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

📄 asl_font.h

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 H
字号:
//-----------------------------------------------------------------------------
//
//    ____ Azure Star Game Engine 蓝星游戏引擎 ____
//
//    Copyright (c) 2006, 蓝星工作室
//    All rights reserved.
//
//    文件名称: asl_font.h
//    摘    要: 字体类定义
//
//    当前版本: 1.0
//    作    者: 汤  祺
//    创建日期: 2006-8-6
//
//-----------------------------------------------------------------------------

#ifndef ASL_FONT_INCLUDE
#define ASL_FONT_INCLUDE

#pragma once

#include "asl_utils.h"
#include "asl_bitmap.h"

//-----------------------------------------------------------------------------
namespace ASL
{

//-----------------------------------------------------------------------------
// 类名: ASLFont
// 功能: 字体类
//           本类使用LRU算法管理一块字符信息缓存,以提高字符显示速度。
//       同时支持平滑字体的显示(通过alpha通道混合实现)。               
//           提速的原理是:游戏中的同一段文字一般要显示几秒钟时间,在这
//       段时间中可能会刷新数百次。若每次刷新都调用GDI函数绘制文字则开
//       销巨大。如果使用缓存机制,则只在第一次显示文字时调用GDI函数,
//       以后数百次刷新均可从缓存中直接取数据,极大的提高了效率。在更新
//       文字后,那些使用率较高的字保留在缓存中,只替换低频率的字,所以
//       此时需要调用GDI函数更新缓存的部分是比较少的,速度同样有保证。
//           若缓存开的较小,不能容纳屏幕中所有要显示的文字,则每次刷新
//       要重新调用GDI函数替换部分使用率低的缓存块。经测试,此时速度仍
//       比直接调用GDI函数快,但比足缓存时速度有很大下降,这是由LRU算法
//       的性质决定的。因此建议设置缓存的大小为足够容纳屏幕中所有要显示
//       的文字。
//-----------------------------------------------------------------------------
class ASLFont
{

// 字符信息结构定义
private:
	struct CharInfo
	{
		CharInfo() : ciChar(0), ciData(NULL), ciTime(0) {}
		~CharInfo() { SAFE_DELETE_ARRAY(ciData); }

		UINT ciChar;	// 字符表示数
		BYTE *ciData;	// 字符点阵数据或alpha通道数据
		int ciWidth;	// 字符宽度
		int ciHeight;	// 字符高度
		int ciPitch;	// 字符每行字节数
		int ciOx;		// 数据起点到字符左侧的偏移
		int ciOy;		// 数据起点到字符上端的偏移
		int ciInc;		// 字符占据的宽度(用于计算下一字符起点)
		int ciTime;		// 最后使用时间(伪时间,每调用_GetChar()加1)
	};



// 构造/析构函数
public:
	ASLFont(void);
	ASLFont(HFONT font, bool bSmooth, int nCacheSize = 256);
	~ASLFont(void);



// 公有函数
public:
	// 创建字体
	void Create(HFONT font, bool bSmooth, int nCacheSize = 256);

	// 销毁字体
	void Destroy(void);
	
	// 设置字符间距
	inline void SetSpace(int nSpace) { m_nSpace = nSpace; }

	// 取单个字符宽度
	inline int GetCharWidth(void) { return m_nAveWidth; }
	
	// 取单个字符高度
	inline int GetCharHeight(void) { return m_nCharBmpHeight; }

	// 绘制字符串
	void DrawText(ASLBitmap &bmDest, int x, int y, LPCSTR str, COLOR color);
	void DrawText(ASLBitmap &bmDest, int x, int y, COLOR color, LPCSTR format, ...);
	
	// 自动分行绘制字符串
	void DrawTextEx(ASLBitmap &bmDest, int x, int y, LPCSTR str, COLOR color, 
					int length, int vspace);


// 私有函数
private:
	// 取字符信息
	const CharInfo& _GetChar(UINT ch);

	// 设置字符信息
	void _SetChar(CharInfo &ci, UINT ch);

	// 绘制字符
	void _DrawChar(const CharInfo &ci, ASLBitmap &bmDest, int x, int y, 
				   COLOR color) const;



// 私有变量
private:
	CharInfo*	m_pCache;			// 字符信息缓存(LRU算法管理)
	HDC			m_hDC;				// 内存DC
	HBITMAP		m_hBitmap;			// 字符位图
	BYTE*		m_pCharBmpBuf;		// 字符位图数据
	int			m_nCharBmpWidth;	// 字符位图宽度
	int			m_nCharBmpHeight;	// 字符位图高度
	int			m_nSize;			// 字符信息缓存大小
	int			m_nAscent;			// 字符基准线上最大高度
	int			m_nSpace;			// 字符间距
	int			m_nTime;			// 当前时间(伪时间,每调用_GetChar()加1)
	bool		m_bSmooth;			// 是否平滑字体
	int			m_nAveWidth;		// 平均字宽

}; // ASLFont类定义结束

}  // namespace ASL

#endif // ASL_FONT_INCLUDE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -