gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Sutichaykuna

Clamp origin-zero grid lines to a symmetric [-10000, 10000] range

Explicit tracks now count against the positive limit, so the grid is
limited to 20000 total tracks in each axis.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

d97b1d3506caee8bc85ac3ff8c109bbb2b8afeae · ruwaq Nico Burns · (3 killa ñawpaq) · tayta a3f94c274 · kay commitpi sach'ata qhaway

Semántico sayk'uy · 6

src/compute/grid/implicit_grid.rs

src/compute/grid/placement.rs

src/compute/grid/types/coordinates.rs

5 qillqakuna · +20 −28

diff --git a/src/compute/grid/implicit_grid.rs b/src/compute/grid/implicit_grid.rs
index ce3c5196d..05c2d1f4f 100644
--- a/src/compute/grid/implicit_grid.rs
+++ b/src/compute/grid/implicit_grid.rs
@@ -6,7 +6,7 @@ use crate::{CheapCloneStr, Direction, GridItemStyle};
 use core::cmp::{max, min};
 
 use super::types::TrackCounts;
-use super::{max_oz_line, OriginZeroLine, MIN_OZ_LINE};
+use super::{OriginZeroLine, MAX_OZ_LINE, MIN_OZ_LINE};
 
 /// Estimate the number of rows and columns in the grid
 /// This is used as a performance optimisation to pre-size vectors and reduce allocations. It also forms a necessary step
@@ -182,7 +182,7 @@ fn child_min_line_max_line_span<S: CheapCloneStr>(
     // stay within the maximum track limit (https://www.w3.org/TR/css-grid-1/#overlarge-grids).
     // This matches the clamping of the actual item placements performed during placement.
     let clamped_min = OriginZeroLine(min.0.max(MIN_OZ_LINE));
-    let clamped_max = OriginZeroLine(max.0.min(max_oz_line(explicit_track_count)));
+    let clamped_max = OriginZeroLine(max.0.min(MAX_OZ_LINE));
 
     (clamped_min, clamped_max, span)
 }
diff --git a/src/compute/grid/mod.rs b/src/compute/grid/mod.rs
index a072267b1..99649094b 100644
--- a/src/compute/grid/mod.rs
+++ b/src/compute/grid/mod.rs
@@ -24,7 +24,7 @@ use types::{CellOccupancyMatrix, GridTrack, NamedLineResolver, TrackCounts};
 #[cfg(feature = "detailed_layout_info")]
 use types::{GridItem, GridTrackKind};
 
-pub(crate) use types::{max_oz_line, GridCoordinate, GridLine, OriginZeroLine, MAX_GRID_TRACKS, MIN_OZ_LINE};
+pub(crate) use types::{GridCoordinate, GridLine, OriginZeroLine, MAX_GRID_TRACKS, MAX_OZ_LINE, MIN_OZ_LINE};
 
 mod alignment;
 mod explicit_grid;
diff --git a/src/compute/grid/placement.rs b/src/compute/grid/placement.rs
index 716aa2118..988a10e62 100644
--- a/src/compute/grid/placement.rs
+++ b/src/compute/grid/placement.rs
@@ -1,7 +1,7 @@
 //! Implements placing items in the grid and resolving the implicit grid.
 //! <https://www.w3.org/TR/css-grid-1/#placement>
 use super::types::{CellOccupancyMatrix, CellOccupancyState, GridItem};
-use super::{max_oz_line, NamedLineResolver, OriginZeroLine, MIN_OZ_LINE};
+use super::{NamedLineResolver, OriginZeroLine, MAX_OZ_LINE, MIN_OZ_LINE};
 use crate::geometry::Line;
 use crate::geometry::{AbsoluteAxis, InBothAbsAxis};
 use crate::style::{AlignItems, GridAutoFlow, OriginZeroGridPlacement};
@@ -454,14 +454,13 @@ fn place_indefinitely_positioned_item(
     }
 }
 
-/// Clamp a placement into the limited grid `[-MAX_GRID_TRACKS, explicit_track_count + MAX_GRID_TRACKS]`,
+/// Clamp a placement into the limited grid `[-MAX_GRID_TRACKS, MAX_GRID_TRACKS]`,
 /// preserving a span of at least 1 track. Items placed outside of the limited grid are clamped into it.
 ///
 /// See: <https://www.w3.org/TR/css-grid-1/#overlarge-grids>
-fn clamp_span_to_limited_grid(span: Line<OriginZeroLine>, explicit_track_count: u16) -> Line<OriginZeroLine> {
-    let max_line = max_oz_line(explicit_track_count);
-    let start = span.start.0.clamp(MIN_OZ_LINE, max_line - 1);
-    let end = span.end.0.clamp(start + 1, max_line);
+fn clamp_span_to_limited_grid(span: Line<OriginZeroLine>) -> Line<OriginZeroLine> {
+    let start = span.start.0.clamp(MIN_OZ_LINE, MAX_OZ_LINE - 1);
+    let end = span.end.0.clamp(start + 1, MAX_OZ_LINE);
     Line { start: OriginZeroLine(start), end: OriginZeroLine(end) }
 }
 
@@ -488,10 +487,8 @@ fn record_grid_placement<S: GridItemStyle>(
 
     // Clamp placements into the limited grid to prevent arithmetic overflow when growing the
     // implicit grid (https://www.w3.org/TR/css-grid-1/#overlarge-grids)
-    let primary_explicit_count = cell_occupancy_matrix.track_counts(primary_axis).explicit;
-    let secondary_explicit_count = cell_occupancy_matrix.track_counts(primary_axis.other_axis()).explicit;
-    let primary_span = clamp_span_to_limited_grid(primary_span, primary_explicit_count);
-    let secondary_span = clamp_span_to_limited_grid(secondary_span, secondary_explicit_count);
+    let primary_span = clamp_span_to_limited_grid(primary_span);
+    let secondary_span = clamp_span_to_limited_grid(secondary_span);
 
     // Mark area of grid as occupied
     cell_occupancy_matrix.mark_area_as(primary_axis, primary_span, secondary_span, placement_type);
diff --git a/src/compute/grid/types/coordinates.rs b/src/compute/grid/types/coordinates.rs
index 0190bd57b..e74c2f248 100644
--- a/src/compute/grid/types/coordinates.rs
+++ b/src/compute/grid/types/coordinates.rs
@@ -4,24 +4,19 @@ use crate::geometry::Line;
 use core::cmp::{max, Ordering};
 use core::ops::{Add, AddAssign, Sub};
 
-/// The maximum number of explicit tracks, the maximum number of implicit tracks on each side of the
-/// explicit grid, and the maximum span of a single grid item. Grids larger than this limit are clamped.
+/// The maximum number of tracks in each direction from the start of the explicit grid (line 0 in
+/// OriginZero coordinates), and the maximum span of a single grid item. This limits the grid to
+/// `2 * MAX_GRID_TRACKS` total tracks in each axis (including explicit tracks, which count against
+/// the positive limit). Grids larger than this limit are clamped.
 ///
 /// See: <https://www.w3.org/TR/css-grid-1/#overlarge-grids>
 pub(crate) const MAX_GRID_TRACKS: u16 = 10_000;
 
-/// The lowest valid grid line in OriginZero coordinates (grids are clamped to `MAX_GRID_TRACKS`
-/// implicit tracks before the start of the explicit grid)
+/// The lowest valid grid line in OriginZero coordinates
 pub(crate) const MIN_OZ_LINE: i16 = -(MAX_GRID_TRACKS as i16);
 
-/// The highest valid grid line in OriginZero coordinates given the explicit track count of the grid
-/// (grids are clamped to `MAX_GRID_TRACKS` implicit tracks after the end of the explicit grid)
-///
-/// The `explicit_track_count` passed must already be clamped to `MAX_GRID_TRACKS`.
-pub(crate) fn max_oz_line(explicit_track_count: u16) -> i16 {
-    debug_assert!(explicit_track_count <= MAX_GRID_TRACKS);
-    (explicit_track_count + MAX_GRID_TRACKS) as i16
-}
+/// The highest valid grid line in OriginZero coordinates
+pub(crate) const MAX_OZ_LINE: i16 = MAX_GRID_TRACKS as i16;
 
 /// Represents a grid line position in "CSS Grid Line" coordinates
 ///
@@ -50,7 +45,7 @@ impl GridLine {
 
     /// Convert into OriginZero coordinates using the specified explicit track count.
     ///
-    /// The result is clamped into the limited grid `[-MAX_GRID_TRACKS, explicit_track_count + MAX_GRID_TRACKS]`
+    /// The result is clamped into the limited grid `[-MAX_GRID_TRACKS, MAX_GRID_TRACKS]`
     pub(crate) fn into_origin_zero_line(self, explicit_track_count: u16) -> OriginZeroLine {
         let explicit_line_count = explicit_track_count + 1;
         let oz_line = match self.0.cmp(&0) {
@@ -58,7 +53,7 @@ impl GridLine {
             Ordering::Less => self.0 + explicit_line_count as i16,
             Ordering::Equal => panic!("Grid line of zero is invalid"),
         };
-        OriginZeroLine(oz_line.clamp(MIN_OZ_LINE, max_oz_line(explicit_track_count)))
+        OriginZeroLine(oz_line.clamp(MIN_OZ_LINE, MAX_OZ_LINE))
     }
 }
 
diff --git a/src/compute/grid/types/mod.rs b/src/compute/grid/types/mod.rs
index ac46e7fce..cd91ef3e0 100644
--- a/src/compute/grid/types/mod.rs
+++ b/src/compute/grid/types/mod.rs
@@ -8,7 +8,7 @@ mod named;
 
 // Publish only locally in the grid module
 pub(super) use cell_occupancy::{CellOccupancyMatrix, CellOccupancyState};
-pub(crate) use coordinates::{max_oz_line, GridCoordinate, GridLine, OriginZeroLine, MAX_GRID_TRACKS, MIN_OZ_LINE};
+pub(crate) use coordinates::{GridCoordinate, GridLine, OriginZeroLine, MAX_GRID_TRACKS, MAX_OZ_LINE, MIN_OZ_LINE};
 pub(super) use grid_item::GridItem;
 pub(super) use grid_track::GridTrack;
 pub(super) use grid_track_counts::TrackCounts;