字体渲染
libSceFont 用 FreeType 光栅化游戏提供的 TrueType 和 OpenType 字体面。系统字体请求使用随附的 Noto Sans 替代字体,覆盖拉丁文、希腊文和西里尔文。
仓库笔记截至 2026年10月10日
字体面、缩放与生命周期
游戏打开一个字体库,用它提供的字节或一次系统字体请求创建字体面,然后询问字形度量和覆盖。每个字体面保持自己的缩放、渲染缩放、倾斜和生命周期。关闭字体库会释放它的字体面,进程拆卸会清除字体状态。字体字节在打开时被复制,因此稍后解除映射游戏的源缓冲区也不会使光栅器失效。
Noto Sans 是替代字体,不是每一种固件字体的逐字节副本。它覆盖拉丁文、希腊文和西里尔文。游戏提供的字体面可以包含其他字形,包括 CJK,这些轮廓会被使用。系统字体请求本身不会替换成一个 CJK 字体面。
字形、字距与图集
字形路径返回真实度量、水平排版、基本的成对字距、抗锯齿覆盖、裁剪和渲染结果描述符。有界的字形缓存避免再次光栅化同一个字符,单独的字距对缓存跨字号复用字距。写入在触及纹理图集之前会检查 CPU 权限,并使 GPU 页监视失效。
字体面不含有的合法 Unicode 标量使用该字体面的 .notdef 轮廓,包括游戏在构建完整图集范围时遇到的控制码。正是这条缺失字形路径让 Jurassic Park Classic Games Collection 能够建完它的字体图集。非法的 Unicode 标量,以及超出范围的显式字形标识符,仍然返回错误。覆盖被写到一到四个字节的像素上。
留给游戏的文本排版
许多游戏从不调用 libSceFont。它们用自己的引擎字体绘制文本,这个实现不会改那些像素。HLE 路径是给那些要求固件来光栅化的游戏的。
文本整形、双向排版、合成字重、CJK 系统字体替换、字体集面选择,以及更高层的 FontWriting 和 String API 都没有实现。针对性检查要通过 zig build test-hle,并加上 font 过滤器。
已经实现的部分
- 用 FreeType 光栅化游戏提供的 TrueType 和 OpenType 字体面。
- 系统字体请求在拉丁文、希腊文和西里尔文上的 Noto Sans 回退。
- 度量、水平排版、成对字距、倾斜、裁剪和字形缓存。
- 缺失 Unicode 标量时回退到 .notdef,从而放行 Jurassic Park 的图集。
尚未实现的部分
- 整形、双向排版和 FontWriting API 缺失。
- 系统字体请求不会替换成 CJK 字体面。
- 完全用自己的引擎绘制文本的游戏不会走这条路径。
相关机制
这些页面说明什么