⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 font.h

📁 一个3D的保龄球的源代码
💻 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 + -