summaryrefslogtreecommitdiff
path: root/library/src/math
diff options
context:
space:
mode:
authorAlex Saveau <saveau.alexandre@gmail.com>2023-04-20 10:48:11 -0700
committerGitHub <noreply@github.com>2023-04-20 19:48:11 +0200
commit851b154a6cb1d558b0091f1a63baa4d3414a7356 (patch)
treea726571ad105e898cdad8f627aac0a8466c93e0b /library/src/math
parent42b93b7b534557205a6dc3dfda8fe3cfccfcc458 (diff)
Convert math alignment to single-pass algorithm (#891)
Diffstat (limited to 'library/src/math')
-rw-r--r--library/src/math/align.rs42
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
}