Поделиться через


Функция ScriptShapeOpenType (usp10.h)

Создает глифы и визуальные атрибуты для выполнения Юникода с информацией OpenType. Каждый запуск состоит из одного вызова этой функции.

Синтаксис

HRESULT ScriptShapeOpenType(
  [in, optional] HDC                  hdc,
  [in, out]      SCRIPT_CACHE         *psc,
  [in, out]      SCRIPT_ANALYSIS      *psa,
  [in]           OPENTYPE_TAG         tagScript,
  [in]           OPENTYPE_TAG         tagLangSys,
  [in, optional] int                  *rcRangeChars,
  [in, optional] TEXTRANGE_PROPERTIES **rpRangeProperties,
  [in]           int                  cRanges,
  [in]           const WCHAR          *pwcChars,
  [in]           int                  cChars,
  [in]           int                  cMaxGlyphs,
  [out]          WORD                 *pwLogClust,
  [out]          SCRIPT_CHARPROP      *pCharProps,
  [out]          WORD                 *pwOutGlyphs,
  [out]          SCRIPT_GLYPHPROP     *pOutGlyphProps,
  [out]          int                  *pcGlyphs
);

Параметры

[in, optional] hdc

Обработка в контексте устройства. Дополнительные сведения см. в разделе Кэширование.

[in, out] psc

Указатель на структуру SCRIPT_CACHE , определяющую кэш скриптов.

[in, out] psa

Указатель на структуру SCRIPT_ANALYSIS , полученную при предыдущем вызове ScriptItemizeOpenType. Структура идентифицирует подсистему формирования, чтобы глифы могли быть правильно сформированы.

Кроме того, приложение может задать для этого параметра значение NULL , чтобы получать нефильтрованные результаты.

[in] tagScript

Структура OPENTYPE_TAG , определяющая тег скрипта OpenType для системы записи.

[in] tagLangSys

Структура OPENTYPE_TAG , содержащая тег языка OpenType для системы записи.

[in, optional] rcRangeChars

Массив символов в каждом диапазоне. Количество элементов массива обозначается cRanges. Значения элементов этого массива добавляются к значению cChars.

[in, optional] rpRangeProperties

Массив TEXTRANGE_PROPERTIES структур, каждая из которых представляет один диапазон функций OpenType. Количество структур определяется параметром cRanges . Дополнительные сведения о rpRangeProperties см. в разделе Примечания.

[in] cRanges

Количество диапазонов возможностей OpenType.

[in] pwcChars

Указатель на массив символов Юникода, содержащий выполнение.

[in] cChars

Количество символов в выполнении Юникода.

[in] cMaxGlyphs

Максимальное число глифов для создания.

[out] pwLogClust

Указатель на буфер, в котором эта функция извлекает массив сведений о логическом кластере . Каждый элемент массива соответствует символу в массиве символов Юникода. Значение каждого элемента — это смещение от первого глифа в выполнении до первого глифа в кластере, содержающем соответствующий символ. Обратите внимание, что если элемент fRTLструктуры SCRIPT_ANALYSIS имеет значение TRUE, элементы уменьшаются по мере считывания массива.

[out] pCharProps

Указатель на буфер, в котором эта функция извлекает массив значений свойств символов длины, указанной cChars.

[out] pwOutGlyphs

Указатель на буфер, в котором эта функция извлекает массив глифов.

[out] pOutGlyphProps

Указатель на буфер, в котором эта функция извлекает массив атрибутов для каждого из полученных глифов. Длина значений равна значению pcGlyphs. Так как для каждого глифа указывается одно свойство глифа, значение этого параметра указывает количество элементов, заданных cMaxGlyphs.

[out] pcGlyphs

Указатель на расположение, в котором эта функция извлекает количество глифов, указанных в pwOutGlyphs.

Возвращаемое значение

Возвращает 0 в случае успеха. Функция возвращает ненулевое значение HRESULT, если это не удалось. Во всех случаях ошибок содержимое всех значений выходного массива не определено.

Возвращается ошибка:

  • E_OUTOFMEMORY. Длина выходного буфера, указанная cMaxGlyphs , недостаточна.
  • E_PENDING. Кэш скриптов, заданный параметром psc , не содержит достаточно сведений для формирования строки, а контекст устройства был передан как NULL , поэтому функция не может завершить процесс формирования. Приложение должно настроить правильный контекст устройства для запуска и снова вызвать эту функцию с соответствующим значением контекста в hdc и с теми же параметрами.
  • USP_E_SCRIPT_NOT_IN_FONT. Шрифт, соответствующий контексту устройства, не поддерживает требуемый скрипт. Приложение должно выбрать другой шрифт, используя ScriptGetCMap или другой метод для выбора шрифта.

Комментарии

ScriptShapeOpenType предпочтительнее, чем более старая функция ScriptShape . Ниже перечислены некоторые преимущества ScriptShapeOpenType .

  • Параметры напрямую соответствуют тегам OpenType в таблицах макета шрифтов.
  • Параметры определяют признаки, применяемые к каждому символу.
  • Входные данные делятся на запуски. Каждый запуск имеет свойства OpenType и состоит из одного вызова ScriptShapeOpenType.
