ภาษาไทยใน Mozilla Servo

ผมหวังว่า Servo จะถูกเอามาใช้ใน Firefox รุ่นถัด ๆ ไปตอนมัน stable แล้ว ก็เลยเลิกยุ่งกับ code ของ Firefox ตอนนี้เพราะเขียน C++ ไม่เป็น เขียน Rust ง่ายกว่า
เวลานี้คิดว่ามันน่าจะพอรันได้แล้ว compile จาก source code ก็ไม่ยากแล้ว มี nightly build ให้เล่นด้วย ก็เลยลองดูภาษาไทย ก็ตามคาดพอว่าเจ๊ง

servo_bug1
ก็เลยรายงาน issue นี้ไป #12193
รายงานไปสักพักก็คิดว่าก็คงต้องแก้เอง ก็เลยไปแกะ code ดู พบว่า Servo นี่เวลาจะแสดงผลข้อความมันไปเรียกใช้ Harfbuzz อีกที ผมก็เลยลองวาดรูปออกมาดู
harfbuzz_moz.svg.png
ที่ดู ๆ ไปก็ไม่ค่อยสื่อเท่าไหร่เลยขอให้คุณเทพพิทักษ์ ช่วยดูให้ซึ่งท่าก็อธิบายเพิ่มเติมตามนี้ ผมไม่แน่ใจว่าผมเข้าใจแค่ไหนต่อไปคงเข้าใจมากขึ้น Harfbuzz นี้เราส่งข้อความเข้าไป และก็ส่งฟอนท์เข้าไป มันจะบอกว่าได้คร่าว ๆ ว่าอักขระนั้นหน้าตาอย่างไร ซึ่งตัว ๆ พวกนี้เราจะไม่เรียกมันว่า character แล้วแต่เรียกว่า glyph แทน เพราะมันมีข้อมูลเรื่องรูปร่างหน้าตามเกี่ยวข้อง ไม่เหมือน character ที่แค่บอกว่ารหัสอะไร นอกจากนั้น Harfbuzz ยังจับกลุ่ม glyph สลับที่และรวมกันเป็น cluster ให้ด้วย แต่ว่า Harfbuzz ไม่ได้ทำเรื่องตัดบรรทัด (ตัดคำ) และไม่เปลี่ยน glyph เป็น Raster ให้

สำหรับ Servo แล้วเรื่องพวกนี้อยู่ในไฟล์ components/gfx/text/shaping/harfbuzz.rs
ที่ผมเข้าไปดูเพราะคิดว่ามันอาจจะมี bug ใน harfbuzz.rs ก็ได้ แต่พอลองตรวจสอบดูก็พบว่าปกติดี

นอกจาก Harfbuzz แล้วผมพบว่ามีจุดที่มันน่าเจ๊งอีกอย่างคือ Glyph store ที่พยายามจะเก็บ glyph ทั้งหลายไว้แบบบีบอัด ซึ่ง code อยู่ใน ไฟล์นี้ ก็เลยลองวาดรูปออกมาดูด้วย
servo_gl.png

ถ้าว่ากันคร่าว ๆ ก็คือ glyph store นี่มันพยายามจะเก็บ cluster ของ glyph ไว้ใน entry buffer ซึ่งเป็น integer ขนาด 4 byte ตัวเดียว ทำแบบนี้ได้มันก็จะประหยัดดี แต่ว่าพอ cluster มี glyph หลาย ๆ ตัวมันก็เก็บไม่ได้เลยก็เลยเอามาใส่ detail buffer แทน ที่เปลืองที่กว่า เวลาจะใช้งานก็ต้องมา binary search ใน detail lookup ก่อน ข้อมูลที่จะหาอยู่ไหน แล้วเอาข้อมูลใน detail lookup ไปเปิด detail buffer ดู

ซึ่ง bug ก็อยู่ตอนเปิด detail lookup นี่เอง ผมก็เลย patch แล้ว pull request เข้าไป ก็พบว่าแก้ปัญหาได้
servo_fix

แต่ว่า pull request ก็ยังไม่ผ่านเพราะมาติดว่ามี testcase ตัวหนึ่งมันดันไม่ผ่าน พอไปเปิด test case ดูมันก็ไม่น่าจะผ่านแต่แรกอยู่แล้ว เพราะไปเรียกใช้ offsetWidth แล้ว return 0 ตลอด ที่ผ่านตอนก่อน patch น่าจะเป็นเพราะ CSS มา set width มาบังเอิญตรงพอดี ก็เลยรายงาน issue เรื่อง offsetWidth เข้าไปอีก

นอกจากนั้นมาเปิด testcase ดูปรากฎว่าแสดงผลผิดออกมามีแต่กล่อง

myanmar2

ทั้ง ๆ ที่ควรจะออกมาเป็นอักษรพม่าสวยงามแบบนี้

myanmar1
ก็เลยรายงาน issue เรื่องอักษรพม่าไปด้วย ก็เลยมาเขียนเล่าให้กันฟังครับ เผื่อใครอยากให้ Servo เสร็จเร็ว ๆ ก็จะได้ช่วยกันทำได้โดยไม่ต้องไปแกะใหม่จาก ๐

Posted in ไม่มีหมวดหมู่

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s