Friday, November 05, 2004

TryLinux ภาค 5: เรื่องของชุดตัวอักษร

จากตอนที่แล้วลองเปิดใช้ Subpixel ของ KDE เลือกฟอนต์ใน Firefox หลายๆตัวก็ยังดูไม่ค่อยสวย (หรือว่าไม่ชินตา) ก็เลยอยากจะเอาฟอนต์ TTF จาก Windows [3] มาลอง

ฟอนต์ของ Microsoft

Otto บอกว่าให้ติดตั้งแพคเกจชื่ออะไรสักอย่าง มีคำว่า corefont อยู่ ลองค้นดู

TryLinux:~# apt-cache search corefont
openoffice.org - high-quality office productivity suite
msttcorefonts - Installer for Microsoft TrueType core fonts
โอเคคงเป็นอันที่สอง msttcorefonts ลองติดตั้งโดย
TryLinux:~# apt-get install msttcorefonts
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  msttcorefonts
0 upgraded, 1 newly installed, 0 to remove and 49 not upgraded.
Need to get 21.7kB of archives.
...
Extracting cabinet: andale32.exe
Extracting cabinet: arialb32.exe
Extracting cabinet: arial32.exe
Extracting cabinet: comic32.exe
Extracting cabinet: courie32.exe
Extracting cabinet: georgi32.exe
Extracting cabinet: impact32.exe
Extracting cabinet: times32.exe
Extracting cabinet: trebuc32.exe
Extracting cabinet: verdan32.exe
Extracting cabinet: webdin32.exe
  extracting fontinst.exe
  extracting Webdings.TTF
  extracting fontinst.inf
  extracting Licen.TXT

All done, no errors.
All fonts downloaded and installed.
ดูเหมือนไฟล์ TTF ที่ติดตั้งลงไปมีดังนี้
...
  extracting AndaleMo.TTF
  extracting AriBlk.TTF
  extracting Ariali.TTF
  extracting Arialbd.TTF
  extracting Arialbi.TTF
  extracting Arial.TTF
  extracting Comicbd.TTF
  extracting Comic.TTF
  extracting Georgiaz.TTF
  extracting Georgiab.TTF
  extracting Georgiai.TTF
  extracting Georgia.TTF
  extracting Impact.TTF
  extracting Times.TTF
  extracting Timesbd.TTF
  extracting Timesbi.TTF
  extracting Timesi.TTF
  extracting Verdanab.TTF
  extracting Verdanai.TTF
  extracting Verdanaz.TTF
  extracting Verdana.TTF
  extracting Webdings.TTF
ติดตั้งเสร็จก็อยากรู้ว่ามีฟอนต์อะไรเพิ่มขึ้นมาบ้าง ทดลอง xlsfonts | grep -i microsoft ดู ไม่เห็นมี Arial หรือ Georgia หรือ ฯลฯ ในรายการข้างบน สงสัยต้องทำอะไรเพิ่มเติมหรือเปล่าหว่า ?

ตอนติดตั้งมีหน้าจอขึ้นมาบอกว่าเครื่องเราต้องมี defoma (DEbian FOnt MAnager) ถ้ายังไม่มีให้ติดตั้งแพคเกจ x-ttcidfont-conf ลองใช้คำสั่ง dpkg -l ดูเหมือน defoma ไรเนี่ยจะมีอยู่แล้ว

เห็นมี X font server (xfs) รันอยู่ ก็เลยลอง restart มันดู /etc/init.d/xfs restart แล้วสั่ง xlsfonts | grep -i microsoft อีกที ได้ผลเหมือนเดิม ไม่มีอะไรเปลี่ยนแปลง

ลองดูว่าตอนนี้ X11 เอาฟอนต์มาจากไหนบ้าง ด้วยคำสั่ง xset q

...
Font Path:
  /usr/X11R6/lib/X11/fonts/misc,
  /usr/X11R6/lib/X11/fonts/75dpi,
  /usr/X11R6/lib/X11/fonts/100dpi,
  /usr/X11R6/lib/X11/fonts/misc:unscaled,
  /usr/X11R6/lib/X11/fonts/75dpi:unscaled,
  /usr/X11R6/lib/X11/fonts/100dpi:unscaled,
  /usr/X11R6/lib/X11/fonts/Speedo,
  /usr/X11R6/lib/X11/fonts/Type1,
  /usr/share/fonts/ttf/western,
  /usr/share/fonts/ttf/decoratives,
  /usr/share/fonts/truetype/openoffice,
  /usr/share/fonts/truetype/ttf-bitstream-vera,
  /usr/share/fonts,
  /usr/share/fonts/truetype/freefont,
  /usr/share/fonts/truetype/kochi,
  /usr/share/fonts/truetype/latex-xft-fonts,
  /usr/share/fonts/truetype/msttcorefonts,
  /usr/share/fonts/truetype/thai
