Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ardaku/fonterator
Load fonts as vector graphics in pure Rust with advanced text layout.
https://github.com/ardaku/fonterator
font font-collections footile opentype rust text-layout truetype vector-graphics
Last synced: about 1 month ago
JSON representation
Load fonts as vector graphics in pure Rust with advanced text layout.
- Host: GitHub
- URL: https://github.com/ardaku/fonterator
- Owner: ardaku
- License: other
- Created: 2018-05-03T00:00:09.000Z (over 6 years ago)
- Default Branch: stable
- Last Pushed: 2023-03-08T11:07:45.000Z (almost 2 years ago)
- Last Synced: 2024-05-21T08:08:30.243Z (8 months ago)
- Topics: font, font-collections, footile, opentype, rust, text-layout, truetype, vector-graphics
- Language: Rust
- Homepage: https://libcala.github.io/fonterator
- Size: 6.3 MB
- Stars: 37
- Watchers: 2
- Forks: 4
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE-APACHE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# fonterator
#### Load fonts as vector graphics in pure Rust with advanced text layout.
[![Build Status](https://api.travis-ci.org/ardaku/fonterator.svg?branch=master)](https://travis-ci.org/ardaku/fonterator)
[![Docs](https://docs.rs/fonterator/badge.svg)](https://docs.rs/fonterator)
[![crates.io](https://img.shields.io/crates/v/fonterator.svg)](https://crates.io/crates/fonterator)When you want to render text, fonterator gives you an iterator over
[footile](https://crates.io/crates/footile) `PathOp`s, 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
- [Arabic and other script text shaping](https://github.com/plopgrizzly/fonterator/issues/3)
- Better interoperability for monospace when mixing scripts.## Table of Contents
- [Getting Started](#getting-started)
- [Example](#example)
- [API](#api)
- [Features](#features)
- [Upgrade](#upgrade)
- [License](#license)
- [Contribution](#contribution)## Getting Started
Add the following to your `Cargo.toml`.```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::::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](https://docs.rs/fonterator).### 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](https://github.com/ardaku/fonterator/blob/stable/CHANGELOG.md)
to facilitate upgrading this crate as a dependency.## License
Licensed under either of
- Apache License, Version 2.0,
([LICENSE-APACHE](https://github.com/ardaku/fonterator/blob/stable/LICENSE-APACHE) or
[https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0))
- Zlib License,
([LICENSE-ZLIB](https://github.com/ardaku/fonterator/blob/stable/LICENSE-ZLIB) or
[https://opensource.org/licenses/Zlib](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 [[email protected]](mailto:[email protected]).
Otherwise,
[here's a link to the issues on GitHub](https://github.com/ardaku/fonterator/issues).
Before contributing, check out the
[contribution guidelines](https://github.com/ardaku/fonterator/blob/stable/CONTRIBUTING.md),
and, as always, make sure to follow the
[code of conduct](https://github.com/ardaku/fonterator/blob/stable/CODE_OF_CONDUCT.md).