pretext-render 0.1.0

Shaping-backed text rasterization helpers for Pretext layouts.
Documentation

pretext-render

Shared rasterization helpers for Pretext text layouts.

pretext-render converts shaped text from pretext into alpha-mask rasters and exposes baseline metrics that renderer crates can reuse. Most apps should use pretext for layout and a renderer crate such as pretext-egui; use this crate when you are building your own rendering backend.

Install

[dependencies]
pretext = "0.1.0"
pretext-render = "0.1.0"

Rasterize a shaped text run

use pretext::{BidiDirection, PretextEngine, PretextStyle};
use pretext_render::{BaselineMode, TextRasterRequest, TextRenderCache};

let engine = PretextEngine::builder().build();
let style = PretextStyle {
    families: vec!["Arial".to_owned()],
    size_px: 18.0,
    weight: 400,
    italic: false,
};
let request = TextRasterRequest {
    text: "Hello, raster cache.",
    style: &style,
    direction: BidiDirection::Ltr,
    slot_height: 24.0,
    padding_x: 2.0,
    padding_y: 2.0,
    slack_x: 0.0,
    slack_y: 0.0,
    baseline_mode: BaselineMode::AutoFontMetrics,
};

let cache = TextRenderCache::default();
let rasterized = cache
    .rasterized_text(&engine, request, 1.0)
    .expect("text should rasterize with an available font");

let size = rasterized.pixel_size();
let alpha = rasterized.alpha_pixels();
assert_eq!(alpha.len(), size[0] * size[1]);

Baseline metrics

# use pretext::{BidiDirection, PretextEngine, PretextStyle};
# use pretext_render::{BaselineMode, TextRasterRequest, text_baseline_metrics};
# let engine = PretextEngine::builder().build();
# let style = PretextStyle { families: vec!["Arial".to_owned()], size_px: 18.0, weight: 400, italic: false };
let request = TextRasterRequest {
    text: "Align me",
    style: &style,
    direction: BidiDirection::Ltr,
    slot_height: 24.0,
    padding_x: 0.0,
    padding_y: 0.0,
    slack_x: 0.0,
    slack_y: 0.0,
    baseline_mode: BaselineMode::AutoFontMetrics,
};
let metrics = text_baseline_metrics(&engine, request);
assert!(metrics.content_height_px() > 0.0);