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