Theppitak's blog

My personal blog.

22 เมษายน 2550

Font Hinting Solutions

คุณ wd แนะนำ มาว่า มีวิธี สร้าง TrueType hint ด้วย fontforge โดยแค่กำหนดรูปแบบ spline ของฟอนต์จาก Cubic ในแบบ Type 1 ให้เป็น Quadratic ของ TrueType เมนู hinting ที่เกี่ยวกับ TrueType ทั้งหมดที่เคย gray อยู่ ก็จะเรียกใช้ได้

ว้าว ใช้ได้จริง ๆ ด้วย และนี่คือผลที่ได้จากการสั่ง AutoInstr:

(screenshot ทั้งหมดข้างล่างนี้ ใช้การตั้งค่าฟอนต์แบบเปิดใช้ hint เต็มที่ และไม่มีการใช้ subpixel ช่วย)

ก่อนทำ:

Unhinted Loma TTF

หลังทำ:

Hinted Loma TTF

หลังจากตื่นเต้นอยู่พักหนึ่ง ก็คิดหาทางปรับ hint โดยอาศัย Tutorial ของไมโครซอฟท์ แต่กลับต้องพิศวงงงงวย กับ instruction ต่าง ๆ ที่รูปแบบไม่ต่างจากภาษาแอสเซมบลีเท่าไร อีกอย่าง การปรับ quadratic spline ก็ทำได้ยากกว่า cubic spline ที่คุ้นเคยด้วย

แต่ยังก่อน นั่นยังไม่ใช่ทั้งหมดของเรื่อง ย้อนกลับไปที่ตอนเช้าของวันนี้ ก่อนจะมาเปิดเครื่องทำงาน.. (และมาเห็นความเห็นของคุณ wd) ขณะทำธุระส่วนตัวก็นึกไปถึงวิธีการสร้างฟอนต์ด้วย fontforge ของเราที่ผ่านมา ที่ทำกับ cubic spline ซึ่งเป็นรูปแบบที่ Type 1 ใช้ แล้ว generate เป็น TTF โดย fontforge จะแปลงรูปแบบ spline เป็น quadratic ให้ ทำให้เราควบคุมการ hint ได้ไม่เต็มที่ และพารามิเตอร์ต่าง ๆ ที่เตรียมไว้ ไม่ว่าจะเป็น HHint, VHint, BlueValues ฯลฯ ก็ล้วนแต่เป็น Postscript ทั้งสิ้น อย่างนี้แล้ว ถ้าเราใช้ฟอนต์ Type 1 โดยตรงได้ ก็คงจะดีไม่น้อย แต่จำได้ว่าฟอนต์ Type 1 จะมีปัญหากับการ shape ภาษาไทย โดยเป็นปัญหาเรื่องการตรวจสอบ glyph ของ fontconfig แต่นั่นก็นานมาแล้ว ตอนนี้จะเป็นยังไงบ้างหนอ

อย่ากระนั้นเลย สิ่งแรกที่ทำในวันนี้คือ ลองฟอนต์ Type 1 ดูเสียหน่อย ได้ผลตามรูป:

Loma Type 1

จะเห็นว่าคุณภาพการ hint ดีกว่า TrueType แต่ยังมีปัญหาวรรณยุกต์ลอยอยู่ ตรวจดูก็ได้ความว่ามี PUA glyph ของวรรณยุกต์ตัวหลบบางตัวอยู่เกินอักขระที่ 255 ไป แล้วก็ไม่โดนอ้างอิงถึง แต่เรื่อง PUA นี่ เราจะ deprecate ในอนาคตแล้วไม่ใช่หรือ เราต้องการ OpenType ต่างหาก

นั่นสิ.. OpenType ไง! OpenType ที่ข้อมูลอยู่ในรูป Postscript แทนที่จะเป็น TrueType ผมเองเคยลองใช้ฟอนต์รูปแบบ OTF แล้วไม่ชอบ เพราะมันคมเกินไป :P แต่พักหลัง ๆ ได้ยินผู้ใช้บ่นเรื่องความเบลอของ TrueType font บนลินุกซ์มากขึ้น.. เอ.. หรือจะลองกลับมาดู OTF อีกครั้ง?

และนี่คือผลที่ได้:

Loma OTF

เป็นไงครับ คมดีไหม? การจัดระดับก็ถูกต้องหมด นี่แหละ คือการเปิดใช้ข้อมูลต่าง ๆ ที่เตรียมไว้อย่างแท้จริง อาจเป็นทางออกให้กับคนที่ชักรู้สึกวิงเวียนกับความเบลอของฟอนต์ TrueType อีกทั้งตัวข้อมูลฟอนต์ก็ไม่ต้องปรับเปลี่ยนอะไรมาก spline และ hinting ทุกอย่าง สามารถนำมาใช้ได้หมด และคุณภาพการ hint ดูจะดีกว่าของ TrueType อยู่หน่อยหนึ่ง (เพราะการรองรับ TrueType instruction ของ fontforge เองยังไม่พัฒนาเต็มที่) แม้จะยังมีบางจุดที่ยังเพี้ยน ก็ดูจะปรับได้ง่ายกว่า TrueType มาก

ว่าแล้วเดี๋ยวนั่ง fine tune hint เสียหน่อยดีกว่า

ป้ายกำกับ:

