#text-rendering #bitmap-font #graphics #gamedev #distance-field #command-line-tool #text-layout

bin+lib raster-fonts

位图字体创建工具和相关元数据反序列化库

2 个版本

0.1.1 2023年1月1日
0.1.0 2022年12月31日

#102 in 渲染

MIT/Apache

87KB
2.5K SLoC

Rusty Object Notation 2K SLoC Rust 378 SLoC // 0.0% comments

raster-fonts Crates.io 文档

此软件包提供了一种命令行工具,可以将 TrueType 字体光栅化成位图,包括传统的和有符号距离场。它还提供了一个用于反序列化动态文本布局计算所需元数据的小型库;支持 serderkyv

font2img CLI

使用 cargo 进行安装

> cargo install raster-fonts --features="bin"

基本用法

> font2img <InputFontFile> <OutputImagePath> <OutputMetadataPath>

这将生成一个包含给定字体文件中可打印 ASCII 范围内所有符号的单色有符号距离场纹理。 正如 Chris Green 所描述的,当时他在 Valve 工作

在最简单的情况下,可以使用现代 GPU 的 alpha 测试和 alpha 阈值功能来简单地渲染此纹理,而不需要自定义着色器。[...]

使用可编程着色器,该技术扩展到执行各种特殊效果渲染,包括软边缘、轮廓、阴影、多色图像和锐角。

有关此技术的简短视频演示,请参阅 Martin Donald 的此视频

支持输出的图像格式包括 PNG、BMP、TIFF、TGA。支持的元数据格式为 RONJSONRKYV。请注意,由于 JSON 字典必须按字符串索引,因此无法将字距调整信息导出为 JSON,而其他格式支持按字符对索引。

指定自定义字符范围

> font2img <Font> <Img> <Meta> [Charset]...

要将不同的字符集转换为位图,必须在输入/输出路径后指定一个或多个Unicode码点范围。码点以十六进制形式给出,不带前缀,可以独立存在。或者,可以通过包含的最小值和最大值指定一个连续的范围。例如:

# This is equivalent to the basic invocation from the previous section:
> font2img <Font> <Img> <Meta> 20-7F

# Additioanlly rasterize printable characters from the Latin-1 Supplement:
> font2img <Font> <Img> <Meta> 20-7F A1-FF

# Throw in the Pilcrow sign () only:
> font2img <Font> <Img> <Meta> 20-7F B1

生成传统位图字体

如果您出于任何原因不想使用有符号距离场,可以使用--coverage-levels <N>选项(简写为-l <N>),其中<N>是输出图像中大于0的独立灰度值的数量。无论级别数量如何,输出图像都将是一个单色8bpp图像,最高级别设置为255。

# Rasterize with maximum fidelity:
> font2img -l 255 <Font> <Img> <Meta>

# Generate a binary image, i.e. rasterize without anti-aliasing:
> font2img -l 1 <Font> <Img> <Meta>

# Use a happy medium with 16 total distinct values:
> font2img -l 15 <Font> <Img> <Meta>

这仍然很有用,尤其是如果您知道所需的精确文本大小,并且希望在生成后手动处理纹理。

完整帮助输出

> font2img --help
Bitmap font creation tool and accompanying metadata deserialization library

Usage: font2img [OPTIONS] <FONT_PATH> <IMG_PATH> <META_PATH> [CHARSET]...

Arguments:
  <FONT_PATH>   Path to the font file to convert
  <IMG_PATH>    Path to where the output image should be written
  <META_PATH>   Path to where the output meta data should be written
  [CHARSET]...  List of Unicode codepoint ranges written in hex

Options:
  -l, --coverage-levels <COVERAGE_LEVELS>
          Enable coverage-based (as opposed to SDF) rasterization with the specified number of distinct levels above 0
  -s, --scale <SCALE>
          Desired font pixel height [default: 24]
  -p, --padding <PADDING>
          Desired number of pixels between glyphs in output texture [default: 8]
  -o, --output-image-size <OUTPUT_IMAGE_SIZE>
          Side length of the square output texture [default: 512]
      --skip-kerning-table
          Exclude additional kerning information from output metadata
  -h, --help
          Print help information
  -V, --version
          Print version information

raster_fonts

这是一个单模块库,包含一些普通数据类型,根据您设置的cargo功能实现各种反序列化特性。因此,您将根据选择的数据格式使用不同的功能。因此,如果您更喜欢rkyv,请将此内容放入您的Cargo.toml

[dependencies]
raster-fonts = { version = "0.1", features = ["rkyv-deserialize"] }
rkyv = "0.7"

如果您想使用serde,您还需要serde_jsonron crate。

[dependencies]
raster-fonts = { version = "0.1", features = ["serde-deserialize"] }
# depending on data format:
serde_json = "1"
ron = "0.8"

文档

依赖关系

~0–3.5MB
~29K SLoC