From 9bca0bce73cffe44dc85fa5f45d1736b473f9823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Tue, 10 Oct 2023 11:51:22 +0200 Subject: Fix clipping when a box/block has a `radius` (#2338) --- crates/typst-library/src/layout/container.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'crates/typst-library/src/layout') diff --git a/crates/typst-library/src/layout/container.rs b/crates/typst-library/src/layout/container.rs index 28a56103..36b62864 100644 --- a/crates/typst-library/src/layout/container.rs +++ b/crates/typst-library/src/layout/container.rs @@ -146,15 +146,18 @@ impl Layout for BoxElem { frame.set_baseline(frame.baseline() - shift); } - // Clip the contents - if self.clip(styles) { - frame.clip(); - } - // Prepare fill and stroke. let fill = self.fill(styles); let stroke = self.stroke(styles).map(|s| s.map(Stroke::unwrap_or_default)); + // Clip the contents + if self.clip(styles) { + let outset = self.outset(styles).relative_to(frame.size()); + let size = frame.size() + outset.sum_by_axis(); + let radius = self.radius(styles); + frame.clip(path_rect(size, radius, &stroke)); + } + // Add fill and/or stroke. if fill.is_some() || stroke.iter().any(Option::is_some) { let outset = self.outset(styles); @@ -408,17 +411,20 @@ impl Layout for BlockElem { frames }; + // Prepare fill and stroke. + let fill = self.fill(styles); + let stroke = self.stroke(styles).map(|s| s.map(Stroke::unwrap_or_default)); + // Clip the contents if self.clip(styles) { for frame in frames.iter_mut() { - frame.clip(); + let outset = self.outset(styles).relative_to(frame.size()); + let size = frame.size() + outset.sum_by_axis(); + let radius = self.radius(styles); + frame.clip(path_rect(size, radius, &stroke)); } } - // Prepare fill and stroke. - let fill = self.fill(styles); - let stroke = self.stroke(styles).map(|s| s.map(Stroke::unwrap_or_default)); - // Add fill and/or stroke. if fill.is_some() || stroke.iter().any(Option::is_some) { let mut skip = false; -- cgit v1.2.3