天没事就把HGE中文的(hgeFontCN)修了一下..
去除了一些不要的东西..
这样使得内存占用小了一大节...
以前用12号字要用15M左右的内存.
现在只需要9M了...
我直接贴代码了...
原理去看我以前发的文章...
#pragma
once
#include " hge.h "
#include " hgesprite.h "
#include < iostream >
class hgeFontCN
{
public :
// HZ_H_MAX = HZ_H_END - HZ_H_FIX + 1 + 1 - (RM_H_END - RM_H_FIX) // 其中 +1 为ASCII码占一行
// HZ_W_MAX = HZ_W_END - HZ_W_FIX + 1;
// EX_H = RM_H_END - RM_H_FIX + 1;
enum FONTCN_DATA
{
HZ_H_MAX = 82 , // 汉字编码高位量
HZ_W_MAX = 95 , // 汉字编码底位量
EX_H = 6 ,
HZ_H_FIX = 0xA1 , // 汉字编码高位
HZ_H_END = 0xF7 ,
HZ_W_FIX = 0xA0 , // 汉字编码底位
HZ_W_END = 0xFE ,
ASCII_FIX = 0x20 , // ASCII编码
ASCII_END = 0x7F ,
RM_H_FIX = 0xAA , // 去除部分汉字编码高位
RM_H_END = 0xAF
};
struct FontCN_Head
{
char strHead[ 0x09 ];
char ImgFile[ 0x40 ];
DWORD dwStringCol;
DWORD dwStringRow;
BYTE iFontW;
BYTE iFontH;
public :
void Set( char * head, const char * file, DWORD nCol, DWORD nRow, BYTE nFWidth, BYTE nFHeight);
};
struct FontCN_Frame
{
BYTE HZ[ 2 ];
WORD dwFontX;
WORD dwFontY;
public :
void Set(BYTE h, BYTE l, WORD fx, WORD fy);
};
public :
hgeFontCN( const char * filename); // 根据字体文件创建
~ hgeFontCN( void );
void Render( float x, float y, const char * string ); // 绘制字符串
void printf( float x, float y, const char * format, ...); // 绘制格式字符串
void SetColor(DWORD col){ sprFont -> SetColor(col); } // 设置字体颜色
void SetZ( float z){ sprFont -> SetZ(z); } // 设置Z缓冲
DWORD GetColor() const { return sprFont -> GetColor(); } // 获得颜色
float GetZ() const { return sprFont -> GetZ(); } // 获得Z缓冲
float GetHeight() const { return fHeight; } // 获得字体高度
float GetCNWidth() const { return fCNWidth; }
float GetENWidth() const { return fENWidth; }
void SetBlendMode( int blend){sprFont -> SetBlendMode(blend);} // 设置混和模式
int GetBlendMode() const { return sprFont -> GetBlendMode(); } // 获得混和模式
float GetStringWidth( const char * string ) const ;
float GetStringHeight( const char * string ) const ;
private :
static HGE * hge;
hgeSprite * sprFont; // 所有字模精灵
FontCN_Frame fontFrame[HZ_H_MAX][HZ_W_MAX]; // 所有字符
float fCNWidth; // 汉字宽度
float fENWidth; // ASCII宽度
float fHeight; // 字符高度
char txtBuffer[ 512 ]; // 文本缓存
};
inline void hgeFontCN::FontCN_Head::Set( char * head, const char * file, DWORD nCol, DWORD nRow, BYTE nFWidth, BYTE nFHeight)
{
strcpy(strHead, head);
strcpy(ImgFile, file);
dwStringCol = nCol;
dwStringRow = nRow;
iFontW = nFWidth;
iFontH = nFHeight;
}
inline void hgeFontCN::FontCN_Frame::Set(BYTE h, BYTE l, WORD fx, WORD fy)
{
HZ[ 0 ] = h;
HZ[ 1 ] = l;
dwFontX = fx;
dwFontY = fy;
}
#include " hge.h "
#include " hgesprite.h "
#include < iostream >
class hgeFontCN
{
public :
// HZ_H_MAX = HZ_H_END - HZ_H_FIX + 1 + 1 - (RM_H_END - RM_H_FIX) // 其中 +1 为ASCII码占一行
// HZ_W_MAX = HZ_W_END - HZ_W_FIX + 1;
// EX_H = RM_H_END - RM_H_FIX + 1;
enum FONTCN_DATA
{
HZ_H_MAX = 82 , // 汉字编码高位量
HZ_W_MAX = 95 , // 汉字编码底位量
EX_H = 6 ,
HZ_H_FIX = 0xA1 , // 汉字编码高位
HZ_H_END = 0xF7 ,
HZ_W_FIX = 0xA0 , // 汉字编码底位
HZ_W_END = 0xFE ,
ASCII_FIX = 0x20 , // ASCII编码
ASCII_END = 0x7F ,
RM_H_FIX = 0xAA , // 去除部分汉字编码高位
RM_H_END = 0xAF
};
struct FontCN_Head
{
char strHead[ 0x09 ];
char ImgFile[ 0x40 ];
DWORD dwStringCol;
DWORD dwStringRow;
BYTE iFontW;
BYTE iFontH;
public :
void Set( char * head, const char * file, DWORD nCol, DWORD nRow, BYTE nFWidth, BYTE nFHeight);
};
struct FontCN_Frame
{
BYTE HZ[ 2 ];
WORD dwFontX;
WORD dwFontY;
public :
void Set(BYTE h, BYTE l, WORD fx, WORD fy);
};
public :
hgeFontCN( const char * filename); // 根据字体文件创建
~ hgeFontCN( void );
void Render( float x, float y, const char * string ); // 绘制字符串
void printf( float x, float y, const char * format, ...); // 绘制格式字符串
void SetColor(DWORD col){ sprFont -> SetColor(col); } // 设置字体颜色
void SetZ( float z){ sprFont -> SetZ(z); } // 设置Z缓冲
DWORD GetColor() const { return sprFont -> GetColor(); } // 获得颜色
float GetZ() const { return sprFont -> GetZ(); } // 获得Z缓冲
float GetHeight() const { return fHeight; } // 获得字体高度
float GetCNWidth() const { return fCNWidth; }
float GetENWidth() const { return fENWidth; }
void SetBlendMode( int blend){sprFont -> SetBlendMode(blend);} // 设置混和模式
int GetBlendMode() const { return sprFont -> GetBlendMode(); } // 获得混和模式
float GetStringWidth( const char * string ) const ;
float GetStringHeight( const char * string ) const ;
private :
static HGE * hge;
hgeSprite * sprFont; // 所有字模精灵
FontCN_Frame fontFrame[HZ_H_MAX][HZ_W_MAX]; // 所有字符
float fCNWidth; // 汉字宽度
float fENWidth; // ASCII宽度
float fHeight; // 字符高度
char txtBuffer[ 512 ]; // 文本缓存
};
inline void hgeFontCN::FontCN_Head::Set( char * head, const char * file, DWORD nCol, DWORD nRow, BYTE nFWidth, BYTE nFHeight)
{
strcpy(strHead, head);
strcpy(ImgFile, file);
dwStringCol = nCol;
dwStringRow = nRow;
iFontW = nFWidth;
iFontH = nFHeight;
}
inline void hgeFontCN::FontCN_Frame::Set(BYTE h, BYTE l, WORD fx, WORD fy)
{
HZ[ 0 ] = h;
HZ[ 1 ] = l;
dwFontX = fx;
dwFontY = fy;
}
欢迎转载,如有问题请与作者联系:原作BLOG (QQ:29774874);
#include " hgefontcn.h "
#include < stdlib.h >
#include < stdio.h >
HGE * hgeFontCN::hge = 0 ;
hgeFontCN:: ~ hgeFontCN( void )
{
hge -> Texture_Free(sprFont -> GetTexture());
delete sprFont;
sprFont = 0 ;
hge -> Release();
}
hgeFontCN::hgeFontCN( const char * filename)
{
hge = hgeCreate(HGE_VERSION);
HTEXTURE hTexture = 0 ;
FontCN_Head fonthead;
FILE * pFontFile = fopen(filename, " rb " );
if (fread( & fonthead, 1 , sizeof (FontCN_Head), pFontFile) != sizeof (FontCN_Head))
{
fclose(pFontFile);
return ;
}
if (strcmp(fonthead.strHead, " [FONTCN] " ))
{
fclose(pFontFile);
return ;
}
std:: string imgFileName(fonthead.ImgFile);
fCNWidth = ( float )fonthead.iFontW;
fENWidth = fCNWidth / 2 + 1 ;
#ifndef _DEBUG
fENWidth += 1 ;
#endif
fHeight = ( float )fonthead.iFontH;
char szFullImgFile[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath(filename, drive, dir, fname, ext );
sprintf(szFullImgFile, " %s%s " , dir, imgFileName.c_str());
if ((hTexture = hge -> Texture_Load(szFullImgFile)) == 0 )
{
fclose(pFontFile);
return ;
}
float texW = ( float )hge -> Texture_GetWidth(hTexture, true );
float texH = ( float )hge -> Texture_GetHeight(hTexture, true );
sprFont = new hgeSprite(hTexture, 0 , 0 , texW, texH);
FontCN_Frame _frame;
while ( ! feof(pFontFile))
{
if (fread( & _frame, 1 , sizeof (FontCN_Frame), pFontFile) != sizeof (FontCN_Frame))
break ;
BYTE hz0 = _frame.HZ[ 0 ];
BYTE hz1 = _frame.HZ[ 1 ];
if (hz0 >= HZ_H_FIX && hz0 <= HZ_H_END)
{
if (hz1 < HZ_W_FIX || hz1 > HZ_W_END)
continue ;
BYTE _ex = hz0 >= RM_H_FIX ? EX_H : 0 ;
hz0 -= HZ_H_FIX + _ex;
hz1 -= HZ_W_FIX;
}
else if (hz0 == 0xFF )
{
if (hz1 < ASCII_FIX || hz1 >= ASCII_END)
continue ;
hz0 = HZ_H_MAX - 1 ;
hz1 -= ASCII_FIX;
}
else
continue ;
fontFrame[hz0][hz1] = _frame;
}
fclose(pFontFile);
SetBlendMode(BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE);
}
void hgeFontCN::Render( float x, float y, const char * string )
{
float fx = x;
int i = 0 , j = 0 ;
while ( * string )
{
BYTE hz0 = * string ;
BYTE hz1 = * ( string + 1 );
if ( * string == ' ' )
{
y += fHeight;
fx = x;
}
else if (hz0 >= HZ_H_FIX && hz0 <= HZ_H_END)
{
BYTE _ex = hz0 >= RM_H_FIX ? EX_H : 0 ;
i = hz0 - HZ_H_FIX - _ex;
j = hz1 - HZ_W_FIX;
sprFont -> SetTextureRect(( float )fontFrame[i][j].dwFontX, ( float )fontFrame[i][j].dwFontY, fCNWidth, fHeight);
sprFont -> Render(fx, y);
fx += fCNWidth;
string ++ ;
}
else if (hz0 >= ASCII_FIX && hz0 < ASCII_END)
{
i = HZ_H_MAX - 1 ;
j = hz0 - ASCII_FIX;
sprFont -> SetTextureRect(( float )fontFrame[i][j].dwFontX,( float )fontFrame[i][j].dwFontY, fENWidth, fHeight);
sprFont -> Render(fx, y);
fx += fENWidth;
}
else
{
i = HZ_H_MAX - 1 ;
j = ' ? ' ;
sprFont -> SetTextureRect(( float )fontFrame[i][j].dwFontX, ( float )fontFrame[i][j].dwFontY, fENWidth, fHeight);
sprFont -> Render(fx, y);
fx += fENWidth;
}
string ++ ;
}
}
void hgeFontCN::printf( float x, float y, const char * format, ...)
{
char * pArg = ( char * ) & format + sizeof (format);
_vsnprintf(txtBuffer, sizeof (txtBuffer) - 1 , format, pArg);
txtBuffer[ sizeof (txtBuffer) - 1 ] = 0 ;
Render(x, y, txtBuffer);
}
float hgeFontCN::GetStringWidth( const char * string ) const
{
float w = 0 , tw = 0 ;
while ( * string )
{
if ( * string == ' ' )
{
tw = max(tw, w);
w = 0 , string ++ ;
continue ;
}
BYTE hz0 = * ( string ++ ), hz1 = * string ;
if (hz0 >= HZ_H_FIX && hz0 <= HZ_H_END)
w += fCNWidth, string ++ ;
else
w += fENWidth;
}
return max(tw, w);
}
float hgeFontCN::GetStringHeight( const char * string ) const
{
float _h = fHeight;
while ( * string )
{
if ( * ( string ++ ) == ' ' )
_h += fHeight;
}
return _h;
}
怪的地方有一个.Release和Debug版的GDI字体竟然不一样..而且差别非常大.
字模的生成工具下载:hgeFontImage.exe和config.ini
注意:下载完后将ini文件更名为:config.ini