2013年3月28日 星期四

liblua.so的製作

從lua官方下載到原始碼之後,手動編譯它,然後就會有lua, luac, 以及liblua.a三個二元檔,以及一些header和文件等..等等,少了什麼的樣子。親愛的動態連結程式庫勒??

難不成lua沒辦法做成動態連結程式庫?直覺上來說,不可能。(光是有這個想法就讓我覺得自己..)Makefile裡面沒有寫不代表生不出來,更何況提供precompiled binary的網站也有提供動態連結程式庫,所以這樣的東西一定可以被做出來。

2013年3月24日 星期日

透過lua提供擴充功能的機會

玩過許多軟體的人或許都會對那些提供功能擴充界面(外掛界面)的軟體有相當的印象,例如emacs, firefox, notepad++, WoW, Homeworld2等。這些軟體如了原本就有的功能以外,由於擴充界面的存在,讓許多有創意有能力的大眾得以把程式改良到接近自己所喜愛的樣子;而這些被製作出來的外掛則反過來增加了程式的知名度,讓程式得以接觸更多的人。

2013年3月23日 星期六

試用xelatex

基於想要選擇一個適當的文件製作工具的心情,我決定試用名聞遐邇的latex。

Latex具有悠久的歷史(比我還要老呢!),一般來說用在科學文件,但理所當然的也可以用在任何文件上面。總之如果想排出精美的文件,就可以讓latex幫你喔!

2013年3月20日 星期三

寫文件要使用什麼工具?xelatex以及Docbook超簡介

在我心中,一個好的程式是那些不需要讀說明書就可以使用到它七成以上功能的那些。這類的程式多半會有相當精巧的設計,讓人得以輕鬆上手。然而,對大部分程式來說,一般人可能只能參透這個程式最主軸的幾成(三到五成吧)功能。這樣子其實是相當可惜的不是嗎?天生我才必有用,程式設計人員不可能會把沒有用的功能放在自己的程式裡面(「會心一笑」和「炫耀」在這裡都算是有用的功能)。

2013年3月18日 星期一

Brainf*k: 超精簡程式語言之口譯篇

偶然的機遇下,我認識了一個超精簡的程式語言brainf*k(下稱BF)。這個程式語言的特性是,只有8個指令,卻被認為可以完成任何的計算(似乎是Turing-complete特性。),正所謂「麻雀雖小,五臟俱全」。

也因為這個程式語言的簡潔性(每個操作均由一個字元表示,而且沒有運算子順序等等的問題...),讓我想:不如就做一個BF直譯器吧!依據當時我腦袋瓜子裡的規劃(「用一個main直接解決它吧!」),應該只要一個下午,頂多再加上一個晚上就可以完成了吧?

2013年3月9日 星期六

Harfbuzz:複雜文字排列的好幫手

經常被使用在OpenGL遊戲設計上的freetype2不只可以依照所選定字型檔來將文字點陣化,點陣化的文字接著被使用在OpenGL場景中。上面所描述的是當一個OpenGL軟體要使用文字的時候的最常見用法,也是許多線上教學會教各位的方法。

然而,freetype2所提供的layout engine無法使用OpenType所提供的許多更進階的文字繪圖指示(例如說某些阿拉伯文字)。這樣子的功能必須由更為專業的layout engine來代勞,像是pango。

仔細調查後會發現pango的相關功能是由harfbuzz所提供的。也就是,我們可以繞過又大又重的pango(使用pango會增加對glib的依賴性),直接調用harfbuzz來進行複雜文字繪圖的工作。此外,直接使用harfbuzz的程式不只可以利用系統字型(需要直接指定系統字型的檔案位置。可以用fontconfig來解決這個問題),還可以使用軟體自帶的字型檔案。

由於harfbuzz沒有文件檔案,範例檔案又寫得相當之高深(看完原始碼中util/hb-shape.cc之後的感想是:作者大人實在有夠強大!),所以只好花時間在網路上不斷的看人討論的文章。

在和harfbuzz奮鬥三天(左右)之後,找到了以下的範例檔案:

而且自己動手做了一個小程式,放在Github

我使用的流程和上面所列出的範例檔不同:首先,我把字型檔案利用mmap整個讀取進記憶體,接著利用harfbuzz載入它,用freetype2來繪製字型,最後由libpng把輸出的圖形放到png圖檔中。

