THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID

مخصص نقاط الترميز الاصطناعية PUA لـ THotPDF (الإصدار v2.119.68)

 

GSUB Engine  Auto Shaping Pipeline  Arabic Shaping

يخصص ويستعلم عن نقاط الترميز الاصطناعية لمنطقة الاستخدام الخاص (U+E000 - U+F8FF) لمعرفات GIDs البديلة لـ OpenType GSUB التي لا تحتوي على نقطة ترميز Unicode طبيعية يمكن الوصول إليها عبر cmap الخاص بالخط؛ ويغلق فجوة إصدار مستوى GID على جانب المنتج التي تركتها واجهات برمجة تطبيقات استعلام وتنقية GSUB للإصدارات v2.119.43-66

 

Delphi syntax:

function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean;

function GetSyntheticCodepointForGID(GID: Word): Word;

 

لماذا توجد واجهة برمجة التطبيقات هذه

يتطلب خط معالجة التشكيل التلقائي على جانب المنتج للإصدار v2.119.32-67 (العربي / اللاتيني / الديفاناغاري) أن تكون معرفات GIDs البديلة التي يرجعها محرك GSUB قابلة للوصول إليها عبر نقطة ترميز Unicode - حيث يقوم خط معالجة النصوص المشفرة بنظام الستة عشري الحالي بإصدار نقاط ترميز، وليس معرفات GIDs، ويقوم القارئ المستهلك بحل نقطة الترميز مرة أخرى إلى معرف GID من خلال /CIDToGIDMap المدمج؛ وبالنسبة للمعرفات GIDs البديلة التي تحتوي على نقطة ترميز Unicode طبيعية عبر cmap الخاص بالخط (أشكال العرض العربي، والروابط القياسية اللاتينية FB00-FB06)، فإن خط المعالجة الحالي يعمل بشكل جيد

 

ولكن البدائل الخاصة بالخط التي تهبط على معرفات GIDs الداخلية للخط - معظم أشكال مجموعات الديفاناغاري، والبدائل الأسلوبية التي يشحنها مصمم الخط فقط كمعرفات GIDs مرقمة، ومتسلسلات الاختلاف الأيديوجرافي CJK (IVS)، والروابط التقديرية التي لا تحتوي على شكل عرض مقابل - لا تحتوي على نقطة ترميز على الإطلاق في cmap الخاص بالخط؛ قبل الإصدار v2.119.68، كان لا يمكن الوصول إلى معرفات GIDs هذه عبر خط المعالجة الستة عشري على جانب المنتج؛ ويغلق الإصدار v2.119.68 هذه الفجوة بالسماح للمستدعين بتخصيص نقطة ترميز اصطناعية في منطقة الاستخدام الخاص لأي معرف GID

 

دلالات AssignSyntheticCodepointForGID

يخصص نقطة ترميز PUA التالية المتاحة (بدءًا من U+E000) لمعرف GID المقدم ويعكس التعيين في كل ذاكرة تخزين مؤقت يعتمد عليها خط المعالجة الستة عشري الحالي على جانب المنتج + سلسلة حل القارئ المستهلك:

 

1. FUnicodeCpToGid[SyntheticCP] := GID - بحيث يصدر خط المعالجة الستة عشري على جانب المنتج SyntheticCP إلى عامل تشغيل عرض النص ويقوم القارئ المستهلك بحل SyntheticCP مرة أخرى إلى GID من خلال /CIDToGIDMap في وقت التقديم

2. FAcroFormUnicodeAdvances[SyntheticCP] := em-fraction - بحيث يجد حاسب التفاف الكلمات للإصدار v2.65 التقدم الصحيح لـ hmtx لنقطة الترميز الاصطناعية عندما تظهر في محتوى حقل نص AcroForm

3. FUnicodeSyntheticCpForGID[GID] := SyntheticCP - جدول البحث العكسي لكل GID المستخدم بواسطة GetSyntheticCodepointForGID لجعل مكالمات AssignSyntheticCodepointForGID المتكررة متطابقة القيمة (ترجع المكالمة الثانية بنفس معرف GID نقطة SyntheticCP المخصصة بالفعل)

 

يرجع True عند النجاح مع تعيين SyntheticCP إلى نقطة الترميز المخصصة؛ ويرجع False (ويترك SyntheticCP عند 0) تحت أي من هذه الشروط الدفاعية: عدم تسجيل أي خط (لم يتم استدعاء RegisterUnicodeTTF أبدًا أو تم استدعاؤه بوسطاء فارغين لإعادة تعيين الحالة)، أو معرف GID غير صالح (صفر أو يتجاوز عدد صور الحروف في cmap)، أو نفاد نطاق PUA (تم تخصيص جميع فتحات 6400 من U+E000 - U+F8FF)، أو عدم تهيئة ذاكرة التخزين المؤقت عند الدخول

 

دلالات GetSyntheticCodepointForGID

استعلام وظيفي بحت لأي تعيين موجود؛ يرجع نقطة الترميز الاصطناعية المخصصة لـ معرف GID إذا تم استدعاء AssignSyntheticCodepointForGID(GID, ...) سابقًا؛ وإلا يرجع 0 (والذي ليس نقطة ترميز PUA صالحة، لذا فهو يعمل كحارس "لا يوجد تعيين")؛ ولا يقوم بالتخصيص؛ وآمن للاستدعاء قبل تشغيل أي AssignSyntheticCodepointForGID

 

دورة حياة حالة المخصص

ينشأ FUnicodeSyntheticCpForGID ومؤشر PUA التالي المتاح (FUnicodeNextSyntheticCp) بشكل lazy عند أول استدعاء لـ AssignSyntheticCodepointForGID. يبدأ المؤشر من 0 (غير مهيأ) وينتقل إلى $E000 عند أول تخصيص؛ ثم تتحرك التخصيصات اللاحقة عبر $E001 و$E002 وما بعدها حتى $F8FF. يعاد ضبط الحقلين إلى empty / 0 عند كل RegisterUnicodeTTF('', nil) مع بقية حالة per-font subset، لذلك يبدأ المستدعون الذين يعيدون استخدام نسخة THotPDF عبر عدة مستندات mapping اصطناعية جديدة لكل مستند

 

سير العمل النموذجي (شكل مجموعة الديفاناغاري)

 

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 في عامل تشغيل عرض النص ويحلها من خلال /CIDToGIDMap المدمج في المستند إلى معرف GID المستهدف، ثم يقدم هذا المعرف GID باستخدام برنامج الخط المدمج؛ ومن منظور القارئ، لا يوجد فرق بين نقطة ترميز Unicode "طبيعية" يوجهها cmap إلى GID ونقطة ترميز اصطناعية PUA يوجهها /CIDToGIDMap إلى GID - فكلاهما ينتج نفس صورة الحرف المقدمة

 

سلوك النسخ / اللصق: تعود نقاط ترميز PUA كأنفسها من خلال النسخ / اللصق عندما يعلن ToUnicode CMap عنها كتعيينات هوية؛ ويمكن للمستدعين الذين يريدون أن تعود أحرف Unicode المصدر (التشغيل المدخل الذي أنتج البديل) بدلاً من ذلك تسجيل تعيين عكسي باستخدام RegisterToUnicodeReverseMapping أو تأليف خصائص متسلسلة المحتوى المميز ActualText من خلال BeginTaggedContent وإصدار نقاط الترميز الاصطناعية داخل المحتوى المحدد بين قوسين؛ ويستخدم HotPDF نفس نمط CID الداخلي تلقائيًا لتدفقات مظهر AcroForm المدعومة بـ RegisterUnicodeTTF والتي تحتوي على أحرف Unicode الخاصة بالمستوى التكميلي

 

إغلاق خارطة طريق المرحلة 8

يغلق الإصدار v2.119.68 / المرحلة 8c.6 خارطة طريق محرك GSUB للمرحلة 8: واجهة برمجة تطبيقات استعلام LookupType 1-8 (المرحلة 1-6)، وواجهة برمجة تطبيقات تحديد Script / LangSys (المرحلة 7)، ونقطة دخول إغلاق مخصص مخرجات TTF (المرحلة 9)، وطي الروابط الثابت للممر اللاحق (v2.119.32 / 58 / 60 / 62)، وخط معالجة التشكيل التلقائي الاختياري (v2.119.59)، والإصدار التلقائي لـ rlig العربي + liga / clig اللاتيني + rclt (المرحلة 8b / 8c.2 / 8b / GSUB 'rclt')، والتعيين العكسي لـ ToUnicode (v2.119.61 / 62 / 65)، واستعلام التقدم (v2.119.64)، والممر المسبق لإعادة ترتيب الديفاناغاري الهندية (v2.119.67)، والآن إصدار مستوى GID لنقاط الترميز الاصطناعية PUA (v2.119.68) تتكامل جميعها في سطح تشكيل واحد على جانب المنتج يتعامل مع كل نوع من صور الحروف البديلة التي يمكن أن ينتجها خط OpenType

 

انظر أيضًا: OpenType GSUB Substitution Engine، Automatic Shaping Pipeline (Phase 8)، Arabic / Persian / Urdu Shaping Support، Syriac / Mongolian / Devanagari Shaping، THotPDF.BeginTaggedContent