📄 font.h
字号:
// Font.h: interface for the CFont class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_FONT_H__D86A2085_141B_48F2_AE11_F01B4273D75C__INCLUDED_)
#define AFX_FONT_H__D86A2085_141B_48F2_AE11_F01B4273D75C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "gfx.h"
///#include "..\game\def.h"
class CEngine;
const char FONT_W[] =
{
2,// space
2,//!
4,//"
6,//sharp
6,//$
5,//%
6,//&
3,//'
4,//(
4,//)
6,//*
6,//+
3,//,
4,//-
2,//.
5,///
5,//0
3,//1
5,//2
5,//3
5,//4
5,//5
5,//6
5,//7
5,//8
5,//9
2,//:
3,//;
6,//<
5,//=
6,//>
5,//?
7,//@
5,//A
5,//B
5,//C
5,//D
5,//E
5,//F
5,//G
5,//H
4,//I
4,//J
5,//K
5,//L
6,//M
5,//N
5,//O
5,//P
5,//Q
5,//R
5,//S
4,//T
5,//U
6,//V
6,//W
6,//X
6,//Y
5,//Z
3,//[
5,//
3,//
6,//^
6,//_
3,//`
5,//a
5,//b
5,//c
5,//d
5,//e
5,//f
5,//g
5,//h
2,//i
3,//j
5,//k
2,//l
6,//m
5,//n
5,//o
5,//p
5,//q
5,//r
5,//s
4,//t
5,//u
6,//v
6,//w
6,//x
4,//y
5,//z
4,//{
7,//copyright
4,//}
5,//~
7 //ED
};
const char MINI_FONT_W[] =
{
5,//0
3,//1
5,//2
5,//3
5,//4
5,//5
5,//6
5,//7
5,//8
5,//9
5,//A
5,//B
5,//C
5,//D
5,//E
5,//F
5,//G
5,//H
4,//I
4,//J
5,//K
5,//L
6,//M
5,//N
5,//O
5,//P
5,//Q
5,//R
5,//S
4,//T
5,//U
6,//V
6,//W
6,//X
6,//Y
5,//Z
3, //empty
};
enum FONT_TYPE
{
FONT_NORMAL = 0,
FONT_MINI = 1,
};
class CFont
{
public:
CFont(CEngine *p);
~CFont();
CEngine *m_pEngine;
GFXBMP* m_pFontImage;
GFXBMP* m_pFontImageMini;
bool loadFont();
void drawString(const char *str, int x, int y, int clrFG = -1, int fonttype = FONT_MINI)
{
CGfx *g = m_pEngine->GetGfx();
int car, i;
int x2 = x;
if (fonttype == FONT_NORMAL)
{
for (i=0;str[i]!=0;i++)
{
car = str[i];
car -= 32;
if(x2 >= SCREEN_WIDTH)
break;
if(clrFG == -1)
g->DrawBmp(x2, y, 8, 12, m_pFontImage, 0, car*12, 0);
else
FontBlt(g->GetVideo(), x2, y, 8, 12, m_pFontImage, 0, car*12, clrFG);
x2 += FONT_W[car];
}
}
else
{
for (i=0;str[i]!=0;i++)
{
car = str[i];
car = getMiniFontidx(car);
if(x2 >= SCREEN_WIDTH)
break;
if(clrFG == -1)
g->DrawBmp(x2, y, 6, 6, m_pFontImageMini, 0, car*6+1, 0);
else
FontBlt(g->GetVideo(), x2, y, 6, 6, m_pFontImageMini, 0, car*6+1, clrFG);
x2 += MINI_FONT_W[car];
}
}
}
void FontBlt(GFXBMP *pDes, int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy, int clrFG)
{
SYS_ASSERT(pSrc!=NULL);
SYS_ASSERT(pDes!=NULL);
int invisible;
//set clip area, it's long and puzzling...
if(dx < 0 )
{
w += dx;
sx -= dx;
dx= 0;
}
invisible = dx + w - pDes->w;
if(invisible > 0)
w -= invisible;
if(dy < 0 )
{
h += dy;
sy -= dy;
dy= 0;
}
invisible = dy + h - pDes->h;
if(invisible > 0)
h -= invisible;
if(w<=0 || h <=0)
return;
unsigned short *pD, *pE, *pPal;
unsigned char *pS;
int i;
int s_space, d_space;
//copy to buffer
pPal = (unsigned short*)pSrc->pData;
pS = pSrc->pData + pSrc->w * sy + sx + pSrc->npal * 2;
s_space= (pSrc->w - w);
pD = (unsigned short*)(pDes->pData + (pDes->w * dy + dx) * 2);
d_space = pDes->w - w;
for(i = 0; i < h; i++)
{
pE = pD + w;
while(pD < pE)
{
if( *pS)
{
#if (HW_COLORMODEL == CM_RGB565)
if(pPal[*pS] == 0xffff)//fg
#elif (HW_COLORMODEL == CM_RGB444)
if(pPal[*pS] == 0xfff)//fg
#endif
*pD = clrFG;//pPal[*pS];
else//bg
*pD = pPal[*pS];
}
pD++;
pS++;
}
pS += s_space;
pD += d_space;
}
}
int getFontWidth(const char *str, int fonttype = FONT_NORMAL)
{
int w = 0;
int car, i;
if (fonttype == FONT_NORMAL)
for (i=0;str[i]!=0;i++)
{
car = str[i] - 32;
if (car < 0 || car >= 96)
{
SYS_ASSERT(0);
}
else
w += FONT_W[car];
}
else if (fonttype == FONT_MINI)
{
for (i=0;str[i]!=0;i++)
{
car = getMiniFontidx(str[i]);
w += MINI_FONT_W[car];
}
}
return w;
}
int getMiniFontidx(char c) {
if ((c >= 'A') && (c <= 'Z'))
return c-'A'+10;
if ((c >= 'a') && (c <= 'z'))
return c-'a'+10;
if ((c >= '0') && (c <= '9'))
return c-'0';
return 36;
}
};
#endif // !defined(AFX_FONT_H__D86A2085_141B_48F2_AE11_F01B4273D75C__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -