📄 asl_font.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 + -