#字体 #真型 #开放型 #otf

fonterator

使用高级文本布局,在纯 Rust 中将字体作为矢量图形加载。

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 个直接) 中使用

Apache-2.0 OR Zlib

2MB
542

fonterator

使用高级文本布局,在纯 Rust 中将字体作为矢量图形加载。

Build Status Docs crates.io

当你想要渲染文本时,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许可证定义的任何有意提交以包含在作品中的贡献,均将按照上述方式双许可,不附加任何其他条款或条件。

欢迎贡献者(感谢您的兴趣!),无论是错误报告、错误修复、功能请求、功能实现还是其他任何内容。不要害羞地参与进来。我总是抽出时间来修复错误,所以通常在报告后的几天内就会有库的补丁版本。功能请求可能不会那么快完成。如果您有任何问题、设计评论,或者想让我根据您的技能水平为您找到一些可以工作的内容,您可以发送电子邮件到 [email protected]。否则,这里是GitHub上的问题链接。在贡献之前,请查看 贡献指南,并且,一如既往地,确保遵守 行为准则

依赖项