FreeType是一款字型服務庫,它支援多種字型,並且提供高效,高品質的文字。
freetype相關介紹見:http://blog.csdn.net/ganxingming/archive/2006/06/05/774796.aspx
1, 編譯FreeType
解壓後進入./include/freetype,複製config到當前檔案夾,隨便去個什麼名,這裡我用custom_config
然後進入 ./builds/win32/visualc
這裡是vs工程,因為FreeType的支援相當廣泛,有很多我們不需要東西,因此需要重新編譯FreeType。
而剛才我們複製的檔案夾中,就是FreeType的可定製檔案
開啟工程後,將你剛才複製的檔案夾加入到工程中,即custom_config
然後開啟ft2build.h
可以看到這裡包含了一個檔案,
#include <freetype/config/ftheader.h>
這個檔案就是用於定製FreeType的主要檔案,我們要做的就是建立自己的定製檔案,將其替代這個檔案,將其改成
#include <freetype/custom_config/ftheader.h>
custom_config是你自己的檔案夾哈
然後進入custom_config/ftheader.h
修改這幾行
#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h>
#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h>
#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h>
#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h>
改成
#define FT_CONFIG_CONFIG_H <freetype/custom_config/ftconfig.h>
#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/custom_config/ftstdlib.h>
#define FT_CONFIG_OPTIONS_H <freetype/custom_config/ftoption.h>
#define FT_CONFIG_MODULES_H <freetype/custom_config/ftmodule.h>
接著進入custom_config/ftmodule.h
這個檔案是FreeType的模組註冊,我把它改成了
/*FT_USE_MODULE(autofit_module_class)*/
FT_USE_MODULE(tt_driver_class)
/*FT_USE_MODULE(t1_driver_class)*/
/*FT_USE_MODULE(cff_driver_class)*/
/*FT_USE_MODULE(t1cid_driver_class)*/
/*FT_USE_MODULE(pfr_driver_class)*/
/*FT_USE_MODULE(t42_driver_class)*/
/*FT_USE_MODULE(winfnt_driver_class)*/
/*FT_USE_MODULE(pcf_driver_class)*/
/*FT_USE_MODULE(psaux_module_class)*/
/*FT_USE_MODULE(psnames_module_class)*/
/*FT_USE_MODULE(pshinter_module_class)*/
/*FT_USE_MODULE(ft_raster1_renderer_class)*/
FT_USE_MODULE(sfnt_module_class)
FT_USE_MODULE(ft_smooth_renderer_class)
/*FT_USE_MODULE(ft_smooth_lcd_renderer_class)*/
/*FT_USE_MODULE(ft_smooth_lcdv_renderer_class)*/
/*FT_USE_MODULE(bdf_driver_class)*/
只留下了3個模組
好,現在FreeType定製完畢了,但是還有個問題,FreeType是編譯的靜態連結庫,我們一般是使用動態連結程式庫的,
因此需要將其修改成動態連結程式庫。
進入custom_config/ftconfig.h,將
#ifndef FT_EXPORT
#ifdef __cplusplus
#define FT_EXPORT( x ) extern "C" x
#else
#define FT_EXPORT( x ) extern x
#endif
改成
#ifdef DLL_EXPORT
#undef DLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif /* !DLL_EXPORT */
#ifndef FT_EXPORT
#ifdef __cplusplus
#define FT_EXPORT( x ) extern "C" DLL_EXPORT x
#else
#define FT_EXPORT( x ) extern DLL_EXPORT x
#endif
接下來修改工程,進入工程屬性的Release Multithreaded配置,我們編譯多線程版本哈
進入常規,修改配置類型為動態庫
進入C/C++ -> 前置處理器,在前置處理器定義中加入DLL_EXPORT
好了,現在我們可以開始編譯了。編譯成功後的目錄在objs/release_mt,現在可以拷貝
freetype.dll,freetype.lib和整個include檔案夾,到我們的工程中了
2, 使用FreeType
這裡就請大家參考文章
http://www.unixresources.net/lin ... 0/59/21/592188.html
裡面有詳細的介紹。
下面,我說一下自己使用FreeType的心得
1, 得到字元的正確繪製位置
首先在建立好FTFace,Freetype推薦使用基準作為繪製基準,但是通常都是設定字元左上方的位置開始繪製。需要獲
得基準到字元輪廓最高點的距離,這個資訊放在
Ascender = FTFace->size->metrics.ascender >> 6; // 基準到字元輪廓最高點的距離, 由於是26.6的定點數,
因此擷取整數部分需要除以64
然後每個字元的高度是不同的,Freetype產生的bitmap一般剛剛好包圍到字元,比如a和l的bitmap圖高度是不同的。
因此還需要獲得每個字元的位移寬度和高度,這兩個資訊放在
bitmap_left = FTFace->glyph->bitmap_left; // 字元距離左邊界的距離
bitmap_top = FTFace->glyph->bitmap_top; // 字元最高點距離基準的距離
好了,現在假設要在(posx, posy)處繪製字元,(charposx, charposy)表示字元的正確繪製位置
charposx = posx + bitmap_left;
charposy = posy + Ascender - bitmap_top;
2,行距
字元輪廓最大高度放在
FTFace->size->metrics.height // 字元輪廓最大高度, 26.6定點數
但是我實測發現,這個高度太高了點,所以我一般是這樣用的
Descender = FTFace->size->metrics.descender >> 6; // // 基準到字元輪廓最低點的距離
FontHeight = ((FTFace->size->metrics.height >> 6) + Ascender + Descender) / 2;
然後還可以在FontHeight上加上一個固定高度,比如1或2
3,字元顏色
Freetype產生的圖是8bit灰階圖(也有別的,不過8bit好看些),文字部分為白色,背景為黑色。
這就有個麻煩,一般字型都是黑的,那好如果把字型顏色取反,就黑的變白的,白的變黑的了。
可是呢,要加上顏色怎麼辦?這就是Freetype的文字是白色的原因,因為是8bit灰階圖,因此不是黑色或白色的地方
,顏色就成了一個比例因素,只需將其與想要設定的顏色相乘再除以256即可,比如灰階圖中某點的顏色是156,想要
設定的顏色是RGB(127, 42, 186),那麼實際的顏色是
(127 * 156 >> 8, 42 * 156 >> 8, 186 * 156 >> 8)
回到之前說的,如果將黑的變白的,白的變黑的,那麼比例因素就要再取反一次,麻煩了。
而且,如果字型被設定過顏色後,灰階圖的比例因素效果就喪失了,不能再被設定成其他顏色了(重新擷取灰階圖就要
花多餘的時間了)。
解決方案是,把8bit灰階圖儲存在alpha通道中。如果想設定顏色就從alpha通道中擷取灰階值即可。
4,把字元變的好看些
上面把灰階圖儲存在alpha通道中了,如果你的驅動支援alpha混合,那麼恭喜你了,字元能和背景混合。
不錯,灰階圖還兼有alpha功能,如果想好看些就做alpha混合吧。
我的驅動不支援alpha混合,只好自己混合了。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/shtianhai/archive/2010/06/07/5652587.aspx