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


Управление размещением курсора и тестированием попаданий

Сложные языки скриптов разбиваются на кластеры с помощью ScriptShape. Изменение порядка символов всегда происходит в пределах кластера. Сами кластеры гарантированно будут продвигаться в направлении порядка чтения.

Сведения о кластере в массиве логических кластеров используются для равномерного совместного использования ширины кластера глифов между логическими символами, которые они представляют. Например, глиф lam alef делится на четыре области:

  • Ведущая половина лам.
  • Последующая половина ламинга.
  • Ведущая половина алефа.
  • Завершающая половина алефа.

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

Функции ScriptXtoCP и ScriptCPtoX преобразуются между положениями курсора (в смещениях кодовых точек) и x (в пикселях). Функция ScriptXtoCP обладает знаниями о соглашениях о позиции курсора для каждого скрипта:

  • Для индийского и тайского языка позиции курсора прикрепляются к границам кластера.
  • Для арабского языка положения курсоров интерполируются с помощью кластеров.
  • Для иврита в версиях до Usp10.dll версии 1.420 позиции курсора интерполируются с помощью кластеров. Начиная с Usp10.dll версии 1.420 положения курсоров привязываются к границам кластера.

ScriptXtoCP и ScriptCPtoX работают только в рамках выполнения. Для функций требуется, чтобы определенные параметры были получены из более ранних вызовов Uniscribe, как показано в следующей таблице.

Параметр Источник
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, все кодовые точки являются допустимыми позициями курсора.

Использование Uniscribe