Если эта функция возвращает E_OUTOFMEMORY, приложение может многократно вызывать ScriptShapeOpenType с последовательно большими выходными буферами, пока не будет предоставлен достаточно большой буфер. Количество глифов, созданных кодовой точкой, зависит от скрипта и шрифта. Для простого скрипта кодовая точка Юникода может создать один глиф. Однако сложный шрифт скрипта может создавать символы из компонентов и таким образом генерировать в несколько раз больше глифов, чем символов. Кроме того, существуют особые случаи, например недопустимые представления символов, в которых добавляются дополнительные глифы для представления недопустимой последовательности. Таким образом, разумное предположение для размера буфера, указанного pwOutGlyphs , в 1,5 раза больше длины буфера символов, а также дополнительные 16 глифов в редких случаях, например недопустимое представление последовательности.

Эта функция может задать элемент fNoGlyphIndexструктуры SCRIPT_ANALYSIS , если шрифт или операционная система не поддерживают индексы глифов.

Приложение может вызывать ScriptShapeOpenType , чтобы определить, поддерживает ли шрифт символы в заданной строке. Если функция возвращает S_OK, приложение должно проверка выходные данные отсутствующих глифов. Если fLogicalOrder имеет значение TRUE в структуре SCRIPT_ANALYSIS , функция всегда создает глифы в том же порядке, что и исходные символы Юникода. Если параметр fLogicalOrder имеет значение FALSE, функция создает элементы справа налево в обратном порядке, чтобы scriptTextOut не нужно было их отменять перед вызовом ExtTextOut.

Если для элемента eScriptSCRIPT_ANALYSIS задано значение SCRIPT_UNDEFINED, формирование отключается. В этом случае ScriptShapeOpenType отображает глиф, который находится в таблице cmap шрифтов. Если в таблице нет глифа, функция указывает, что глифы отсутствуют.

ScriptShapeOpenType последовательности кластеров равномерно в пределах выполнения и последовательности глифов в кластере. Он использует значение члена fRTLSCRIPT_ANALYSIS из ScriptItemizeOpenType, чтобы определить, является ли виртуализация слева направо или справа налево.

Для параметра rpRangeProperties структура TEXTRANGE_PROPERTIES указывает на массив OPENTYPE_FEATURE_RECORD структур. Этот массив используется следующим образом:

  • Каждый элемент массива, указанный для rpRangeProperties , описывает диапазон.
  • Диапазоны определенных свойств общего доступа к тексту, как правило, "nest", а вложенные диапазоны могут совместно использовать OPENTYPE_FEATURE_RECORD сведения. Например, на рисунке ниже:
    • Строки чисел в верхней части представляют диапазоны, элементы и запуски соответственно.
    • Каждый диапазон, помеченный здесь буквой, представляет одну функцию OpenType. Признаки, которые попадают в каждый диапазон, хранятся в OPENTYPE_FEATURE_RECORD массиве этого диапазона.
    • Для каждого диапазона массив структур OPENTYPE_FEATURE_RECORD соответствует буквам диапазонов, содержащих этот диапазон.
    • На этом рисунке диапазон 2 косвенно связан со структурами OPENTYPE_FEATURE_RECORD для диапазонов A, B и C. Диапазон 4 связан только со структурами для диапазонов A и D.
Иллюстрация, показывающая диапазон, элемент, выполнение и признак каждого слова в строке текста, использующего шесть свойств для представления восьми слов
Примечание На рисунке используется множество вызовов ScriptShapeOpenType, каждый из которых представляет один запуск.
 
Важно Начиная с Windows 8: чтобы поддерживать возможность запуска в Windows 7, модуль, использующий Uniscribe, должен указать Usp10.lib перед gdi32.lib в списке библиотек.
 

Примеры

В следующем примере показано, как ScriptShapeOpenType создает массив логического кластера (pwLogClust) из массива символов (pwcChars) и массива глифов (pwOutGlyphs). Запуск состоит из четырех кластеров.

  • Первый кластер: один символ, представленный одним глифом
  • Второй кластер: один символ, представленный тремя глифами
  • Третий кластер: три символа, представленные одним глифом
  • Четвертый кластер: два символа, представленные тремя глифами
Выполнение описывается следующим образом в массивах символов и глифов.

Массив символов:

  • | c1u1 | c2u1 | c3u1 c3u2 c3u3 | c4u1 c4u2 |
Массив глифов:
  • | c1g1 | c2g1 c2g2 c2g3 | c3g1 | c4g1 c4g2 c4g3 |
Нотация элементов массива состоит из следующих элементов:
  • c<n> означает кластер n.
  • g<m> означает глиф m.
  • u<p> означает кодовую точку Юникода p.
Созданный кластерный массив сохраняет смещения для кластера, содержащего символ . Единицы измерения выражаются в глифах.
  • | 0 | 1 | 4 4 4 | 5 5 |

Требования

   
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header usp10.h
Библиотека Usp10.lib
DLL Usp10.dll
Распространяемые компоненты Usp10.dll версии 1.600 или более поздней в Windows XP

См. также раздел

Отображение текста с помощью Uniscribe

OPENTYPE_FEATURE_RECORD

SCRIPT_ANALYSIS

ScriptItemizeOpenType

ScriptPlaceOpenType

ScriptShape

ScriptTextOut

TEXTRANGE_PROPERTIES

Функции uniscribe