Szír / mongol / devanagari formázás támogatása

Többírásos képességfelületek (v2.119.53 - v2.119.55)

 

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

A HotPDF kapcsolódási osztály (joining-class) / pozícióelemző (positional-analysis) / indiai szótagkategória (Indic syllabic-category) képességfelületeket tesz elérhetővé az arab nyelven kívül három összetett írásrendszerhez: a szír (U+0700-U+074F), a mongol (U+1800-U+18AF) és a devanagari (U+0900-U+097F) nyelvekhez. Mindegyik képesség lehetővé teszi a hívók számára, hogy a meglévő OpenType GSUB motoron keresztül vezéreljék az írásrendszert a helyes formázás érdekében, miközben a nehéz feladatokat (klaszterhatár-felismerés, BiDi feloldás, GPOS pozicionálás) a HotPDF hatókörén kívül tartják

 

Szír formázási képesség (v2.119.53)

Két új metódus mutatja be a szír kapcsolódási viselkedést:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

A szír ugyanazt a jobbra kapcsolódó (Right-Joining) / kettősen kapcsolódó (Dual-Joining) / transzparens (Transparent) / nem kapcsolódó (Non-Joining) négyosztályos keretrendszert követi, mint az arab; a GetSyriacJoiningClass osztályozza az U+0700-U+074F blokk minden egyes kódpontját a Unicode kapcsolódási tulajdonságának megfelelően. A GetSyriacPosition végigmegy egy szír futamon, és a közvetlen szomszédai kapcsolódási osztályai alapján feloldja az egyes karaktereket izolált / kezdeti / mediális / végső pozícióra

 

Az arabtól eltérően a szír blokk nem rendelkezik előre kódolt bemutatási formákkal (Presentation Forms) a Unicode-ban – a szírnek nincs megfelelője az U+FB50-FDFF / U+FE70-FEFC arab bemutatási formák blokkjainak. A fogyasztóknak ezért a betűtípus által meghatározott GSUB kereséseken (jellemzően init / medi / fina / isol + rlig) keresztül kell vezérelniük a szír formázást, nem pedig a kódpontok átírásával. A fenti képességi réteg megadja a hívóknak azokat a pozíciócímkéket, amelyekre szükségük van a megfelelő GSUB funkció lekérdezéséhez minden egyes glifához

 

Mongol formázási képesség (v2.119.54)

Két párhuzamos metódus a mongol nyelvhez:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;

 

A lefedettség magában foglalja az alapvető mongol (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu és Ali Gali kiterjesztéseket. Az FVS1 / FVS2 / FVS3 (U+180B-U+180D) variációs szelektorok, a NIRUGU (U+180A) lágy kötőjel és az Ali Gali magánhangzó-jelek mind transzparens (T-osztályú) besorolást kaptak, így részt vesznek a kapcsolódásban anélkül, hogy megszakítanák a futást

 

A szírhez hasonlóan a mongolnak sincsenek előre kódolt bemutatási formái a Unicode-ban. A mongol hagyományos függőleges elrendezése, az összetett betűalak-változási szabályok és az FVS-vezérelt alakválasztás mind a betűtípus by determined GSUB keresések (jellemzően init / medi / fina / isol + ccmp / rlig / locl) által vezéreltek; a képesség-réteg biztosítja a hívók számára a funkciók lekérdezéséhez szükséges pozíciócímkéket

 

Devanagari indiai formázási képesség (v2.119.55)

A devanagari alapvetően különbözik az arab / szír / mongol nyelvektől – ez egy indiai abugida írásrendszer, ahol az értelmes egység egy szótagklaszter (akshara), nem pedig egyetlen betű, és a glifák renderelt sorrendje a klaszteren belül gyakran eltér a logikai Unicode sorrendtől. Két metódus teszi elérhetővé a devanagari indiai képességi réteget:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

A GetDevanagariCategory osztályozza az U+0900-U+097F tartomány minden egyes kódpontját a 13 indiai szótagkategória egyikébe (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other), így a hívók felismerhetik a szótaghatárokat, és azonosíthatják, hogy az egyes klasztereken belül mely pozíciók igényelnek újrarendezést

 

Az ApplyDevanagariReorder egy előzetes menet (pre-pass), amely végigmegy a bemeneti futamon, és alkalmazza a két fő devanagari újrarendezési szabályt: (1) a Repha (Ra + Halant a szótagklaszter elején) a klaszter alapmássalhangzója utáni pozícióba kerül, így felső indexben lévő horogként renderelődik; (2) az alap-előtti I-matra (U+093F DEVANAGARI VOWEL SIGN I) a klaszter alapmássalhangzója elé kerül, így bal oldali horogként renderelődik. A többi indiai újrarendezés (alap feletti matra, alap alatti matra, konjunkt képzés) a betűtípus GSUB motorjára van bízva, mivel ezek betűtípus-specifikus keresőtáblákat igényelnek

 

Automatikus integráció (v2.119.67): ha a sfIndicShaping a PDF.ShapingFeatures-ben van, az ApplyDevanagariReorder automatikusan előzetes menetként kerül alkalmazásra a három BuildUnicode*FieldContent segédmetóduson belül. A felhasználói olvasó GSUB motorja ezután a megfelelő sorrendben olvassa be a szótagot, és alkalmazza saját kontextuális formázási szabályait. Lásd: Automatikus formázási pipeline

 

Tipikus munkafolyamat (szír)

 

PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf');

PDF.SetGSUBScript('syrc'); // see GSUB engine doc

for i := 0 to Length(Run) - 1 do

begin

Pos := PDF.GetSyriacPosition(Run, i); // init / medi / fina / isol

// a pozíciónak megfelelő helyettesítő glifa lekérdezése a GSUB-ból

// emit + MarkUnicodeGlyphUsed

end;

 

Tipikus munkafolyamat (devanagari automatikus újrarendezéssel)

 

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

PDF.ShapingFeatures := [sfIndicShaping]; // auto Repha + I-matra reorder

PDF.CurrentPage.SetFont('NotoDeva', [], 14);

PDF.CurrentPage.UnicodeTextOut(50, 700, 0,

UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"

 

Unicode részhalmaz és kinyerési segédek

A RegisterToUnicodeReverseMapping rögzíti a forrás kódpontokat a formázott vagy szintetikus glifakimenethez. A ClearToUnicodeReverseMappings visszaállítja a táblázatot, a ToUnicodeReverseMappingCount jelenti annak méretét, a GetUnicodeGlyphForCodepoint visszaadja a regisztrált betűtípus glifa-azonosítóját egy Unicode kódponthoz, és az EnableShapingFeatureForSubset megjelöli a helyettesítő glifákat egy GSUB funkcióból a beágyazott részhalmazba való felvételhez

 

Hatókör és korlátozások

Jelenlegi előállító-oldali integráció

A szír, mongol, tibeti és indiai formázás már külön API reference oldalakat kapott. A szír az AutoShapeSyriac, a mongol az sfMongolianShaping, a tibeti az sfTibetanShaping, az indiai újrarendezés az sfIndicShaping, a teljes indiai GSUB formázás pedig az sfIndicGSUB segítségével engedélyezhető. A részletes belépési pontok a tibeti, mongol és szír formázási módszerek, valamint az indiai formázási módszerek oldalain vannak dokumentálva

A jelenlegi hatókör kiterjed a N'Ko és Adlam nyelvekre is mint RTL kurzív írásrendszerekre, a thai/laoszi SARA AM és tónusjel-rendezésre, a héber niqqud rendezésre, valamint a jávai alap-előtti jelekre. Ezek a folyamatok az írásrendszer formázási előfeldolgozási módszerek oldalon vannak dokumentálva

 

 

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