خط لوله شکل‌دهی خودکار (فاز ۸)

خط لوله انتخابی GSUB سمت تولیدکننده (نسخه ۲.۱۱۹.۵۹ - ۲.۱۲۰.۱۰)

 

شکل‌دهی عربی  شکل‌دهی چند اسکریپتی  موتور GSUB

خط لوله شکل‌دهی خودکار، OpenType GSUB engine را از یک سطح پرس‌وجوی صرفِ capability به یک feature سمت تولیدکننده ارتقا می‌دهد که هنگام خروج متن به PDF content streamها به‌صورت خودکار اعمال می‌شود. فراخواننده‌ها featureهای مشخص GSUB را از طریق یک set تایپ‌شده (ShapingFeatures: THPDFShapingFeatures) فعال می‌کنند و HotPDF اجرای substitution درست، علامت‌گذاری glyphهای substitute در زیرمجموعه فونت جاسازی‌شده، و تولید entryهای reverse-mapping موردنیاز برای دسترس‌پذیری در ToUnicode CMap را بر عهده می‌گیرد

 

چارچوب opt-in (v2.119.59 / Phase 8a)

یک enum و property جدید مشخص می‌کنند کدام substitutionهای خودکار هنگام text emission اجرا شوند:

 

type

  THPDFShapingFeature = (

    sfArabicGSUB,    // native Arabic init / medi / fina / isol + rlig / calt / rclt

    sfStandardLigatures, // Latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)

    sfContextualLigatures,// Latin 'clig' (contextual ligatures)

    sfContextualAlternates,// 'rclt' (Required Contextual Alternates)

    sfIndicShaping); // Devanagari Repha + pre-base I-matra reorder

  THPDFShapingFeatures = set of THPDFShapingFeature;

 

property ShapingFeatures: THPDFShapingFeatures read ... write ...;

 

مقدار پیش‌فرض [] (مجموعه خالی) است که برای فراخواننده‌هایی که به static post-pass shaper نسخه v2.119.32-58 وابسته‌اند، خروجی byte-identical را حفظ می‌کند. فعال‌کردن یک یا چند flag، engine را برای featureهای متناظر به حالت خودکار می‌برد

 

sfArabicGSUB - شکل‌دهی بومی Arabic GSUB (v2.185.0)

وقتی sfArabicGSUB فعال است، HotPDF یک run منطقی عربی را به base glyph IDها نگاشت می‌کند، lookupهای موقعیتی init، medi، fina و isol فونت ثبت‌شده را در موقعیت‌های اتصال انتخاب‌شده برای هر حرف اعمال می‌کند، سپس rlig، calt و rclt را روی run شکل‌گرفته اجرا می‌کند. glyphهای جایگزینی که codepoint Unicode ندارند از مسیر synthetic-codepoint همراه با reverse mappingهای ToUnicode صادر می‌شوند، بنابراین فونت‌هایی که glyphهای عربی contextual آن‌ها بیرون از cmap قرار دارند هم می‌توانند درست جاسازی و کپی شوند

 

فعال‌کردن sfArabicGSUB به‌طور ضمنی static shaper چهارموقعیتی نسخه v2.85.0 برای عربی را دور می‌زند - فراخواننده‌هایی که می‌خواهند static shaper همچنان codepointهایی را خارج از آنچه GSUB فونت اعلام می‌کند مدیریت کند، باید sfArabicGSUB را خاموش بگذارند

 

sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)

وقتی sfStandardLigatures فعال باشد، لیگاتورهای استاندارد لاتین به‌طور خودکار با feature liga فونت fold می‌شوند. ApplyLatinLigatureRefinement محدودهٔ Alphabetic Presentation Forms (U+FB00-FB4F) را هدف می‌گیرد - معمولاً FB00 ff، FB01 fi، FB02 fl، FB03 ffi، FB04 ffl، FB05 long-s + t و FB06 st. sfContextualLigatures یک گذر دوم برای feature clig فونت اضافه می‌کند. هر دو گذر از همان سازوکار reverse-cmap مانند sfArabicGSUB استفاده می‌کنند و 7 ورودی reverse-mapping جدید در ToUnicode CMap (FB00-FB06) تولید می‌کنند تا copy / paste در خوانندهٔ مصرف‌کننده ligature را به حروف مبدأ برگرداند

 

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

وقتی sfContextualAlternates فعال باشد، feature rclt (Required Contextual Alternates) فونت اعمال می‌شود. ApplyArabicGSUBContextualRefinement از نقطهٔ ورود ApplyContextualSubst نسخهٔ v2.119.47 استفاده می‌کند و خروجی N-to-M با طول متغیر را مدیریت می‌کند (substitution فقط وقتی قطعی می‌شود که هر GID جایگزین از طریق reverse cmap قابل دسترسی باشد). بازهٔ reverse cmap به FB00-FDFF + FE70-FEFF گسترش می‌یابد تا Latin + Arabic + Hebrew Presentation Forms را پوشش دهد

 

کاربردهای رایج rclt: formهای عربی init / medi / fina / isol وقتی فونت شکل‌دهی موقعیتی را از طریق GSUB و نه از طریق codepointهای Unicode Presentation Forms هدایت می‌کند؛ برخی قواعد رفع ابهام دنباله‌های لاتین؛ و featureهای shaping Indic شامل pres / blws / psts / half / pstf / cjct وقتی طراح فونت آن‌ها را به‌صورت rclt ثبت کرده باشد

 

sfIndicShaping - Phase 8e (v2.119.67)

