תמיכה בעיצוב סורית / מונגולית / דבנאגארי

משטחי יכולות מרובי כתבים (v2.119.53 - v2.119.55)

Arabic Shaping  Auto Shaping Pipeline  GSUB Engine

HotPDF חושף משטחי יכולות של מחלקות חיבור / ניתוח מיקומי / קטגוריה הברתית אינדית עבור שלושה כתבים מורכבים מעבר לערבית: סורית (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;

סורית עוקבת אחר אותה מסגרת בת ארבע מחלקות של חיבור ימני / חיבור כפול / שקוף / ללא חיבור כמו ערבית; GetSyriacJoiningClass מסווגת כל נקודת קוד בבלוק U+0700-U+074F בהתאם למאפיין החיבור של יוניקוד. GetSyriacPosition עוברת על ריצת סורית ופותחת כל תו למיקומו המבודד / תחילי / אמצעי / סופי בהתבסס על מחלקות החיבור של השכנים המיידיים שלו

בניגוד לערבית, לבלוק הסורי אין צורות תצוגה המקודדות מראש ביוניקוד - אין מקבילה סורית לבלוקי צורות התצוגה בערבית U+FB50-FDFF / U+FE70-FEFC. לפיכך, צרכנים חייבים להניע עיצוב סורית דרך חיפושי GSUB המוגדרים בגופן (בדרך כלל init / medi / fina / isol + rlig) ולא דרך שכתוב נקודות קוד. שכבת היכולות שלעיל מעניקה לקוראים את תוויות המיקום שהם צריכים כדי לשאול את תכונת ה-GSUB המתאימה לכל גליף

יכולת עיצוב מונגולית (v2.119.54)

שתי מתודות מקבילות עבור מונגולית:

function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass;

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

הכיסוי כולל מונגולית בסיסית (U+1820-U+1842), טודו (U+1843-U+1877), סיבה (U+1880-U+18A8), מנצ'ו, והרחבות עלי גאלי. בוררי וריאציות FVS1 / FVS2 / FVS3 (U+180B-U+180D), המקף הרך NIRUGU (U+180A), וסימני תנועות עלי גאלי מסווגים כולם כשקופים (T-class) כך שהם משתתפים בחיבור מבלי לקטוע את המעבר

בדומה לסורית, למונגולית אין צורות תצוגה המקודדות מראש ביוניקוד. הפריסה האנכית המסורתית של מונגולית, חוקי וריאציית צורת האותיות המורכבים, ובחירת צורה מונחית FVS - כולם צפויים להיות מונעים על ידי חיפושי GSUB המוגדרים בגופן (בדרך כלל init / medi / fina / isol + ccmp / rlig / locl); שכבת היכולות מעניקה לקוראים את תוויות המיקום הדרושות כדי לשאול תכונות אלו

יכולת עיצוב אינדית של Devanagari (v2.119.55)

Devanagari שונה מהותית מערבית / סורית / מונגולית - זהו כתב אבוגידה אינדי שבו היחידה המשמעותית היא צביר הברות (akshara), לא אות בודדת, וסדר הרינדור של הגליפים בתוך צביר שונה לרוב מסדר היוניקוד הלוגי. שתי מתודות חושפות את שכבת היכולות האינדית של Devanagari:

function GetDevanagariCategory(CP: Cardinal): TIndicCategory;

procedure ApplyDevanagariReorder(var Run: array of Cardinal);

GetDevanagariCategory מסווג כל נקודת קוד בטווח U+0900-U+097F לאחת מ-13 קטגוריות הברתיות אינדיות (בסיס / עיצור / תנועה / תנועה עצמאית / סימן תנועה / מטרה טרום-בסיסית / מטרה מעל הבסיס / מטרה מתחת לבסיס / Halant Virama / רפה / אנוסברה / ויסארגה / אחר) כך שקוראים יכולים לזהות גבולות הברות ולזהות אילו מיקומים בתוך כל צביר זקוקים לשינוי סדר

ApplyDevanagariReorder הוא מעבר מקדים (pre-pass) שעובר על הרצת הקלט ומחיל את שני חוקי שינוי הסדר העיקריים של Devanagari: (1) Repha (Ra + Halant בתחילת צביר הברות) מועבר למיקום שלאחר העיצור הבסיסי של הצביר כך שהוא מרונדר כוו עליון; (2) I-matra טרום-בסיסי (U+093F DEVANAGARI VOWEL SIGN I) מועבר לפני העיצור הבסיסי של הצביר כך שהוא מרונדר כוו שמאלי. שינויי סדר אינדיים אחרים (matra מעל הבסיס, matra מתחת לבסיס, יצירת צברים) מושארים למנוע ה-GSUB של הגופן מכיוון שהם דורשים טבלאות חיפוש ספציפיות לגופן

שילוב אוטומטי (v2.119.67): כאשר sfIndicShaping in PDF.ShapingFeatures, ApplyDevanagariReorder מוחל באופן אוטומטי כמעבר מקדים בתוך שלושת עוזרי BuildUnicode*FieldContent. מנוע ה-GSUB של קורא הקצה קולט אז את ההברה בסדר הנכון ומחיל את כללי העיצוב ההקשריים שלו. ראה צינור עיצוב אוטומטי

זרימת עבודה טיפוסית (סורית)

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;

זרימת עבודה טיפוסית (Devanagari עם שינוי סדר אוטומטי)

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"

עוזרי תת-קבוצה וחילוץ של יוניקוד

RegisterToUnicodeReverseMapping מתעד נקודות קוד מקור עבור פלט גליפים מעוצב או סינתטי. ClearToUnicodeReverseMappings מאפס את הטבלה, ToUnicodeReverseMappingCount מדווח על גודלה, GetUnicodeGlyphForCodepoint מחזיר את מזהה גליף הגופן הרשום עבור נקודת קוד יוניקוד, ו-EnableShapingFeatureForSubset מסמן גליפים חלופיים מתכונת GSUB לצורך הכללה בתת-קבוצה המוטמעת

טווח ומגבלות

שילוב נוכחי בצד היצרן

לעיצוב סורית, מונגולית, טיבטית ואינדית יש כעת דפי ייחוס מפורשים של API. ניתן להפעיל סורית דרך AutoShapeSyriac, מונגולית דרך sfMongolianShaping, טיבטית דרך sfTibetanShaping, שינוי סדר אינדי דרך sfIndicShaping, ועיצוב Indic GSUB מלא דרך sfIndicGSUB. נקודות הכניסה המפורטות מתועדות ב-מתודות עיצוב טיבטי/מונגולי/סורי וב-מתודות עיצוב אינדי

הטווח הנוכחי מכסה גם את N'Ko ואדלאם ככתבים מחוברים מסוג RTL, סידור SARA AM וסימני טון בתאית/לאו, סידור ניקוד בעברית, וסימנים טרום-בסיסיים של ג'אוונית. נתיבים אלו מתועדים ב-מתודות עיבוד מקדים לעיצוב כתב

ראה גם: