金橋科普  
設為首頁 關于我們 郵箱登錄
科普聚焦時代科技科普生活科學技術自然科學航空航天科技博覽歷史考古電腦IT
您現在的位置: 首頁 >> 科普頻道 >> 電腦遊戲 >> 文章詳情
FreeType的教程代碼

xpertsoft gameres 2006-09-30
 FreeType的教程代碼. 使用GLUT.

在Nehe的代碼基礎上改的:

以下是基礎代碼:
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;

int   m_w;
int   m_h;
public:
xFreeTypeLib()
{
if (FT_Init_FreeType( &m_FT2Lib) ) 
exit(0);
}

void load(const char* font_file , int _w , int _h)
{
//加載一個字體,取默認的Face,一般為Regualer
if (FT_New_Face( m_FT2Lib, 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.這是規定。照做就可以了。
//FT_Set_Char_Size( m_FT_Face , 0 , m_w << 6, 96, 96);
FT_Set_Pixel_Sizes(m_FT_Face,m_w, m_h);
}

GLuint 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_RENDER|FT_LOAD_FORCE_AUTOHINT|
(true ? FT_LOAD_TARGET_NORMAL : FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO) )   )
{
return 0;
}

        xCharTexture& charTex = g_TexID[ch];

//得到字模
FT_Glyph glyph;
if(FT_Get_Glyph( m_FT_Face->glyph, &glyph ))
return 0;

//轉化成位圖
FT_Render_Glyph( m_FT_Face->glyph,   FT_RENDER_MODE_LCD );//FT_RENDER_MODE_NORMAL  ); 
FT_Glyph_To_Bitmap( &glyph, ft_render_mode_normal, 0, 1 );
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;

//取道位圖數據
FT_Bitmap& bitmap=bitmap_glyph->bitmap;

//把位圖數據拷貝自己定義的數據區裡.這樣舊可以畫到需要的東西上面了。
int width  =  bitmap.width;
int height =  bitmap.rows;

m_FT_Face->size->metrics.y_ppem;
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;
charTex.m_delta_y = (float)bitmap_glyph->top - height;
glGenTextures(1,&charTex.m_texID);
        glBindTexture(GL_TEXTURE_2D,charTex.m_texID);
char* pBuf = new char[width * height * 4];
for(int j=0; j  < height ; j++)
{
for(int i=0; i < width; i++)
{
unsigned char _vl =  (i>=bitmap.width || j>=bitmap.rows) ? 0 : bitmap.buffer[i + bitmap.width*j];
pBuf[(4*i + (height - j - 1) * width * 4)  ] = 0xff;
pBuf[(4*i + (height - j - 1) * width * 4)+1] = 0xff;
pBuf[(4*i + (height - j - 1) * width * 4)+2] = 0xff;
pBuf[(4*i + (height - j - 1) * width * 4)+3] = _vl;
}
}

glTexImage2D( GL_TEXTURE_2D,0,GL_RGBA,width, height,0,GL_RGBA,GL_UNSIGNED_BYTE,pBuf);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_REPLACE);
delete[]pBuf;
return charTex.m_chaID;
}

}g_FreeTypeLib;


繪制代碼如下:
void drawText(wchar_t* _strText,int x , int y, int maxW , int h)
{
int sx = x;
int sy = y;
int maxH = h;
for(int i = 0 ; i < wcslen(_strText) ; i ++)
{

if(_strText[i] =='n')
{
sx = x ; sy += maxH + 12;
continue;
}
xCharTexture* pCharTex = getTextChar(_strText[i]);
glBindTexture(GL_TEXTURE_2D,pCharTex->m_texID);
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//glDisable(GL_TEXTURE_2D);
int w = pCharTex->m_Width;
int h = pCharTex->m_Height;

int ch_x = sx + pCharTex->m_delta_x;
int ch_y = sy - h - pCharTex->m_delta_y;

if(maxH < h) maxH = h;
glBegin ( GL_QUADS );
{
glTexCoord2f(0.0f, 1.0f); glVertex3f(ch_x      , ch_y    ,  1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(ch_x +  w, ch_y    ,  1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(ch_x +  w, ch_y + h,  1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(ch_x     , ch_y + h,  1.0f);
}
glEnd();
sx += pCharTex->m_adv_x;
if(sx > x + maxW)
{
sx = x ; sy += maxH + 12;
}
}

}


http://bbs.gameres.com/upload/sf_200692103510.png

 


  發表評論 寫信給編輯 關閉窗口
同欄目內容
· 星際爭霸秘籍字面全解釋 2008-05-06
· 網遊不一定會讓孩子弱智 2008-03-26
· 網絡遊戲玩3年孩子變弱智 2008-03-24
· 玩QQ俄羅斯方塊遊戲的幾個誤區 2008-03-21
· 全球遊戲開發公司前50強排名揭曉 2008-03-12
· 攜帶超方便的圍棋棋盤 2007-11-15
相關內容
近期主推
太空性愛面臨技術難題
·太空性愛面臨技術難題
·最有益健康的牙刷形狀什麼樣
·世界公認的10大最健康減肥法
·每天三個俯臥撐 健康迎奧運
·美懷孕變性男產下一名女嬰
·古埃及法老是外星人後代?
近期熱門
千年前超新星爆發
·千年前超新星爆發
·解開水星三十餘年難解謎題
·風箏發電機揭秘
·美計劃建1000米高太陽能塔發電
·“朱堅強”為什麼能那麼堅強?
·太陽系暗物質總重量測定
近期焦點
美國人造腎人體試用成功
·美國人造腎人體試用成功
·美日打造機器人套裝
·雲彩打造另類廣告
·諾基亞推出“即拍即譯”技術
·"隆頭增高術" 一天增高5釐米
·德國開發機器人"機械甲蟲"守護森林
金橋科普是一個公益性欄目,內容由作者提供或摘自互聯網,其目的是向廣大網民普及科學技術知識。如果您發現本網站轉載或摘編了您擁有著作權的作品,請通知我們(電話:023-63659911),我們立即刪除。
關于我們 | 網站地圖 | 用戶注冊 | 廣告客戶 | 招聘信息 | 業務信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重慶科技咨詢中心.重慶網得信息技術有限公司.版權所有
Email:webmaster@jqinfo.com
重慶數據通信局提供網絡帶寬. 渝ICP備05002327號