这个是CEGUI底层生成字体的基本原理,也是研究CEGUI字体优化的起始
使用 Ogre1.7的depends的函数库, 编译时要加 FREEIMAGE_LIB 预编译指令
// FontTest.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//然后,到CMD里执行:Exer01 "simsun.ttc"
/**
使用FreeImage写FreeType2字体图片
*/
#include <iostream>
#include <string>
#include <FreeImage.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
//----------------------------------------------------------------------------//
// 初始化函数
bool Init(const std::string &fontFileName);
// 写到图片
bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &imgFileName);
// 清理资源
void DeInit(void);
// 全局句柄
FT_Library g_ftLib;
FT_Face g_ftFace;
//----------------------------------------------------------------------------//
int main(int argc,char **argv)
{
using namespace std;
if ( argc < 2 || !Init(argv[1]) )
{
cout<<"初始化失败!"<<endl;
return -1;
}
DrawToImage(L'家',48,48,"jia.jpg");
DeInit();
return 0;
}
//----------------------------------------------------------------------------//
bool Init(const std::string &fontFileName)
{
// 初始化字体库
if ( FT_Init_FreeType(&g_ftLib) ) { return false; }
if ( FT_New_Face(g_ftLib,fontFileName.c_str(),0,&g_ftFace) ) { return false; }
// FreeImage
FreeImage_Initialise();
return true;
}
//----------------------------------------------------------------------------//
bool DrawToImage(wchar_t uchar,int fw,int fh,const std::string &fileName)
{
// 设置字体大小
FT_Set_Char_Size(g_ftFace,fw<<6,fh<<6,96,96);
// 加载并渲染字体GLYPH
FT_Load_Glyph(g_ftFace,FT_Get_Char_Index(g_ftFace,uchar),FT_LOAD_DEFAULT);
FT_Glyph glyph;
FT_Get_Glyph(g_ftFace->glyph,&glyph);
FT_Render_Glyph(g_ftFace->glyph,FT_RENDER_MODE_NORMAL);
// 拷贝到图片写入文件
FT_Bitmap *pBmp = &g_ftFace->glyph->bitmap;
int w = pBmp->width;
int h = pBmp->rows;
FIBITMAP *fib = FreeImage_Allocate(w,h,24);
RGBQUAD rgb;
for ( int i=0;i<h;++i )
{
for ( int j=0;j<w;++j )
{
rgb.rgbRed = pBmp->buffer[i*w+j];
rgb.rgbGreen = pBmp->buffer[i*w+j];
rgb.rgbBlue = pBmp->buffer[i*w+j];
FreeImage_SetPixelColor(fib,j,h-i,&rgb);
}
}
FreeImage_Save(FIF_JPEG,fib,fileName.c_str());
FreeImage_Unload(fib);
return true;
}
//----------------------------------------------------------------------------//
void DeInit()
{
FT_Done_Face(g_ftFace);
FT_Done_FreeType(g_ftLib);
FreeImage_DeInitialise();
}