diff --git a/crates/typst-layout/src/grid/layouter.rs b/crates/typst-layout/src/grid/layouter.rs index 2c7f957f2..5d37584ec 100644 --- a/crates/typst-layout/src/grid/layouter.rs +++ b/crates/typst-layout/src/grid/layouter.rs @@ -1768,7 +1768,7 @@ impl<'a> GridLayouter<'a> { // TODO(subfooters): let's not... let footers = self.repeating_footers.clone(); self.prepare_repeating_footers( - footers.iter().map(|f| *f), + footers.iter().copied(), true, engine, disambiguator, diff --git a/crates/typst-layout/src/grid/repeated.rs b/crates/typst-layout/src/grid/repeated.rs index 89e785efc..512593a5b 100644 --- a/crates/typst-layout/src/grid/repeated.rs +++ b/crates/typst-layout/src/grid/repeated.rs @@ -245,6 +245,7 @@ impl<'a> GridLayouter<'a> { // changed. let (footer_height, footer_heights) = self.simulate_footer_heights( self.repeating_footers.iter().map(|x| *x), + &self.regions, engine, disambiguator, )?; @@ -519,7 +520,7 @@ impl<'a> GridLayouter<'a> { .first() .is_none_or(|f| f.level >= footer.level) { - self.prepare_next_repeating_footers(false, engine); + self.prepare_next_repeating_footers(false, engine)?; return Ok(()); } @@ -564,7 +565,7 @@ impl<'a> GridLayouter<'a> { first_footers, engine, 0, - ); + )?; Ok(()) } @@ -578,8 +579,13 @@ impl<'a> GridLayouter<'a> { engine: &mut Engine, disambiguator: usize, ) -> SourceResult<()> { - let (mut expected_footer_height, mut expected_footer_heights) = - self.simulate_footer_heights(footers.clone(), engine, disambiguator)?; + let (mut expected_footer_height, mut expected_footer_heights) = self + .simulate_footer_heights( + footers.clone(), + &self.regions, + engine, + disambiguator, + )?; // Skip to fitting region where all of them fit at once. // @@ -612,8 +618,8 @@ impl<'a> GridLayouter<'a> { if skipped_region { // Simulate the footer again; the region's 'full' might have // changed, and the vector of heights was cleared. - (expected_footer_height, expected_footer_heights) = - self.simulate_footer_heights(footers, engine, disambiguator)?; + (expected_footer_height, expected_footer_heights) = self + .simulate_footer_heights(footers, &self.regions, engine, disambiguator)?; } self.current.footer_height += expected_footer_height; @@ -622,18 +628,18 @@ impl<'a> GridLayouter<'a> { Ok(()) } - fn simulate_footer_heights( + pub fn simulate_footer_heights( &self, footers: impl Iterator + ExactSizeIterator, + regions: &Regions<'_>, engine: &mut Engine, disambiguator: usize, ) -> SourceResult<(Abs, Vec)> { let mut total_footer_height = Abs::zero(); let mut footer_heights = Vec::with_capacity(footers.len()); for footer in footers { - let footer_height = self - .simulate_footer(footer, &self.regions, engine, disambiguator)? - .height; + let footer_height = + self.simulate_footer(footer, regions, engine, disambiguator)?.height; total_footer_height += footer_height; footer_heights.push(footer_height); @@ -701,11 +707,3 @@ pub fn total_header_row_count<'h>( ) -> usize { headers.into_iter().map(|h| h.range.end - h.range.start).sum() } - -/// The total amount of rows in the given list of headers. -#[inline] -pub fn total_footer_row_count<'f>( - footers: impl IntoIterator, -) -> usize { - footers.into_iter().map(|f| f.end - f.start).sum() -}