gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 227Rust 7TOML 3CSS 1307 Definiciones

Fix panics in the grid algorithm (#691)

* Fix typo (max -> min) in grid track repetition resolution.

* Remove first/last optimisation that breaks with zero-sized track lists

* Grid: Fix crash when placing item with definite primary axis / indefinite secondary axis

0ce2f3eef52826852811363a87ef28ecc38e3d55 · por Nico Burns · (hace 2 años) · padre b746ac4f3 · ver el árbol en este commit

Delta semántico · 4

src/compute/grid/explicit_grid.rs

src/compute/grid/placement.rs

src/compute/grid/track_sizing.rs

3 archivos · +5 −13

diff --git a/src/compute/grid/explicit_grid.rs b/src/compute/grid/explicit_grid.rs
index 793aa2477..d0e0b3afb 100644
--- a/src/compute/grid/explicit_grid.rs
+++ b/src/compute/grid/explicit_grid.rs
@@ -106,7 +106,7 @@ pub(crate) fn compute_explicit_grid_size_in_axis(
             /// otherwise, flooring the max track sizing function by the min track sizing function if both are definite
             fn track_definite_value(sizing_function: &NonRepeatedTrackSizingFunction, parent_size: Option<f32>) -> f32 {
                 let max_size = sizing_function.max.definite_value(parent_size);
-                let min_size = sizing_function.max.definite_value(parent_size);
+                let min_size = sizing_function.min.definite_value(parent_size);
                 max_size.map(|max| max.maybe_min(min_size)).or(min_size).unwrap()
             }
 
diff --git a/src/compute/grid/placement.rs b/src/compute/grid/placement.rs
index 695ac0291..ae1bab6ad 100644
--- a/src/compute/grid/placement.rs
+++ b/src/compute/grid/placement.rs
@@ -227,7 +227,6 @@ fn place_indefinitely_positioned_item(
     let primary_placement_style = placement.get(primary_axis);
     let secondary_placement_style = placement.get(primary_axis.other_axis());
 
-    let primary_span = primary_placement_style.indefinite_span();
     let secondary_span = secondary_placement_style.indefinite_span();
     let has_definite_primary_axis_position = primary_placement_style.is_definite();
     let primary_axis_grid_start_line = cell_occupancy_matrix.track_counts(primary_axis).implicit_start_line();
@@ -256,7 +255,7 @@ fn place_indefinitely_positioned_item(
         // Item has fixed primary axis position: so we simply increment the secondary axis position
         // until we find a space that the item fits in
         loop {
-            let primary_span = Line { start: primary_idx, end: primary_idx + primary_span };
+            let primary_span = Line { start: primary_idx, end: primary_idx + definite_primary_placement.span() };
             let secondary_span = Line { start: secondary_idx, end: secondary_idx + secondary_span };
 
             // If area is occupied, increment the index and try again
@@ -269,6 +268,8 @@ fn place_indefinitely_positioned_item(
             return (primary_span, secondary_span);
         }
     } else {
+        let primary_span = primary_placement_style.indefinite_span();
+
         // Item does not have any fixed axis, so we search along the primary axis until we hit the end of the already
         // existent tracks, and then we reset the primary axis back to zero and increment the secondary axis index.
         // We continue in this vein until we find a space that the item fits in.
diff --git a/src/compute/grid/track_sizing.rs b/src/compute/grid/track_sizing.rs
index 822d30798..891da015e 100644
--- a/src/compute/grid/track_sizing.rs
+++ b/src/compute/grid/track_sizing.rs
@@ -399,16 +399,7 @@ fn flush_planned_growth_limit_increases(tracks: &mut [GridTrack], set_infinitely
 /// Initialize each track’s base size and growth limit.
 #[inline(always)]
 fn initialize_track_sizes(axis_tracks: &mut [GridTrack], axis_inner_node_size: Option<f32>) {
-    let last_track_idx = axis_tracks.len() - 1;
-
-    // First and last grid lines are always zero-sized.
-    axis_tracks[0].base_size = 0.0;
-    axis_tracks[0].growth_limit = 0.0;
-    axis_tracks[last_track_idx].base_size = 0.0;
-    axis_tracks[last_track_idx].growth_limit = 0.0;
-
-    let all_but_first_and_last = 1..last_track_idx;
-    for track in axis_tracks[all_but_first_and_last].iter_mut() {
+    for track in axis_tracks.iter_mut() {
         // For each track, if the track’s min track sizing function is:
         // - A fixed sizing function
         //     Resolve to an absolute length and use that size as the track’s initial base size.