...
อ่าว โฟลเดอร์ของ msttcorefonts ก็เข้าไปแล้วนี่หว่า ทำไม xlsfonts | grep -i microsoft แล้วไม่เห็น ?

ยุคโบราณ

คำตอบดูเหมือนจะเป็นเพราะว่า xlsfonts นั้นมัน โบราณ ไปแล้ว แสดงว่าเราไม่ได้เล่น X11 มานานพอสมควร ลองทบทวนความทรงจำ สมัยก่อนคำสั่งเกี่ยวกับฟอนต์ที่ใช้บ่อยๆบน X11 ก็มี

  • xlsfonts เอาไว้แสดงรายการว่า ตอนนี้ มีฟอนต์อะไรให้ใช้บ้าง
  • xset q ดูค่าตัวแปรต่างๆของ X ปกติจะดู Font Path ว่าเอาฟอนต์มาจากที่ไหนบ้าง ถ้ามาจาก Font Server ก็จะมีชื่อ Host
  • xset +fp /.../... เพิ่มรายการโฟลเดอร์ใน Font Path ปกติคำสั่งนี้ต้องตามด้วย xset fp rehash จึงจะมีผล
  • fslsfonts เอาไว้แสดงรายการฟอนต์ที่ให้บริการโดย Font Server (xfs)
  • fstobdf เอาฟอนต์จาก Font Server ออกมาในรูปแบบ bdf ไฟล์ เคยใช้ดึงฟอนต์ Norasi (TTF) ออกมาเป็น Bitmap (bdf) ที่ขนาดต่างๆ สำหรับเอาไปใช้กับโปรแกรม SimpleThai
ปกติโปรแกรมพื้นๆบน X สามารถระบุฟอนต์ที่ต้องการใช้ได้ด้วยตัวเลือก -fn fontname เช่น xterm -fn thai8x20

ตอน TrueType ฟอนต์ใช้ได้ใหม่ๆ จำได้ว่ามาในรูปแบบของ Font Server ที่สามารถวาด TrueType ได้ เช่น xfstt [6] กับ xfsft [7] (ตัวหลังใช้ Patch XFree ได้ด้วย) ซึ่งเป็นเหตุผลที่ทำให้หันมาใช้ Font Server ก่อนหน้านั้นมักใส่ฟอนต์ไว้ใน Font Path ซะมากกว่า

ดูเหมือนเดี๋ยวนี้โปรแกรมพวกนี้จะกลายเป็น FreeType คอมไพล์เข้าไปกับ X แล้ว

ยุคปัจจุบัน

Otto บอกให้ใช้ fontconfig [2] แต่เจ้าตัวก็ไม่แน่ใจว่ามันคืออะไร ดูเหมือนเป็น Library ที่คอยช่วยจัดการเรื่องฟอนต์ในระบบ ไม่ได้วาดตัวอักษรเอง เวลาจะดูว่ามีฟอนต์อะไรที่ใช้ได้บ้าง ต้องใช้คำสั่ง fc-list

...
Arial Black:style=Regular
Arial:style=Bold
Arial:style=Bold Italic
Arial:style=Italic
Arial:style=Regular
...
JS Amphan:style=Italic
JS Angsumalin:style=Regular
JS Arisa:style=Italic
JS Arisa:style=Regular
...
Times New Roman:style=Bold
Times New Roman:style=Bold Italic
Times New Roman:style=Italic
Times New Roman:style=Regular
...
แสดงว่า mscorefonts เมื่อกี้ติดตั้งเข้าไปเรียบร้อยแล้ว แต่ไม่โผล่ใน xlsfonts (และใช้กับ xterm -fn ... ไม่ได้ ?) ลองเลือกฟอนต์ใน Firefox / KDE Control Center ก็โผล่ขึ้นมา มีให้เลือก

ชักงง: ไอ้โปรแกรมพวกนี้ทำไมต่างกับ xterm มันเอาฟอนต์มาจากไหน ผ่าน API อะไร ? ใครเป็นคนวาดตัวอักษรให้ ? สำหรับ KDE คงจะผ่าน Qt ? แล้ว Firefox (ใช้ GTK?) ละ ? คงมีอะไรที่ทั้ง Qt และ GTK เรียกใช้อีกที

ไปเจอที่ [1] เขาบอกว่า เดี๋ยวนี้จะคอมไพล์ XFree ต้องมี FreeType [5], fontconfig [2], และก็ Xft [4] ซึ่งอ่านคร่าวๆดูเหมือนความสัมพันธ์จะเป็นว่า

"โปรแกรมประยุกต์จะใช้ API ของ Xft ซึ่งจะอาศัย fontconfig ช่วยดูว่ามีฟอนต์อะไรบ้าง แล้วจากนั้นก็อาจจะใช้ FreeType สำหรับวาดตัวอักษรผ่าน XRender ?" xterm เกิดก่อน Xft เลยไม่ได้ใช้ ?

และของ Qt [5]

"Recent versions of the Qt library support the XRender extension that uses FreeType 2 to generate anti-aliased text."

สรุป

เดี๋ยวนี้มันวุ่นวายกว่าเดิม จะให้เข้าใจกว่านี้คงต้องลองไปเขียนโปรแกรมเรียกใช้ฟอนต์ทั้งหลายผ่าน API ใหม่ๆเหล่านี้ดู

เดี๋ยวจะลองดูว่าเพิ่มฟอนต์ใหม่ทำได้อย่างไร ทำแค่เพิ่ม Font Path ให้มีโครงสร้างเหมือน /usr/share/fonts/truetype/msttcorefonts ได้ไหม ดูเหมือนคำสั่งสำหรับสร้าง fonts.dir ของ TTF ก็คือ ttmkfdir

ถ้าวุ่นวายนักก็เพิ่มฟอนต์ผ่าน GUI ของ KDE Control Center ละกัน

เริ่มเห็นว่ามีฟอนต์หลายกลุ่ม: กลุ่มฟอนต์ที่ โปรแกรมเก่าๆ xterm ใช้ได้ กลุ่มฟอนต์ที่ โปรแกรมใหม่ๆ KDE/Firefox ใช้ได้ และ กลุ่มฟอนต์ที่ JavaVM ใช้ได้ (Java มันจัดการฟอนต์ของมันเอง)

การบ้าน

ในหน้า FreeType/Patent เขาบอกว่า FreeType2 ปกติจะปิด TrueType VM สำหรับจัดการพวก Hint ไว้ เพราะไปโดนสิทธิบัตรของ Apple ถ้าเปิดใช้งานจะวาดตัวอักษรได้สวยขึ้น

ต้องลองดูสักหน่อย Otto บอกให้ apt-get source มาคอมไพล์เอง

อ้างอิง

  1. XFree86 compilation guide
  2. fontconfig: Fontconfig.Org
  3. Microsoft's TrueType core fonts on linux
  4. Xft: The Xft Font Library: Architecture and Users Guide
  5. FreeType2: the FreeType project
  6. xfstt: X11 Font Server for TrueType fonts
  7. xfsft: Truetype Font Support For X

เพิ่มเติม

เมื่อกี้ไม่รู้ไปทำไรมัน (อาจจะเป็น fc-cache -fv แต่ไม่ยืนยันเพราะย้อนกลับไปสถานะก่อนหน้าแล้วลองใหม่ไม่ได้) ตอนนี้ xlsfonts | grep -i microsoft เห็นฟอนต์ครบหมดแล้ว เอามาใช้กับ xterm ก็ได้ด้วย

TryLinux:~> wc msfont.*
   344    344  22566 msfont.1
  1435   2114  91082 msfont.2
msfont.1 เป็นผลของ xlsfonts | grep -i microsoft หลังติดตั้ง msttcorefonts เสร็จใหม่ๆ ส่วน msfont.2 เป็นของตอนนี้

เรื่องของกลุ่มฟอนต์โปรแกรมเก่าๆใหม่ๆที่เขียนไว้ข้างบนก็เลยไม่จริง เพราะมันก็กลุ่มเดียวกัน แต่จะให้กลุ่มโปรแกรมเก่าเห็นฟอนต์ใหม่ ต้องสั่ง fc-cache -fv ก่อน ?

ดูเหมือนฟอนต์ภาษาไทยที่ Otto ใส่ไว้ใน KNOPPIX-TH เช่นพวก JS ฯลฯ ก็เพิ่งโผล่มาใน xlsfonts ก่อนหน้านี้จำได้ว่าไม่เห็น

2 comments:

Thep said...

เอ.. แปลกๆ..

เท่าที่ทราบนะครับ Xft/fontconfig จะ provide font ที่ client-side ส่วน xfs หรือ X server จะให้ฟอนต์ที่ server-side ตามแบบเก่า

fc-cache, fc-list ก็เป็นการจัดการกับฟอนต์ที่ฝั่ง client ส่วน xlsfonts นั้น ก็อ่านฟอนต์จากฝั่ง server ตามปกติ ตามหลักแล้ว ไม่น่าจะมีผลถึงกัน

สำหรับ debian, defoma จะจัดการฟอนต์สำหรับทุก app ในคราวเดียว โดย x-ttcidfont-conf จะทำ symlink ไปยังฟอนต์ต่างๆ ไว้ที่ /var/lib/defoma/x-ttcidfont-conf.d/dirs/{TrueType,CID} แล้ว generate พวก fonts.dir และ fonts.cache-1 ให้ทั้ง server และ client side และ xfs ควรจะไป list ฟอนต์จากที่นั่นแทน /usr/share/fonts/* ทั้งหลายตรงๆ

ไม่ทราบเหมือนกันครับ ว่าฟอนต์มาโผล่ที่ xlsfonts ทีหลังได้ยังไง แหะๆ

Hui/ฮุ้ย said...

คิดว่าไม่น่าใช่ fc-cache -fv เหมือนกัน ต้องหาโอกาสลองใหม่