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 modstykket til Uniscribe-backenden i FPdfTextShaping og henvender sig til mål, der ikke har usp10.dll. Interfacet kompileres kun under Free Pascal, fordi Delphi sigter mod Windows, hvor Uniscribe-backenden gælder
De to backends deler arbejdet forskelligt. Uniscribe opdeler, former, placerer og sorterer visuelt i ét hug, mens HarfBuzz former ét run ad gangen, hvis retning og script allerede er kendt. Denne enhed leverer resten: FPdfBidi opløser indlejringsniveauerne, Unicode-scriptet for hvert tegn opdeler teksten i runs, og runene lægges i den visuelle rækkefølge, som UAX #9-regel L2 giver. Fælles, nedarvede og ukendte script-tegn fortsætter det run, de er i, så et ciffer eller et mellemrum ikke deler et ord
libharfbuzz bindes ved run time via DynLibs, så det ikke er en build-afhængighed, og fraværet rapporteres i stedet for at være fatalt. HarfBuzzAvailable rapporterer, om biblioteket blev fundet, og de påkrævede entry points blev opløst, og HarfBuzzVersionString returnerer versionen af det indlæste bibliotek
Shaperen slår ikke fonts op på egen hånd. Uniscribe læser fontens binære data ud af en GDI-device-kontekst, som ikke har nogen portabel pendant, så hosten giver en TPdfFontDataResolver til Create, der oversætter et fontnavn til TrueType- eller OpenType-bytes. Det holder fontopslag - fontconfig, CoreText eller applikationens egen fontmappe - uden for en enhed, der ikke har noget at gøre med den politik
| Function | Description |
|---|---|
HarfBuzzAvailable | True, når libharfbuzz blev fundet, og de påkrævede entry points blev opløst; det første kald udfører bindingen |
HarfBuzzVersionString | Version af det indlæste bibliotek som "major.minor.micro" eller en tom streng, når biblioteket ikke er tilgængeligt |
| Type | Description |
|---|---|
TPdfFontDataResolver | Method-reference, der oversætter FontName til fontfilbytes i FontData; returnering af False får shaperen til at afvise kaldet på samme måde, som en ulæselig GDI-font gør det på Windows |
EPdfHarfBuzzError | Exception, der udløses, når ingen resolver er konfigureret, når libharfbuzz ikke er tilgængelig, eller når en HarfBuzz-blob, face, font eller buffer ikke kan oprettes |
TPdfHarfBuzzTextShaper | TPdfTextShaper-implementering med HarfBuzz i ryggen, med Create, Destroy og Shape |
| Member | Description |
|---|---|
Create(Resolver) | Opretter shaperen og gemmer den TPdfFontDataResolver, den bruger ved hvert fontopslag |
Destroy | Frigiver den cachede HarfBuzz-face og -blob og derefter den nedarvede destruktor |
Shape(Text, FontName, FontSize, Options, Shaped) | Opløser indlejringsniveauerne, opdeler teksten efter niveau og script, former hvert run gennem HarfBuzz og returnerer runene i visuel rækkefølge i Shaped; False, når teksten ikke giver nogen glyffer |
HarfBuzzAvailable-kald sonderer libharfbuzz-0.dll og harfbuzz.dll på Windows, libharfbuzz.0.dylib og libharfbuzz.dylib på macOS samt libharfbuzz.so.0 og libharfbuzz.so alle andre stederShape udløser EPdfTextShapingError ved tom tekst, et tomt fontnavn, en ikke-positiv fontstørrelse, ugyldige Options-grænser, tekst over MaxCharacters, glyffer over MaxGlyphs eller fontdata, som resolveren ikke kunne levereShape udløser EPdfHarfBuzzError, når ingen TPdfFontDataResolver er konfigureret, når libharfbuzz ikke er tilgængelig, eller når et HarfBuzz-objekt ikke kan oprettesOptions.MaxRuns, og Options.Direction afbilder ptdLeftToRight og ptdRightToLeft på en fast afsnitsretning, mens alt andet opløses automatiskShaped.FontData indeholder de bytes, resolveren returnerede, hvilket er det, TPdf.AddShapedText har brug for for at bygge en CID-font