وقتی sfIndicShaping فعال باشد، قابلیت دواناگری نسخهٔ v2.119.55 یعنی ApplyDevanagariReorder از یک متد دستی به یک pre-pass خودکار درون سه helperِ BuildUnicode*FieldContent ارتقا می‌یابد. runهای دواناگری Repha (Ra + Halant در آغاز خوشه) را به موقعیت post-base و I-matra پیش از پایه (U+093F) را قبل از consonant پایهٔ خوشه منتقل می‌کنند تا موتور GSUBِ خوانندهٔ مصرف‌کننده syllable را در ترتیب رندر درست بردارد. سایر reorderهای Indic (matra بالابنیاد / پایین‌بنیاد، تشکیل conjunct) در GSUB فونت باقی می‌مانند

 

پشتیبانی از پرس‌وجوی advance (v2.119.64 / Phase 8c.5)

یک API همراه، em-fraction ذخیره‌شدهٔ /W را در معرض می‌گذارد تا فراخواننده‌ها هنگام صدور glyphهای جایگزین‌شدهٔ GSUB بتوانند word-wrap را درست محاسبه کنند:

 

function GetCodepointAdvance(CP: Cardinal): Single;

 

عرض advance مشتق‌شده از hmtx را به‌صورت کسری از em برای glyphی که در cmap با CP resolve شده برمی‌گرداند. همان release همچنین CodeUnitAdvance را اصلاح کرد تا Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) را به‌عنوان NARROW و نه WIDE طبقه‌بندی کند (fallback heuristic پیش از v2.65 اشتباه بود)

 

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

 

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

PDF.ShapingFeatures :=

  [sfArabicGSUB,  // native Arabic GSUB contextual glyphs

   sfCursiveAttachment];  // GPOS cursive entry / exit anchors

PDF.SetGSUBScript('arab');

PDF.BeginDoc;

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

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

  UnicodeString(#$0628#$0633#$0645#$0020#$0627#$0644#$0644#$0647));

PDF.EndDoc;

 

گردش‌کار معمول (لیگاتورهای استاندارد لاتین + بازآرایی دواناگری)

 

PDF.RegisterUnicodeTTF('NotoSans', 'NotoSans-Regular.ttf');

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

PDF.ShapingFeatures :=

  [sfStandardLigatures, // FB00-FB06 Latin liga

   sfContextualLigatures, // + clig

   sfIndicShaping]; // Devanagari Repha + I-matra reorder

 

جمع‌بندی نقشه راه فاز 8

Phase 8a (v2.119.59) چارچوب opt-in + قابلیت عربی؛ Phase 8b (v2.119.65) لیگاتورهای استاندارد لاتین؛ Phase 8c.1 (v2.119.60) Allah؛ Phase 8c.2 (v2.119.63) rlig در سطح GID برای GSUB؛ Phase 8c.3 (v2.119.61) reverse mapping در ToUnicode؛ Phase 8c.4 (v2.119.62) Bismillah؛ Phase 8c.5 (v2.119.64) پرس‌وجوی advance + اصلاح heuristic؛ Phase 8c.6 (v2.119.68) صدور codepoint مصنوعی PUA؛ Phase 8d در sub-phaseهای 8c ادغام شد؛ Phase 8e (v2.119.67) بازآرایی خودکار دواناگری. با v2.119.68 ماتریس قابلیت Phase 8 بسته می‌شود؛ بهبودهای بعدی (scriptهای Indic بیشتر، موقعیت‌دهی OpenType GPOS، حل BiDi) در آیتم‌های جداگانهٔ roadmap پیگیری می‌شوند

 

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

خط لولهٔ opt-in به‌صورت عمدی بر روی شکل‌دهندهٔ ایستای post-pass افزوده می‌شود - فراخواننده‌های موجود هیچ تغییری در رفتار نمی‌بینند مگر این‌که opt in کنند. مجموعهٔ پیش‌فرض [] انتخاب امن برای regressionهای byte-stable است. فونت‌هایی که feature tableهای GSUB درخواستی را ندارند، خروجی بدون اثر امن تولید می‌کنند (هیچ substitutionی اعمال نمی‌شود و exceptionی هم رخ نمی‌دهد)

 

نقشه فعلی API شکل‌دهی

خط لولهٔ فعلی دیگر فقط substitution نیست: sfKerning جفت‌kerning GPOS را اعمال می‌کند، sfMarkPositioning offsetهای Mark-to-Base و Mark-to-Mark را اعمال می‌کند، sfMarkToLigature جای‌گذاری Mark-to-Ligature را اعمال می‌کند، sfCursiveAttachment هم‌ترازی anchorهای ورود / خروج cursive را اعمال می‌کند، sfTibetanShaping shaping تبتی GSUB را اعمال می‌کند، sfMongolianShaping formهای موقعیتی مغولی را اعمال می‌کند و sfIndicGSUB زنجیرهٔ featureهای Indic GSUB را پس از بازآرایی syllable اعمال می‌کند. ShapingFeatures، روش‌های GPOS و روش‌های shaping Indic را ببینید

افزوده‌های اخیر sfLocalizedForms را برای locl، calt از طریق ApplyGSUBContextualFeature، کرنینگ GPOS متنی و عمودی، صدور glyphهای contextual عربی بومی GSUB، و مسیرهای N'Ko، Adlam، Thai/Lao، Hebrew و Javanese اضافه می‌کنند. روش‌های پیش‌پردازش شکل‌دهی اسکریپت را ببینید

 

همچنین ببینید: موتور جایگزینی OpenType GSUB, پشتیبانی شکل‌دهی عربی / فارسی / اردو, شکل‌دهی سریانی / مغولی / دواناگری, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting