diff --git a/src/geom/length.rs b/src/geom/length.rs index d0f11bd23..de184e6ce 100644 --- a/src/geom/length.rs +++ b/src/geom/length.rs @@ -126,6 +126,13 @@ impl Length { pub fn approx_eq(self, other: Self) -> bool { self == other || (self - other).to_raw().abs() < 1e-6 } + + /// Perform a checked division by a number, returning `None` if the result + /// is not finite. + pub fn div_finite(self, number: f64) -> Option { + let result = self.to_raw() / number; + result.is_finite().then(|| Self::raw(result)) + } } impl Debug for Length { diff --git a/src/layout/pad.rs b/src/layout/pad.rs index 55c11e451..52766dfab 100644 --- a/src/layout/pad.rs +++ b/src/layout/pad.rs @@ -25,7 +25,9 @@ impl BlockLevel for PadNode { frames.iter_mut().zip(regions.iter()) { fn solve_axis(length: Length, padding: Linear) -> Length { - (length + padding.abs) / (1.0 - padding.rel.get()) + (length + padding.abs) + .div_finite(1.0 - padding.rel.get()) + .unwrap_or_default() } // Solve for the size `padded` that satisfies (approximately): diff --git a/tests/ref/layout/pad.png b/tests/ref/layout/pad.png index cdf08c78f..4d381ce24 100644 Binary files a/tests/ref/layout/pad.png and b/tests/ref/layout/pad.png differ diff --git a/tests/typ/layout/pad.typ b/tests/typ/layout/pad.typ index bce13d425..3729761a8 100644 --- a/tests/typ/layout/pad.typ +++ b/tests/typ/layout/pad.typ @@ -27,9 +27,11 @@ Hi #box(pad(left: 10pt)[]) there --- // Test that the pad node doesn't consume the whole region. - #page(height: 6cm) - #align(left)[Before] #pad(10pt, image("../../res/tiger.jpg")) #align(right)[After] + +--- +// Test that padding adding up to 100% does not panic. +#pad(50%)[]