THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

THotPDF pengalokasi codepoint sintetis PUA (v2.119.68)

 

Mesin GSUB  Pipeline Shaping Otomatis  Shaping Arab

Mengalokasikan dan menanyakan codepoint sintetis Private Use Area (U+E000 - U+F8FF) untuk GID substitusi OpenType GSUB yang tidak memiliki codepoint Unicode alami yang dapat dijangkau melalui cmap font. Menutup celah emisi level GID sisi produsen yang tersisa dari API query dan refinement GSUB v2.119.43-66

 

Sintaks Delphi:

function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean;

function GetSyntheticCodepointForGID(GID: Word): Word;

 

Mengapa API ini ada

Pipeline shaping otomatis sisi produsen v2.119.32-67 (Arabic / Latin / Devanagari) memerlukan GID substitusi yang dikembalikan mesin GSUB agar dapat dijangkau melalui codepoint Unicode - pipeline teks ber-hex yang sudah ada mengeluarkan codepoint, bukan GID, dan pembaca klien memetakan kembali codepoint ke GID melalui /CIDToGIDMap yang disematkan. Untuk GID substitusi yang memiliki codepoint Unicode alami melalui cmap font (Arabic Presentation Forms, Latin Standard Ligatures FB00-FB06), pipeline yang sudah ada bekerja dengan baik

 

Namun substitusi khusus font yang berakhir pada GID internal font - sebagian besar bentuk klaster Devanagari, alternate stilistik yang hanya dikirim desainer font sebagai GID bernomor, sequence variasi ideografis CJK (IVS), discretionary ligature tanpa Presentation Form yang bersesuaian - sama sekali tidak memiliki codepoint di cmap font. Sebelum v2.119.68, GID ini tidak dapat dijangkau melalui pipeline hex sisi produsen; v2.119.68 menutup celah itu dengan membiarkan pemanggil mengalokasikan codepoint sintetis di Private Use Area untuk GID apa pun

 

Semantik AssignSyntheticCodepointForGID

Mengalokasikan codepoint PUA berikutnya yang masih tersedia, mulai dari U+E000, untuk GID yang diberikan, lalu menyalin penugasan itu ke setiap cache yang dipakai rantai pipeline hex sisi produsen + resolusi pembaca konsumen:

 

1 FUnicodeCpToGid[SyntheticCP] := GID - sehingga pipeline hex sisi produsen mengeluarkan SyntheticCP ke operator text-showing dan pembaca konsumen memetakan kembali SyntheticCP ke GID melalui /CIDToGIDMap saat render

2 FAcroFormUnicodeAdvances[SyntheticCP] := em-fraction - sehingga kalkulator word-wrap v2.65 menemukan advance hmtx yang benar untuk codepoint sintetis ketika muncul di konten text field AcroForm

3 FUnicodeSyntheticCpForGID[GID] := SyntheticCP - tabel reverse lookup per GID yang dipakai GetSyntheticCodepointForGID agar pemanggilan ulang AssignSyntheticCodepointForGID bersifat idempoten, yaitu panggilan kedua dengan GID yang sama mengembalikan SyntheticCP yang sudah dialokasikan

 

Mengembalikan True saat berhasil, dengan SyntheticCP berisi codepoint yang dialokasikan. Mengembalikan False dan membiarkan SyntheticCP bernilai 0 pada kondisi defensif berikut: tidak ada font yang didaftarkan, RegisterUnicodeTTF belum pernah dipanggil atau dipanggil dengan argumen kosong untuk mereset state; GID tidak valid, yaitu nol atau melewati jumlah glyph cmap; rentang PUA habis, yaitu semua 6400 slot U+E000 - U+F8FF sudah teralokasi; cache belum terinisialisasi saat masuk

 

Semantik GetSyntheticCodepointForGID

Query murni fungsional atas assignment yang sudah ada. Mengembalikan codepoint sintetis yang dialokasikan untuk GID jika AssignSyntheticCodepointForGID(GID, ...) pernah dipanggil sebelumnya; jika tidak, mengembalikan 0, yang bukan codepoint PUA valid sehingga sekaligus menjadi penanda tidak ada assignment. Tidak melakukan alokasi. Aman dipanggil sebelum AssignSyntheticCodepointForGID mana pun dijalankan

 

Siklus hidup state allocator

