HPDFShapeHeadlessTextSpan
function HPDFShapeHeadlessTextSpan(const Context: UnicodeString;
FirstUnit, UnitCount: Integer; const FontBytes: SysUtils.TBytes;
MaximumGlyphs: Integer; CancellationToken: THPDFCancellationToken;
CharacterAdvance: Double = 0; WordAdvance: Double = 0;
ParagraphDirection: THPDFHeadlessTextDirection = htdAuto): THPDFHeadlessShapedGlyphs;
Шейпит только выбранный UTF-16 span с реальным шрифтом OpenType вызывающего, удерживая весь окружающий абзац как pre-context и post-context для HarfBuzz
FirstUnit — смещение UTF-16 с нуля, UnitCount — длина в UTF-16; ни одна граница не может разрезать суррогатную пару, а span нулевой длины не возвращает глифов
FriBidi вычисляет уровни вложенности по полному абзацу; HarfBuzz получает разрешённый script и шейпит выбранные фрагменты внутри каждого визуального run, сохраняя арабские соединительные формы и зеркальную пунктуацию
Возвращённые SourceOffset отсчитываются от выбранного span, UnicodeText сохраняет каждый реально выбранный кластер, а advance и смещения глифов используют шрифтовые координаты из 1000 единиц
CharacterAdvance применяется один раз на шейпленный кластер, кроме кластера только из направляющих управляющих символов Unicode; WordAdvance применяется к кластеру U+0020, оба должны быть конечными и использовать те же координаты, что и Advance
ParagraphDirection может сохранить существующее направление абзаца слева направо или справа налево при шейпинге физической перенесённой строки, чей первый сильный символ отличается от исходного абзаца
К этой функции также применяются прежние бюджеты ввода и глифов, проверки покрытия шрифта, cancellation token и требования к нативным runtime-зависимостям
Частичный span сохраняет контекст соединений, но не позиционирует самостоятельно комбинируемый знак с другим оформлением относительно базового глифа из другого шрифта; когда один шрифт покрывает весь кластер, используйте полный шейпинг кластера
См. HPDFShapeHeadlessText, HPDFResolveHeadlessTextOrder и контекстные appearance rich text