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 yra Uniscribe galinės sistemos, aprašytos FPdfTextShaping, atitikmenys aplinkoms, kuriose nėra usp10.dll. Sąsaja kompiliuojama tik Free Pascal naudojančioms aplinkoms, nes Delphi orientuota į Windows, kur galioja Uniscribe galinė sistema
Abi galinės sistemos darbą pasiskirsto skirtingai. Uniscribe vienu praėjimu suskirsto, suformuoja, išdėsto ir perfiliuoja tekstą, o HarfBuzz formuoja vieną segmentą, kurio kryptis ir raštas jau žinomi. Šis modulis padengia likusią dalį: FPdfBidi nustato įdėtinio lygio reikšmes, kiekvieno simbolio Unicode raštas suskaido tekstą į segmentus, o segmentai išdėstomi vaizdine tvarka, kurią nulemia UAX #9 taisyklė L2. Bendrosios, paveldimos ir nežinomo rašto simboliai tęsia segmentą, kuriame yra, todėl skaitmuo ar tarpas žodžio neperskiria
libharfbuzz susiejamas vykdymo metu per DynLibs, todėl nėra kūrimo priklausomybės, o jo nebuvimas pranešamas vietoj to, kad būtų kritiška klaida. HarfBuzzAvailable praneša, ar biblioteka rasta ir ar išspręsti reikalingi įėjimo taškai, o HarfBuzzVersionString grąžina įkeltos bibliotekos versiją
Formuoklis šriftų pats neiškošo. Uniscribe šrifto dvejetainius duomenis skaito iš GDI įrenginio konteksto, kuris neturi perkeliamos atitikmenų, todėl pagrindinė programa Create perduoda TPdfFontDataResolver, susiejantį šrifto vardą su TrueType arba OpenType baitais. Taip šriftų išvardinimas - fontconfig, CoreText ar paties pritaikymo šriftų aplankas - lieka už modulio, kuris tos politikos spręsti neturėtų
| Function | Description |
|---|---|
HarfBuzzAvailable | True, kai libharfbuzz rasta ir reikalingi įėjimo taškai išspręsti; pirmasis kreipinys atlieka susiejimą |
HarfBuzzVersionString | Įkeltos bibliotekos versija formatu "major.minor.micro" arba tuščia eilutė, kai biblioteka neprieinama |
| Type | Description |
|---|---|
TPdfFontDataResolver | Metodo nuoroda, susiejanti FontName su šrifto failo baitais FontData; grąžinus False formuoklis prašymą žlugdo taip pat, kaip Windows sistemoje neperskaitomas GDI šriftas |
EPdfHarfBuzzError | Išimtis, keliama, kai nesukonfigūruota spręstuvė, kai libharfbuzz neprieinama arba kai nepavyksta sukurti HarfBuzz blob, face, font arba buffer objekto |
TPdfHarfBuzzTextShaper | HarfBuzz pagrįsta TPdfTextShaper realizacija su Create, Destroy ir Shape |
| Member | Description |
|---|---|
Create(Resolver) | Sukuria formuoklį ir įsimena TPdfFontDataResolver, kurį naudos kiekvienam šrifto paieškos kreipiniui |
Destroy | Atlaisvina podėlyje laikomą HarfBuzz face ir blob, tada iškviečia paveldėtą destruktorių |
Shape(Text, FontName, FontSize, Options, Shaped) | Nustato įdėtinio lygio reikšmes, suskaido tekstą pagal lygį ir raštą, kiekvieną segmentą suformuoja per HarfBuzz ir grąžina segmentus vaizdine tvarka Shaped; False, kai tekstas neduoda nė vieno glifo |
HarfBuzzAvailable kreipinys Windows sistemoje ieško libharfbuzz-0.dll ir harfbuzz.dll, macOS sistemoje - libharfbuzz.0.dylib ir libharfbuzz.dylib, kitur - libharfbuzz.so.0 ir libharfbuzz.soShape kelia EPdfTextShapingError, kai tekstas tuščias, šrifto vardas tuščias, šrifto dydis neteigiamas, Options ribos netinkamos, tekstas viršija MaxCharacters, glifai viršija MaxGlyphs arba spręstuvė nepateikė šrifto duomenųShape kelia EPdfHarfBuzzError, kai nesukonfigūruota TPdfFontDataResolver, kai libharfbuzz neprieinama arba kai nepavyksta sukurti HarfBuzz objektoOptions.MaxRuns, o Options.Direction reikšmes ptdLeftToRight ir ptdRightToLeft pervesti į fiksuotą pastraipos kryptį, o visos kitos išsprendžiamos automatiškaiShaped.FontData saugo spręstuvės grąžintus baitus, kurių TPdf.AddShapedText reikia CID šriftui sukurti