|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID מקצה נקודות קוד סינתטיות של THotPDF PUA (v2.119.68)
|
GSUB Engine Auto Shaping Pipeline Arabic Shaping |
|
מקצה ושאילת נקודות קוד סינתטיות של Private Use Area (U+E000 - U+F8FF) עבור גליפי תחליף OpenType GSUB שאין להם נקודת קוד יוניקוד טבעית הנגישה דרך ה-cmap של הגופן. סוגר את פער הפליטה ברמת ה-GID בצד היצרן שהושאר על ידי ממשקי ה-API של שאילתות ושיפורי GSUB של v2.119.43-66
תחביר Delphi: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
מדוע ה-API קיים צינור העיצוב האוטומטי בצד היצרן v2.119.32-67 (ערבית / לטינית / Devanagari) דורש שגליפי תחליף GID המוחזרים על ידי מנוע ה-GSUB יהיו נגישים דרך נקודת קוד יוניקוד - צינור הטקסט הקיים המקודד בהקס פולט נקודות קוד, לא GID, וקורא הקצה פותר את נקודת הקוד בחזרה ל-GID דרך ה-
אך תחליפים ספציפיים לגופן הנוחתים על גליפי GID פנימיים של הגופן - רוב צורות צבירי Devanagari, חלופות סגנוניות שמעצב הגופן מספק רק כגליפי GID ממוספרים, רצפי וריאציות אידיאוגרפיות של CJK (IVS), ליגטורות מיוחדות ללא צורת תצוגה מתאימה - אינם בעלי נקודת קוד כלל ב-cmap של הגופן. לפני v2.119.68 גליפי GID אלו לא היו נגישים דרך צינור ההקס בצד היצרן; גרסה v2.119.68 סוגרת פער זה על ידי מתן אפשרות לקוראים להקצות נקודת קוד סינתטית ב-Private Use Area עבור כל GID
סמנטיקה של AssignSyntheticCodepointForGID מקצה את נקודת הקוד הבאה הפנויה ב-PUA (החל מ-U+E000) עבור ה-GID שסופק ומשקף את ההקצאה לכל מטמון שבו תלויים צינור ההקס הקיים בצד היצרן + שרשרת הפתרון של קורא הקצה:
1. 2. 3.
מחזיר
סמנטיקה של GetSyntheticCodepointForGID שאילתה פונקציונלית טהורה של כל הקצאה קיימת. מחזיר את נקודת הקוד הסינתטית שהוקצתה עבור
מחזור חיים של מצב המקצה
זרימת עבודה טיפוסית (צורת צביר Devanagari)
PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf'); PDF.ShapingFeatures := [sfIndicShaping]; PDF.SetGSUBScript('deva');
// Get a font-internal cluster GID through the GSUB engine ClusterGID := PDF.GetSingleSubstituteGlyph(BaseGID, 'nukt'); if ClusterGID <> BaseGID then begin // Check if cmap reaches the substitute - usually no for Indic // clusters, since cluster GIDs are font-internal // Allocate a synthetic codepoint that the producer-side // hex pipeline can emit if PDF.AssignSyntheticCodepointForGID(ClusterGID, SyntheticCP) then begin // SyntheticCP is now in the U+E000-F8FF range; emit it // through UnicodeTextOut just like a normal codepoint PDF.CurrentPage.UnicodeTextOut(X, Y, 0, UnicodeChar(SyntheticCP)); PDF.MarkUnicodeGlyphUsed(ClusterGID); end; end;
דוגמה לאידמפוטנטיות
PDF.AssignSyntheticCodepointForGID(150, CP1); // CP1 = $E000 PDF.AssignSyntheticCodepointForGID(151, CP2); // CP2 = $E001 PDF.AssignSyntheticCodepointForGID(150, CP3); // CP3 = $E000 (idempotent) CP4 := PDF.GetSyntheticCodepointForGID(150); // CP4 = $E000 CP5 := PDF.GetSyntheticCodepointForGID(999); // CP5 = 0 (no assignment)
התנהגות קורא הקצה קורא הקצה רואה את נקודת הקוד PUA באופרטור הצגת הטקסט ופותח אותה דרך ה-
התנהגות העתק/הדבק: נקודות קוד PUA חוזרות כעצמן דרך העתק/הדבק כאשר ה-ToUnicode CMap מצהיר עליהן כמיפויי זהות. קוראים שרוצים שתווי היוניקוד של המקור (ריצת הקלט שייצרה את התחליף) יחזרו במקום זאת, יכולים לרשום מיפוי הפוך עם
Phase 8 roadmap closure סגירת מפת הדרכים של שלב 8
ראה גם: |