ผมส่องดูซอร์สโค้ดของ Pango และ HarfBuzz ก็พบมรดกของคุณเทพพิทักษ์อยู่ในนั้นครับ Pango มีโมดูลไทย (ถ้าผมเข้าใจไม่ผิดต้องคอมไพล์พร้อม libthai headers?) ส่วน HarfBuzz ก็เอาสเปค OpenType ที่คุณเทพเขียนไว้ใส่เป็น
hb-ot-shape-complex-thai แล้ว มีฟังชั่น
preprocess_text_thai ซึ่งใกล้เคียงกับ
lib เล็กๆ ที่ผมหมายถึงในโพสต์ก่อนหน้านี้ครับ (อย่างน้อยผมอุ่นใจที่รู้ว่ามี opensource lib ทำไว้แล้ว แม้จะเพื่อ legacy font ของโอเอสแต่ละเจ้าก็ตาม) ถ้าผมเข้าใจไม่ผิด HarfBuzz ไม่ใช่แค่ shaper แต่ทำหน้าที่เป็นเหมือน OT driver สำหรับ shaper ตัวอื่นๆ ด้วย ผมทดสอบ OT shaper ด้วย hb-view ใน Mac แล้วประทับใจ (ใน Debian/Ubuntu hb-view จะรวมอยู่ใน libharfbuzz-bin) เราสามารถเลือกข้าม native shaper ของโอเอสได้ด้วย API ของ HB อันนี้คงเป็นข้อดีสำหรับผู้ผลิตซอฟต์แวร์ที่ต้องการใช้ HB ดูแลการแสดงผลฟอนต์โดยเฉพาะ ไม่เกี่ยวกับคนทำฟอนต์โดยตรงนะครับ
ผมรวมสคริปต์และภาพที่ทดสอบด้วย hb-view กับ pango-view ไว้ใน
F0ntUni branch 0.2 สรุปโดยรวมคือ HarfBuzz OT จัดตำแหน่งตัวอักษรไทยใน Mac ได้ดีกว่า Pango ครับ (
ซึ่งเละเลย) ผมคิดว่า HarfBuzz เป็นอนาคตที่ดีกว่าสำหรับทั้งผู้ผลิตซอฟต์แวร์และคนทำฟอนต์แบบ OpenType (ถ้าผู้ผลิตโอเอสมี API ให้ปิด native shaper ด้วยจะดีมาก ฮา! :)
นอกเรื่องไปไกล ทีนี้มาเข้าเรื่องฟอนต์เทมเพลตนะครับ มี 2 เรื่องหลักๆ ที่ผมอยากปรึกษาและขอความเห็นจากคุณเทพเกี่ยวกับมาตรฐาน เอาไว้เป็นแนวทางสำหรับการพัฒนาฟอนต์ที่ใช้งานได้ข้ามแพลตฟอร์มครับ
1. OT features ที่จำเป็นต้องใช้ตอนนี้ F0ntUni ทำเทมเพลตไว้ 2 แบบ คือ แบบ A ที่ไม่พึ่งตัวหลบโดยใช้ mark & mkmk เป็นหลัก (แต่สลับตำแหน่งนิคหิตกับวรรณยุกต์ด้วย liga) กับ แบบ B ที่ใช้ตัวหลบโดยไม่พึ่งฟีเจอร์อะไรใน GPOS
1.1 GSUB ccmp จำเป็นแน่ๆ สำหรับการทำ glyph substitute, contextual substitute
1.2 GSUB locl อันนี้ผมก็คิดว่าจำเป็นสำหรับ localize ภาษาบาลี-สันสกฤตที่เขียนด้วยตัวอักษรไทย ผมเข้าใจว่าฟอนต์ในชุด TLWG ใช้ ccmp ซึ่ง FireFox รองรับทั้ง ccmp และ locl โดยอัตโนมัติ เมื่อกำหนด lang=pi-TH และ lang=sa-TH (ตอนนี้มีแค่ FireFox ที่รองรับ lang attribute เพื่อระบุตัวอักษรตามภาษาใน html นะครับ ส่วน HarfBuzz และ Pango รองรับ locl อยู่แล้วจากที่ผมทดสอบ) แต่ผมจะเห็นต่างจากคุณเทพในแง่การเลือกใช้ฟีเจอร์ เพราะโดยทั่วไปฟอนต์ Latin, Cyrillic, Arabic และอื่นๆ ที่มีตัวอักษรใน code point เดียวกันแต่ที่ใช้เขียนในภาษาที่ต่างกันจะใช้ฟีเจอร์ locl เพื่อแสดงผล localized form (หรือ preferable form) ยกตัวอย่างเช่น Romanian Latin, Turkish Latin, Russian Cyrillic, Bulgarian Cyrillic ผมคิดว่าบาลีไทยกับสันสกฤตไทยก็อยู่ในกรณีเดียวกัน เพียงแต่ไม่ค่อยมีใครใช้ locl กับตัวอักษรไทย
ผมเลยเห็นว่าใช้ locl เพื่อแสดง ฐ ญ ไม่มีเชิงน่าจะเหมาะสมกว่าใช้ ccmp ในแง่ semantic ครับ และ W3C ก็ recommend ไว้ใน font module ให้เป็น
default feature สำหรับผู้ผลิตบราวเซอร์ด้วย ต่อไปบราวเซอร์ที่ปฏิบัติตามความเห็นของ W3C ก็ต้องรองรับ locl เป็นค่าตั้งต้นกันมากขึ้น รวมถึง ccmp, mark, mkmk ด้วย (ผมเป็น web developer น่ะครับ เลยเน้นทำฟอนต์ให้แสดงผลในเว็บได้เหมาะสม)
ส่วนการที่ผมใส่ salt & ssXX ไว้สำหรับ ฐ ญ ก็เพื่อแก้ปัญหาให้โปรแกรมของ Adobe, word processor และเว็บบราวเซอร์ที่ไม่รองรับ locl มีทางเลือกใช้ ฐ ญ ไม่มีเชิงแบบง่ายๆ ถ้ามันรองรับ 2 ฟีเจอร์นี้ไม่ตัวใดก็ตัวหนึ่ง (ไม่ต้องใช้วิธี insert ทีละตัว หรือในกรณีของบราวเซอร์ก็เรียกผ่าน CSS ได้ประมาณนั้น) ถ้าต่อไปโปรแกรมส่วนใหญ่รองรับหรือมีวิธีเข้าถึง locl ฟีเจอร์ salt & ssXX ก็ไม่จำเป็นต้องใส่ไว้ครับ
1.3 GPOS mark & mkmk อันนี้จะมีปัญหาใน MacOS เท่าที่ผมรู้ Core Text ของ Apple ไม่เข้าใจ mark กับ mkmk ดังนั้นฟอนต์ไทยที่พึ่งสองฟีเจอร์นี้จึงแสดงผลไม่ถูกต้องในโปรแกรมทั่วไปของ Mac (ยกเว้นจะทำฟีเจอร์เฉพาะสำหรับ AAT ใส่ไว้ในฟอนต์ด้วย ซึ่งผมยังไม่ได้ศึกษา) ในอีกมุมหนึ่ง ถ้าฟอนต์ไม่มีฟีเจอร์ในตาราง GPOS เลย text engine บางตัวจะไม่คิดว่าฟอนต์ตัวนั้นเป็น complex script มันจะไม่เปิดฟีเจอร์ mark & mkmk ให้ (text engine ของ Adobe เป็นตัวอย่าง ไม่แน่ใจว่า Uniscribe ของ Windows ตีความแบบนี้ด้วยรึเปล่า?) แล้วมันจะแสดงผล PUA glyphs ไม่ถูกต้อง (
ภาพตัวอย่างเทมเพลต F0ntUni B เดิมที่ไม่มีฟีเจอร์ใน GPOS เลย) อีกอย่างถ้าต้องการให้ฟอนต์ไทยรอบรับภาษาชาติพันธุ์ก็ต้องมี mark กับ mkmk อย่างหลีกเลี่ยงไม่ได้ (ยกเว้นจะใช้ Graphite ใส่เพิ่มต่างหาก ซึ่งผมก็ยังไม่ได้ศึกษา)
ดังนั้นในความเห็นของผมเพื่อความปลอดภัยฟอนต์ไทยแบบ OT ต้องมีทั้ง GSUB และ GPOS (แม้จะเป็นแค่ฟีเจอร์กลวงๆ ก็ตาม)
2. ควรใส่ PUA glyphs แบบไหนตอนแรกผมไม่เข้าใจว่าทำไมถึงมี Windows PUA กับ Mac PUA เพราะ Unicode ไม่ได้กำหนดไว้ซักหน่อยว่าต้องใส่ตัวหลบไทยไว้ที่ code point ไหน แต่หลังจากอ่านสเปคที่คุณเทพเขียนไว้ผมถึงได้เข้าใจว่าเป็นเหตุผลด้าน compatibility เพราะฟอนต์ไทยของโอเอสเหล่านั้นเขาใส่ไว้แบบนั้นนานแล้วแต่ดันใส่ไม่เหมือนกัน! (สำหรับท่านที่ไม่คุ้นกับยูนิโค้ด PUA คือ Private Use Area ที่ยูนิโค้ดไม่ได้กำหนดว่า code point ในส่วนนี้เป็นของตัวอักษรใด)
ตอนนี้ผมใส่ PUA glyphs ในสำหรับ F0ntUni B ที่ช่วง EE0D-EE4D, F0E48-F0E4D, FEE48-FEE4D เหตุผลเพราะมันยังว่างอยู่และผมอยากให้เลขฐานสิบหก 3 ตัวหลังมันจำง่าย เช่น ไม้เอก 4 ตำแหน่งลงท้ายด้วย E48 เหมือนกัน 0E48, EE48, F0E48, FEE48 เป็นต้น ไม่ได้ยึดตามของทั้ง Windows และ Mac
คำถามคือการใส่ PUA glyphs ไม่ตรงกับฟอนต์เก่าในโอเอสไหนเลยมันจะสร้างปัญหาอะไรรึเปล่าครับ? แล้วถ้ามันสร้างปัญหาเราควรเลือก PUA glyphs แบบ Windows หรือ Mac? (การใส่ไว้ทั้งสองแบบไม่ใช่ทางเลือกของผมแน่ๆ เพราะต้องมีไม้เอก 7-8 ตัว!)
ถ้าผมเข้าใจไม่ผิด HarfBuzz จะจัดการฟอนต์ไทยที่ไม่ใช่ OT จากโอเอสเก่าให้แสดงผลได้ถูกต้องด้วย เพราะเขาทำ glyph mapping ไว้ให้ (แต่อ่านจากคอมเมนต์ในโค้ดเขายึดตาม Uniscribe ของ Windows มากกว่า Mac นะ โดยเฉพาะเรื่อง reordering นิคหิตกับวรรณยุกต์)
นอกจากนี้ถ้ามีคำแนะนำอื่นๆ ก็เสนอไว้ได้ครับ จริงๆ ผมสนใจหลายโครงการของคุณเทพ โดยเฉพาะโครงการอักษรอีสานและภาษาชาติพันธุ์ (ซึ่งผมก็เพิ่งรู้ว่ามีอักษรธรรมเมื่อไม่นานนี่เอง) แต่ไม่แน่ใจว่าผมจะเข้าไปมีส่วนร่วมและเรียนรู้ได้ทางไหนบ้าง?