|
THotPDF.AssignSyntheticCodepointForGID / GetSyntheticCodepointForGID THotPDF PUA synthetic codepoint allocator (v2.119.68)
|
GSUB Engine Auto Shaping Pipeline Arabic Shaping |
|
Cấp phát và truy vấn các mã điểm tổng hợp trong Private Use Area (U+E000 - U+F8FF) cho những GID thay thế của OpenType GSUB không có mã Unicode tự nhiên nào có thể truy cập qua cmap của phông. Điều này khép lại khoảng trống phát ra ở mức GID phía producer do các API truy vấn và tinh chỉnh GSUB v2.119.43-66 để lại
Cú pháp Delphi: function AssignSyntheticCodepointForGID(GID: Word; out SyntheticCP: Word): Boolean; function GetSyntheticCodepointForGID(GID: Word): Word;
Vì sao API này tồn tại Chuỗi tạo hình tự động phía producer v2.119.32-67 (Arabic / Latin / Devanagari) yêu cầu các GID thay thế do bộ máy GSUB trả về phải đi tới được qua một mã điểm Unicode - pipeline văn bản mã hex hiện có phát ra codepoint chứ không phải GID, và trình đọc phía tiêu thụ sẽ giải mã codepoint trở lại GID thông qua
Nhưng các thay thế riêng của phông rơi vào những GID nội bộ của phông - phần lớn các cụm Devanagari, các biến thể kiểu chữ mà nhà thiết kế chỉ phát hành dưới dạng GID đánh số, các chuỗi biến thể ideograph CJK (IVS), các ligature tùy chọn không có Presentation Form tương ứng - thì không có codepoint nào trong cmap của phông. Trước v2.119.68, các GID này không thể đi qua pipeline hex phía producer; v2.119.68 khép lại khoảng trống đó bằng cách cho phép bên gọi cấp phát một codepoint tổng hợp trong Private Use Area cho bất kỳ GID nào
Ngữ nghĩa của AssignSyntheticCodepointForGID Cấp phát codepoint PUA tiếp theo còn trống (bắt đầu từ U+E000) cho GID được cung cấp và ghi lại phép gán vào mọi cache mà chuỗi pipeline hex phía producer + giải mã phía consumer đang phụ thuộc vào:
1. 2. 3.
Trả về
Ngữ nghĩa của GetSyntheticCodepointForGID Truy vấn thuần túy đối với một phép gán đã tồn tại. Trả về codepoint tổng hợp đã cấp phát cho
Vòng đời trạng thái bộ cấp phát
Quy trình điển hình (hình dạng cụm 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;
Idempotency example
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)
Hành vi của reader phía consumer Trình đọc phía consumer thấy codepoint PUA trong toán tử hiển thị văn bản và giải mã nó qua
Hành vi copy / paste: codepoint PUA sẽ round-trip đúng chính nó qua copy / paste khi ToUnicode CMap khai báo chúng là ánh xạ đồng nhất. Bên gọi muốn các ký tự Unicode nguồn (dải đầu vào đã tạo ra substitute) round-trip thay vào đó có thể đăng ký ánh xạ ngược bằng
Khép lại lộ trình Phase 8 v2.119.68 / Phase 8c.6 khép lại lộ trình máy GSUB Phase 8: mọi API truy vấn LookupType 1-8 (Phase 1-6), API chọn Script / LangSys (Phase 7), điểm vào closure của bộ cắt con TTF (Phase 9), bước gộp ligature hậu xử lý tĩnh (v2.119.32 / 58 / 60 / 62), pipeline tự động opt-in (v2.119.59), phát tự động Arabic
See also: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Arabic / Persian / Urdu Shaping Support, Syriac / Mongolian / Devanagari Shaping, THotPDF.BeginTaggedContent |