צינור עיצוב אוטומטי (שלב 8)

צינור GSUB בצד היצרן לבחירה (v2.119.59 - v2.120.10)

Arabic Shaping  Multi-Script Shaping  GSUB Engine

צינור העיצוב האוטומטי מעלה את מנוע ה-OpenType GSUB ממשטח שאילתות בלבד של יכולות לתכונה בצד היצרן המוחלת באופן אוטומטי כאשר טקסט נפלט לזרמי תוכן PDF. קוראים מאפשרים תכונות GSUB ספציפיות דרך קבוצה מוקלדת (ShapingFeatures: THPDFShapingFeatures) ו-HotPDF דואג להריץ את ההחלפות הנכונות, לסמן גליפים חלופיים בתוך תת-קבוצת הגופן המוטמעת, ולפלוט את ערכי המיפוי ההפוך ToUnicode CMap הנדרשים לנגישות

מסגרת הצטרפות (v2.119.59 / שלב 8a)

מונה ומאפיין חדשים שולטים באילו החלפות אוטומטיות ירוצו במהלך פליטת טקסט:

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 ...;

ברירת המחדל היא [] (קבוצה ריקה), השומרת על פלט זהה ברמת הבתים עבור קוראים התלויים במעצב המעבר העוקב הסטטי v2.119.32-58. הגדרת דגל אחד או יותר מעלה את המנוע למצב אוטומטי עבור התכונות המתאימות

sfArabicGSUB - עיצוב GSUB ערבי מקורי (v2.185.0)

כאשר sfArabicGSUB מוגדר, HotPDF ממפה ריצת ערבית לוגית למזהי גליפי בסיס, מחיל את חיפושי המיקום init, medi, fina ו-isol של הגופן הרשום בעמדות החיבור שנבחרו לכל אות, ולאחר מכן מחיל rlig, calt ו-rclt על הריצה המעוצבת. גליפי תחליף שאין להם נקודת קוד יוניקוד נפלטים דרך נתיב נקודות הקוד הסינתטיות עם מיפויי ToUnicode הפוכים, כך שגופנים שגליפי הערבית ההקשריים שלהם נמצאים מחוץ ל-cmap עדיין יכולים להיות מוטמעים ומועתקים בצורה נכונה

הגדרת sfArabicGSUB עוקפת במשתמע את המעצב הסטטי בעל 4 העמדות v2.85.0 עבור ערבית - קוראים שצריכים שהמעצב הסטטי ימשיך לטפל בנקודות קוד מחוץ למה שהצהרות ה-GSUB של הגופן מצהירות צריכים להשאיר את sfArabicGSUB כבוי

sfStandardLigatures / sfContextualLigatures - שלב 8b (v2.119.65)

כאשר sfStandardLigatures מוגדר, ליגטורות לטיניות סטנדרטיות מקופלות באופן אוטומטי באמצעות תכונת liga של הגופן. ApplyLatinLigatureRefinement מכוון לבלוק Alphabetic Presentation Forms (U+FB00-FB4F) - בדרך כלל FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures מוסיף מעבר שני עבור תכונת clig של הגופן. שני המעברים משתמשים באותו מנגנון cmap הפוך כמו sfArabicGSUB ופולטים 7 ערכי מיפוי הפוך ToUnicode CMap חדשים (FB00-FB06) כך שהעתקה/הדבקה של קורא קצה פותרת את הליגטורה בחזרה לאותיות המקור

sfContextualAlternates - GSUB 'rclt' (v2.119.66)

כאשר sfContextualAlternates מוגדר, מוחלת תכונת rclt (חלופות הקשריות נדרשות) של הגופן. ApplyArabicGSUBContextualRefinement משתמש בנקודת הכניסה v2.119.47 ApplyContextualSubst ומטפל בפלט N-to-M באורך משתנה (החלפה מתבצעת רק כאשר כל GID חלופי נגיש דרך ה-cmap ההפוך). טווח ה-cmap ההפוך מורחב ל-FB00-FDFF + FE70-FEFF כדי לכסות את צורות התצוגה של לטינית + ערבית + עברית

משתמשים קנוניים של rclt: צורות init / medi / fina / isol של ערבית כאשר הגופן מניע עיצוב מיקומי דרך GSUB במקום דרך נקודות קוד של צורות תצוגה של יוניקוד; כללי התרת עמימות מסוימים של רצפים לטיניים; תכונות עיצוב אינדיות pres / blws / psts / half / pstf / cjct כאשר הן רשומות כ-rclt על ידי מעצב הגופן

sfIndicShaping - שלב 8e (v2.119.67)

