diff --git a/crates/canvas/src/layout.rs b/crates/canvas/src/layout.rs index 7c6c3387294827fe25d4f9fe8bff995c3952fc80..b1303952e983f44e0011b6f030457dc05e818648 100644 --- a/crates/canvas/src/layout.rs +++ b/crates/canvas/src/layout.rs @@ -176,7 +176,12 @@ impl TextEngine { } let mut shaped = builder.build(text); shaped.break_all_lines(Some(width)); - shaped.align(Alignment::Start, AlignmentOptions::default()); + let alignment = match paragraph.spans()[0].format.alignment { + Some(1) => Alignment::Center, + Some(2) => Alignment::End, + _ => Alignment::Start, + }; + shaped.align(alignment, AlignmentOptions::default()); Ok(shaped) } @@ -549,6 +554,39 @@ mod tests { assert_eq!(fonts.len(), 1); } + #[test] + fn paragraph_alignment_offsets_lines_within_the_wrap_width() { + let mut engine = TextEngine::default(); + let mut offset = |alignment| { + let layout = engine + .layout( + &Paragraph::new( + "Short".into(), + Format { + alignment, + ..Format::default() + }, + ), + 200.0, + ) + .unwrap(); + let (line, _) = layout.lines().next().unwrap(); + let advance = line.metrics().advance; + let x = line + .items() + .find_map(|item| match item { + PositionedLayoutItem::GlyphRun(run) => Some(run.offset()), + _ => None, + }) + .unwrap(); + (x, advance) + }; + let (left, advance) = offset(None); + assert_eq!(left, 0.0); + assert!(((offset(Some(1)).0) - (200.0 - advance) / 2.0).abs() < 0.01); + assert!(((offset(Some(2)).0) - (200.0 - advance)).abs() < 0.01); + } + #[test] fn highlights_share_line_geometry_without_changing_wraps() { let paragraph = Paragraph::from_runs([