最近在一個(gè)項(xiàng)目中要渲染段落文本,找了很多文字渲染庫(kù),發(fā)現(xiàn)都不能滿足我的要求,所以只能自己做。字體渲染還是找freetype完成吧,雖然小字號(hào)效果不好,不過(guò)可以生成大圖再縮小來(lái)解決掉,自己寫(xiě)一個(gè)字體渲染引擎也是不可望也不可及的事。
有了freetype實(shí)現(xiàn)底層字體渲染,我只需要處理一些布局方法即可,其中要實(shí)現(xiàn)的有以下幾點(diǎn):
1、英、中字體
很多中文字體中的英文字體都比較難看,所以在X的字體配置中設(shè)置了一個(gè)字體順序。我也可以學(xué)學(xué),傳遞一個(gè)字體列表,拿到一個(gè)字符時(shí),按順序從字體列表中查詢(xún),查詢(xún)不到時(shí)就查下一個(gè)字體,這樣就可以實(shí)現(xiàn)英、中使用不同字體了。
2、分行
段落分行要考慮到中、英文不同的分割方式,還有標(biāo)點(diǎn)符號(hào),某引起標(biāo)點(diǎn)符號(hào)不能在行尾(比如“<等),某些標(biāo)點(diǎn)不能在行首(比如”>),某些標(biāo)點(diǎn)不能分割(比如破折號(hào)),所以實(shí)際上要有一個(gè)分割算法,把段落分成一個(gè)個(gè)的標(biāo)記,漢字直接分割,英文按空格分割,不能在行首的標(biāo)點(diǎn)就分到前面單詞里,不能在行尾的就分在后面的單詞里。
3、對(duì)齊
對(duì)齊方式有左、中、右、兩端(Full Justification)這幾種方式,目前大部分開(kāi)源渲染庫(kù)都不支持兩端對(duì)齊,這也是我要自己實(shí)現(xiàn)的主要原因。左、中、右只要計(jì)算出一行的所有字符寬度,再計(jì)算出左邊距即可。兩端對(duì)齊則需要計(jì)算每個(gè)單詞的間距。
4、段首縮進(jìn)
原來(lái)設(shè)想在分段后直接加上全角空格,不想這個(gè)空格在轉(zhuǎn)成UNICODE編碼時(shí),它的編碼是\u0000,不能獲取到全角空格的寬度。于是把它設(shè)成字體高度,看了一下效果還好。