Chapter 82 · 字体与文本

XRF 位图字体

XRF 是 XGE 预光栅化字体格式,加载快、无需运行时渲染,适合固定字符集场景。

82

API 速查

函数说明
int xgeFontLoadXRF(xge_font pFont, const char* sPath)加载 XRF 文件
int xgeFontLoadXRFMemory(xge_font pFont, const void* pData, int iSize)从内存加载 XRF
int xgeFontSaveXRF(xge_font pFont, const char* sPath, uint32_t iFirstCodepoint, uint32_t iCount)导出 XRF 文件
int xgeFontBuildXRFMemory(xge_font pFont, uint32_t iFirstCodepoint, uint32_t iCount, void** ppData, int* pSize)构建内存 XRF

编译本章示例

gcc -O2 -I. -o ch82.exe ch82_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch82.exe

示例:生成与加载 XRF

// 步骤 1:从 TTF 生成 XRF(离线工具或启动时)
xge_font srcFont = NULL;
xgeFontLoad(&srcFont, "fonts/NotoSansSC.ttf", 24.0f);

// 导出 ASCII + 常用汉字(U+4E00 起 3000 个)
xgeFontSaveXRF(srcFont, "fonts/NotoSans24.xrf",
    0x20, 95);  // ASCII 可打印字符
xgeFontFree(srcFont);

// 步骤 2:运行时加载 XRF(极快)
xge_font font = NULL;
xgeFontLoadXRF(&font, "fonts/NotoSans24.xrf");

// 步骤 3:构建内存 XRF(嵌入资源)
void* xrfData;
int xrfSize;
xgeFontBuildXRFMemory(srcFont, 0x20, 95,
    &xrfData, &xrfSize);
// xrfData 可写入文件或嵌入代码

完整代码

将以下代码保存为 ch82_main.c,编译后运行即可看到 XRF 生成与加载效果:

#include "xge.h"

static xge_font g_font = NULL;

static int onFrame(void* pUser) {
    (void)pUser;
    xgeClear(0x081114FF);

    xgeTextDraw(g_font, "XRF Fast Load!", 100, 250, 0xFFB454FF)
    xgeTextDraw(g_font, "No runtime rasterize", 100, 320, 0x4FD8C2FF)
    return XGE_OK;
}

int main(void) {
    xge_desc_t d = {0};
    d.iWidth  = 800;
    d.iHeight = 600;
    d.sTitle  = "ch82 - XRF Font";
    d.iFlags  = XGE_INIT_VSYNC;
    xgeInit(&d);

    // 步骤 1:从 TTF 生成 XRF(仅首次)
    xge_font src = NULL;
    xgeFontLoad(&src, "fonts/NotoSansSC.ttf", 24.0f);
    xgeFontSaveXRF(src, "fonts/NotoSans24.xrf", 0x20, 95);
    xgeFontFree(src);

    // 步骤 2:加载 XRF(极快)
    xgeFontLoadXRF(&g_font, "fonts/NotoSans24.xrf");

    xgeRun(onFrame, NULL);
    xgeFontFree(g_font);
    xgeUnit();
    return 0;
}

代码讲解

  • XRF 生成:从 TTF 导出指定字符范围的位图字体文件,仅需执行一次。
  • XRF 加载:运行时直接加载位图,无光栅化开销,启动极快。
  • 字符范围:0x20 起 95 个 = ASCII 可打印字符,中文需扩大范围。
  • 固定字号:XRF 包含特定字号的位图,缩放会模糊。

要点与陷阱

  • XRF 优势:加载即用,无运行时光栅化开销,适合嵌入式/低端设备。
  • 固定大小:XRF 包含特定字号的位图,缩放会模糊。
  • 字符范围:iFirstCodepoint + iCount 定义包含的 Unicode 范围。
  • 文件体积:中文字符多时 XRF 较大,按需裁剪字符集。

进阶练习

  1. 实现多字号 XRF 预生成工具。
  2. 按需生成:只包含项目实际使用的字符。
XRF 位图字体效果
图:XRF 位图字体渲染效果