Chapter 85 · 字体与文本

字体 Fallback 链

当主字体缺少某个字符时,自动从 Fallback 字体中查找,实现多语言混排。

85

API 速查

函数说明
void xgeFontSetFallback(xge_font pFont, xge_font pFallback)设置 Fallback 字体
int xgeFontFallbackSet(const char* sPath, float fSize)设置全局 Fallback
int xgeFontFallbackSetMemory(const void* pData, int iSize, float fSize)内存设置全局 Fallback
int xgeFontFallbackGet(xge_font pFont, float fSize)获取 Fallback 字体
void xgeFontFallbackClear(void)清除全局 Fallback

编译本章示例

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

示例:中英文混排

// 主字体:英文
xge_font enFont = NULL;
xgeFontLoad(&enFont, "Roboto.ttf", 20.0f);

// Fallback:中文
xge_font cnFont = NULL;
xgeFontLoad(&cnFont, "NotoSansSC.ttf", 20.0f);

// 链接 Fallback
xgeFontSetFallback(enFont, cnFont);

// 绘制中英文混排(自动切换字体)
xgeTextDraw(enFont, "Hello 世界!", 100, 100, 0xFFFFFFFF);
// "Hello " 用 Roboto,"世界" 用 NotoSansSC

// 全局 Fallback(所有字体共享)
xgeFontFallbackSet("NotoSansSC.ttf", 20.0f);

// 清除
xgeFontFallbackClear();

完整代码

将以下代码保存为 ch85_main.c,编译后运行即可看到中英文 Fallback 混排效果:

#include "xge.h"

static xge_font g_en = NULL;
static xge_font g_cn = NULL;

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

    xgeTextDraw(g_en, "Hello 世界! XGE 引擎", 100, 200, 0xFFFFFFFF)
    xgeTextDraw(g_en, "Fallback: EN→CN 自动切换", 100, 280, 0x4FD8C2FF)
    return XGE_OK;
}

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

    xgeFontLoad(&g_en, "fonts/Roboto.ttf", 28.0f);
    xgeFontLoad(&g_cn, "fonts/NotoSansSC.ttf", 28.0f);
    xgeFontSetFallback(g_en, g_cn);

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

代码讲解

  • SetFallback:主字体缺少的字符自动回退到 Fallback 字体渲染。
  • 中英文混排:英文用 Roboto,中文自动切换到 NotoSansSC。
  • 字号匹配:Fallback 字体按相同字号渲染,保证视觉一致。
  • 链式 Fallback:可设置多级(A→B→C),适合多语言场景。

要点与陷阱

  • 链式 Fallback:可设置多级 Fallback(A→B→C)。
  • 全局 vs 局部:SetFallback 针对单个字体,FallbackSet 全局生效。
  • 字号匹配:Fallback 字体按相同字号渲染。
  • 性能:Fallback 查找有开销,常用字符应在主字体中。

进阶练习

  1. 实现多语言 Fallback 链:英文→中文→日文→韩文。
  2. Emoji 支持:添加 Emoji 字体作为 Fallback。
Fallback 链效果
图:Fallback 链渲染效果