1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
//! General crate for text layout / text shaping //! //! ![Text layout functions and ](https://i.imgur.com/1T7a1VR.png) //! //! # Example //! //! ```rust,ignore,no_run //! 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 //! //! ```rust,ignore,no_run //! 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 //! ``` #![doc( html_logo_url = "https://raw.githubusercontent.com/maps4print/azul/master/assets/images/azul_logo_full_min.svg.png", html_favicon_url = "https://raw.githubusercontent.com/maps4print/azul/master/assets/images/favicon.ico", )] extern crate azul_css; extern crate azul_core; extern crate unicode_normalization; extern crate harfbuzz_sys; extern crate freetype; // necessary to get baseline of font pub mod text_layout; pub mod text_shaping; use azul_core::{ traits::GetTextLayout, ui_solver::{ResolvedTextLayoutOptions, InlineTextLayout}, app_resources::{Words, ScaledWords}, }; #[derive(Debug, Clone)] pub struct InlineText<'a> { pub words: &'a Words, pub scaled_words: &'a ScaledWords, } impl<'a> GetTextLayout for InlineText<'a> { fn get_text_layout(&mut self, text_layout_options: &ResolvedTextLayoutOptions) -> InlineTextLayout { let layouted_text_block = text_layout::position_words( self.words, self.scaled_words, text_layout_options, ); // TODO: Cache the layouted text block on the &mut self text_layout::word_positions_to_inline_text_layout(&layouted_text_block, &self.scaled_words) } }