כאשר sfIndicShaping מוגדר, יכולת ה-Devanagari של v2.119.55 ApplyDevanagariReorder מקודמת ממתודה ידנית למעבר מקדים (pre-pass) אוטומטי המוחל בתוך שלושת עוזרי BuildUnicode*FieldContent. ריצות Devanagari מקבלות את ה-Repha (Ra + Halant בתחילת הצביר) מועבר למיקום שלאחר הבסיס, ואת ה-I-matra הטרום-בסיסי (U+093F) מועבר לפני העיצור הבסיסי של הצביר, כך שמנוע ה-GSUB של קורא הקצה קולט את ההברה בסדר הרינדור הנכון. שינויי סדר אינדיים אחרים (matra מעל הבסיס / מתחת לבסיס, יצירת צברים) נשארים ב-GSUB של הגופן

תמיכה בשאילתת התקדמות (v2.119.64 / שלב 8c.5)

API נלווה חושף את שבר ה-em המאוחסן בכתובת /W כך שקוראים יכולים לחשב יישור מילים בצורה נכונה בעת פליטת גליפים שהוחלפו ב-GSUB:

function GetCodepointAdvance(CP: Cardinal): Single;

מחזיר את רוחב ההתקדמות הנגזר מ-hmtx כשבר של em עבור הגליף שנפתר ב-cmap ב-CP. אותה גרסה תיקנה גם את CodeUnitAdvance לסיווג צורות תצוגה בערבית (U+FB50-FDFF + U+FE70-FEFF) כ-NARROW במקום WIDE (הנסיגה ההיוריסטית הייתה שגויה לפני 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;

זרימת עבודה טיפוסית (ליגטורות לטיניות סטנדרטיות + שינוי סדר Devanagari)

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

שלב 8a (v2.119.59) מסגרת הצטרפות + יכולת ערבית; שלב 8b (v2.119.65) ליגטורות לטיניות סטנדרטיות; שלב 8c.1 (v2.119.60) אללה; שלב 8c.2 (v2.119.63) רמת GID של GSUB rlig; שלב 8c.3 (v2.119.61) מיפויי ToUnicode הפוכים; שלב 8c.4 (v2.119.62) בסמאללה; שלב 8c.5 (v2.119.64) שאילתת התקדמות + תיקון היוריסטי; שלב 8c.6 (v2.119.68) פליטת נקודת קוד סינתטית PUA; שלב 8d הוכנס לתת-שלבי 8c; שלב 8e (v2.119.67) שינוי סדר אוטומטי של Devanagari. עם v2.119.68 מטריצת היכולות של שלב 8 סגורה; שיפורים נוספים (כתבים אינדיים נוספים, מיקום OpenType GPOS, פתרון BiDi) מנוהלים תחת פריטי מפת דרכים נפרדים

טווח ומגבלות

צינור ההצטרפות (opt-in) הוא תוספתי במכוון על מעצב המעבר העוקב הסטטי - קוראים קיימים אינם רואים שינוי בהתנהגות אלא אם כן הם מצטרפים. קבוצת ברירת המחדל [] היא הבחירה הבטוחה לרגרסיה יציבה ברמת הבתים. גופנים ללא טבלאות תכונות ה-GSUB המבוקשות מייצרים פלט בטוח ללא פעולה (no-op) (הקוראים אינם רואים שינוי מוחל, ולא מועלות חריגות)

מפת API הנוכחית לעיצוב

צינור העיצוב הנוכחי אינו עוד החלפה בלבד: sfKerning מחיל ריווח (kerning) של זוגות GPOS, sfMarkPositioning מחיל היסטים של סימן-לבסיס וסימן-לסימן, sfMarkToLigature מחיל מיקום סימן-לליגטורה, sfCursiveAttachment מחיל יישור עוגן כניסה/יציאה מקושר, sfTibetanShaping מחיל עיצוב Tibetan GSUB, sfMongolianShaping מחיל צורות מיקום מונגוליות, ו-sfIndicGSUB מחיל את שרשרת תכונות ה-Indic GSUB לאחר שינוי סדר ההברות. ראה ShapingFeatures, מתודות GPOS, ו-מתודות עיצוב Indic

תוספות אחרונות מוסיפות את sfLocalizedForms עבור locl, calt דרך ApplyGSUBContextualFeature, ריווח GPOS הקשרי ואנכי, פליטת גליפים הקשריים מקומיים של ערבית GSUB, ואת נתיבי N'Ko, אדלאם, תאית/לאו, עברית וג'אוונית. ראה מתודות עיבוד מקדים לעיצוב כתב

ראה גם: