14 个版本 (8 个破坏性更新)
0.9.0 | 2020 年 10 月 2 日 |
---|---|
0.8.0 | 2020 年 5 月 20 日 |
0.7.0 | 2020 年 4 月 30 日 |
0.6.0 | 2019 年 10 月 24 日 |
0.1.0 | 2018 年 5 月 25 日 |
#58 在 渲染 中
在 3 个 crate(2 个直接) 中使用
2MB
542 行
fonterator
使用高级文本布局,在纯 Rust 中将字体作为矢量图形加载。
当你想要渲染文本时,fonterator 会给你一个遍历 footile PathOp
的迭代器,你可以轻松地将它传递到 footile 中。
- 加载 TTF/OTF 字体和字体集合。
- 自动字距调整和字体布局。
- 水平和垂直文本布局。
- 从左到右和从右到左的文本布局。
- 如果某个字符从一个字体中不可用,则使用后备字体。
- 可以左/居中/右/垂直对齐文本
- 自动换行
待办事项
- 阿拉伯文和其他脚本文本塑形
- 混合脚本时,改善等宽字体的互操作性。
目录
入门
将以下内容添加到您的 Cargo.toml
。
[dependencies]
fonterator = "0.8"
示例
use fonterator as font; // For parsing font file.
// For rendering text
use footile::{FillRule, Plotter, PathOp, Transform};
use png_pong::Encoder; // For saving PNG
use pix::{
Raster,
rgb::{Rgba8p, SRgba8},
matte::{Matte8},
ops::{SrcOver}
};
const FONT_SIZE: f32 = 32.0;
fn main() {
// Example Text
let english = "Raster Text With Font";
let korean = "글꼴로 래스터 텍스트 사용";
let japanese = "フォント付きラスタテキスト";
// Init font, and paths.
let font = font::monospace_font();
// Render English Left Aligned.
let mut p = Plotter::new(Raster::with_clear(512, 512));
let mut r = Raster::with_clear(512, 512);
p.set_transform(Transform::with_scale(FONT_SIZE, FONT_SIZE));
let path = font.render(
english,
(512.0 - 64.0) / FONT_SIZE,
font::TextAlign::Left
).0;
r.composite_matte(
(64, 0, 512, 512),
p.fill(FillRule::NonZero, path, Matte8::new(255)),
(),
Rgba8p::new(0, 0, 0, 255),
SrcOver,
);
// Render Korean Vertically
let mut pr = p.raster();
pr.clear();
p = Plotter::new(pr);
p.set_transform(Transform::with_scale(FONT_SIZE, FONT_SIZE));
let path = font.render(
korean,
512.0 / FONT_SIZE,
font::TextAlign::Vertical
).0;
r.composite_matte(
(0, 0, 512, 512),
p.fill(FillRule::NonZero, path, Matte8::new(255)),
(),
Rgba8p::new(0, 0, 0, 255),
SrcOver,
);
// Render Japanese Vertically
let mut pr = p.raster();
pr.clear();
p = Plotter::new(pr);
p.set_transform(Transform::with_scale(FONT_SIZE, FONT_SIZE));
let path = font.render(
japanese,
(512.0 - 32.0 * 7.0) / FONT_SIZE,
font::TextAlign::Vertical
).0;
r.composite_matte(
(32, 0, 512, 512),
p.fill(FillRule::NonZero, path, Matte8::new(255)),
(),
Rgba8p::new(0, 0, 0, 255),
SrcOver,
);
// Save PNG
let raster = Raster::<SRgba8>::with_raster(&r);
let mut out_data = Vec::new();
let mut encoder = Encoder::new(&mut out_data).into_step_enc();
encoder.still(&raster).expect("Failed to add frame");
std::fs::write("out.png", out_data).expect("Failed to save image");
}
API
API 文档可以在 docs.rs 上找到。
功能
monospace-font
在 crate 的根目录中嵌入可通过 monospace_font()
公共 API 访问的等宽字体。
normal-font
在 crate 的根目录中嵌入可通过 normal_font()
公共 API 访问的变宽字体。
升级
您可以使用 变更日志 来方便地将此 crate 作为依赖项升级。
许可
根据您的选择,许可协议可以是以下之一
- Apache 许可证,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- Zlib 许可证,(LICENSE-ZLIB 或 https://opensource.org/licenses/Zlib)
。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均将按照上述方式双许可,不附加任何其他条款或条件。
欢迎贡献者(感谢您的兴趣!),无论是错误报告、错误修复、功能请求、功能实现还是其他任何内容。不要害羞地参与进来。我总是抽出时间来修复错误,所以通常在报告后的几天内就会有库的补丁版本。功能请求可能不会那么快完成。如果您有任何问题、设计评论,或者想让我根据您的技能水平为您找到一些可以工作的内容,您可以发送电子邮件到 [email protected]。否则,这里是GitHub上的问题链接。在贡献之前,请查看 贡献指南,并且,一如既往地,确保遵守 行为准则。