Thanks to visit codestin.com
Credit goes to lib.rs

#svg #svg-graphics #css #graphics

no-std azul-layout

Layout solver + font and image loader the Azul GUI framework

5 releases

0.0.5 Mar 18, 2025
0.0.4 May 14, 2020
0.0.3 May 14, 2020
0.0.2 May 11, 2020
0.0.1 May 11, 2020

#136 in GUI

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

6,695 downloads per month
Used in 4 crates

MPL-2.0 license

2MB
51K SLoC

azul-layout

General crate for text layout / text shaping

Text layout functions and

Example

use azul_text_layout::{
    text_layout::{split_text_into_words, words_to_scaled_words},
    text_shaping::get_font_metrics_freetype,
};

let text = "hello";
let font_size = 14.0; // px
let font = include_bytes!("Helvetica.ttf");
let font_index = 0; // only for fonts with font collections
let font_metrics = get_font_metrics_freetype(&font, font_index);
let words = split_text_into_words(text);
let scaled_words = words_to_scaled_words(&words, &font, font_index as u32, font_metrics, font_size);

let total_width = scaled_words.items.iter().map(|i| i.word_width).sum();

Full text layout

use azul_text_layout::{text_layout, text_shaping::get_font_metrics_freetype};
use azul_css::{LayoutSize, StyleTextAlignmentHorz};
use azul_core::ui_solver::ResolvedTextLayoutOptions;

// set all options of the text
let text = "hello";
let font_size = 14.0; // px
let font_bytes = include_bytes!("Helvetica.ttf");
let font_index = 0; // only for fonts with font collections
let text_layout_options = ResolvedTextLayoutOptions {
    font_size_px: font_size,
    line_height: None,
    letter_spacing: None,
    word_spacing: None,
    tab_width: None,
    // for line breaking, maximum width that a line can have
    max_horizontal_width: Some(400.0), // px
    leading: None,
    holes: Vec::new(),
};

// Cache the font metrics of the given font (baseline, height, etc.)
let font_metrics = get_font_metrics_freetype(font_bytes, font_index as i32);
// "Hello World" => ["Hello", "World"]
let words = text_layout::split_text_into_words(text);
// "Hello" @ 14px => Size { width: 50px, height: 14px }
let scaled_words = text_layout::words_to_scaled_words(&words, font_bytes, font_index, font_metrics, text_layout_options.font_size_px);
// Calculate the origin of the word relative to the line
let word_positions = text_layout::position_words(&words, &scaled_words, &text_layout_options);
// Calculate the origin of the line relative to (0, 0)
let mut inline_text_layout = text_layout::word_positions_to_inline_text_layout(&word_positions, &scaled_words);
// Align the line horizontally
inline_text_layout.align_children_horizontal(StyleTextAlignmentHorz::Center);
// Calculate the glyph positons (line_offset + word_offset + glyph_offset)
let layouted_glyphs = text_layout::get_layouted_glyphs(&word_positions, &scaled_words, &inline_text_layout);

println!("{:#?}", inline_text_layout); // get infos about word offset, line breaking, etc.
println!("{:#?}", layouted_glyphs); // get the final glyph positions relative to the origin

License: MIT

Dependencies

~22MB
~509K SLoC