| ... | ... | @@ -176,7 +176,12 @@ impl TextEngine { |
| 176 | 176 | } |
| 177 | 177 | let mut shaped = builder.build(text); |
| 178 | 178 | shaped.break_all_lines(Some(width)); |
| 179 | | shaped.align(Alignment::Start, AlignmentOptions::default()); |
| 179 | let alignment = match paragraph.spans()[0].format.alignment { |
| 180 | Some(1) => Alignment::Center, |
| 181 | Some(2) => Alignment::End, |
| 182 | _ => Alignment::Start, |
| 183 | }; |
| 184 | shaped.align(alignment, AlignmentOptions::default()); |
| 180 | 185 | Ok(shaped) |
| 181 | 186 | } |
| 182 | 187 | |
| ... | ... | @@ -549,6 +554,39 @@ mod tests { |
| 549 | 554 | assert_eq!(fonts.len(), 1); |
| 550 | 555 | } |
| 551 | 556 | |
| 557 | #[test] |
| 558 | fn paragraph_alignment_offsets_lines_within_the_wrap_width() { |
| 559 | let mut engine = TextEngine::default(); |
| 560 | let mut offset = |alignment| { |
| 561 | let layout = engine |
| 562 | .layout( |
| 563 | &Paragraph::new( |
| 564 | "Short".into(), |
| 565 | Format { |
| 566 | alignment, |
| 567 | ..Format::default() |
| 568 | }, |
| 569 | ), |
| 570 | 200.0, |
| 571 | ) |
| 572 | .unwrap(); |
| 573 | let (line, _) = layout.lines().next().unwrap(); |
| 574 | let advance = line.metrics().advance; |
| 575 | let x = line |
| 576 | .items() |
| 577 | .find_map(|item| match item { |
| 578 | PositionedLayoutItem::GlyphRun(run) => Some(run.offset()), |
| 579 | _ => None, |
| 580 | }) |
| 581 | .unwrap(); |
| 582 | (x, advance) |
| 583 | }; |
| 584 | let (left, advance) = offset(None); |
| 585 | assert_eq!(left, 0.0); |
| 586 | assert!(((offset(Some(1)).0) - (200.0 - advance) / 2.0).abs() < 0.01); |
| 587 | assert!(((offset(Some(2)).0) - (200.0 - advance)).abs() < 0.01); |
| 588 | } |
| 589 | |
| 552 | 590 | #[test] |
| 553 | 591 | fn highlights_share_line_geometry_without_changing_wraps() { |
| 554 | 592 | let paragraph = Paragraph::from_runs([ |