FreeType編譯及使用心得

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.