summaryrefslogtreecommitdiff
path: root/crates/typst-layout/src/flow/block.rs
diff options
context:
space:
mode:
authorPgBiel <9021226+PgBiel@users.noreply.github.com>2024-12-20 07:03:12 -0300
committerGitHub <noreply@github.com>2024-12-20 10:03:12 +0000
commit6c2d54bbe3df70670afef6d3f61750daeb2adf34 (patch)
treed6346e7163d2ceb9899dc870adc7138a5749f78c /crates/typst-layout/src/flow/block.rs
parent370aa5929fc78a6b5300547b2f0f3f9e0cca96e3 (diff)
Fix crash when block or text have negative sizes (#5610)
Diffstat (limited to 'crates/typst-layout/src/flow/block.rs')
-rw-r--r--crates/typst-layout/src/flow/block.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/crates/typst-layout/src/flow/block.rs b/crates/typst-layout/src/flow/block.rs
index 71eacc1c..6c2c3923 100644
--- a/crates/typst-layout/src/flow/block.rs
+++ b/crates/typst-layout/src/flow/block.rs
@@ -364,6 +364,12 @@ fn breakable_pod<'a>(
/// Distribute a fixed height spread over existing regions into a new first
/// height and a new backlog.
+///
+/// Note that, if the given height fits within the first region, no backlog is
+/// generated and the first region's height shrinks to fit exactly the given
+/// height. In particular, negative and zero heights always fit in any region,
+/// so such heights are always directly returned as the new first region
+/// height.
fn distribute<'a>(
height: Abs,
mut regions: Regions,
@@ -371,7 +377,19 @@ fn distribute<'a>(
) -> (Abs, &'a mut [Abs]) {
// Build new region heights from old regions.
let mut remaining = height;
+
+ // Negative and zero heights always fit, so just keep them.
+ // No backlog is generated.
+ if remaining <= Abs::zero() {
+ buf.push(remaining);
+ return (buf[0], &mut buf[1..]);
+ }
+
loop {
+ // This clamp is safe (min <= max), as 'remaining' won't be negative
+ // due to the initial check above (on the first iteration) and due to
+ // stopping on 'remaining.approx_empty()' below (for the second
+ // iteration onwards).
let limited = regions.size.y.clamp(Abs::zero(), remaining);
buf.push(limited);
remaining -= limited;