diff options
| author | Alex Saveau <saveau.alexandre@gmail.com> | 2023-04-20 10:48:11 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-20 19:48:11 +0200 |
| commit | 851b154a6cb1d558b0091f1a63baa4d3414a7356 (patch) | |
| tree | a726571ad105e898cdad8f627aac0a8466c93e0b /library/src | |
| parent | 42b93b7b534557205a6dc3dfda8fe3cfccfcc458 (diff) | |
Convert math alignment to single-pass algorithm (#891)
Diffstat (limited to 'library/src')
| -rw-r--r-- | library/src/math/align.rs | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/library/src/math/align.rs b/library/src/math/align.rs index d34379e2..03abeac2 100644 --- a/library/src/math/align.rs +++ b/library/src/math/align.rs @@ -16,34 +16,30 @@ impl LayoutMath for AlignPointElem { /// Determine the position of the alignment points. pub(super) fn alignments(rows: &[MathRow]) -> Vec<Abs> { - let count = rows - .iter() - .map(|row| { - row.iter() - .filter(|fragment| matches!(fragment, MathFragment::Align)) - .count() - }) - .max() - .unwrap_or(0); + let mut widths = Vec::<Abs>::new(); - let mut points = vec![Abs::zero(); count]; - for current in 0..count { - for row in rows { - let mut x = Abs::zero(); - let mut i = 0; - for fragment in row.iter() { - if matches!(fragment, MathFragment::Align) { - if i < current { - x = points[i]; - } else if i == current { - points[i].set_max(x); - } - i += 1; + for row in rows { + let mut width = Abs::zero(); + let mut alignment_index = 0; + for fragment in row.iter() { + if matches!(fragment, MathFragment::Align) { + if alignment_index < widths.len() { + widths[alignment_index].set_max(width); + } else { + widths.push(width); } - x += fragment.width(); + width = Abs::zero(); + alignment_index += 1; + } else { + width += fragment.width(); } } } + let mut points = widths; + for i in 1..points.len() { + let prev = points[i - 1]; + points[i] += prev; + } points } |