FUnicodeSyntheticCpForGID dan kursor PUA berikutnya yang masih tersedia, yaitu FUnicodeNextSyntheticCp, dialokasikan secara lazy saat AssignSyntheticCodepointForGID pertama kali dipanggil. Kursor dimulai dari 0, artinya belum diinisialisasi, lalu naik ke $E000 pada alokasi pertama; alokasi berikutnya menggerakkannya melalui $E001, $E002, dan seterusnya hingga $F8FF. Kedua field di-reset ke kosong / 0 pada setiap RegisterUnicodeTTF('', nil) bersama state subset per font lainnya, sehingga pemanggil yang memakai ulang instance THotPDF di beberapa dokumen memulai setiap dokumen dengan kursor PUA baru

 

Alur kerja umum (bentuk klaster Devanagari)

 

PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');

PDF.ShapingFeatures := [sfIndicShaping];

PDF.SetGSUBScript('deva');

 

// Get a font-internal cluster GID through the GSUB engine

ClusterGID := PDF.GetSingleSubstituteGlyph(BaseGID, 'nukt');

if ClusterGID <> BaseGID then

begin

  // Check if cmap reaches the substitute - usually no for Indic

  // clusters, since cluster GIDs are font-internal

  // Allocate a synthetic codepoint that the producer-side

  // hex pipeline can emit

  if PDF.AssignSyntheticCodepointForGID(ClusterGID, SyntheticCP) then

  begin

    // SyntheticCP is now in the U+E000-F8FF range; emit it

    // through UnicodeTextOut just like a normal codepoint

    PDF.CurrentPage.UnicodeTextOut(X, Y, 0, UnicodeChar(SyntheticCP));

    PDF.MarkUnicodeGlyphUsed(ClusterGID);

  end;

end;

 

Contoh idempoten

 

PDF.AssignSyntheticCodepointForGID(150, CP1);  // CP1 = $E000

PDF.AssignSyntheticCodepointForGID(151, CP2);  // CP2 = $E001

PDF.AssignSyntheticCodepointForGID(150, CP3);  // CP3 = $E000 (idempotent)

CP4 := PDF.GetSyntheticCodepointForGID(150);  // CP4 = $E000

CP5 := PDF.GetSyntheticCodepointForGID(999);  // CP5 = 0 (no assignment)

 

Perilaku pembaca konsumen

Pembaca konsumen melihat codepoint PUA di operator text-showing dan memetakannya melalui /CIDToGIDMap yang tertanam di dokumen ke GID target, lalu merender GID itu memakai program font yang disematkan. Dari sudut pandang pembaca, tidak ada perbedaan antara codepoint Unicode "alami" yang diarahkan cmap ke GID dan codepoint sintetis PUA yang diarahkan /CIDToGIDMap ke GID - keduanya menghasilkan glyph yang sama saat dirender

 

Perilaku copy / paste: codepoint PUA round-trip sebagai dirinya sendiri melalui copy / paste ketika CMap ToUnicode menyatakannya sebagai pemetaan identitas. Pemanggil yang ingin karakter Unicode sumber, yaitu run input yang menghasilkan substitusi, ikut round-trip dapat mendaftarkan pemetaan balik dengan RegisterToUnicodeReverseMapping atau menulis properti sequence marked-content ActualText melalui BeginTaggedContent dan mengeluarkan codepoint sintetis di dalam konten yang dibatasi. HotPDF memakai pola CID internal yang sama secara otomatis untuk stream appearance AcroForm berbasis RegisterUnicodeTTF yang berisi karakter Unicode supplementary plane

 

Penutupan roadmap Phase 8

v2.119.68 / Phase 8c.6 menutup roadmap mesin GSUB Phase 8: semua API query LookupType 1-8 (Phase 1-6), API pemilihan Script / LangSys (Phase 7), entry point penutupan subsetter TTF (Phase 9), folding ligatur pasca-langkah statis (v2.119.32 / 58 / 60 / 62), pipeline otomatis opt-in (v2.119.59), emisi otomatis Arabic rlig + Latin liga / clig + rclt (Phase 8b / 8c.2 / 8b / GSUB 'rclt'), reverse mapping ToUnicode (v2.119.61 / 62 / 65), query advance (v2.119.64), pre-pass reorder Indic Devanagari (v2.119.67), dan kini emit codepoint sintetis PUA di level GID (v2.119.68) semuanya menyatu ke satu permukaan shaping sisi produsen yang menangani setiap jenis glyph substitusi yang dapat dihasilkan font OpenType

 

Lihat juga: Mesin Substitusi OpenType GSUB, Pipeline Shaping Otomatis (Phase 8), Dukungan shaping Arab / Persia / Urdu, Shaping Syriac / Mongolian / Devanagari, THotPDF.BeginTaggedContent