4 ความเห็น:

  • 25 เมษายน 2550 เวลา 13:39 , Blogger wd แถลง…

    ที่ linux.thai.net เข้าไม่ได้ ขออนุญาตมาโพสต์ที่นี่แทนครับ

    สองวันที่ผ่านมา ผมได้ลองศึกษาเรื่อง Truetype Hint แล้วก็เลยลองดาวน์โหลดพวกโปรแกรมทำฟอนต์ดัง ๆ มาลองทำ Truetype Hint ดู โปรแกรมที่ว่าคือตระกูล FontLab ได้แก่ Studio5, TypeTool3 และลองแปลงฟอนต์พร้อม Hint ไปในตัว ด้วยโปรแกรม TransType พบว่าคุณภาพการ AutoHint ของโปรแกรมเหล่านี้ ค่อนข้างแย่ คุณภาพได้ประมาณสัก 60% ของ OpenType - Postscript Hint ที่คุณเทพแสดงไว้

    เลยคิดว่าถ้าเราจะทำ Truetype Hint ด้วยตัวเอง มันน่าจะเสียเวลามากเกินไป (ถ้าให้ผมทำงานนี้อย่างเดียว ฟอนต์แรกน่าจะกินเวลาสัก 6-8 เดือนจึงจะเสร็จ ฟอนต์ต่อ ๆ มาอาจเร็วขึ้นบ้าง แต่ก็ยังช้าอยู่ดี และคุณภาพไม่มีทางสู้งานระดับหอคอยแบบ Tahoma ได้) สู้เราทำ Postscript Hint อย่างเดิม แล้วให้ระบบ Hint ให้น่าจะดีกว่า ผมว่าคุณภาพการ Hint ดีพอควรทีเดียวครับ นอกจากนั้นยังสามารถตั้งระดับการ Hint ได้ด้วย ยกตัวอย่างเช่นฟอนต์วีรบุตรที่ผมทำใหม่ จะมีลักษณะส่วนโค้งเป็นครีบบาง ๆ อยู่หลายส่วน ถ้าเลือกใช้ Truetype Hint จะทำให้การแสดงผลดูแย่มาก
    แต่หากกำหนดให้ระบบ Hint ให้ โดยกำหนดค่าการ Hint เป็น 2 จะทำให้การแสดงผลดูสบายตาดีมากครับ

    ตัวอย่างไฟล์คอนฟิกของฟอนต์วีรบุตรคือ
    <fontconfig>
    <alias>
    ...
    <family>Verachart</family>
    <default><family>san-serif</family></default>
    </alias>
    ...
    <match target="font">
    <test name="family"><string>Verachart</string></test>
    <edit name="autohint" mode="assign"><bool>true</bool></edit>
    <edit name="hintstyle" mode="assign"><int>2</int></edit>
    </match>
    </fontconfig>

    ผมตั้งชื่อว่า 65-1-ttfonts.conf เอาใส่ไว้ใน /etc/fonts/conf.avail แล้วโยงไปหา /etc/fonts/conf.d ครับ

    เสนอให้ทราบครับ เผื่อจะได้กำหนดค่าการคอนฟิกไว้ใน ttf-thai รุ่นต่อ ๆ ไป

     
  • 25 เมษายน 2550 เวลา 15:14 , Blogger Thep แถลง…

    TrueType hint มันทำยากครับ ผมคิดว่าเรื่องนี้ Postscript ออกแบบมาดีกว่า แต่ก็มีข้อเสียตรงที่ คุณภาพของการ render จะขึ้นอยู่กับ rasterizer ที่ใช้ด้วย ในขณะที่ TrueType font จะอาศัย hint ในฟอนต์ล้วน ๆ rasterizer มีหน้าที่ execute instruction แบบทื่อ ๆ เท่านั้น ภาระเลยมาตกที่คนทำฟอนต์

    เคยคุยกับวิศวกรฝ่าย typography ของ MS คนหนึ่ง เขาบอกว่า เขานับคนที่ทำ TrueType hint ได้ดีจริง ๆ ในโลกนี้ได้ด้วยนิ้วมือเลยเชียว

    Postscript ง่ายกว่าเยอะครับ แต่ปัญหาคือ OO.o ยังใช้ OTF ไม่ได้นี่ซิ :-/

     
  • 25 เมษายน 2550 เวลา 17:02 , Blogger wd แถลง…

    เห็นด้วยครับ ว่าไม่ควรพยายามทำ Truetype Hint
    แต่ควรเขียนคอนฟิกฟอนต์เพิ่ม และแนบไปกับแพกเกจ เพื่อให้ระบบ Hint ให้ครับ ดูเหมือนระบบ (FontConfig)จะใช้FreeType หรืออะไรสักอย่างนึง ที่เป็นการ Hint สด ๆ ตอนแสดงผล โดยไม่ต้องใช้ข้อมูล Truetype Hint จากฟอนต์

    (การทดลองคราวก่อน ผมทดลองบนอูบุนตู Feisty ที่ถูก dist-upgrade จาก Dapper
    ข้อมูลใน /etc/fonts/conf.d เลยตีกันมั่ว เที่ยวนี้ผมเก็บกวาดสะอาดแล้วจึงทดลองใหม่ เลยทราบผลที่แน่ชัดหน่อย)

     
  • 25 เมษายน 2550 เวลา 18:58 , Blogger wd แถลง…

    ขออภัยครับ ไฟล์คอนฟิกฟอนต์ข้างบน ตกไปบรรทัดนึงคือ

    ...
    <edit name="hinting" mode="assign"><bool>true</bool></edit>
    ...

    ครับ

     

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem