|
צינור העיצוב האוטומטי מעלה את מנוע ה-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, אדלאם, תאית/לאו, עברית וג'אוונית. ראה מתודות עיבוד מקדים לעיצוב כתב
ראה גם:
|