|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID تخصیصدهنده کدپوینت مصنوعی PUA برای THotPDF (نسخه ۲.۱۱۹.۶۸)
|
موتور GSUB خط لوله شکلدهی خودکار شکلدهی عربی |
|
کدپوینتهای مصنوعی محدوده Private Use Area (U+E000 - U+F8FF) را برای GIDهای جایگزین OpenType GSUB که هیچ کدپوینت Unicode طبیعیِ قابل دسترسی از طریق cmap فونت ندارند اختصاص میدهد و پرسوجو میکند. این API شکاف صدور در سطح GID را که در APIهای پرسوجو و اصلاح GSUB نسخه v2.119.43-66 باقی مانده بود میبندد
Delphi syntax: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
چرا این API وجود دارد خط لوله شکلدهی خودکار سمت تولید در نسخه v2.119.32-67 (Arabic / Latin / Devanagari) ایجاب میکند GIDهای جایگزینی که موتور GSUB برمیگرداند از طریق یک کدپوینت Unicode قابل دسترسی باشند - خط لوله متنی hex-encoded موجود کدپوینت صادر میکند، نه GID، و خواننده مصرفکننده کدپوینت را از طریق
اما جایگزینهای وابسته به فونت که به GIDهای داخلی فونت میرسند - بیشتر شکلهای خوشهای Devanagari، جایگزینهای سبکی که طراح فونت فقط بهصورت GID شمارهدار ارائه میکند، دنبالههای تنوع ایدئوگرافیک CJK (IVS)، لیگاتورهای اختیاری بدون Presentation Form متناظر - اصلاً هیچ کدپوینتی در cmap فونت ندارند. پیش از v2.119.68 این GIDها از طریق خط لوله hex سمت تولید قابل دسترس نبودند؛ v2.119.68 این شکاف را با اجازه دادن به فراخواننده برای تخصیص یک کدپوینت مصنوعی در Private Use Area برای هر GID میبندد
معنای AssignSyntheticCodepointForGID نخستین کدپوینت آزاد PUA را از U+E000 به بعد برای GID دادهشده تخصیص میدهد و این تخصیص را در همهٔ cacheهایی که خط لولهٔ hex سمت تولیدکننده و زنجیرهٔ resolve سمت reader مصرفکننده به آنها تکیه دارند بازتاب میدهد:
1. 2. 3.
در صورت موفقیت
معنای GetSyntheticCodepointForGID یک پرسوجوی کاملاً خواندنی از هر تخصیص موجود است. اگر
چرخهٔ حیات state تخصیصدهنده
گردشکار معمول (شکل خوشهٔ دواناگری)
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 را در text-showing operator میبیند و آن را از طریق
رفتار copy / paste: کدپوینتهای PUA وقتی ToUnicode CMap آنها را بهصورت identity mapping اعلام کند، در copy / paste به همان شکل رفتوبرگشت میکنند. فراخوانندههایی که میخواهند بهجای آن نویسههای Unicode مبدأ (run ورودی که substitute را تولید کرده) برگردند، میتوانند یک reverse mapping با
بستن نقشهٔ راه Phase 8 v2.119.68 / Phase 8c.6 نقشهٔ راه موتور GSUB فاز 8 را میبندد: تمام APIهای پرسوجوی LookupType 1-8 (Phase 1-6)، API انتخاب Script / LangSys (Phase 7)، نقطهٔ ورود بستن subsetterِ TTF (Phase 9)، fold لیگاتور در post-pass ایستا (v2.119.32 / 58 / 60 / 62)، خط لولهٔ خودکار opt-in (v2.119.59)، صدور خودکار Arabic
همچنین ببینید: موتور جایگزینی OpenType GSUB, خط لولهٔ شکلدهی خودکار (Phase 8), پشتیبانی شکلدهی عربی / فارسی / اردو, شکلدهی سریانی / مغولی / دواناگری, THotPDF.BeginTaggedContent |