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 je náprotivok backendu Uniscribe v FPdfTextShaping pre ciele bez usp10.dll. Rozhranie sa kompiluje len pod Free Pascal, pretože Delphi cieli Windows, kde sa uplatňuje backend Uniscribe
Oba backendy si rozdeľujú prácu inak. Uniscribe rozčlení, vytvaruje, umiestni a preusporiada v jednom prechode, zatiaľ čo HarfBuzz tvaruje jediný beh, ktorého smer a písmo sú už známe. Táto jednotka dodáva zvyšok: FPdfBidi vyrieši úrovne zapustenia, skript Unicode každého znaku rozsegmentuje text na behy a behy sa rozložia do vizuálneho poradia, ktoré dáva pravidlo L2 z UAX #9. Znaky so skriptom Common, Inherited a neznámym pokračujú v behu, v ktorom sa nachádzajú, takže číslica ani medzera nerozdelí slovo
libharfbuzz sa viaže za behu cez DynLibs, takže nie je buildovou závislosťou a jeho neprítomnosť sa nahlási namiesto fatálneho zlyhania. HarfBuzzAvailable oznamuje, či bola knižnica nájdená a či sa rozpoznali požadované vstupné body, a HarfBuzzVersionString vráti verziu načítanej knižnice
Tvarovač si fonty nevyhľadáva. Uniscribe číta binárny font z GDI device contextu, čo nemá prenosný ekvivalent, takže hostiteľ odovzdá do Create TPdfFontDataResolver, ktorý mapuje názov fontu na bajty TrueType alebo OpenType. Výber fontov - fontconfig, CoreText alebo vlastný priečinok fontov aplikácie - tak zostáva mimo jednotky, ktorá nemá čo rozhodovať o tejto politike
| Function | Description |
|---|---|
HarfBuzzAvailable | True, keď sa našla libharfbuzz a rozpoznali sa požadované vstupné body; prvé volanie vykoná viazanie |
HarfBuzzVersionString | Verzia načítanej knižnice ako "major.minor.micro", alebo prázdny reťazec, keď knižnica nie je dostupná |
| Type | Description |
|---|---|
TPdfFontDataResolver | Referencia na metódu, ktorá mapuje FontName na bajty súboru fontu v FontData; vrátenie False spôsobí, že tvarovač zamietne požiadavku rovnakým spôsobom ako nečitateľný GDI font na Windows |
EPdfHarfBuzzError | Výnimka vyvolaná, keď nie je nakonfigurovaný žiadny resolver, keď libharfbuzz nie je dostupné, alebo keď nemožno vytvoriť blob, face, font či buffer HarfBuzz |
TPdfHarfBuzzTextShaper | Implementácia TPdfTextShaper postavená na HarfBuzz s Create, Destroy a Shape |
| Member | Description |
|---|---|
Create(Resolver) | Vytvorí tvarovač a uloží TPdfFontDataResolver, ktorý použije pri každom vyhľadaní fontu |
Destroy | Uvoľní cache face a blob HarfBuzz, potom zdedený deštruktor |
Shape(Text, FontName, FontSize, Options, Shaped) | Vyrieši úrovne zapustenia, rozsegmentuje text podľa úrovne a skriptu, vytvaruje každý beh cez HarfBuzz a vráti behy vo vizuálnom poradí v Shaped; False, keď text neposkytne žiadne glyfy |
HarfBuzzAvailable vyskúša libharfbuzz-0.dll a harfbuzz.dll na Windows, libharfbuzz.0.dylib a libharfbuzz.dylib na macOS a libharfbuzz.so.0 a libharfbuzz.so indeShape vyvolá EPdfTextShapingError pri prázdnom texte, prázdnom názve fontu, nekladnej veľkosti fontu, neplatných limitoch v Options, texte nad MaxCharacters, glyfoch nad MaxGlyphs alebo dátach fontu, ktoré resolver nedodalShape vyvolá EPdfHarfBuzzError, keď nie je nakonfigurovaný žiadny TPdfFontDataResolver, keď libharfbuzz nie je dostupné, alebo keď nemožno vytvoriť objekt HarfBuzzOptions.MaxRuns a Options.Direction mapuje ptdLeftToRight a ptdRightToLeft na pevný smer odseku, pričom všetko ostatné sa vyrieši automatickyShaped.FontData drží bajty, ktoré resolver vrátil, čo je presne to, čo TPdf.AddShapedText potrebuje na stavbu CID fontu