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 è la controparte del backend Uniscribe in FPdfTextShaping, per i target che non hanno usp10.dll. L'interfaccia viene compilata solo sotto Free Pascal, perché Delphi punta a Windows, dove si applica il backend Uniscribe
I due backend dividono il lavoro in modo diverso. Uniscribe scompone in item, modella, posiziona e riordina in un solo passaggio, mentre HarfBuzz modella una singola run la cui direzione e la cui scrittura sono già note. Questa unità fornisce il resto: FPdfBidi risolve i livelli di incorporamento, la scrittura Unicode di ogni carattere segmenta il testo in run, e le run vengono disposte nell'ordine visivo che la regola L2 di UAX #9 fornisce. I caratteri di scrittura common, inherited e sconosciuta proseguono la run in cui si trovano, così una cifra o uno spazio non spezza una parola
libharfbuzz viene caricato a runtime tramite DynLibs, quindi non è una dipendenza di build e la sua assenza viene riportata anziché essere fatale. HarfBuzzAvailable riporta se la libreria è stata trovata e gli entry point richiesti risolti, e HarfBuzzVersionString restituisce la versione della libreria caricata
Lo shaper non cerca i font. Uniscribe legge il binario del font da un device context GDI, che non ha equivalenti portabili, quindi l'host passa a Create un TPdfFontDataResolver che mappa un nome di font nei byte TrueType o OpenType. Questo tiene l'enumerazione dei font - fontconfig, CoreText, o la cartella font di un'applicazione - fuori da un'unità che non ha alcun motivo di stabilire quella politica
| Function | Description |
|---|---|
HarfBuzzAvailable | True quando libharfbuzz è stato trovato e gli entry point richiesti sono stati risolti; la prima chiamata esegue il binding |
HarfBuzzVersionString | Versione della libreria caricata come "major.minor.micro", o una stringa vuota quando la libreria non è disponibile |
| Type | Description |
|---|---|
TPdfFontDataResolver | Riferimento a metodo che mappa FontName nei byte del file di font in FontData; restituire False fa fallire la richiesta dello shaper nello stesso modo in cui lo fa un font GDI illeggibile su Windows |
EPdfHarfBuzzError | Eccezione sollevata quando nessun resolver è configurato, quando libharfbuzz non è disponibile, o quando un blob, una face, un font o un buffer HarfBuzz non può essere creato |
TPdfHarfBuzzTextShaper | Implementazione TPdfTextShaper basata su HarfBuzz, con Create, Destroy e Shape |
| Member | Description |
|---|---|
Create(Resolver) | Crea lo shaper e memorizza il TPdfFontDataResolver che userà per ogni ricerca di font |
Destroy | Rilascia la face e il blob HarfBuzz in cache, poi il distruttore ereditato |
Shape(Text, FontName, FontSize, Options, Shaped) | Risolve i livelli di incorporamento, segmenta il testo per livello e scrittura, modella ogni run tramite HarfBuzz, e restituisce le run in ordine visivo in Shaped; False quando il testo non produce glyph |
HarfBuzzAvailable sonda libharfbuzz-0.dll e harfbuzz.dll su Windows, libharfbuzz.0.dylib e libharfbuzz.dylib su macOS, e libharfbuzz.so.0 e libharfbuzz.so altroveShape solleva EPdfTextShapingError per testo vuoto, nome di font vuoto, dimensione del font non positiva, limiti di Options non validi, testo oltre MaxCharacters, glyph oltre MaxGlyphs, o dati di font che il resolver non ha potuto fornireShape solleva EPdfHarfBuzzError quando nessun TPdfFontDataResolver è configurato, quando libharfbuzz non è disponibile, o quando un oggetto HarfBuzz non può essere creatoOptions.MaxRuns, e Options.Direction mappa ptdLeftToRight e ptdRightToLeft su una direzione di paragrafo fissa, con tutto il resto risolto automaticamenteShaped.FontData contiene i byte che il resolver ha restituito, ciò che TPdf.AddShapedText richiede per costruire un font CID