Arabic / Persian / Urdu şekillendirme desteği

Üretici tarafı şekillendirme hattı (v2.85.0 - v2.119.68)

 

OpenType GSUB motoru  CFF / OpenType alt kümeleme

HotPDF, Unicode girdili Arapça, Farsça ve Urduca dizileri PDF metni yazılırken Arapça Presentation Forms biçimlerine çeviren üretici tarafı bir shaping hattı çalıştırır; böylece okuyucu uygulamalar, kendi başlarına Harfbuzz sınıfı bir shaper'a ihtiyaç duymadan konumsal / bağlantı (ligature) gliflerini doğrudan alır.

 

Hattın yaptığı iş

Konumsal shaping (v2.85.0): her Arapça temel harfinin en fazla dört konumsal biçimi vardır — isolated (isol), initial (init), medial (medi), final (fina). HotPDF her Arapça karakterin birleşme sınıfını ve komşularının birleşme sınıflarını inceler, ardından girdi kod noktasını uygun Arabic Presentation Forms-B (U+FE70 - U+FEFC) glifiyle eşler. Birleşmeyen harfler, birleştiriciler, saydam karakterler (birleştirme işaretleri) ve Tatweel kashida'nın tümü Unicode Arabic Shaping algoritmasına göre işlenir.

 

LAM-ALEF zorunlu ligatürü (v2.119.32): Arapça Unicode Shaping spec; herhangi bir LAM'ın (U+0644) hemen ardından bir ALEF gelmesi (U+0627 düz, U+0622 maddalı, U+0623 üst hamzalı, U+0625 alt hamzalı) hâlinde tek bir ligatür glifine katlanmasını zorunlu kılar (U+FEFB - U+FEFC; uygun hamza / madda varyantlarıyla isolated / final biçimleri). Bu, Arapça tipografideki az sayıda isteğe bağlı olmayan ligatürden biridir ve doğruluk için gereklidir; bunları ayrı glifler olarak çizmek, ana dili okuyanların hemen bozuk metin olarak tanıdığı bir çıktı üretir. HotPDF bu katlamayı yazım sırasında gerçekleştirir; böylece çağıranların kendi kod yolunda Harfbuzz sınıfı bir shaper'a ihtiyacı olmaz.

 

Farsça / Urduca çekirdek 9 harf (v2.119.35): Farsça ve Urduca, Arabic Presentation Forms-B bloğunda (U+FE70 - U+FEFC) bulunmayan harflerle Arapçayı genişletir. En çok kullanılan 9 such harf — PEH (U+067E), TCHEH (U+0686), JEH (U+0698), KEH (U+06A9 / U+06AF), GAF (U+06AF), NOON GHUNNA (U+06BA), HEH DOACHASHMEE (U+06BE), YEH BARREE (U+06D2) ve HEH GOAL (U+06C1) dahil — Arabic Presentation Forms-A'da (U+FB50 - U+FDFF) sunum biçimlerine sahiptir. HotPDF artık konumsal shaping sırasında bu harfleri uygun Forms-A glifleriyle eşler; böylece Farsça ve Urduca metin, herhangi bir okuyucuda doğru init / medi / fina / isol biçimleriyle çizilir.

 

Arabic Extended-A + Supplement (v2.119.52, v2.119.56): birleşme sınıfı tablosu artık kalan Arabic Extended-A karakterlerini (ALEF WASLA / NOON GHUNNA / HEH varyantları), Arabic Supplement U+0750-U+077F aralığını ve üst Arabic Extended-A U+08A0-U+08FF aralığını kapsıyor. Sabit bir Presentation Forms-A kodlaması olan karakterler mevcut 4 konumlu shaper üzerinden eşlenir; olmayanlar (Extended-A'nın çoğu) yalnızca birleşme sınıfı sınıflandırması alır; böylece karakterin kendisi değişmeden geçse bile komşuları doğru şekillenir. v2.119.56, v2.119.52'nin getirdiği iki yanlış Forms-A eşlemesini (U+06C2 / U+06C3) düzeltti.

 

Farsça / Urduca Forms-B tam kapsamı (v2.119.57): birleşme sınıfı tablosu, tam U+0672-U+06D5 aralığını kapsayacak şekilde genişletildi (REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH varyantlarını kapsayan yaklaşık 80 karakter) ve 26 yeni Presentation Forms-A eşlemesi eklendi (15 D sınıfı 4 biçimli + 11 R sınıfı 2 biçimli). Özellikle Urduca'nın standart 'h'si HEH DOACHASHMEE (U+06BE → FBAA-FBAD) ve Urduca kelime sonu yeh'si YEH BARREE (U+06D2 → FBAE-FBAF), artık v2.119.52 ALEF WASLA / NOON GHUNNA geçici düzeltmesinin yanlış kullandığı Forms-A yuvalarına doğru biçimde eşleniyor. Sabit Forms-A kapsamı artık 40+ kaynak karakteri kapsıyor.

 

YEH-HAMZA + ünlü ligatürü son geçişi (v2.119.58): konumsal şekillendirmenin ardından _ApplyArabicShaping'e eklenen bir son geçiş, Forms-A bloğu U+FBEA-U+FBFB içindeki 8 ligatür çiftini kapsar — YEH-HAMZA + ALEF / AE / WAW / U / OE / YU / E / ALEF MAKSURA. Her çift, isolated biçimi (FBEA / FBEC / FBEE / FBF0 / FBF2 / FBF4 / FBF6 / FBF9) artı taban+1 final biçimini yazar. Başlangıç / medial biçim yuvaları FBF8 / FBFB, sfArabicGSUB isteğe bağlı kullanımıyla GSUB motoruna bırakılır. v2.119.32 LAM-ALEF ile aynı iskelet üzerine kuruludur.

 

Allah ligatürü (v2.119.60): ALEF + LAM + LAM + HEH şeklindeki dört karakterli dizi, U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM'a katlanır. _ApplyArabicShaping zincirinde v2.119.32 LAM-ALEF ve v2.119.58 YEH-HAMZA'nın ardından kod noktası düzeyinde statik bir son geçiş olarak uygulanmıştır.

 

Bismillah ifadesi ligatürü (v2.119.62): standart 22 kod noktalı Bismillah ifadesi "بسم الله الرحمن الرحيم", tek bir glife katlanır: U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM. _ApplyArabicShaping içinde (LAM-ALEF'ten önce) ilk ön geçiş olarak çalışır; böylece katlanmış Bismillah glifi hattın gerisine tek bir kod noktası olarak ulaşır ve sonraki ikamelerce dokunulmaz.

 

Herkese açık sorgu yardımcıları

GetArabicJoiningClass, statik Arapça shaper'ın kullandığı Unicode birleşme sınıfını döndürür. GetArabicPosition, bir dizedeki bir karakteri isolated, initial, medial veya final konumuna çözer; böylece çağıranlar metni yazmadan önce aynı shaping kararlarını inceleyebilir ya da aynalayabilir

 

Çağıranlar nasıl kullanır

Hattı bir kez PDF.AutoShapeArabic:= True ile açın; bundan sonra Unicode metin yazma metotlarının içinde otomatik çalışır — açık bir "bunu şekillendir" çağrısı gerekmez. Unicode girdili Arapça / Farsça / Urduca dizelerini THPDFPage.TextOut'a, THPDFPage.UnicodeTextOut'a veya THPDFPage.RtLTextOut'a geçirin; HotPDF, PDF metin gösterme operatörünü yazmadan önce her girdi kod noktasını sunum biçimiyle eşler. Sayfa yazı tipiyle çizilen free text annotation'lar da aynı şekilde şekillenir. Özgün Unicode baytları ayrıca ToUnicode CMap üretimi için FUnicodeUsedCps içine alınır; böylece okuyucu tarafı kopyala/yapıştır ve ekran okuyucular özgün Unicode yükünü görmeye devam eder.

 

Yazı tipi gereksinimleri

RegisterUnicodeTTF ile kaydedilen yazı tipi; hem Arabic Presentation Forms-B bloğu (U+FE70 - U+FEFC) hem de (Farsça / Urduca için) ilgili Arabic Presentation Forms-A aralığı (U+FB50 - U+FDFF) için glifler içermelidir. Tam kümeyi taşıyan önerilen yazı tipleri:

 

Noto Sans Arabic (Latin + Arapça; Forms-A + Forms-B + Arabic Extended-A).

Noto Naskh Arabic, Noto Naskh Arabic UI.

Amiri (traditional Naskh, full Forms-A + Forms-B coverage).

Scheherazade New (SIL; Müslüman dünyanın dilleri için tasarlanmıştır).

Microsoft Arabic Typesetting / Tahoma / Times New Roman (Windows ile paketli, tam Forms-B; bazılarında Forms-A kapsamı vardır).

 

Kayıtlı yazı tipinde, türetilmiş bir sunum biçimi için glif yoksa HotPDF temel Unicode kod noktasına geri döner ve onu değiştirmeden yazar; okuyucular daha sonra kendi shaping'lerini deneyebilir (Acrobat, Foxit) ya da .notdef çizebilir.

 

Tipik iş akışı

 

PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');

PDF.AutoShapeArabic:= True;

PDF.BeginDoc;

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

PDF.CurrentPage.RtLTextOut(100, 700, 0,

  UnicodeString(#$0645#$0631#$062D#$0628#$0627));  // "marhaba" (hello)

PDF.EndDoc;

 

Otomatik Phase 8 hattı entegrasyonu (v2.119.59 - v2.119.68)

v2.119.59; shaping hattını statik son geçiş katlamasının ötesine taşıyıp otomatik GSUB güdümlü yazı tipine özgü ikameye yükselten, isteğe bağlı ShapingFeatures: THPDFShapingFeatures özelliğini ve THPDFShapingFeature enum'unu getirdi. Kayıtlı yazı tipinin yerel Arapça init, medi, fina, isol, rlig, calt ve rclt lookup'larını uygulamak ve oluşan bağlamsal glif ID'lerini yazmak için PDF.ShapingFeatures := [sfArabicGSUB] yapın; şekillendirilmiş bu diziye GPOS el yazısı giriş/çıkış çıtalarını uygulamak için sfCursiveAttachment ekleyin; Latin standart ligatürleri için sfStandardLigatures ekleyin (FB00-FB06 ff / fi / fl / ffi / ffl / ſt / st; v2.119.65 ApplyLatinLigatureRefinement ile); Devanagari ön geçiş yeniden sıralamasını etkinleştirmek için sfIndicShaping ekleyin (v2.119.67). Varsayılan [], statik hatta bağlı kalan çağıranlar için bayt düzeyinde aynı çıktıyı korur.

 

sfArabicGSUB ayarlandığında, statik Unicode Presentation Forms shaper'ı devre dışı bırakılır ve yazı tipinin kendi GSUB kuralları tercih edilir. HotPDF; bu gliflere font cmap'ten ulaşılamıyorsa yerel bağlamsal glif ID'lerini sentetik kod noktaları üzerinden yazar, gömülü alt kümeyi kapalı tutar ve kopyala/yapıştır için ToUnicode ters eşlemelerini yazar. Statik shaper'ın, yazı tipinin GSUB'unun bildirdiği dışındaki kod noktası kapsamı için de çalışmaya devam etmesini isteyen çağıranlar sfArabicGSUB'u kapalı bırakıp statik son geçiş zincirine güvenmelidir

 

ToUnicode CMap ligatürü ters eşlemesi (v2.119.61, v2.119.62, v2.119.65)

RegisterUnicodeTTF'in yazdığı Adobe-Identity-UCS ToUnicode CMap'i, son geçiş zincirinin üretebileceği her ligatür kod noktası için bfchar ters eşleme girdileri taşır. v2.119.61 27 girdi ekledi (8 LAM-ALEF + 18 YEH-HAMZA ailesi + 1 Allah); v2.119.62 Bismillah'ı (U+FDFD); v2.119.65 7 Latin standart ligatür girdisini (FB00-FB06) ekledi. Okuyucu tarafı kopyala/yapıştır, her ligatür glifini kaynak kod noktası dizisine geri çözer; böylece çizilen PDF erişilebilirlik dostu kalır.

 

PUA sentetik kod noktası yazımı (v2.119.68)

AssignSyntheticCodepointForGID(GID; out CP): Boolean + GetSyntheticCodepointForGID(GID): Word; üretici kodun, font cmap'i üzerinden ulaşılamayan doğal Unicode kod noktası olmayan GSUB ikame GID'lerini yazmasını sağlar. Ayırıcı, Private Use Area'dan (U+E000 - U+F8FF, 6400 yuva) kod noktaları dağıtır ve atamayı üç yere yansıtır: FUnicodeCpToGid (/CIDToGIDMap, sentetik CP'yi okuyucuda hedef GID'ye çözer), FAcroFormUnicodeAdvances (v2.65 satır sarması doğru em kesrini bulur) ve GID başına ters arama tablosu (tekrarlanan atama istekleri idempotent olur). Bunu; GSUB'un getirdiği ama cmap'in ulaşmadığı Devanagari küme biçimleri, üslup alternatifleri ve CJK ideografik varyasyon dizileri için kullanın.

 

OpenType GSUB motoruyla ilişkisi

Yukarıda anlatılan statik son geçiş shaper'ı (v2.85.0 + v2.119.32 / 58 / 60 / 62) varsayılan olarak OpenType GSUB motorundan bağımsızdır. ShapingFeatures üzerinden sfArabicGSUB etkinleştirildiğinde GSUB motoru, üretici tarafı yazım yolunun parçası olur: HotPDF bir temel GID dizisi kurmak için cmap'e bakar, o glif dizisine yerel Arapça konumsal ve bağlamsal GSUB lookup'larını uygular, Unicode Presentation Form'u olmayan ikame glif ID'leri için sentetik kod noktaları atar ve ikame glifleri gömülü yazı tipi alt kümesi içinde tutmak için MarkUnicodeGlyphUsed çağırır.

 

Unicode kod noktası olmayan ikame glifler için çağıranlar, ShapingFeatures'i v2.119.68 PUA sentetik kod noktası ayırıcısıyla birleştirir; böylece ikame GID standart hex hattı üzerinden yine de ulaşılabilir olur. Statik son geçiş zinciri, yazı tipinin GSUB bildirimlerinin kapsamadığı kod noktaları için varsayılan geri dönüş olarak kalır.

 

Kapsam ve sınırlamalar

BiDi algoritması bu sayfanın kapsamı dışındadır: çağıranlar, karışık LTR ve RTL dizilerini hâlâ kendileri sıralamalı ya da ayrı bir BiDi kitaplığı kullanmalı. GPOS, Indic/Tibetçe/Moğolca, İbranice, N'Ko, Adlam, Thai/Lao ve Cava desteği artık ayrı isteğe bağlı shaping bayrağı ve API sayfalarında yaşıyor; bu sayfa yalnızca statik ve GSUB tabanlı Arapça shaping'e odaklanıyor

 

Ayrıca bkz.: OpenType GSUB Substitution Engine, Otomatik shaping hattı (Phase 8), Süryanice / Moğolca / Devanagari shaping, THotPDF.AssignSyntheticCodepointForGID, THPDFPage.RtLTextOut, THPDFPage.UnicodeTextOut, CFF / OpenType yazı tipi alt kümeleme