當我看著由這個小巧的自製小程式所繪出的精美阿拉伯文字時,我整個人都飛躍了起來,超開心!

2013年3月8日 星期五

順序很重要:gcc library參數的順序

今天呢,想說來看一下lua好了。Lua是一個在許多遊戲中當作scripting language的程式語言,為這些遊戲提供了不小的擴展性。首先,lua可以讓遊戲在不重新編譯的狀態下更有彈性的更改參數;其次,lua提供了一個讓玩者自訂遊戲的管道(像是製作新道具等)。

提供自訂能力的lua必須由另一隻程式來驅動。也就是,我可以做出一隻C語言的程式,讓該程式與lua程式庫連結,然後載入並執行lua的程式碼。

2013年3月3日 星期日

使用OpenGL畫圖片(png圖檔)

前情請見此文
簡單的說,我希望可以利用OpenGL來作2D繪圖,在上篇文章中已經畫出了有色彩的三角形,這次的目標是把圖檔畫出來。
本文介紹的程式使用了材質貼圖、indexed VBO以及讀取png圖片並形成材質的技術。

文中的程式碼均放置於Github中。

以下是簡單的筆記摘要:

2013年3月2日 星期六

使用Freetype2來繪製單一字母

對於一個畫家來說,OpenGL是畫家的手,只能呈現畫家腦袋裡面已經存在的靈感。對於想利用OpenGL來繪製場景的人來說,場景中所出現的人物、圖片、文字等都需要事先準備好(無論以何種形式)。

對於一個遊戲來說,遊戲中所要使用的圖片需要事先畫好;遊戲中所要用的文字需要先寫好。然而,對於以OpenGL為作圖元件的遊戲來說,文字的部份是一個嚴峻的挑戰:OpenGL,和許多提供繪圖功能的元件(Qt, Cairo...)相比,沒有提供文字繪製的功能(連一丁點都沒有!!)

因此,想要利用OpenGL作為繪圖工具,但同時需要呈現文字的話,有幾種方法:

  • 把文字事先以其他的軟體製作成圖片,然後利用材質貼圖把字貼上去。
    本方法對於使用拉丁字母的語言(如英文)來說是最簡單的解決方法,但無法滿足想要放眼世界的野心。
  • 利用其他的元件,把文字繪製出來,再利用材質貼圖把動態繪製的文字圖貼上去。
    缺點就是比較麻煩,也增加了相依性(需要其他可以繪製文字的程式支援)

製作「文字圖」以供OpenGL的方法相當多。可以用Qt, Gtk+, pango, cairo...,但它們不只稍微大了點,而且還無法直接使用所指定的字型檔而必須使用已經安裝在系統中的字型。對於一個想要使用作者自選字型的可攜式軟體來說還需要其他的解決方法。

對於上面囉哩囉唆說了一堆的問題,目前最受歡迎的自由軟體解法是Freetype2。Freetype2是一個小巧的字型程式庫,可以讀取許多格式的字型,並且提供了點陣化(rasterization)以及簡單的輔助文字排列功能。Freetype2所提供的功能足以應付地球上大部分(八成吧)文字排列的需求。

基於我對於各種字型的著迷以及對此主題的興趣(我超喜歡畫圖的喔!),做了一組小小的程式來展示如何利用Freetype2來把單一字母繪製出來。請見這裡

由於對OpenGL還不甚了解(還在學習如何使用材質貼圖..)所以這組程式把所指定的文字輸出到PNG圖檔中。

使用方法

利用cmake來編譯:(記得對build_dir和source_dir作適當的替換)

$ mkdir build_dir
$ cd build_dir
$ cmake source_dir
$ make
接著,假設你想要繪製「好」,則:
$ ft2_char_cairo 好 /usr/share/fonts/wqy-microhei/wqy-microhei.ttc > /tmp/1.png
那麼,「好」字就會被輸出到/tmp/1.png了。

注意事項:

  • 想改變字的色彩?請找到如下的程式碼:
    # define RED (192)
    # define GREEN (255)
    # define BLUE (192)
    void render_glyph_to_stdout(FT_GlyphSlot slot)
    
    然後把RED, GREEN, BLUE括號中的數字改成你想要顏色的RGB元素。
  • 如果您使用Windows,則由於Windows的shell預設不是utf-8,所以在指定中文字可能會有問題。
  • 另外,如果所指定的字型檔中沒有這個字元的話,字就不會被畫出來。