Friday, November 05, 2004

XRender / xterm ตัวใหม่

ต่อจากเรื่องของฟอนต์ใน TryLinux ภาค 5 ลองหาเอกสารเกี่ยวกับ XRender (X Rendering Extension) อ่านดู เจอสรุปไว้ค่อนข้างดี ที่

Summary of XFree86 4

อ่านแล้วตีความได้ว่า

  • XRender เป็นส่วนขยายของ X สำหรับให้ Application ใช้วาดภาพ 2 มิติใดๆ (ทั้ง Vector และ Bitmap) มีการใช้ Hardware Accelerator เข้ามาช่วย และใช้โครงสร้างคำสั่งซึ่งประยุกต์มาจาก Plan 9

  • ดังนั้น Application จึงใช้ XRender เพื่อวาดตัวอักษรที่เป็น anti-aliased ได้ แต่ในการนี้ Application จะไม่คุยกับ XRender เองตรงๆ แต่จะใช้ผ่าน Xft

  • Xft จะเรียก FreeType มาวาดตัวอักษรจากฟอนต์แบบ TypeI, TrueType ฯลฯ แล้วส่งคำสั่งไปให้ XRender

    ถ้าในเครื่องไม่มี FreeType, Xft ยังยอมให้ Application ใช้ฟอนต์ที่มีอยู่บน X ตามปกติได้ด้วย (เขาเรียก core fonts) แต่ต่างกับการใช้ core fonts ของโปรแกรมปกติ ตรงที่โปรแกรมที่ใช้ Xft จะวาดตัวอักษรผ่าน XRender เสมอ ?

  • ดังนั้น โปรแกรมทั้งหลายที่ใช้ Xft จึงสามารถแสดงผลได้บน X-Server อื่นๆบนเครือข่ายที่สนับสนุน XRender โดยไม่จำเป็นต้องติดตั้งฟอนต์บน X-Server เหล่านั้น

  • สรุปแล้ว การวาดตัวอักษรบน X มีสองแบบ 1) แบบดั้งเดิม วาดโดย Server (ดูรายการฟอนต์ด้วย xlsfonts) และ 2) วาดผ่าน XRender โดยใช้ Xft-FreeType (ดูรายการฟอนต์ด้วย fc-list) ดีกว่าแบบแรก คือ มี anti-aliased และไม่ต้องติดตั้งฟอนต์บน Server ก่อน (แสดงผลบน X-Server เครื่องอื่นๆได้)

  • เมื่อติดตั้งฟอนต์ใหม่ จำเป็นต้องบอกให้ Xft และ X Server รู้จัก ใน TryLinux 5 ดูเหมือน Xft จะรู้จักก่อน โปรแกรม KDE ฯลฯ ใช้งานได้เลย ส่วน X Server จะรู้จักหลังจากที่เรียก fc-cache -fv
ในเอกสารเดียวกัน ยังบอกว่า xterm ได้รับการแก้ไข ให้ใช้ฟอนต์ผ่าน Xft-FreeType-XRender แล้วเหมือนกัน โดยใช้ตัวเลือก -fa และ -fs

ทดลองดูโดย xterm -fs 12 -fa 'Courier New' ได้ตัวอักษรมี anti-aliased สวยงาม จากนั้นก็ลองให้ใช้ฟอนต์ตัวเดียวกันขนาดเดียวกัน แต่เอามาทาง X Server ด้วยคำสั่ง xterm -fn '-monotype-courier new-medium-r-normal--12-0-0-0-m-0-microsoft-ansi' ดูๆแล้วก็เป็นฟอนต์ Courier New เหมือนกันแต่ไม่มี anti-aliased ขนาดก็ใกล้เคียงกัน (อันสวยจะกว้างกว่าหน่อย)


xterm -fn ...


xterm -fa ... -fs ...

5 comments:

id said...
This comment has been removed by a blog administrator.
id said...

Xrender วาด bezier path vector ไม่ได้ เวลาจะวาดส่วนโค้งต้อง
tessellate path ก่อน (โดยทั่วไปด้วย cairo) ตัวมันจะเป็นเรื่อง
compositing (porter-duff) เป็นหลัก ส่วนการวาด font ก็วาดผ่าน bitmap
โดย freetype จะ generate bitmap ให้ จริงๆ freetype extract path
ออกมาได้ก็จริงแต่ช้า ไม่มีใครใช้ (นอกจากโปรแกรม graphic และก็จะไม่
สมบูรณ์เพราะจะไม่มีการทำ hinting/shaping/etc.) ใช้การ cache glyph
bitmap เอา... สรุปว่ายังไม่ใช่การออกแบบที่สมบูรณ์นักเพราะยังต้องส่ง
trapezoids ผ่าน network layer อยู่ (เมื่อเทียบกับ network layer ของ
dps server และ NeWS) แต่ในอนาคตก็มีแนวโน้มว่าอาจจะมีการดึง
ตัว tessellator กลับเข้าไปทางฝั่ง display server

Thep said...

Xft ใหม่ไม่ต้องมี RENDER extension ก็ render ได้แล้วนะครับ (ตั้งแต่ XFree86 4.3.0 มังครับ ถ้าจำไม่ผิด)

Hui/ฮุ้ย said...

สรุปว่า Vector ของ RENDER ไม่ค่อยได้ใช้ วาดเส้นโค้งไม่ได้
ได้แค่เส้นตรง ที่ผ่านมาในการวาดตัวอักษรใช้แค่ Bitmap

แต่ตอนนี้ไม่ต้องมี RENDER ก็แสดงผลได้เหมือนกัน โยน Bitmap
กันตูมๆเลย ?

เมื่อกี้ลองเรียก xterm -fa ให้มาแสดงบน Xserver ตัวเก่าๆ
บน Windows (xdpyinfo ดูแล้วไม่มี RENDER แน่นอน)
ใช้ได้จริงๆด้วยครับ

id said...

ต่อไปคงได้ใช้เยอะครับ ผ่าน cairo (cairo สร้าง trapezoids แล้ว xrender แสดง trapezoids)