پشتیبانی شکل‌دهی سریانی / مغولی / دواناگری

بخش‌های قابلیت چند اسکریپتی (نسخه ۲.۱۱۹.۵۳ - ۲.۱۱۹.۵۵)

 

شکل‌دهی عربی  خط لوله شکل‌دهی خودکار  موتور GSUB

HotPDF برای سه خط پیچیده فراتر از عربی، سطح‌های joining-class، تحلیل موقعیت و category هجایی Indic را در معرض می‌گذارد: سریانی (U+0700-U+074F)، مغولی (U+1800-U+18AF) و دواناگری (U+0900-U+097F). هر قابلیت به فراخواننده اجازه می‌دهد با استفاده از موتور OpenType GSUB موجود، آن خط را برای شکل‌دهی درست هدایت کند، در حالی که کارهای سنگین‌تر مانند تشخیص مرز خوشه، حل BiDi و موقعیت‌دهی GPOS خارج از دامنهٔ HotPDF می‌مانند

 

قابلیت شکل‌دهی سریانی (v2.119.53)

دو روش جدید رفتار اتصال سریانی را در معرض می‌گذارند:

 

function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass;

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

 

سریانی همان چارچوب چهارکلاسه Right-Joining / Dual-Joining / Transparent / Non-Joining را مثل عربی دنبال می‌کند؛ GetSyriacJoiningClass هر codepoint در بلوک U+0700-U+074F را بر اساس Unicode joining property دسته‌بندی می‌کند. GetSyriacPosition یک run سریانی را پیمایش می‌کند و هر نویسه را بر پایه کلاس‌های اتصال همسایه‌های بلافصل آن به موقعیت isolated / initial / medial / final نگاشت می‌کند

 

برخلاف عربی، بلوک سریانی Presentation Forms از پیش در Unicode ندارد - معادلی برای بلوک‌های Arabic Presentation Forms U+FB50-FDFF / U+FE70-FEFC در سریانی وجود ندارد. بنابراین مصرف‌کننده‌ها باید شکل‌دهی سریانی را از طریق GSUB lookupهای تعریف‌شده در فونت (معمولاً init / medi / fina / isol + rlig) هدایت کنند، نه با بازنویسی codepoint. لایه قابلیت بالا برچسب‌های موقعیتی لازم را به فراخواننده می‌دهد تا feature درست GSUB را برای هر glyph پرس‌وجو کند

 

قابلیت شکل‌دهی مغولی (v2.119.54)

دو روش موازی برای مغولی:

 

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

 

پوشش شامل Mongolian پایه (U+1820-U+1842)، Todo (U+1843-U+1877)، Sibe (U+1880-U+18A8)، Manchu و extensionهای Ali Gali است. Variation Selectorهای FVS1 / FVS2 / FVS3 (U+180B-U+180D)، خط‌تیره نرم NIRUGU (U+180A) و نشان‌های واکه Ali Gali همگی به عنوان Transparent (T-class) دسته‌بندی می‌شوند تا بدون شکستن پیمایش، در اتصال مشارکت کنند

 

مثل سریانی، مغولی هم Presentation Forms از پیش‌کدگذاری‌شده در Unicode ندارد. چیدمان عمودی سنتی مغولی، قواعد پیچیده تغییر شکل نویسه‌ها و انتخاب شکل مبتنی بر FVS همگی باید از طریق GSUB lookupهای تعریف‌شده در فونت هدایت شوند (معمولاً init / medi / fina / isol + ccmp / rlig / locl)؛ لایه قابلیت، برچسب‌های موقعیتی لازم برای پرس‌وجوی آن featureها را در اختیار فراخواننده می‌گذارد

 

قابلیت شکل‌دهی Indic برای دواناگری (v2.119.55)

دواناگری از عربی / سریانی / مغولی بنیادی‌تر متفاوت است - این یک خط abugida از خانواده Indic است که در آن واحد معنادار خوشه هجایی (akshara) است، نه یک نویسه منفرد، و ترتیب نمایش glyphها درون یک خوشه اغلب با ترتیب منطقی Unicode تفاوت دارد. دو روش، لایه قابلیت Indic دواناگری را در معرض می‌گذارند:

 

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

 

