TPdfFontDataResolver = function(const FontName: WideString;
out FontData: TBytes): Boolean of object;
EPdfHarfBuzzError = class(Exception);
TPdfHarfBuzzTextShaper = class(TPdfTextShaper)
constructor Create(const Resolver: TPdfFontDataResolver);
destructor Destroy; override;
function Shape(const Text, FontName: WideString; FontSize: Single;
const Options: TPdfTextShapingOptions;
out Shaped: TPdfShapedText): Boolean; override;
end;
function HarfBuzzAvailable: Boolean;
function HarfBuzzVersionString: string;
FPdfTextShapingHb е двойник на Uniscribe бекенда в FPdfTextShaping за целите, които разполагат с usp10.dll. Интерфейсът се компилира само под Free Pascal, защото Delphi целите са Windows, където важи Uniscribe бекендът
Двата бекенда разделят работата по различен начин. Uniscribe разделя на елементи, оформя, поставя и пренарежда в един проход, докато HarfBuzz оформя единичен run, чиято посока и писменост вече са известни. Този модул доставя останалото: FPdfBidi разрешава нивата на вграждане, Unicode писмеността на всеки знак разделя текста на runs, а run-овете се подреждат във визуалния ред, който дава правилото L2 на UAX #9. Знаците с обща, наследена и непозната писменост продължават run-а, в който се намират, така че цифра или интервал не разцепват дума
libharfbuzz се свързва по време на изпълнение чрез DynLibs, така че не е зависимост при компилация, а липсата му се докладва, вместо да бъде фатална. HarfBuzzAvailable отчита дали библиотеката е намерена и необходимите входни точки са разрешени, а HarfBuzzVersionString връща версията на заредената библиотека
Оформителят не търси шрифтове. Uniscribe чете двоичния шрифтов файл от GDI device context, който няма преносим еквивалент, затова хостът подава на Create TPdfFontDataResolver, който съпоставя име на шрифт с TrueType или OpenType байтовете. Така изброяването на шрифтове - fontconfig, CoreText или собствена шрифтова папка на приложението - остава извън модул, който няма работа да определя тази политика
| Функция | Описание |
|---|---|
HarfBuzzAvailable | True, когато libharfbuzz е намерен и необходимите входни точки са разрешени; първото извикване извършва свързването |
HarfBuzzVersionString | Версия на заредената библиотека като "major.minor.micro", или празен низ, когато библиотеката е недостъпна |
| Тип | Описание |
|---|---|
TPdfFontDataResolver | Method reference, който съпоставя FontName с байтовете на шрифтовия файл в FontData; връщането на False кара оформителя да провали заявката по същия начин, както нечетим GDI шрифт на Windows |
EPdfHarfBuzzError | Изключение, вдигано когато не е конфигуриран resolver, когато libharfbuzz е недостъпен или когато HarfBuzz blob, face, font или buffer не може да бъде създаден |
TPdfHarfBuzzTextShaper | TPdfTextShaper реализация, поддържана от HarfBuzz, с Create, Destroy и Shape |
| Член | Описание |
|---|---|
Create(Resolver) | Създава оформителя и съхранява TPdfFontDataResolver, който ще използва за всяко търсене на шрифт |
Destroy | Освобождава кешираните HarfBuzz face и blob, след което наследения деструктор |
Shape(Text, FontName, FontSize, Options, Shaped) | Разрешава нивата на вграждане, разделя текста по ниво и писменост, оформя всеки run чрез HarfBuzz и връща run-овете във визуален ред в Shaped; False, когато текстът не произведе глифи |
HarfBuzzAvailable пробва libharfbuzz-0.dll и harfbuzz.dll на Windows, libharfbuzz.0.dylib и libharfbuzz.dylib на macOS и libharfbuzz.so.0 и libharfbuzz.so другадеShape вдига EPdfTextShapingError при празен текст, празно име на шрифт, неположителен размер на шрифта, невалидни лимити в Options, текст над MaxCharacters, глифи над MaxGlyphs или шрифтови данни, които resolver-ът не можа да доставиShape вдига EPdfHarfBuzzError когато не е конфигуриран TPdfFontDataResolver, когато libharfbuzz е недостъпен или когато HarfBuzz обект не може да бъде създаденOptions.MaxRuns, а Options.Direction съпоставя ptdLeftToRight и ptdRightToLeft на фиксирана посока на абзаца, като всичко останало се разрешава автоматичноShaped.FontData съдържа байтовете, върнати от resolver-а - точно това е нужно на TPdf.AddShapedText, за да изгради CID шрифт