|
Chuỗi tạo hình tự động nâng bộ máy OpenType GSUB từ một bề mặt chỉ để truy vấn khả năng thành một tính năng phía producer được áp dụng tự động khi văn bản được phát ra vào các luồng nội dung PDF. Bên gọi bật các tính năng GSUB cụ thể qua một tập hợp đã kiểu hóa (ShapingFeatures: THPDFShapingFeatures) và HotPDF sẽ lo việc chạy các phép thay thế phù hợp, đánh dấu glyph thay thế vào subset phông nhúng, và phát các mục ánh xạ ngược ToUnicode CMap cần cho khả năng truy cập
Khung tùy chọn (v2.119.59 / Phase 8a)
Một enum và một thuộc tính mới kiểm soát những phép thay thế tự động nào sẽ chạy trong lúc phát văn bản:
type
THPDFShapingFeature = (
sfArabicGSUB, // native Arabic init / medi / fina / isol + rlig / calt / rclt
sfStandardLigatures, // Latin 'liga' (ff / fi / fl / ffi / ffl / sft / st)
sfContextualLigatures,// Latin 'clig' (contextual ligatures)
sfContextualAlternates,// 'rclt' (Required Contextual Alternates)
sfIndicShaping); // Devanagari Repha + pre-base I-matra reorder
THPDFShapingFeatures = set of THPDFShapingFeature;
property ShapingFeatures: THPDFShapingFeatures read ... write ...;
Mặc định là [] (tập rỗng), giúp giữ đầu ra byte-identical cho những bên gọi phụ thuộc vào bộ tạo hình hậu xử lý tĩnh v2.119.32-58. Đặt một hay nhiều cờ sẽ đưa bộ máy vào chế độ tự động cho các tính năng tương ứng
sfArabicGSUB - tạo hình Arabic GSUB gốc (v2.185.0)
Khi đặt sfArabicGSUB, HotPDF ánh xạ một dải Arabic logic sang các GID glyph gốc, áp dụng các tra cứu vị trí init, medi, fina và isol của phông đã đăng ký tại các vị trí nối được chọn cho từng chữ cái, rồi áp dụng rlig, calt và rclt lên dải đã tạo hình. Các glyph thay thế không có mã điểm Unicode sẽ được phát qua đường codepoint tổng hợp kèm ánh xạ ngược ToUnicode, nên các phông có glyph Arabic theo ngữ cảnh nằm ngoài cmap vẫn có thể được nhúng và sao chép đúng
Việc bật sfArabicGSUB sẽ ngầm bỏ qua bộ tạo hình tĩnh 4 vị trí cho Arabic của v2.85.0 - bên gọi nào vẫn cần bộ tạo hình tĩnh để tiếp tục xử lý các codepoint nằm ngoài phần mà GSUB của phông khai báo thì nên để sfArabicGSUB tắt
sfStandardLigatures / sfContextualLigatures - Phase 8b (v2.119.65)
Khi đặt sfStandardLigatures, các Latin Standard Ligatures sẽ được gộp tự động bằng feature liga của phông. ApplyLatinLigatureRefinement nhắm vào khối Alphabetic Presentation Forms (U+FB00-FB4F) - điển hình là FB00 ff, FB01 fi, FB02 fl, FB03 ffi, FB04 ffl, FB05 long-s + t, FB06 st. sfContextualLigatures thêm một lượt xử lý thứ hai cho feature clig của phông. Cả hai lượt đều dùng cơ chế reverse-cmap giống sfArabicGSUB và phát ra 7 mục ánh xạ ngược ToUnicode CMap mới (FB00-FB06) để copy / paste ở trình đọc phía tiêu thụ tách ligature trở lại thành các chữ cái nguồn
sfContextualAlternates - GSUB 'rclt' (v2.119.66)
Khi đặt sfContextualAlternates, feature rclt (Required Contextual Alternates) của phông sẽ được áp dụng. ApplyArabicGSUBContextualRefinement dùng điểm vào ApplyContextualSubst của v2.119.47 và xử lý đầu ra biến độ dài N-to-M (phép thay thế chỉ được chốt khi mọi GID thay thế đều đi tới được qua reverse cmap). Phạm vi reverse cmap được mở rộng tới FB00-FDFF + FE70-FEFF để bao trọn Presentation Forms Latin + Arabic + Hebrew
Các trường hợp điển hình của rclt: Arabic init / medi / fina / isol khi phông điều khiển tạo hình vị trí thông qua GSUB thay vì qua các codepoint Unicode Presentation Forms; một số quy tắc phân biệt chuỗi Latin; các feature tạo hình Indic pres / blws / psts / half / pstf / cjct khi nhà thiết kế phông đăng ký chúng dưới dạng rclt
sfIndicShaping - Phase 8e (v2.119.67)
Khi đặt sfIndicShaping, năng lực Devanagari ApplyDevanagariReorder của v2.119.55 được nâng từ một phương thức thủ công thành một lượt tiền xử lý tự động bên trong ba helper BuildUnicode*FieldContent. Các dải Devanagari sẽ được chuyển Repha (Ra + Halant ở đầu cụm) sang vị trí sau base, còn I-matra đặt trước base (U+093F) được chuyển ra trước phụ âm gốc của cụm, để bộ máy GSUB của trình đọc phía consumer lấy âm tiết theo đúng thứ tự kết xuất. Các phép reorder Indic khác (matra trên base / dưới base, tạo conjunct) vẫn nằm trong GSUB của phông
Hỗ trợ truy vấn advance (v2.119.64 / Phase 8c.5)
Một API đi kèm phơi ra phân số em đã cache của /W để bên gọi có thể tính wrap từ đúng khi phát các glyph đã được thay thế qua GSUB:
function GetCodepointAdvance(CP: Cardinal): Single;
Trả về độ rộng advance lấy từ hmtx dưới dạng phân số em cho glyph được cmap giải quyết tại CP. Cùng bản phát hành đó cũng sửa CodeUnitAdvance để phân loại Arabic Presentation Forms (U+FB50-FDFF + U+FE70-FEFF) là NARROW thay vì WIDE (quy tắc dự phòng heuristic trước v2.65 là sai)
Quy trình điển hình (tạo hình Arabic tự động đầy đủ)
PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf');
PDF.ShapingFeatures :=
[sfArabicGSUB, // native Arabic GSUB contextual glyphs
sfCursiveAttachment]; // GPOS cursive entry / exit anchors
PDF.SetGSUBScript('arab');
PDF.BeginDoc;
PDF.CurrentPage.SetFont('NotoArab', [], 14);
PDF.CurrentPage.RtLTextOut(100, 700, 0,
UnicodeString(#$0628#$0633#$0645#$0020#$0627#$0644#$0644#$0647));
PDF.EndDoc;
Quy trình điển hình (ligature Latin chuẩn + reorder Devanagari)
PDF.RegisterUnicodeTTF('NotoSans', 'NotoSans-Regular.ttf');
PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf');
PDF.ShapingFeatures :=
[sfStandardLigatures, // FB00-FB06 Latin liga
sfContextualLigatures, // + clig
sfIndicShaping]; // Devanagari Repha + I-matra reorder
Khép lại lộ trình Phase 8
Phase 8a (v2.119.59) khung opt-in + khả năng Arabic; Phase 8b (v2.119.65) các ligature chuẩn Latin; Phase 8c.1 (v2.119.60) Allah; Phase 8c.2 (v2.119.63) GSUB rlig ở mức GID; Phase 8c.3 (v2.119.61) ánh xạ ngược ToUnicode; Phase 8c.4 (v2.119.62) Bismillah; Phase 8c.5 (v2.119.64) truy vấn advance + sửa heuristic; Phase 8c.6 (v2.119.68) phát codepoint PUA tổng hợp; Phase 8d được nhập vào các phân đoạn phụ 8c; Phase 8e (v2.119.67) tự đảo thứ tự Devanagari Với v2.119.68, ma trận khả năng của Phase 8 đã khép lại; các tinh chỉnh tiếp theo (thêm script Indic, định vị OpenType GPOS, xử lý BiDi) được theo dõi trong các mục lộ trình riêng
Phạm vi và giới hạn
Pipeline tùy chọn này được thiết kế để chỉ cộng thêm lên bộ tạo hình hậu xử lý tĩnh - các bên gọi hiện có sẽ không thấy thay đổi hành vi trừ khi họ bật vào. Tập mặc định [] là lựa chọn an toàn cho các bộ hồi quy cần byte ổn định. Phông không có các bảng feature GSUB được yêu cầu sẽ cho đầu ra no-op an toàn (bên gọi thấy không có phép thay thế nào được áp dụng và cũng không có ngoại lệ nào được ném ra)
Bản đồ API tạo hình hiện tại
Pipeline hiện tại không còn chỉ là thay thế đơn thuần nữa: sfKerning áp dụng pair kerning của GPOS, sfMarkPositioning áp dụng độ lệch Mark-to-Base và Mark-to-Mark, sfMarkToLigature áp dụng vị trí Mark-to-Ligature, sfCursiveAttachment áp dụng căn chỉnh anchor nhập / thoát chữ viết tay, sfTibetanShaping áp dụng tạo hình GSUB cho Tibetan, sfMongolianShaping áp dụng các dạng vị trí Mongolian, và sfIndicGSUB áp dụng chuỗi feature GSUB Indic sau khi reorder âm tiết. Xem ShapingFeatures, các phương thức GPOS và các phương thức tạo hình Indic
Các bổ sung gần đây thêm sfLocalizedForms cho locl, calt qua ApplyGSUBContextualFeature, kerning ngữ cảnh và kerning dọc của GPOS, phát glyph ngữ cảnh Arabic gốc qua GSUB, cùng các đường dẫn cho N'Ko, Adlam, Thai/Lao, Hebrew và Javanese. Xem các phương thức tiền xử lý tạo hình script
Xem thêm: Bộ máy thay thế OpenType GSUB, Hỗ trợ tạo hình Arabic / Persian / Urdu, Hỗ trợ tạo hình Syriac / Mongolian / Devanagari, THotPDF.AssignSyntheticCodepointForGID, CFF / OpenType Font Subsetting
|