MCPcopy Index your code
hub / github.com/ardaku/fonterator

github.com/ardaku/fonterator @v0.9.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.9.0 ↗ · + Follow
25 symbols 51 edges 7 files 4 documented · 16% updated 3y ago★ 432 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

fonterator

Load fonts as vector graphics in pure Rust with advanced text layout.

Build Status Docs crates.io

When you want to render text, fonterator gives you an iterator over footile PathOps, which you can easily pass right into footile.

  • Loads TTF/OTF fonts and font collections.
  • Automatic kerning and font layout.
  • Horizontal and vertical text layout.
  • Left-to-right and right-to-left text layout.
  • Uses fallback fonts if a character is not available from one font.
  • Can Align text left/center/right/vertical
  • Line Wrapping

Todo

Table of Contents

Getting Started

Add the following to your Cargo.toml.

[dependencies]
fonterator = "0.8"

Example

```rust,no_run 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 documentation can be found on docs.rs.

Features

monospace-font

Embeds a monospace font accessible with the monospace_font() public API in the root of the crate.

normal-font

Embeds a variable-width font accessible with the normal_font() public API in the root of the crate.

Upgrade

You can use the changelog to facilitate upgrading this crate as a dependency.

License

Licensed under either of - Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0) - Zlib License, (LICENSE-ZLIB or https://opensource.org/licenses/Zlib)

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Contributors are always welcome (thank you for being interested!), whether it be a bug report, bug fix, feature request, feature implementation or whatever. Don't be shy about getting involved. I always make time to fix bugs, so usually a patched version of the library will be out a few days after a report. Features requests will not complete as fast. If you have any questions, design critques, or want me to find you something to work on based on your skill level, you can email me at jeronlau@plopgrizzly.com. Otherwise, here's a link to the issues on GitHub. Before contributing, check out the contribution guidelines, and, as always, make sure to follow the code of conduct.

Core symbols most depended-on inside this repo

push
called by 14
src/font.rs
render
called by 13
src/font.rs
set
called by 6
src/font.rs
monospace_font
called by 4
src/font.rs
direction
called by 2
src/direction.rs
next
called by 2
src/font.rs
move_to
called by 1
src/font.rs
line_to
called by 1
src/font.rs

Shape

Method 10
Function 8
Class 5
Enum 2

Languages

Rust100%

Modules by API surface

src/font.rs19 symbols
src/direction.rs2 symbols
examples/raster.rs1 symbols
examples/main.rs1 symbols
examples/image.rs1 symbols
examples/directions.rs1 symbols

For agents

$ claude mcp add fonterator \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact