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 är motparten till Uniscribe-backenden i FPdfTextShaping, för mål som saknar usp10.dll. Gränssnittet kompileras endast under Free Pascal, eftersom Delphi riktar sig mot Windows där Uniscribe-backenden gäller
De två backenderna delar upp arbetet olika. Uniscribe itemiserar, formar, placerar och omordnar i ett pass, medan HarfBuzz formar ett enskilt run vars riktning och skrift redan är känd. Denna enhet tillhandahåller resten: FPdfBidi löser ut inbäddningsnivåerna, varje teckens Unicode-skrift segmenterar texten till runs, och runs läggs ut i den visuella ordning UAX #9-regeln L2 ger. Gemensamma, ärvda och okända skrifttecken fortsätter run de befinner sig i, så en siffra eller ett blanksteg delar inte upp ett ord
libharfbuzz binds vid körning via DynLibs, så det är inget byggberoende och dess frånvaro rapporteras i stället för att vara ödesdiger. HarfBuzzAvailable rapporterar huruvida biblioteket hittades och de nödvändiga ingångspunkterna löstes upp, och HarfBuzzVersionString returnerar det inlästa bibliotekets version
Formnaren slår inte upp typsnitt själv. Uniscribe läser typsnittsbinären ur en GDI-enhetkontext, vilket saknar portabel motsvarighet, så värden skickar en TPdfFontDataResolver till Create som mappar ett typsnittsnamn till TrueType- eller OpenType-bytena. Det håller typsnittsuppräkning - fontconfig, CoreText eller en applikations egen typsnittsmapp - utanför en enhet som inte har någon som helst sak i den policyn
| Function | Description |
|---|---|
HarfBuzzAvailable | True när libharfbuzz hittades och de nödvändiga ingångspunkterna löstes upp; första anropet utför bindningen |
HarfBuzzVersionString | Version av det inlästa biblioteket som "major.minor.micro", eller en tom sträng när biblioteket inte är tillgängligt |
| Type | Description |
|---|---|
TPdfFontDataResolver | Metodreferens som mappar FontName till typsnittsfilens byten i FontData; att returnera False låter formnaren misslyckas med begäran på samma sätt som ett oläsbart GDI-typsnitt gör på Windows |
EPdfHarfBuzzError | Undantag som kastas när ingen resolver är konfigurerad, när libharfbuzz inte är tillgängligt eller när en HarfBuzz-blob, face, typsnitt eller buffert inte kan skapas |
TPdfHarfBuzzTextShaper | TPdfTextShaper-implementering byggd på HarfBuzz, med Create, Destroy och Shape |
| Member | Description |
|---|---|
Create(Resolver) | Skapar formnaren och sparar den TPdfFontDataResolver den ska använda för varje typsnittsuppslag |
Destroy | Frigör den cachade HarfBuzz-facen och bloben, därefter den ärvda destruktorn |
Shape(Text, FontName, FontSize, Options, Shaped) | Löser ut inbäddningsnivåerna, segmenterar texten efter nivå och skrift, formar varje run via HarfBuzz och returnerar runs i visuell ordning i Shaped; False när texten inte ger några glyfer |
HarfBuzzAvailable-anropet sonderar libharfbuzz-0.dll och harfbuzz.dll på Windows, libharfbuzz.0.dylib och libharfbuzz.dylib på macOS, samt libharfbuzz.so.0 och libharfbuzz.so på övrigaShape kastar EPdfTextShapingError för tom text, ett tomt typsnittsnamn, en icke-positiv typsnittsstorlek, ogiltiga Options-gränser, text över MaxCharacters, glyfer över MaxGlyphs eller typsnittsdata som resolvern inte kunde tillhandahållaShape kastar EPdfHarfBuzzError när ingen TPdfFontDataResolver är konfigurerad, när libharfbuzz inte är tillgängligt eller när ett HarfBuzz-objekt inte kan skapasOptions.MaxRuns, och Options.Direction mappar ptdLeftToRight och ptdRightToLeft på en fast styckeriktning, medan allt annat löses ut automatisktShaped.FontData håller de bytes resolvern returnerade, vilket är vad TPdf.AddShapedText behöver för att bygga ett CID-typsnitt