martensite-text 0.8.0

HarfBuzz shaping, BiDi, font fallback, and sub-pixel IME projection via cosmic-text.
Documentation

martensite-text

Crates.io Documentation License

HarfBuzz text shaping, Unicode BiDi, two-tier caching, and velocity-damped IME candidate positioning.


Overview

martensite-text provides the internationalized text layout and typography engine for the Martensite GUI framework. Built on top of cosmic-text and HarfBuzz, it solves complex text shaping, multi-script font fallback, Unicode bidirectional text (UAX #9), and line breaking.

To sustain 120 FPS interactive window resizing across thousands of text nodes, martensite-text implements a two-tier caching architecture alongside a kinetic IME positioner that prevents Input Method candidate popups from flickering or lagging during active container scrolling.

The entire crate is built under #![forbid(unsafe_code)].


Key Features

  • Complex Text Shaping & BiDi: Seamlessly shapes Arabic, Hebrew, Devanagari, CJK, and Latin scripts with automatic bidirectional reordering and font fallback.
  • Two-Tier Text Caching:
    • Tier 1 (Inline): Stored in each node's ColdNode to absorb repeated min/max constraint probes during two-pass flexbox layout without global lock contention.
    • Tier 2 (Global LRU): Bounded 16 MB memory budget (TextShapeCache) caching fully shaped glyph runs across identical text strings and style attributes.
  • Velocity-Damped IME Positioning (ImePositioner): Projects caret positions and dampens velocity during rapid mousewheel scrolling, ensuring CJK/IME candidate windows dock smoothly without visual detachment.
  • Font Management (FontManager): System font discovery via fontdb, system font collection querying, and zero-copy custom font asset loading.
  • 100% Safe Rust: #![forbid(unsafe_code)] enforced across all text buffers and shaping routines.

Quick Start

Add martensite-text to your Cargo.toml:

[dependencies]
martensite-text = "0.7.0"

Measuring and shaping text:

use martensite_text::{FontManager, TextShapeCache, measure_text};

fn main() {
    let mut font_manager = FontManager::new();
    let mut cache = TextShapeCache::new(16 * 1024 * 1024); // 16 MB budget

    let metrics = measure_text(
        &mut font_manager,
        &mut cache,
        "Hello, Martensite!",
        16.0,
        None, // natural line height
        None, // unconstrained width
    );

    println!("Measured width: {}, height: {}", metrics.width, metrics.height);
}

Two-Tier Cache Architecture

Measure Request (Text, FontSize, MaxWidth)
                 |
                 v
      +----------------------+
      | Tier 1: Inline Cache | -----> [Hit: Return Instant Bounds]
      +----------------------+
                 | (Miss)
                 v
      +----------------------+
      | Tier 2: 16MB LRU     | -----> [Hit: Return Cached ShapeRun]
      +----------------------+
                 | (Miss)
                 v
      +----------------------+
      | Full HarfBuzz Shape  | -----> [Compute, Populate Tiers, Return]
      +----------------------+

Part of Martensite

This crate provides typography and text layout for the Martensite GUI framework. For high-level widgets and application tools, see martensite.


License

Licensed under either of:

at your option.