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 adalah pasangan dari backend Uniscribe di FPdfTextShaping, untuk target yang tidak memiliki usp10.dll. Antarmukanya hanya dikompilasi di bawah Free Pascal, karena Delphi menargetkan Windows tempat backend Uniscribe berlaku
Kedua backend membagi pekerjaan secara berbeda. Uniscribe mengitemisasi, membentuk, menempatkan, dan mengurutkan ulang dalam satu lintasan, sedangkan HarfBuzz membentuk satu run yang arah dan skripnya sudah diketahui. Unit ini menyediakan sisanya: FPdfBidi menyelesaikan level embedding, skrip Unicode setiap karakter membagi teks menjadi run, dan run-run itu disusun dalam urutan visual yang diberikan aturan L2 UAX #9. Karakter skrip Common, inherited, dan unknown melanjutkan run tempat mereka berada, sehingga digit atau spasi tidak memecah sebuah kata
libharfbuzz diikat saat run time melalui DynLibs, sehingga bukan dependency build dan ketiadaannya dilaporkan alih-alih bersifat fatal. HarfBuzzAvailable melaporkan apakah pustaka ditemukan dan entry point yang disyaratkan ter-resolve, dan HarfBuzzVersionString mengembalikan versi pustaka yang termuat
Shaper ini tidak mencari font. Uniscribe membaca biner font dari GDI device context, yang tidak punya padanan portabel, sehingga host meneruskan sebuah TPdfFontDataResolver ke Create yang memetakan nama font ke byte TrueType atau OpenType. Dengan begitu, enumerasi font - fontconfig, CoreText, atau folder font milik aplikasi sendiri - tetap berada di luar unit yang bukan tempatnya menentukan kebijakan itu
| Function | Description |
|---|---|
HarfBuzzAvailable | True ketika libharfbuzz ditemukan dan entry point yang disyaratkan ter-resolve; pemanggilan pertama melakukan binding |
HarfBuzzVersionString | Versi pustaka yang termuat dalam bentuk "major.minor.micro", atau string kosong ketika pustaka tidak tersedia |
| Type | Description |
|---|---|
TPdfFontDataResolver | Method reference yang memetakan FontName ke byte berkas font dalam FontData; mengembalikan False membuat shaper menggagalkan request dengan cara yang sama seperti font GDI yang tidak terbaca di Windows |
EPdfHarfBuzzError | Exception yang dimunculkan ketika tidak ada resolver yang dikonfigurasi, ketika libharfbuzz tidak tersedia, atau ketika blob, face, font, atau buffer HarfBuzz tidak dapat dibuat |
TPdfHarfBuzzTextShaper | Implementasi TPdfTextShaper yang didukung HarfBuzz, dengan Create, Destroy, dan Shape |
| Member | Description |
|---|---|
Create(Resolver) | Membuat shaper dan menyimpan TPdfFontDataResolver yang akan dipakai untuk setiap pencarian font |
Destroy | Melepas face dan blob HarfBuzz yang di-cache, lalu destructor turunannya |
Shape(Text, FontName, FontSize, Options, Shaped) | Menyelesaikan level embedding, membagi teks berdasarkan level dan skrip, membentuk setiap run melalui HarfBuzz, lalu mengembalikan run dalam urutan visual di Shaped; False ketika teks tidak menghasilkan glyph |
HarfBuzzAvailable pertama memeriksa libharfbuzz-0.dll dan harfbuzz.dll di Windows, libharfbuzz.0.dylib dan libharfbuzz.dylib di macOS, serta libharfbuzz.so.0 dan libharfbuzz.so di tempat lainShape memunculkan EPdfTextShapingError untuk teks kosong, nama font kosong, ukuran font non-positif, batas Options tidak valid, teks melampaui MaxCharacters, glyph melampaui MaxGlyphs, atau data font yang tidak bisa disediakan resolverShape memunculkan EPdfHarfBuzzError ketika tidak ada TPdfFontDataResolver yang dikonfigurasi, ketika libharfbuzz tidak tersedia, atau ketika objek HarfBuzz tidak dapat dibuatOptions.MaxRuns, dan Options.Direction memetakan ptdLeftToRight serta ptdRightToLeft ke arah paragraf tetap, dengan nilai lain diselesaikan secara otomatisShaped.FontData menyimpan byte yang dikembalikan resolver, yang dibutuhkan TPdf.AddShapedText untuk membangun font CID