距离显示结果还剩2票~
暂无日志..
暂无管理组..
暂无编辑组..
暂无开发组..
概述
Caxton 以 威廉·卡克斯顿(William Caxton) 的名字命名,这个模组添加了 TrueType 和 OpenType 字体支持。
特点
借助 MSDF 技术,呈现任何大小的清晰文本;
真正的粗体和斜体字体;
复杂文本呈现;
不使用 AWT。
当前限制
目前不支持旧字体中的阿拉伯语整形(shaping)。在样式化和适当的双向文本处理的情况下使其工作非常复杂,因为我们不能使用 ICU4J 的 API。如果要正确呈现阿拉伯语文本,那么玩家将不得不在 Caxton 下使用支持阿拉伯语的字体。
从字体生成 MTSDF 很费时间,加载 3 种语言大约需要 4 分钟。因此, Caxton 会将此操作并行化,并在首次完成后缓存结果。
此外,Minecraft 中的许多 UI 元素对文本渲染做出了不正确的假设。让他们意识到双向文本(更不用说连字之类的东西了)将是一项重大任务,欢迎制作这一领域的补丁。
针对此问题,已对 GUI 元素打了补丁,但无论其基本方向如何,显示的文本都会向左对齐。
预估永不会支持字体微调(Font hinting)。
模组/资源包兼容性
有条件的兼容
模组 | 版本 | 备注 |
---|---|---|
钠 (Sodium) | 非 0.5.5 | 轮廓文本在使用 钠 0.5.5 时渲染会出错(GitHub) |
ImmediatelyFast | ≥1.2.0 | 禁用 Caxton 的 reuseTextRendererDrawer 和 sortTextRenderLayers 选项(自动完成) |
Exordium | 全部 | 禁用 Exordium 的告示牌缓冲功能(GitHub) |
不兼容
模组 | 版本 | 备注 |
---|---|---|
Iris Shaders | 全部 | Iris 不支持自定义核心着色器(GitHub);世界中使用 MSDF 字体的文本根本渲染不出来 |
Emojiful | 全部 | Outright 替换了 Minecraft 的默认文本渲染器 |
≤1.1.1 | ||
VanillaIcecreamFix | 全部 | 启动时与 Caxton 的 Fabric ASM 依赖项发生冲突(GitHub) |
1.18.2 全部; 1.19.2 可能全部 | 与 Fabric API 的核心着色器GitHub注册 API 冲突(GitHub) | |
1.20.4-3.7.7 | 不会崩溃,但 AoA 的轮廓文本不使用 MSDF 字体、AoA 的可滚动窗格组件不会 隔断(clip)使用 MSDF 字体的文本(已计划制作兼容性附属模组) |
无法正确处理布局
已知以下模组无法正确处理文本布局。它们应该不会让游戏崩溃,但这些模组的 GUI 元素可能会出现意外行为,并可能导致日志打印有关「不受支持的文本处理方法」的警告。
模组 | 版本 | 备注 |
---|---|---|
IBE Editor | 全部 | 使用自定义文本字段控件(widget),其克隆了原版 Minecraft 的大部分渲染代码(GitHub) |
全部 | 在某些控件中使用不受支持的方法(GitHub) |
文本相关核心着色器资源包
修改了文本相关的核心着色器的资源包(例如 Vanilla Tweaks 的“Dark UI”和“Transparent UI”资源包)需要经过修改才能兼容 Caxton 字体。
操作系统支持
Caxton 使用本地库(native library)来协助文本整形和 MSDF 生成。模组的预构建副本捆绑了该库适用于 x86_64 Windows 和 Linux 平台的版本。如果你在其他平台上玩游戏,那么你将不得不自己构建模组的副本。
如果模组仍然无法识别你的平台,请在 config/caxton.json 中更改 rustTarget 设置,将其改为与你的平台对应的 Rust 平台的名称 之一,然后向作者这边报告问题。
作者称家中没有 Mac,由于许可问题,无法为 macOS 构建二进制文件。
如何使用
Caxton 目前有两个内置的字体资源包。包含的第一个字体是 Inter,而第二个字体 是 Open Sans。
如果这些都不能满足你的需求,你可以通过资源包使用自己的字体。在分发包含字体文件的资源包之前,请阅读该字体的许可证,以确保你有权分发该字体。
通过资源包添加字体
Caxton 添加了一个 caxton 类型的字体提供器(font provider),它支持 regular、bold、italic、bold_italic 等键。每一个都可以被设置为一个标识符,其中 <namespace>:<path> 解析后指向字体文件 assets/<namespace>/textures/font/<path>。要指定其他选项,请使用如下对象,其中 file 键指定了路径:
{
// 唯一必需的元素。
"file": "<namespace>:<path>",
// 字体在默认大小基础上缩放的因数。
// 如果该项为 1.0,字体缩放后,顶部(ascent)高度【即,与基线(Baseline)的距离】正好是默认位图字体的 7 个像素。
// 在 Caxton 0.3.0 中添加。
"scale_factor": 1.0,
// 阴影偏移,是 memefont 像素大小的倍数。
"shadow_offset": 1.0,
// 渲染文本在 X 轴和 Y 轴上的偏移量(以 memefont 像素为单位)。
// 在 Caxton 0.4.4 中添加。
"shift": [0.0, 0.0],
// 一个 32 位的整型数字,其位被解释为 32 位浮点数,描述应用于字符的倾斜度。
// 这可以用来在没有斜体变体的字体中模拟斜体,但如果有专用的斜体变体,最好还是使用专用的斜体变体。
// 在 Caxton 0.5.6 中添加。
"the_font_designer_couldnt_be_assed_to_make_an_italic_variant_so_slant_the_text": 0,
// 一个 OpenType 特征标签的列表。语法见下文:
// https://docs.rs/rustybuzz/0.6.0/rustybuzz/struct.Feature.html#method.from_str
"features": [],
// 仅影响栅格(raster)技术。MSDF 字体始终启用插值。
// 如果设为 true,会对字形位图(glyph bitmap)中的纹素(texels)进行插值。
// 在 Caxton 0.4.0 中添加。
"blur": false
}
如果字体 JSON 文件中的 caxton_providers 键之中存在对象,且安装了 Caxton,则将使用该对象来代替 providers。这可用于加载 Caxton 字体,同时,在未安装 Caxton 的情况下也能进行回退。如果未指定 caxton_providers,将转而使用 providers。
你还可以添加 assets/<namespace>/textures/font/<path>.json 文件,该文件包含对字体进行栅格化的设置:
{
// 指定字体文件的实际路径,因为它将出现在 Caxton 字体提供器中。
// 一般来说,应该省略此项,但如果你使用的是一种可变的字体,此项可能会很有用。
"path": "<path of font file>",
// 所有这些选项都是可选的,并将默认为所提供的值。
// 纹理图集中每个像素所对应的字体单位的数量。
// 如果使用 msdf 字体渲染技术,可以设为较高的值。
// 如果使用 raster,应设为较低的值。
"shrinkage": 32.0,
// 在字形边界框周围每边要留下的像素数。
// 这应该大于 range,如果留空则默认取 range 的值。
"margin": 4,
// 字形周围最小和最大可表示的有符号距离之间的范围宽度。
// 这是一个不大于 255 的正整数。
// 这也决定了为发光告示牌文本绘制的边界的宽度。
"range": 4,
// 是否倒置有符号距离场(SDF,Signed Distance Field)。
// 如果此项为 null,那么 Caxton 将尝试自动确定它,但你可以覆盖它,避免它猜测错误。
"invert": false,
// 此项用于在可变字体中设置变化轴坐标。
// 每个元素的格式如下:
// { "axis": <轴类型>, "value": <轴值> }
"variations": [],
// 在字体集合(font collection)中使用的字体索引。
// 如果你不确定,请将其保留为 0。
// 在 Caxton 0.3.0 中添加。
"face_index": 0,
// 指定要使用基于 MSDF 的渲染方法("msdf")还是使用字形位图("raster" – 实 验 性)。
// 对于大多数字体,建议使用 msdf,但 raster 更适合像素字体。
// 此外,只有 raster 与 Iris Shaders 完全兼容 - 如果加载了着色器,使用 MSDF 字体的文本将不会在世界中显示。
// 在 Caxton 0.4.0 中添加。
"tech": "msdf",
// 最大 mipmap 级别 (0 – 4)。
// 如果使用 MSDF 渲染技术,则设置此值毫无意义。
// 但是,当你使用栅格(raster)渲染技术时,它对于非像素字体会有用。
// 在 Caxton 0.4.0 中添加。
"max_mipmap": 0
}
全局配置
以下选项位于 config/caxton.json 中:
{
// 与你的平台对应的 Rust 平台名称之一
// (https://doc.rust-lang.org/nightly/rustc/platform-support.html)。
// 如果此项为 null,则 Caxton 将为你的平台确定正确的值,因此建议仅在必要时更改此值。
// 在 Caxton 0.2.1 中添加。
"rustTarget": null,
// 使用不同的方法绘制经验条上的等级文本:
// 对于 Caxton 字体,会使用轮廓着色器(outline shader)绘制文本。
// 本来是使用轮廓颜色绘制四个偏移副本,然后使用填充颜色绘制主要文本。
// 此项主要用于使经验等级文本在使用轮廓字体时看起来更好。
// 它曾经作为 ImmediatelyFast 渲染错误的解决方法,但在较新版本的 IF 上会有问题。
// 自 Caxton 0.5.0 起,Caxton 会检测是否安装了 IF 1.2.0 及更新版本,
// 并使用其 API,以缓解此项设置开启时的问题。
// 请参阅:
// * https://gitlab.com/Kyarei/caxton/-/issues/31
// * https://github.com/RaphiMC/ImmediatelyFast/issues/49
// 非 Caxton 字体不受影响。
// 在 Caxton 0.4.0 中添加。
"tweakExpText": true,
// 从后到前对 Caxton 文本渲染层上的图元进行排序。
// 理论上,禁用此选项可能会导致文本渲染错误;
// 但是,IF 期望禁用此选项,并且 IF 开发者尚未收到禁用后出现渲染问题的报告。
// 如果遇到渲染问题,其中某些文本似乎以错误的 z 顺序绘制,
// 请尝试启用此选项,并在 IF 中禁用 HUD 批处理(HUD batching)。
// 请参阅:https://github.com/RaphiMC/ImmediatelyFast/issues/49
// 在 Caxton 0.4.0 中添加。
"sortTextRenderLayers": false,
// 当使用非 Caxton 字体绘制文本时,重用单个 TextRenderer.Drawer 实例。
// 这避免了为每个旧线程组(run group)创建新对象,但可能导致 IF 崩溃。
// 检测到安装了 IF 时,会自动禁用此项。
// 请参阅:https://gitlab.com/Kyarei/caxton/-/issues/50
// 在 Caxton 0.4.7 中添加。
"reuseTextRendererDrawer": true,
// 某些文本处理方法本质上就有问题,不受 Caxton 支持。
// 每当调用这些方法时,Caxton 都会记录一条警告。
// 如果此项为 true,Caxton 会抛出异常。
// 该选项主要用于调试。如果有疑问,请设为 false。
// 在 Caxton 0.2.1 中添加。
"fatalOnBrokenMethodCall": false,
// 跟踪有关 Caxton 字体对象何时添加或删除引用的信息,出于调试目的。
// 如果有疑问,请设为 false。
// 在 Caxton 0.3.0 中添加。
"debugRefcountChanges": false,
// 禁用闪烁标语在特定日期的复活节彩蛋。
// 在 Caxton 0.5.6 中添加。
"disableEasterEggs": false
}
从源代码进行构建
如果你想使用源代码构建 Caxton,那么除了 Gradle 之外,你还需要安装 Rust 工具链 和 Clang 。
默认情况下,本地库将仅针对主机(指你的电脑)平台构建。要为其他平台构建它,请在 xyz.flirora.caxton.additionalTargets 属性中使用 目标三元组(以逗号分隔)指定其他目标。
例如,如果你想为 x86_64 Windows 构建库,那么你可以用
gradle build -Dxyz.flirora.caxton.additionalTargets=x86_64-pc-windows-gnu
如果出现有关未知目标的错误,请修改 caxton-impl/build.gradle 中的变量 cargoCrossBuildTasks。
与其他模组的比较
BetterFonts / TTFR
BetterFonts / TrueType Font Replacement,最初由 thvortex 在 1.4.4 上创建(GitHub),由 bechill 更新到 1.4.7,然后由 The_MiningCrafter 更新到 1.5.2(MCF),然后由 secretdataz 更新到 1.6.x-1.7.x(GitHub),然后由 cubex2 更新到 1.8.9-1.12.2(GitHub)。然后由 secretdataz 再次更新到 1.13。
这个模组使用 Java AWT 的文本布局功能来布局文本。为了渲染字形,它会将它们栅格化为位图。分辨率非常有限。
然而,与下面列出的其他模组不同,它正确地实现了粗体和斜体样式以及复杂的脚本。
平滑字体
[SF]平滑字体 (Smooth Font),由 bre2el 创建,适用于 1.7-1.12。该模组还改进了不同比例的文本渲染,并对文本渲染实现了一些优化。
至于它是如何工作的,who the RenderType knows?这个模组是 ARR。
ThaiFixes
ThaiFixes,由 lion328 在 Forge 1.12.2 和 Rift 1.13 上创建(GitHub),并由 secretdataz 在 Fabric 上更新到 1.18.2(GitHub) 。
这个模组专门为泰语实现了自己的塑形程序。因此,它对需要其他复杂渲染的语言没有用。
现代化 UI
[MUI]现代化 UI (Modern UI),由 BloCamLimb 在 Forge 上为 1.15-1.20 版本创建。
从截图来看,这个 Mod 支持复杂的文本渲染和真正的粗体和斜体样式。它还修复了原版文本布局的许多问题(如 MC-117311)。
从代码来看,Modern UI 具有令人惊讶的复杂布局算法。不过作者还没有太多时间研究它。
但是,此模组无法渲染具有清晰边框的文本。它还使用 AWT 执行文本布局。
Minecraft 1.13 及以上
从 1.13 开始,Minecraft 支持 TrueType 和 OpenType 字体。
然而,这种实现与位图字体没有区别——游戏将字形转换为位图,并幼稚地布置文本。
此外,它还错误地处理字形度量,导致 TTF 文本出现错位。