GetDevanagariCategory هر codepoint در U+0900-U+097F را در یکی از 13 category هجایی Indic دسته‌بندی می‌کند (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) تا فراخواننده بتواند مرزهای هجایی را تشخیص دهد و بفهمد کدام موقعیت‌ها در هر خوشه به reorder نیاز دارند

 

ApplyDevanagariReorder یک pre-pass است که run ورودی را پیمایش می‌کند و دو قاعده اصلی reorder دواناگری را اعمال می‌کند: (1) Repha (Ra + Halant در آغاز یک خوشه هجایی) به موقعیت بعد از consonant پایه خوشه منتقل می‌شود تا به صورت یک قلاب بالانویس رندر شود؛ (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) قبل از consonant پایه خوشه قرار می‌گیرد تا به صورت یک قلاب سمت چپ رندر شود. سایر reorderهای Indic (matra بالابنیاد، matra پایین‌بنیاد، تشکیل conjunct) به GSUB engine فونت واگذار می‌شوند چون به lookup tableهای مخصوص فونت نیاز دارند

 

ادغام خودکار (v2.119.67): وقتی sfIndicShaping in PDF.ShapingFeatures فعال باشد، ApplyDevanagariReorder به‌طور خودکار به‌عنوان یک pre-pass داخل سه helperِ BuildUnicode*FieldContent اعمال می‌شود. موتور GSUBِ reader مصرف‌کننده سپس syllable را به ترتیب درست برمی‌دارد و قواعد shaping زمینه‌ای خودش را اعمال می‌کند. خط لولهٔ شکل‌دهی خودکار را ببینید

 

گردش‌کار معمول (سریانی)

 

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

  // query GSUB for the position-appropriate substitute glyph

  // emit + MarkUnicodeGlyphUsed

end;

 

گردش‌کار معمول (دواناگری با بازآرایی خودکار)

 

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 برای subset و استخراج

RegisterToUnicodeReverseMapping کدپوینت‌های مبدأ را برای خروجی glyphهای شکل‌گرفته یا مصنوعی ثبت می‌کند. ClearToUnicodeReverseMappings جدول را بازنشانی می‌کند، ToUnicodeReverseMappingCount اندازهٔ آن را گزارش می‌دهد، GetUnicodeGlyphForCodepoint GID glyph فونت ثبت‌شده را برای یک کدپوینت Unicode برمی‌گرداند، و EnableShapingFeatureForSubset glyphهای substitute از یک featureِ GSUB را برای inclusion در embedded subset علامت می‌زند

 

دامنه و محدودیت‌ها

ادغام فعلی سمت تولیدکننده

شکل‌دهی سریانی، مغولی، تبتی و Indic اکنون صفحه‌های مرجع API جداگانه دارند. سریانی را می‌توان از طریق AutoShapeSyriac فعال کرد، مغولی را با sfMongolianShaping، تبتی را با sfTibetanShaping، بازآرایی Indic را با sfIndicShaping و شکل‌دهی کامل Indic GSUB را با sfIndicGSUB. نقطه‌های ورود دقیق در روش‌های شکل‌دهی تبتی / مغولی / سریانی و روش‌های شکل‌دهی Indic مستند شده‌اند

دامنهٔ فعلی همچنین N'Ko و Adlam را به‌عنوان scriptهای cursive راست‌به‌چپ، ترتیب‌دهی SARA AM و tone-mark در Thai/Lao، ترتیب‌دهی niqqud عبری، و نشانه‌های pre-base در Javanese پوشش می‌دهد. این مسیرها در روش‌های پیش‌پردازش شکل‌دهی script مستند شده‌اند

 

 

همچنین ببینید: پشتیبانی شکل‌دهی عربی / فارسی / اردو, خط لولهٔ شکل‌دهی خودکار (Phase 8), موتور جایگزینی OpenType GSUB, THotPDF.AssignSyntheticCodepointForGID