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 er motstykket til Uniscribe-backend-en i FPdfTextShaping, for mål som ikke har usp10.dll. Grensesnittet kompileres bare under Free Pascal, fordi Delphi retter seg mot Windows, der Uniscribe-backend-en gjelder
De to backend-ene deler arbeidet forskjellig. Uniscribe segmenterer, formerer, plasserer og stokker om i én gjennomgang, mens HarfBuzz formerer én enkelt run med allerede kjent retning og skrift. Denne uniten leverer resten: FPdfBidi løser innbindingsnivåene, Unicode-skriptet til hvert tegn deler teksten inn i runs, og runene legges ut i den visuelle rekkefølgen UAX #9-regel L2 gir. Tegn med vanlig, arvet og ukjent skript fortsetter runen de står i, så et siffer eller et mellomrom deler ikke et ord
libharfbuzz bindes ved kjøretid gjennom DynLibs, så det er ikke en byggeavhengighet, og fraværet rapporteres i stedet for å være fatalt. HarfBuzzAvailable rapporterer om biblioteket ble funnet og de nødvendige inngangspunktene løst, og HarfBuzzVersionString returnerer versjonen til det lastede biblioteket
Shaperen slår ikke opp fonter selv. Uniscribe leser fontens binærdata ut av en GDI-enhetskontekst, som ikke har noen portabel motpart, så verten sender en TPdfFontDataResolver til Create som avbilder et fontnavn til TrueType- eller OpenType-bytene. Det holder fontoppramsing - fontconfig, CoreText eller programmets egen fontmappe - utenfor en unit som ikke har noe å gjøre med å fastsette den policyen
| Function | Description |
|---|---|
HarfBuzzAvailable | True når libharfbuzz ble funnet og de nødvendige inngangspunktene var løst; det første kallet utfører bindingen |
HarfBuzzVersionString | Versjonen av det lastede biblioteket som "major.minor.micro", eller en tom streng når biblioteket ikke er tilgjengelig |
| Type | Description |
|---|---|
TPdfFontDataResolver | Metodereferanse som avbilder FontName til fontfilbytene i FontData; False gjør at shaperen feiler forespørselen på samme måte som en ulesebar GDI-font på Windows |
EPdfHarfBuzzError | Unntak som utløses når ingen oppløser er konfigurert, når libharfbuzz ikke er tilgjengelig, eller når en HarfBuzz blob, face, font eller buffer ikke kan opprettes |
TPdfHarfBuzzTextShaper | TPdfTextShaper-implementasjon med HarfBuzz i bunn, med Create, Destroy og Shape |
| Member | Description |
|---|---|
Create(Resolver) | Oppretter shaperen og lagrer TPdfFontDataResolver-en den bruker ved hvert fontoppslag |
Destroy | Frigjør den bufrede HarfBuzz-face-en og blob-en, og deretter den arvede destruktoren |
Shape(Text, FontName, FontSize, Options, Shaped) | Løser innbindingsnivåene, deler teksten etter nivå og skript, formerer hver run gjennom HarfBuzz og returnerer runene i visuell rekkefølge i Shaped; False når teksten ikke gir noen glyffer |
HarfBuzzAvailable-kallet sonderer libharfbuzz-0.dll og harfbuzz.dll på Windows, libharfbuzz.0.dylib og libharfbuzz.dylib på macOS, og libharfbuzz.so.0 og libharfbuzz.so andre stederShape utløser EPdfTextShapingError ved tom tekst, tomt fontnavn, ikke-posisiv fontstørrelse, ugyldige Options-grenser, tekst over MaxCharacters, glyffer over MaxGlyphs eller fontdata oppløseren ikke kunne levereShape utløser EPdfHarfBuzzError når ingen TPdfFontDataResolver er konfigurert, når libharfbuzz ikke er tilgjengelig, eller når et HarfBuzz-objekt ikke kan opprettesOptions.MaxRuns, og Options.Direction avbilder ptdLeftToRight og ptdRightToLeft til en fast avsnittsretning, mens alt annet løses automatiskShaped.FontData inneholder bytene oppløseren returnerte, som er det TPdf.AddShapedText trenger for å bygge en CID-font