|
Syriac / Mongolian / Devanagari Shaping Support Multi-script capability surfaces (v2.119.53 - v2.119.55)
|
Arabic Shaping Auto Shaping Pipeline GSUB Engine |
|
HotPDF เปิดเผยความสามารถด้านคลาสการเชื่อมโยง / การวิเคราะห์ตำแหน่ง / หมวดหมู่พยางค์อักษรอินเดียสำหรับอักษรที่มีความซับซ้อนสามระบบนอกเหนือจากภาษาอาหรับ ได้แก่ ซีเรียก (U+0700-U+074F), มองโกเลีย (U+1800-U+18AF) และเทวนาครี (U+0900-U+097F) ความสามารถแต่ละอย่างช่วยให้ผู้เรียกขับเคลื่อนการทำงานของอักษรผ่านเอนจิน GSUB ของ OpenType ที่มีอยู่เพื่อให้ได้รูปทรงที่ถูกต้อง โดยปล่อยหน้าที่ที่มีน้ำหนักมาก (การตรวจจับขอบเขตกลุ่ม, การแปลงทิศทาง BiDi, การจัดตำแหน่ง GPOS) ไว้นอกขอบเขตของ HotPDF
ความสามารถการปรับรูปร่างอักษรซีเรียก (v2.119.53) สองเมธอดใหม่เปิดเผยพฤติกรรมการเชื่อมโยงของอักษรซีเรียก:
function GetSyriacJoiningClass(CP: Cardinal): TJoiningClass; function GetSyriacPosition(const Run: array of Cardinal; Index: Integer): TPosition;
อักษรซีเรียกใช้โครงสร้างสี่คลาสแบบเดียวกับภาษาอาหรับ ได้แก่ การเชื่อมขวา / การเชื่อมคู่ / โปร่งใส / ไม่เชื่อมต่อ เมธอด GetSyriacJoiningClass จะจัดประเภทจุดรหัสแต่ละจุดในบล็อก U+0700-U+074F ตามคุณสมบัติการเชื่อมโยงของ Unicode ส่วน GetSyriacPosition จะสำรวจช่วงอักษรซีเรียกและแก้ปัญหาอักขระแต่ละตัวไปยังตำแหน่งแยกเดี่ยว / เริ่มต้น / กลาง / สุดท้าย โดยอิงจากคลาสการเชื่อมโยงของอักขระข้างเคียงที่อยู่ติดกัน
ไม่เหมือนกับภาษาอาหรับ บล็อกอักษรซีเรียกไม่มีรูปแบบการนำเสนอ (Presentation Forms) ที่เข้ารหัสล่วงหน้าใน Unicode โดยไม่มีอักษรซีเรียกที่เทียบเท่ากับบล็อกรูปแบบการนำเสนอภาษาอาหรับ U+FB50-FDFF / U+FE70-FEFC ดังนั้น ผู้ใช้จึงต้องขับเคลื่อนการปรับรูปร่างอักษรซีเรียกผ่านการค้นหา GSUB ที่กำหนดโดยแบบอักษร (โดยทั่วไปคือ init / medi / fina / isol + rlig) แทนที่จะเป็นการเขียนจุดรหัสใหม่ เลเยอร์ความสามารถข้างต้นช่วยให้ผู้เรียกได้ป้ายกำกับตำแหน่งที่จำเป็นเพื่อสอบถามฟีเจอร์ GSUB ที่ถูกต้องสำหรับกลิฟแต่ละตัว
ความสามารถการปรับรูปร่างอักษรมองโกเลีย (v2.119.54) สองเมธอดขนานกันสำหรับอักษรมองโกเลีย:
function GetMongolianJoiningClass(CP: Cardinal): TJoiningClass; function GetMongolianPosition(const Run: array of Cardinal; Index: Integer): TPosition;
การครอบคลุมประกอบด้วยอักษรมองโกเลียพื้นฐาน (U+1820-U+1842), Todo (U+1843-U+1877), Sibe (U+1880-U+18A8), Manchu และส่วนขยาย Ali Gali สำหรับตัวเลือกการแปรผัน FVS1 / FVS2 / FVS3 (U+180B-U+180D), ยัติภังค์นุ่ม NIRUGU (U+180A) และเครื่องหมายสระ Ali Gali ทั้งหมดจะถูกจัดประเภทเป็นแบบโปร่งใส (T-class) เพื่อให้มีส่วนร่วมในการเชื่อมโยงโดยไม่ขัดขวางการประมวลผล
เช่นเดียวกับอักษรซีเรียก อักษรมองโกเลียไม่มีรูปแบบการนำเสนอ (Presentation Forms) ที่เข้ารหัสล่วงหน้าใน Unicode เค้าโครงแนวตั้งแบบดั้งเดิมของมองโกเลีย กฎการผันแปรของรูปร่างอักษรที่ซับซ้อน และการเลือกรูปร่างที่ขับเคลื่อนด้วย FVS ล้วนคาดว่าจะถูกขับเคลื่อนโดยการค้นหา GSUB ที่กำหนดโดยแบบอักษร (โดยทั่วไปคือ init / medi / fina / isol + ccmp / rlig / locl) เลเยอร์ความสามารถนี้ช่วยให้ผู้เรียกได้ป้ายกำกับตำแหน่งที่จำเป็นเพื่อสอบถามฟีเจอร์เหล่านั้น
ความสามารถการปรับรูปร่างอักษรเทวนาครี (v2.119.55) อักษรเทวนาครีมีความแตกต่างอย่างสิ้นเชิงจากอักษรอาหรับ / ซีเรียก / มองโกเลีย โดยเป็นอักษรประเภทสระประกอบ (Indic abugida) ซึ่งหน่วยที่มีความหมายคือกลุ่มพยางค์ (อักษร) ไม่ใช่ตัวอักษรเดี่ยว และลำดับการแสดงผลของกลิฟภายในกลุ่มมักแตกต่างจากลำดับยูนิโค้ดตามตรรกะ มีสองเมธอดที่เปิดเผยเลเยอร์ความสามารถอักษรอินเดียของอักษรเทวนาครี
function GetDevanagariCategory(CP: Cardinal): TIndicCategory; procedure ApplyDevanagariReorder(var Run: array of Cardinal);
GetDevanagariCategory จะจัดประเภทจุดรหัสแต่ละจุดในช่วง U+0900-U+097F ออกเป็นหนึ่งใน 13 หมวดหมู่พยางค์อักษรอินเดีย (Base / Consonant / Vowel / Independent Vowel / Vowel Mark / Pre-base Matra / Above-base Matra / Below-base Matra / Halant Virama / Repha / Anusvara / Visarga / Other) เพื่อให้ผู้เรียกใช้สามารถตรวจจับขอบเขตพยางค์และระบุตำแหน่งภายในแต่ละกลุ่มที่ต้องจัดเรียงใหม่ได้
ApplyDevanagariReorder คือขั้นตอนเตรียมการที่ตรวจสอบช่วงข้อมูลนำเข้าและใช้กฎการจัดเรียงใหม่สองกฎหลักของอักษรเทวนาครี: (1) Repha (Ra + Halant ที่จุดเริ่มต้นของกลุ่มพยางค์) จะถูกย้ายไปยังตำแหน่งหลังพยัญชนะฐานของกลุ่ม เพื่อให้แสดงผลเป็นตะขอด้านบน (superscript hook); (2) Pre-base I-matra (U+093F DEVANAGARI VOWEL SIGN I) จะถูกย้ายไปข้างหน้าพยัญชนะฐานของกลุ่ม เพื่อให้แสดงผลเป็นตะขอด้านซ้าย ส่วนการจัดเรียงใหม่อื่นๆ ของอักษรอินเดีย (matra ด้านบน, matra ด้านล่าง, การรวมตัวสะกด) จะถูกปล่อยให้เป็นหน้าที่ของเอนจิน GSUB ของแบบอักษร เนื่องจากจำเป็นต้องใช้ตารางการค้นหาเฉพาะของแบบอักษรนั้นๆ
การทำงานร่วมกันโดยอัตโนมัติ (v2.119.67): เมื่อมี sfIndicShaping ใน PDF.ShapingFeatures เมธอด ApplyDevanagariReorder จะถูกเรียกใช้งานโดยอัตโนมัติเป็นขั้นตอนเตรียมการภายในตัวช่วย BuildUnicode*FieldContent ทั้งสามตัว จากนั้นเอนจิน GSUB ของโปรแกรมอ่านจะรับพยางค์ไปในลำดับที่ถูกต้องและใช้กฎการปรับรูปร่างตามบริบทของตัวเอง ดูที่ ท่อส่งการปรับรูปร่างอัตโนมัติ (Automatic Shaping Pipeline)
เวิร์กโฟลว์ทั่วไป (อักษรซีเรียก)
PDF.RegisterUnicodeTTF('Estrangelo', 'SyrCOMEdessa.otf'); PDF.SetGSUBScript('syrc'); // see GSUB engine doc for i := 0 to Length(Run) - 1 do begin Pos := PDF.GetSyriacPosition(Run, i); // init / medi / fina / isol // ค้นหา GSUB สำหรับสัญลักษณ์แทนที่ที่เหมาะสมกับตำแหน่ง // emit + MarkUnicodeGlyphUsed end;
เวิร์กโฟลว์ทั่วไป (อักษรเทวนาครีพร้อมการจัดเรียงใหม่โดยอัตโนมัติ)
PDF.RegisterUnicodeTTF('NotoDeva', 'NotoSansDevanagari-Regular.ttf'); PDF.ShapingFeatures := [sfIndicShaping]; // auto Repha + I-matra reorder PDF.CurrentPage.SetFont('NotoDeva', [], 14); PDF.CurrentPage.UnicodeTextOut(50, 700, 0, UnicodeString(#$0939#$093F#$0928#$094D#$0926#$0940)); // "Hindi"
ตัวช่วยแยกและซับเซ็ต Unicode RegisterToUnicodeReverseMapping จะบันทึกจุดรหัสต้นทางสำหรับเอาต์พุตกลิฟที่ปรับรูปร่างหรือสังเคราะห์ขึ้น เมธอด ClearToUnicodeReverseMappings จะรีเซ็ตตาราง ส่วน ToUnicodeReverseMappingCount จะรายงานขนาด เมธอด GetUnicodeGlyphForCodepoint จะคืนค่ารหัสกลิฟแบบอักษรที่ลงทะเบียนสำหรับจุดรหัส Unicode และ EnableShapingFeatureForSubset จะทำเครื่องหมายสัญลักษณ์แทนที่จากฟีเจอร์ GSUB เพื่อรวมเข้ากับซับเซ็ตฝังตัว
ขอบเขตและข้อจำกัด การทำงานร่วมกันฝั่งผู้สร้างในปัจจุบัน ขณะนี้การปรับรูปร่างอักษรซีเรียก มองโกเลีย ทิเบต และอินเดียมีหน้าอ้างอิง API ที่ชัดเจนแล้ว โดยสามารถเปิดใช้งานอักษรซีเรียกได้ผ่าน AutoShapeSyriac, อักษรมองโกเลียผ่าน sfMongolianShaping, อักษรทิเบตผ่าน sfTibetanShaping, การจัดเรียงอักษรอินเดียใหม่ผ่าน sfIndicShaping และการปรับรูปร่าง GSUB อักษรอินเดียแบบเต็มรูปแบบผ่าน sfIndicGSUB โดยจุดเข้าใช้งานโดยละเอียดจะได้รับการจัดทำเอกสารไว้ใน เมธอดการปรับรูปร่างอักษรทิเบต/มองโกเลีย/ซีเรียก และ เมธอดการปรับรูปร่างอักษรอินเดีย ขอบเขตในปัจจุบันยังครอบคลุมถึงอักษร N'Ko และ Adlam ซึ่งเป็นสคริปต์ตัวเขียนแบบขวาไปซ้าย (RTL cursive), การจัดเรียงสระอำ (SARA AM) และวรรณยุกต์ของภาษาไทย/ลาว, การจัดเรียง niqqud ของภาษาฮีบรู และเครื่องหมายก่อนพยัญชนะฐานของภาษาชวา เส้นทางเหล่านี้ได้รับการบันทึกไว้ใน วิธีการเตรียมการปรับรูปร่างสคริปต์
ดูเพิ่มเติม: การสนับสนุนการปรับรูปร่างภาษาอาหรับ / เปอร์เซีย / อูรดู, ท่อส่งการปรับรูปร่างอัตโนมัติ (เฟส 8), เอนจินการแทนที่ GSUB ของ OpenType, THotPDF.AssignSyntheticCodepointForGID |