Tuesday, November 09, 2004

TryLinux ภาค 7: คอมไพล์ FreeType

Post นี้ตัดคำไว้ให้แล้ว

ต่อจาก TryLinux 6 เรื่องแสดงผลฟอนต์ Arial แบบไม่ใช้ Anti-Aliasing ได้ไม่สวยเท่า Windows คิดว่า Arial คงไม่มี Bitmap ฝังอยู่ เพราะต่างกับฟอนต์ญี่ปุ่นตรงที่เปิด ClearType ได้ (พวกที่เอา Bitmap มาทแทนขนาดเล็กจะไม่มี ClearType ที่ขนาดเล็กเหล่านั้น)

ดังนั้นที่ตัวอักษรออกมาดูสวย/น่าเกลียด น่าจะอยู่ที่ฝีมือในการวาด TrueType เนื่องจาก FreeType บอกว่าปกติแล้วจะไม่เปิดใช้ BYTECODE INTERPRETER สำหรับทำ Hint เนื่องจากติดสิทธิบัตรของ Apple ถ้าอยากจะใช้ต้องไปเปิดแล้วคอมไพล์ใหม่

วันนี้ก็เลยจะลองดู ทำตามคำอธิบายใน Basics of the Debian package management system เริ่มจากเอา Source ของ FreeType มาก่อน

apt-get source libfreetype6
apt-get build-dep libfreetype6
จะได้ไฟล์เหล่านี้มา
freetype_2.1.7-2.2.diff.gz  
freetype_2.1.7-2.2.dsc  
freetype_2.1.7.orig.tar.gz
และอีกหนึ่งโฟลเดอร์ freetype-2.1.7 ซึ่งดูเหมือนถ้าไม่มีสามารถสร้างได้โดย
dpkg-source -x freetype_2.1.7-2.2.dsc  
จากนั้นก็ cd เข้าไปใน freetype-2.1.7 แล้วลองให้คอมไพล์+สร้าง Package ดู
cd freetype-2.1.7
dpkg-buildpackage -rfakeroot -b
ก็จะได้ไฟล์ *deb ออกมามากมายเหนือโฟลเดอร์ปัจจุบันขั้นหนึ่ง
../freetype2-demos_2.1.7-2.2_i386.deb  ../libfreetype6-dev_2.1.7-2.2_i386.deb
../libfreetype6_2.1.7-2.2_i386.deb     ../libfreetype6-udeb_2.1.7-2.2_i386.udeb
ไม่แน่ใจว่าไฟล์เหล่านี้คอมไพล์โดยเปิด Hint แล้วหรือยัง ลองดูใน docs/PATENT เขาบอกให้ไปอ่าน docs/INSTALL ซึ่งบอกให้ไปอ่าน docs/TRUETYPE อีกที หลายต่อ(โว้ย)

เขาบอกให้ไปเปิดไฟล์ include/freetype/config/ftoption.h แล้ว หาบทัดที่ #define ค่า TT_CONFIG_OPTION_BYTECODE_INTERPRETER ถ้าหากว่า #undef อยู่ ก็ให้แก้เป็น #define ลองเปิดดูแล้ว เจอว่า


  /*   Do not #undef this macro here, since the build system might         */
  /*   define it for certain configurations only.                          */
  /*                                                                       */
#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
ดูเหมือนว่าจะ #define เอาไว้อยู่แล้ว และบรรทัดข้างล่างก็มีบอกว่า
#define TT_CONFIG_OPTION_UNPATENTED_HINTING
แปลว่ามีวิธี Hint ที่ไม่ติด Patent แล้วก็เลยเปิดไว้ตลอด ?

แต่ติดใจตรง Comment ข้างบนว่าอย่า #undef ตรงนี้ ! แปลว่าตรงนี้จะ #define ทิ้งไว้ตลอด ?

แล้วทำไมในไฟล์ docs/TRUETYPE บอกให้มาดูตรงนี้ ?

ค้นไปค้นมาสรุว่า ในไฟล์ docs/CHANGES บอกว่า BYTECODE INTERPRETER ถูกปิดไปในรุ่น 2.0.2 ซึ่งถ้าดูในไฟล์ ChangeLog ก็ตรงกับวันที่ 2001-03-24

เอกสาร docs/TRUETYPE (ไม่รู้แก้ไขเมื่อไรแต่วันที่ของไฟล์คือ 2003/4) บอกให้ไปแก้ include/freetype/config/ftoption.h ก็น่าจะถูกต้อง

