Управление размещением текстового курсора и тестированием попадания
Сложные языки скриптов разбиваются на кластеры ScriptShape. Переупорядочение символов всегда происходит в пределах границ кластера. Сами кластеры гарантированно будут продвигаться в направлении, соответствующем порядку чтения.
Информация о кластере в массиве логических кластеров используется для равномерного распределения ширины кластера глифов между логическими символами, которые они представляют. Например, глиф "лам алиф" делится на четыре области.
- Передняя половина лам.
- Задняя половина ламели.
- Ведущая половина алефа.
- Следующая половина алефа.
Соглашения о размещении в кластерах зависят от письменности. Для арабского письма, если положение каретки установлено между базовым символом и его комбинирующим знаком, каретка отображается на полпути через базовый символ. Для тайской письменности курсор не удается разместить внутри кластера. Таким образом, когда пользователь перемещает курсор, приложение должно пройти мимо всех глифов, составляющих кластер.
Функции ScriptXtoCP и ScriptCPtoX преобразуют между позициями каретки (в смещениях точек кода) и позициями x (в пикселях). Функция ScriptXtoCP знает о соглашениях позиционирования курсора для каждого скрипта.
- Для индийских и тайских шрифтов позиции курсора привязываются к границам кластеров.
- Для арабского языка позиции курсора интерполируются с кластерами.
- Для иврита, в версиях до версии 1.420 Usp10.dll, позиции курсора интерполируются в соответствии с кластерами. Начиная с Usp10.dllверсии 1.420, позиции курсора привязываются к границам кластера.
Оба ScriptXtoCP и ScriptCPtoX работают только в пределах выполнения. Функции требуют, чтобы некоторые параметры были получены из предыдущих вызовов Юниписи, как показано в следующей таблице.
Параметр | Источник |
---|---|
psa | Как было возвращено ScriptItemize. |
cGlyphspwLogClust psva |
Как возвращено с помощью ScriptShape. |
piAdvance | Как указано в возврате ScriptPlace. |
Приложение должно определить сегмент выполнения, в котором заданное символьное смещение или x позиция находится перед передачей сведений в ScriptCPtoX или ScriptXtoCP. Если приложение не сохраняет сведения о ширине, оно может выполнять тестирование попадания и размещение каретки после отображения каждого фрагмента текста. В качестве альтернативы приложение может кэшировать достаточно информации, чтобы выполнить проверку попаданий и расположение курсора в текущей строке без необходимости повторной обработки абзаца.
ScriptXtoCP возвращает значение конечного края, чтобы приложение знало сторону символа или кластера, на котором щелкнул пользователь. Значение равно 0 или ширине символа или кластера в точках кода. Возвращаемая позиция символа — это позиция символа, на котором пользователь щелкнул. Дополнительные сведения см. в разделе Отображение курсора в двунаправленных строках.
Для таких языков, как тайский, в которых пользователь обычно не хочет помещать курсор в кластер, ScriptXtoCP задает последний флаг на 0 или на ширину кластера. Для таких языков, как арабский язык, для которого пользователь должен иметь возможность изменять в кластере, ScriptXtoCP задает для конечного бокового флага значение 0 или 1.
Чтобы приложение установило допустимые расположения для курсора при обработке клавиш со стрелками, Uniscribe предоставляет сведения о допустимых позициях в элементе fCharStop в логических атрибутах, возвращаемых ScriptBreak. TRUE возвращается для большинства символов, а FALSE — для межкластерных символов в письменностях, таких как тайская. Приложение должно проверить значение fNeedsCaretInfo в структуре SCRIPT_PROPERTIES для элемента, чтобы узнать, нужно ли вызывать ScriptBreak, чтобы проверить наличие допустимых позиций курсора. Если значение fNeedsCaretInfo равно FALSE, то все точки кода являются допустимыми позициями каретки.
Связанные разделы