Coder Social home page Coder Social logo

ardaku / fonterator Goto Github PK

View Code? Open in Web Editor NEW
37.0 2.0 4.0 6.45 MB

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

Home Page: https://libcala.github.io/fonterator

License: Other

Rust 100.00%
rust font vector-graphics font-collections truetype opentype footile text-layout

fonterator's Introduction

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

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

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]. 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.

fonterator's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

fonterator's Issues

Japanese character boundary calculation bug?

Hi.
When I run this example, I get an error in rendering Japanese.

thread 'main' panicked at 'byte index 34 is not a char boundary; it is inside '' (bytes 33..36) of `フォント付きラスタテキスト`', /Users/yakitori/.cargo/registry/src/github.com-1ecc6299db9ec823/fonterator-0.9.0/src/font.rs:173:21

Cargo.toml

fonterator = { version = "0.9.0", features = ["monospace-font"] }

Env:

  • stable-x86_64-apple-darwin
  • rustc 1.55.0 (c8dfcfe04 2021-09-06)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.