資源簡介
使用OpenGL+FreeType技術(shù)渲染了點陣格式的中文宋體(字體大小小于16),效果極好,可與Windows自身渲染的效果一比

代碼片段和文件信息
#include?
#include?
#include?
#include???
#include?
#include?
#include?
#include?
#include?
#include?
//#pragma?comment(lib??“l(fā)ib/glut32.lib“)
//#pragma?comment(lib??“l(fā)ib/freetype2110.lib“)
using?namespace?std;
#define?MAX_NO_TEXTURES?1
#define?CUBE_TEXTURE?0
GLuint?texture_id[MAX_NO_TEXTURES];
struct?xCharTexture
{
??GLuint??m_texID;
??wchar_t?m_chaID;
??int?????m_Width;
??int?????m_Height;
??int?????m_adv_x;
??int?????m_adv_y;
??int?????m_delta_x;
??int?????m_delta_y;
public:
??xCharTexture()
??{
????m_texID??=?0;
????m_chaID??=?0;
????m_Width??=?0;
????m_Height?=?0;
??}
}g_TexID[65536];
class?xFreeTypeLib
{
??FT_Library?m_FT2Lib;
??FT_Face????m_FT_Face;
public:
??int???m_w;
??int???m_h;
??void?load(const?char*?font_file??int?_w??int?_h);
??GLuint?loadChar(wchar_t?ch);
};
void?xFreeTypeLib::load(const?char*?font_file??int?_w??int?_h)
{
??FT_Library?library;
??if?(FT_Init_FreeType(?&library)?)?
????exit(0);
??m_FT2Lib?=?library;
??//加載一個字體取默認的Face一般為Regualer
??if?(FT_New_Face(?library?font_file?0?&m_FT_Face?))?
????exit(0);
??//選擇字符表
??FT_Select_Charmap(m_FT_Face?FT_ENCODING_UNICODE);
??m_w?=?_w?;?m_h?=?_h;
??m_FT_Face->num_fixed_sizes;
??//大小要乘64.這是規(guī)定。照做就可以了。
??//FT_Set_Char_Size(?m_FT_Face??0??m_w?<6?96?96);
??//用來存放指定字符寬度和高度的特定數(shù)據(jù)
??FT_Set_Pixel_Sizes(m_FT_Facem_w?m_h);
}
GLuint?xFreeTypeLib::loadChar(wchar_t?ch)
{
??if(g_TexID[ch].m_texID)
??return?g_TexID[ch].m_texID;
??/*?裝載字形圖像到字形槽(將會抹掉先前的字形圖像)?*/?
??if(FT_Load_Char(m_FT_Face?ch?
??FT_LOAD_DEFAULT?|?
??FT_LOAD_MONOCHROME?|
??FT_LOAD_TARGET_MONO)???)
??{
????return?0;
??}
?/*if(FT_Load_Glyph(?m_FT_Face?FT_Get_Char_Index(?m_FT_Face?ch?)?FT_LOAD_FORCE_AUTOHINT?))
??throw?std::runtime_error(“FT_Load_Glyph?failed“);*/
??xCharTexture&?charTex?=?g_TexID[ch];
?
??//得到字模
??FT_Glyph?glyph;
??//把字形圖像從字形槽復(fù)制到新的FT_Glyph對象glyph中。這個函數(shù)返回一個錯誤碼并且設(shè)置glyph。?
??if(FT_Get_Glyph(?m_FT_Face->glyph?&glyph?))
????return?0;
? //轉(zhuǎn)化成位圖
? FT_Render_Glyph(?m_FT_Face->glyph???FT_RENDER_MODE_MONO?);//FT_RENDER_MODE_NORMAL??);?
? FT_Glyph_To_Bitmap(?&glyph?FT_RENDER_MODE_MONO?0?1?);
? FT_BitmapGlyph?bitmap_glyph?=?(FT_BitmapGlyph)glyph;
??//取道位圖數(shù)據(jù)
??FT_Bitmap?&bitmap=bitmap_glyph->bitmap;
??//把位圖數(shù)據(jù)拷貝自己定義的數(shù)據(jù)區(qū)里.這樣舊可以畫到需要的東西上面了。
??int?width??=??bitmap.width;
??int?height?=??bitmap.rows;
?
??m_FT_Face->size->metrics.y_ppem; //伸縮距離到設(shè)備空間
??m_FT_Face->glyph->metrics.horiAdvance;??//水平文本排列
??charTex.m_Width?=?width;
??charTex.m_Height?=?height;
??charTex.m_adv_x?=?m_FT_Face->glyph->advance.x?/?64.0f;??//步進寬度
??charTex.m_adv_y?=?m_FT_Face->size->metrics.y_ppem; //m_FT_Face->glyph->metrics.horiBearingY?/?64.0f;
??charTex.m_delta_x?=?(float)bitmap_glyph->left; //left:字形原點(00)到字形位圖最左邊象素的水平距離.它以整數(shù)象素的形式表示。?
??charTex.m_delta_y?=?(float)bitmap_glyph->top?-?height;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
????.......??????3735??2015-04-01?15:44??宋體渲染\FontRendering\FontRendering.vcxproj
????.......???????942??2015-01-30?14:12??宋體渲染\FontRendering\FontRendering.vcxproj.filters
????.......???????143??2015-01-30?14:12??宋體渲染\FontRendering\FontRendering.vcxproj.user
????.......?????11168??2015-04-01?15:37??宋體渲染\FontRendering\main.cpp
????.......???????906??2015-01-30?14:12??宋體渲染\FontRendering.sln
????.......?????22016??2015-04-01?15:45??宋體渲染\FontRendering.suo
????.......????154624??2015-01-30?14:12??宋體渲染\glut.dll
????.......????154624??2015-01-30?14:12??宋體渲染\glut32.dll
????.......?????18094??2015-01-30?14:12??宋體渲染\include\freetype\config\ftconfig.h
????.......?????25587??2015-01-30?14:12??宋體渲染\include\freetype\config\ftheader.h
????.......??????1399??2015-01-30?14:12??宋體渲染\include\freetype\config\ftmodule.h
????.......?????56425??2015-01-30?14:12??宋體渲染\include\freetype\config\ftoption.h
????.......??????7313??2015-01-30?14:12??宋體渲染\include\freetype\config\ftstdlib.h
????.......????254137??2015-01-30?14:12??宋體渲染\include\freetype\freetype.h
????.......??????2383??2015-01-30?14:12??宋體渲染\include\freetype\ft2build.h
????.......?????10646??2015-01-30?14:12??宋體渲染\include\freetype\ftadvanc.h
????.......?????14651??2015-01-30?14:12??宋體渲染\include\freetype\ftautoh.h
????.......??????5244??2015-01-30?14:12??宋體渲染\include\freetype\ftbbox.h
????.......??????6802??2015-01-30?14:12??宋體渲染\include\freetype\ftbdf.h
????.......?????14388??2015-01-30?14:12??宋體渲染\include\freetype\ftbitmap.h
????.......??????4308??2015-01-30?14:12??宋體渲染\include\freetype\ftbzip2.h
????.......?????57527??2015-01-30?14:12??宋體渲染\include\freetype\ftcache.h
????.......?????10121??2015-01-30?14:12??宋體渲染\include\freetype\ftcffdrv.h
????.......??????8514??2015-01-30?14:12??宋體渲染\include\freetype\ftchapters.h
????.......??????5581??2015-01-30?14:12??宋體渲染\include\freetype\ftcid.h
????.......?????12217??2015-01-30?14:12??宋體渲染\include\freetype\fterrdef.h
????.......??????9292??2015-01-30?14:12??宋體渲染\include\freetype\fterrors.h
????.......??????4505??2015-01-30?14:12??宋體渲染\include\freetype\ftgasp.h
????.......?????38694??2015-01-30?14:12??宋體渲染\include\freetype\ftglyph.h
????.......?????13408??2015-01-30?14:12??宋體渲染\include\freetype\ftgxval.h
............此處省略85個文件信息
- 上一篇:vc界面庫集總
- 下一篇:Mindmanager思維導(dǎo)圖中文模版107個
評論
共有 條評論