From dbfb3d2ced91e56314dfabbb4df9a338926c0a7a Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 3 Aug 2020 16:01:23 +0200 Subject: =?UTF-8?q?Formatting,=20documentation=20and=20small=20improvement?= =?UTF-8?q?s=20=F0=9F=A7=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/text.rs | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) (limited to 'src/layout/text.rs') diff --git a/src/layout/text.rs b/src/layout/text.rs index 5c18cd32..b95110b7 100644 --- a/src/layout/text.rs +++ b/src/layout/text.rs @@ -1,17 +1,23 @@ -//! The text layouter layouts continous pieces of text into boxes. +//! Layouting of continous pieces of text into boxes. //! //! The layouter picks the most suitable font for each individual character. //! When the primary layouting axis horizontally inversed, the word is spelled //! backwards. Vertical word layout is not yet supported. -use ttf_parser::GlyphId; use fontdock::{FaceId, FaceQuery, FontStyle}; +use ttf_parser::GlyphId; + use crate::font::SharedFontLoader; use crate::geom::Size; use crate::style::TextStyle; use super::elements::{LayoutElement, Shaped}; use super::*; +/// Layouts text into a box. +pub async fn layout_text(text: &str, ctx: TextContext<'_>) -> BoxLayout { + TextLayouter::new(text, ctx).layout().await +} + /// Performs the text layouting. #[derive(Debug)] struct TextLayouter<'a> { @@ -26,28 +32,24 @@ struct TextLayouter<'a> { /// The context for text layouting. #[derive(Debug, Copy, Clone)] pub struct TextContext<'a> { - /// The font loader to retrieve fonts from when typesetting text - /// using [`layout_text`]. + /// The font loader to retrieve fonts from when typesetting text with + /// `layout_text`. pub loader: &'a SharedFontLoader, /// The style for text: Font selection with classes, weights and variants, /// font sizes, spacing and so on. pub style: &'a TextStyle, - /// The axes along which the word is laid out. For now, only - /// primary-horizontal layouting is supported. - pub axes: LayoutAxes, - /// The alignment of the finished layout. + /// The direction into which the word is laid out. For now, only horizontal + /// directions are supported. + pub dir: Dir, + /// The alignment of the _resulting_ layout. This does not effect the line + /// layouting itself, but rather how the finished layout will be positioned + /// in a parent layout. pub align: LayoutAlign, } -/// Layouts text into a box. -pub async fn layout_text(text: &str, ctx: TextContext<'_>) -> BoxLayout { - TextLayouter::new(text, ctx).layout().await -} - impl<'a> TextLayouter<'a> { - /// Create a new text layouter. - fn new(text: &'a str, ctx: TextContext<'a>) -> TextLayouter<'a> { - TextLayouter { + fn new(text: &'a str, ctx: TextContext<'a>) -> Self { + Self { ctx, text, shaped: Shaped::new(FaceId::MAX, ctx.style.font_size()), @@ -57,10 +59,9 @@ impl<'a> TextLayouter<'a> { } } - /// Do the layouting. async fn layout(mut self) -> BoxLayout { // If the primary axis is negative, we layout the characters reversed. - if self.ctx.axes.primary.is_positive() { + if self.ctx.dir.is_positive() { for c in self.text.chars() { self.layout_char(c).await; } @@ -83,7 +84,6 @@ impl<'a> TextLayouter<'a> { } } - /// Layout an individual character. async fn layout_char(&mut self, c: char) { let (index, glyph, char_width) = match self.select_font(c).await { Some(selected) => selected, @@ -115,11 +115,8 @@ impl<'a> TextLayouter<'a> { self.width += char_width; } - /// Select the best font for a character and return its index along with - /// the width of the char in the font. async fn select_font(&mut self, c: char) -> Option<(FaceId, GlyphId, f64)> { let mut loader = self.ctx.loader.borrow_mut(); - let mut variant = self.ctx.style.variant; if self.ctx.style.bolder { -- cgit v1.2.3