ตกลงตอนนี้มันใช้ BYTECODE INTERPRETER หรือเปล่าและถ้าจะใช้ต้องแก้ตรงไหนก็ไม่รู้ ไม่รู้จะไปอ่านอะไรอีก

ลองไปดูในไฟล์ debian/rules

...
        # Turn on bytecode interpreter, but use unpatented hinting
        # and forces its use.  Many thanks to Graham Asher for this great
        # feature to circumvent bad Apple's patent.  :-p
        patch -p0 -i $(patchdir)/030-bytecode-interpreter.diff
        #patch -p0 -i $(patchdir)/031-compile-unpatented-hinting.diff
        #patch -p0 -i $(patchdir)/032-force-unpatented-hinting.diff
...
ค่อยยังชั่วหน่อย เจออะไรให้ลองเปลี่ยนดูแล้ว

ลองเข้าไปดู patches/030-bytecode-interpreter.diff แล้วก็เข้าใจว่าทำไมเขาถึงบอกว่าอย่า #undef ข้างบน เพราะของเดิมมันแค่ /* .. */ เอาไว้

-/* #define  TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
แสดงว่าไฟล์ docs/TRUETYPE ก็ไม่ได้ล้าสมัยมาก ผิดที่บอกว่าให้แก้ #undef เป็น #define เพราะของเดิมเป็น /* .. */

ลองดูในไฟล์ 031-compile-unpatented-hinting.diff ดูเหมือนจะเกี่ยวกับตัวเลือก TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING ซึ่งไม่มีใน include/freetype/config/ftoption.h ของ Freetype-2.1.7 แล้ว ตกลงอันนี้เลยไม่เกี่ยว

ในอีกไฟล์ 032-force-unpatented-hinting.diff ก็ไปตั้งตัวแปร TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING ไม่มีใน include/freetype/config/ftoption.h อีกเหมือนกัน

สรุปว่า Freetype2 ของ Debian มันใช้ Hint เท่าที่จะทำได้อยู่แล้ว ?

ไหนก็อุตส่าห์คอมไพล์แล้ว ลองให้มันใช้อันที่เพิ่งคอมไพล์เสร็จ

TryLinux:/home/vuthi/temp# dpkg -i ../libfreetype6_2.1.7-2.2_i386.deb 
(Reading database ... 129063 files and directories currently installed.)
Preparing to replace libfreetype6 2.1.7-2.2 (using .../libfreetype6_2.1.7-2.2_i386.deb) ...
Unpacking replacement libfreetype6 ...
Setting up libfreetype6 (2.1.7-2.2) ...
ปิด Anti-Aliasing แล้วเรียก xterm -fa Arial -fs 12 ตัวอักษรที่ได้ยังน่าเกลียดเหมือนเดิม ไม่มีอะไรดีขึ้น หรือว่า FreeType ยังทำ Hint ของ TrueType ไม่ครบ หรือว่า Windows มันทำอะไรเป็นพิเศษ ?

ยังติดใจหน่อยนึงตรง TT_CONFIG_OPTION_UNPATENTED_HINTING เขาบอกให้เลือกใช้ตอน runtime


  /* Define TT_CONFIG_OPTION_UNPATENTED_HINTING (in addition to            */
  /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER) to compile the unpatented      */
  /* work-around hinting system.  Note that for the moment, the algorithm  */
  /* is only used when selected at runtime through the parameter tag       */
  /* FT_PARAM_TAG_UNPATENTED_HINTING; or when the debug hook               */
  /* FT_DEBUG_HOOK_UNPATENTED_HINTING is globally actived                  */
ไม่รู้เหมือนกันว่าจะไปเลือกยังไง

เพิ่มเติม: FreeType ไม่ได้แย่

ไหนก็ได้ freetype2-demos_2.1.7-2.2_i386.deb มาแล้ว ลองติดตั้งดู พบว่ามีโปรแกรมสนุกหลายโปรแกรมให้ลองเล่น

เช่น ftstring -r 96 -m 'T r y L i n u x' 12 /usr/share/fonts/truetype/msttcorefonts/Arial แล้วกด a/h เพื่อเปิด/ปิด Anti-Aliasing กับ Hint ได้ผลดังนี้


ไม่มี Hint

มี Hint

มี Hint+Anti-Aliasing

ออกมาสวยใช้ได้เลยแหละ ยังแปลกใจว่าทำไม xterm ไม่สวยแบบนี้ ต้องไปตั้งค่าตัวเลือก Xft/fontconfig อะไรตรงไหนหรือเปล่า ?

No comments: