THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

THotPDF PUA szintetikus kódpont-allokátor (v2.119.68)

 

GSUB motor Automatikus formázási folyamat Arab formázás

Lefoglal és lekérdez Private Use Area (U+E000 - U+F8FF) szintetikus kódpontokat az olyan OpenType GSUB helyettesítő GID-ekhez, amelyeknek nincs a betűtípus cmap-ján keresztül elérhető természetes Unicode kódpontjuk. Bezárja a v2.119.43-66 GSUB lekérdezési és finomítási API-k által hagyott előállítóoldali GID-szintű kibocsátási rést

 

Delphi szintaxis:

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

function GetSyntheticCodepointForGID(GID: Word): Word;

 

Miért létezik az API

A v2.119.32-67 előállítóoldali automatikus formázási folyamat (arab / latin / devanagari) megköveteli, hogy a GSUB motor by visszaadott helyettesítő GID-ek elérhetőek legyenek egy Unicode kódponton keresztül - a meglévő hexadecimálisan kódolt szövegfolyam kódpontokat bocsát ki, nem GID-eket, és a fogyasztó olvasó a beágyazott /CIDToGIDMap segítségével oldja fel a kódpontot GID-re. Az olyan helyettesítő GID-ek esetében, amelyek a betűtípus cmap-ján keresztül természetes Unicode kódponttal rendelkeznek (arab prezentációs formák, latin szabványos ligatúrák FB00-FB06), a meglévő folyam jól működik

 

Azonban a betűtípus-specifikus helyettesítések, amelyek belső GID-ekre mutatnak - a legtöbb devanagari klaszterforma, stílusbeli alternatívák, amelyeket a betűtípus tervezője csak számozott GID-ként biztosít, CJK ideográfiai variációs szekvenciák (IVS), egyedi ligatúrák megfelelő prezentációs forma nélkül - egyáltalán nem rendelkeznek kódponttal a betűtípus cmap-jában. A v2.119.68 előtt ezek a GID-ek elérhetetlenek voltak az előállítóoldali hexadecimális folyamon keresztül; a v2.119.68 bezárja ezt a rést azáltal, hogy lehetővé teszi a hívók számára, hogy szintetikus kódpontot foglaljanak le a Private Use Area területen bármely GID-hez

 

Az AssignSyntheticCodepointForGID szemantikája

Lefoglalja a következő szabad PUA kódpontot (U+E000-tól kezdve) a megadott GID-hez, és tükrözi a hozzárendelést minden olyan gyorsítótárba, amelytől a meglévő előállítóoldali hex folyam és a fogyasztó-olvasó feloldási lánc függ:

 

1. FUnicodeCpToGid[SyntheticCP] := GID - így az előállítóoldali hex folyam a SyntheticCP értéket bocsátja ki a szövegmegjelenítő operátorba, a fogyasztó olvasó pedig a rendereléskor a /CIDToGIDMap-en keresztül oldja fel a SyntheticCP-t a GID értékre

2. FAcroFormUnicodeAdvances[SyntheticCP] := em-fraction - így a v2.65-ös sortörés-kalkulátor megtalálja a megfelelő hmtx előrelépést (advance) a szintetikus kódponthoz, amikor az egy AcroForm szövegmező tartalmában megjelenik

3. FUnicodeSyntheticCpForGID[GID] := SyntheticCP - a GID-enkénti fordított keresési táblázat, amelyet a GetSyntheticCodepointForGID használ, hogy az ismételt AssignSyntheticCodepointForGID hívásokat idempotenssé tegye (a második hívás ugyanazzal a GID-del a már lefoglalt SyntheticCP-t adja vissza)

 

Siker esetén True értékkel tér vissza, a SyntheticCP-t a lefoglalt kódpontra állítva. False értékkel tér vissza (és a SyntheticCP-t 0-n hagyja) az alábbi védelmi feltételek bármelyike esetén: nincs regisztrálva betűtípus (a RegisterUnicodeTTF nincs meghíva, vagy üres argumentumokkal lett meghíva az állapot visszaállításához), érvénytelen GID (nulla vagy a cmap glifaszámán kívüli), a PUA tartomány kimerült (mind a 6400 slot az U+E000 - U+F8FF tartományban le lett foglalva), a gyorsítótár inicializálatlan a belépéskor

 

A GetSyntheticCodepointForGID szemantikája

Egy meglévő hozzárendelés tiszta funkcionális lekérdezése. Visszaadja a GID-hez lefoglalt szintetikus kódpontot, ha az AssignSyntheticCodepointForGID(GID, ...) korábban meg lett hívva; egyébként 0-t ad vissza (ami nem érvényes PUA kódpont, így "nincs hozzárendelés" őrszemként szolgál). Nem foglal le területet. Biztonságosan hívható bármely AssignSyntheticCodepointForGID futtatása előtt

 

Az allokátor állapotának életciklusa

Az FUnicodeSyntheticCpForGID és a következő szabad PUA kurzor (FUnicodeNextSyntheticCp) lusta allokációval (lazy-allocated) jönnek létre az első AssignSyntheticCodepointForGID híváskor. A kurzor 0-ról (inicializálatlan) indul, és az első allokációnál $E000-ra ugrik; a későbbi allokációk a $E001, $E002, ..., $F8FF értékeken keresztül léptetik. Mindkét mező üresre / 0-ra áll vissza minden RegisterUnicodeTTF('', nil) híváskor a betűtípusonkénti részhalmaz állapot többi részével együtt, így azok a hívók, amelyek a THotPDF példányt több dokumentumban is újrahasználják, minden dokumentumot új PUA kurzorral indítanak

 

Tipikus munkafolyamat (Devanagari klaszterforma)

 

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

PDF.ShapingFeatures := [sfIndicShaping];

PDF.SetGSUBScript('deva');

 

// Egy belső klaszter GID lekérése a GSUB motoron keresztül

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

if ClusterGID <> BaseGID then

begin

// Ellenőrzi, hogy a cmap eléri-e a helyettesítőt - Indic esetén ez általában nem

// klaszterekre igaz, mivel a klaszter GID-ek belsők

// Szintetikus kódpont lefoglalása, amelyet az előállítóoldali

// hex folyam ki tud bocsátani

if PDF.AssignSyntheticCodepointForGID(ClusterGID, SyntheticCP) then

begin

// A SyntheticCP most már az U+E000-F8FF tartományban van; kibocsátja

// a UnicodeTextOut-on keresztül, mint egy normál kódpontot

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

PDF.MarkUnicodeGlyphUsed(ClusterGID);

end;

end;

 

Idempotencia példa

 

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

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

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

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

CP5 := PDF.GetSyntheticCodepointForGID(999); // CP5 = 0 (nincs hozzárendelés)

 

Fogyasztó-olvasó viselkedés

A fogyasztó olvasó a PUA kódpontot látja a szövegmegjelenítő operátorban, és a dokumentumba ágyazott /CIDToGIDMap-en keresztül feloldja a cél GID-re, majd rendereli azt a beágyazott betűtípusprogram segítségével. Az olvasó szempontjából nincs különbség egy "természetes" Unicode kódpont, amelyet a cmap a GID-re irányít, és egy PUA szintetikus kódpont között, amelyet a /CIDToGIDMap irányít a GID-re - mindkettő ugyanazt a renderelt glifát eredményezi

 

Másolási / beillesztési viselkedés: a PUA kódpontok önmagukként fordulnak meg a másolás / beillesztés során, ha a ToUnicode CMap identitásleképezésként deklarálja őket. Azok a hívók, akik azt szeretnék, hogy a forrás Unicode karakterek (a helyettesítést eredményező bemeneti futás) forduljanak meg helyette, regisztrálhatnak egy fordított leképezést a RegisterToUnicodeReverseMapping metódussal, vagy ActualText jelölt-tartalom szekvencia tulajdonságokat hozhatnak létre a BeginTaggedContent segítségével, és a zárójeles tartalomon belül bocsáthatják ki a szintetikus kódpontokat. A HotPDF automatikusan ugyanazt a belső CID-mintát használja a RegisterUnicodeTTF-alapú AcroForm megjelenési folyamokhoz, amelyek kiegészítő-síkbeli Unicode karaktereket tartalmaznak

 

A Phase 8 ütemterv lezárása

A v2.119.68 / Phase 8c.6 lezárja a Phase 8 GSUB motor ütemtervet: minden LookupType 1-8 lekérdező API (Phase 1-6), a Script / LangSys kiválasztási API (Phase 7), a TTF részhalmaz-képző lezárási belépési pont (Phase 9), a statikus utólagos ligatúra-összevonás (v2.119.32 / 58 / 60 / 62), az opcionális automatikus folyamat (v2.119.59), az arab rlig + latin liga / clig + rclt automatikus kibocsátás (Phase 8b / 8c.2 / 8b / GSUB 'rclt'), a ToUnicode fordított leképezés (v2.119.61 / 62 / 65), az előrelépés-lekérdezés (v2.119.64), a Devanagari Indic újrarendezési előfutam (v2.119.67) és a mostani PUA szintetikus kódpont GID-szintű kibocsátás (v2.119.68) mind egyetlen előállítóoldali formázási felületbe integrálódik, amely kezeli a helyettesítő glifák minden típusát, amit egy OpenType betűtípus előállíthat

 

Lásd még: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent