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: [PATCH] Fix clipping when a box/block has a `radius` (#2338) --- crates/typst-library/src/layout/container.rs | 30 ++-- crates/typst-library/src/visualize/image.rs | 4 +- crates/typst/src/doc.rs | 16 +- crates/typst/src/export/pdf/page.rs | 10 +- crates/typst/src/export/render.rs | 10 +- crates/typst/src/export/svg.rs | 62 ++++--- crates/typst/src/geom/mod.rs | 2 +- crates/typst/src/geom/rect.rs | 164 +++++++++++++------ crates/typst/src/geom/sides.rs | 10 ++ tests/ref/layout/clip.png | Bin 25673 -> 29586 bytes tests/typ/layout/clip.typ | 20 ++- 11 files changed, 211 insertions(+), 117 deletions(-) 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 }; - // Clip the contents - if self.clip(styles) { - for frame in frames.iter_mut() { - 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) { + for frame in frames.iter_mut() { + 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 mut skip = false; diff --git a/crates/typst-library/src/visualize/image.rs b/crates/typst-library/src/visualize/image.rs index b0c9d8ea..05a9c352 100644 --- a/crates/typst-library/src/visualize/image.rs +++ b/crates/typst-library/src/visualize/image.rs @@ -1,7 +1,7 @@ use std::ffi::OsStr; use std::path::Path; -use typst::geom::Smart; +use typst::geom::{self, Smart}; use typst::image::{Image, ImageFormat, RasterFormat, VectorFormat}; use typst::util::option_eq; @@ -212,7 +212,7 @@ impl Layout for ImageElem { // Create a clipping group if only part of the image should be visible. if fit == ImageFit::Cover && !target.fits(fitted) { - frame.clip(); + frame.clip(geom::Path::rect(frame.size())); } // Apply metadata. diff --git a/crates/typst/src/doc.rs b/crates/typst/src/doc.rs index dd206044..6fddc281 100644 --- a/crates/typst/src/doc.rs +++ b/crates/typst/src/doc.rs @@ -13,7 +13,7 @@ use crate::export::PdfPageLabel; use crate::font::Font; use crate::geom::{ self, styled_rect, Abs, Axes, Color, Corners, Dir, Em, FixedAlign, FixedStroke, - Geometry, Length, Numeric, Paint, Point, Rel, Shape, Sides, Size, Transform, + Geometry, Length, Numeric, Paint, Path, Point, Rel, Shape, Sides, Size, Transform, }; use crate::image::Image; use crate::model::{Content, Location, MetaElem, StyleChain}; @@ -351,10 +351,14 @@ impl Frame { } } - /// Clip the contents of a frame to its size. - pub fn clip(&mut self) { + /// Clip the contents of a frame to a clip path. + /// + /// The clip path can be the size of the frame in the case of a + /// rectangular frame. In the case of a frame with rounded corner, + /// this should be a path that matches the frame's outline. + pub fn clip(&mut self, clip_path: Path) { if !self.is_empty() { - self.group(|g| g.clips = true); + self.group(|g| g.clip_path = Some(clip_path)); } } @@ -505,7 +509,7 @@ pub struct GroupItem { /// A transformation to apply to the group. pub transform: Transform, /// Whether the frame should be a clipping boundary. - pub clips: bool, + pub clip_path: Option, } impl GroupItem { @@ -514,7 +518,7 @@ impl GroupItem { Self { frame, transform: Transform::identity(), - clips: false, + clip_path: None, } } } diff --git a/crates/typst/src/export/pdf/page.rs b/crates/typst/src/export/pdf/page.rs index 412d753d..04470aad 100644 --- a/crates/typst/src/export/pdf/page.rs +++ b/crates/typst/src/export/pdf/page.rs @@ -462,14 +462,8 @@ fn write_group(ctx: &mut PageContext, pos: Point, group: &GroupItem) { ctx.size(group.frame.size()); } - if group.clips { - let size = group.frame.size(); - let w = size.x.to_f32(); - let h = size.y.to_f32(); - ctx.content.move_to(0.0, 0.0); - ctx.content.line_to(w, 0.0); - ctx.content.line_to(w, h); - ctx.content.line_to(0.0, h); + if let Some(clip_path) = &group.clip_path { + write_path(ctx, 0.0, 0.0, clip_path); ctx.content.clip_nonzero(); ctx.content.end_path(); } diff --git a/crates/typst/src/export/render.rs b/crates/typst/src/export/render.rs index 6fd47387..090c9756 100644 --- a/crates/typst/src/export/render.rs +++ b/crates/typst/src/export/render.rs @@ -183,13 +183,9 @@ fn render_group(canvas: &mut sk::Pixmap, state: State, group: &GroupItem) { let mut mask = state.mask; let storage; - if group.clips { - let size: geom::Axes = group.frame.size(); - let w = size.x.to_f32(); - let h = size.y.to_f32(); - if let Some(path) = sk::Rect::from_xywh(0.0, 0.0, w, h) - .map(sk::PathBuilder::from_rect) - .and_then(|path| path.transform(state.transform)) + if let Some(clip_path) = group.clip_path.as_ref() { + if let Some(path) = + convert_path(clip_path).and_then(|path| path.transform(state.transform)) { if let Some(mask) = mask { let mut mask = mask.clone(); diff --git a/crates/typst/src/export/svg.rs b/crates/typst/src/export/svg.rs index 25cb7519..6399f77d 100644 --- a/crates/typst/src/export/svg.rs +++ b/crates/typst/src/export/svg.rs @@ -12,8 +12,9 @@ use crate::doc::{Frame, FrameItem, FrameKind, GroupItem, TextItem}; use crate::eval::Repr; use crate::font::Font; use crate::geom::{ - Abs, Angle, Axes, Color, FixedStroke, Geometry, Gradient, LineCap, LineJoin, Paint, - PathItem, Point, Quadrant, Ratio, RatioOrAngle, Relative, Shape, Size, Transform, + self, Abs, Angle, Axes, Color, FixedStroke, Geometry, Gradient, LineCap, LineJoin, + Paint, PathItem, Point, Quadrant, Ratio, RatioOrAngle, Relative, Shape, Size, + Transform, }; use crate::image::{Image, ImageFormat, RasterFormat, VectorFormat}; use crate::util::hash128; @@ -269,16 +270,9 @@ impl SVGRenderer { self.xml.start_element("g"); self.xml.write_attribute("class", "typst-group"); - if group.clips { + if let Some(clip_path) = &group.clip_path { let hash = hash128(&group); - let size = group.frame.size(); - let x = size.x.to_pt(); - let y = size.y.to_pt(); - let id = self.clip_paths.insert_with(hash, || { - let mut builder = SvgPathBuilder(EcoString::new()); - builder.rect(x as f32, y as f32); - builder.0 - }); + let id = self.clip_paths.insert_with(hash, || convert_path(clip_path)); self.xml.write_attribute_fmt("clip-path", format_args!("url(#{id})")); } @@ -1014,31 +1008,35 @@ fn convert_geometry_to_path(geometry: &Geometry) -> EcoString { let y = rect.y.to_pt() as f32; builder.rect(x, y); } - Geometry::Path(p) => { - for item in &p.0 { - match item { - PathItem::MoveTo(m) => { - builder.move_to(m.x.to_pt() as f32, m.y.to_pt() as f32) - } - PathItem::LineTo(l) => { - builder.line_to(l.x.to_pt() as f32, l.y.to_pt() as f32) - } - PathItem::CubicTo(c1, c2, t) => builder.curve_to( - c1.x.to_pt() as f32, - c1.y.to_pt() as f32, - c2.x.to_pt() as f32, - c2.y.to_pt() as f32, - t.x.to_pt() as f32, - t.y.to_pt() as f32, - ), - PathItem::ClosePath => builder.close(), - } - } - } + Geometry::Path(p) => return convert_path(p), }; builder.0 } +fn convert_path(path: &geom::Path) -> EcoString { + let mut builder = SvgPathBuilder::default(); + for item in &path.0 { + match item { + PathItem::MoveTo(m) => { + builder.move_to(m.x.to_pt() as f32, m.y.to_pt() as f32) + } + PathItem::LineTo(l) => { + builder.line_to(l.x.to_pt() as f32, l.y.to_pt() as f32) + } + PathItem::CubicTo(c1, c2, t) => builder.curve_to( + c1.x.to_pt() as f32, + c1.y.to_pt() as f32, + c2.x.to_pt() as f32, + c2.y.to_pt() as f32, + t.x.to_pt() as f32, + t.y.to_pt() as f32, + ), + PathItem::ClosePath => builder.close(), + } + } + builder.0 +} + /// Encode an image into a data URL. The format of the URL is /// `data:image/{format};base64,`. #[comemo::memoize] diff --git a/crates/typst/src/geom/mod.rs b/crates/typst/src/geom/mod.rs index 105ee5a3..8ad6cea0 100644 --- a/crates/typst/src/geom/mod.rs +++ b/crates/typst/src/geom/mod.rs @@ -46,7 +46,7 @@ pub use self::paint::Paint; pub use self::path::{Path, PathItem}; pub use self::point::Point; pub use self::ratio::Ratio; -pub use self::rect::styled_rect; +pub use self::rect::{path_rect, styled_rect}; pub use self::rel::Rel; pub use self::scalar::Scalar; pub use self::shape::{Geometry, Shape}; diff --git a/crates/typst/src/geom/rect.rs b/crates/typst/src/geom/rect.rs index 108f5add..37b94527 100644 --- a/crates/typst/src/geom/rect.rs +++ b/crates/typst/src/geom/rect.rs @@ -42,6 +42,19 @@ impl PathExtension for Path { } } +/// Creates a new rectangle as a path. +pub fn path_rect( + size: Size, + radius: Corners>, + stroke: &Sides>, +) -> Path { + if stroke.is_uniform() && radius.iter().cloned().all(Rel::is_zero) { + Path::rect(size) + } else { + segmented_path_rect(size, radius, stroke) + } +} + /// Create a styled rectangle with shapes. /// - use rect primitive for simple rectangles /// - stroke sides if possible @@ -68,24 +81,13 @@ fn simple_rect( vec![Shape { geometry: Geometry::Rect(size), fill, stroke }] } -/// Use stroke and fill for the rectangle -fn segmented_rect( +fn corners_control_points( size: Size, - radius: Corners>, - fill: Option, - strokes: Sides>, -) -> Vec { - let mut res = vec![]; - let stroke_widths = strokes - .clone() - .map(|s| s.map(|s| s.thickness / 2.0).unwrap_or(Abs::zero())); - - let max_radius = (size.x.min(size.y)) / 2.0 - + stroke_widths.iter().cloned().min().unwrap_or(Abs::zero()); - - let radius = radius.map(|side| side.relative_to(max_radius * 2.0).min(max_radius)); - - let corners = Corners { + radius: Corners, + strokes: &Sides>, + stroke_widths: Sides, +) -> Corners { + Corners { top_left: Corner::TopLeft, top_right: Corner::TopRight, bottom_right: Corner::BottomRight, @@ -105,7 +107,67 @@ fn segmented_rect( (None, None) => true, _ => false, }, - }); + }) +} + +fn segmented_path_rect( + size: Size, + radius: Corners>, + strokes: &Sides>, +) -> Path { + let stroke_widths = strokes + .as_ref() + .map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0)); + + let max_radius = (size.x.min(size.y)) / 2.0 + + stroke_widths.iter().cloned().min().unwrap_or(Abs::zero()); + + let radius = radius.map(|side| side.relative_to(max_radius * 2.0).min(max_radius)); + + // insert stroked sides below filled sides + let mut path = Path::new(); + let corners = corners_control_points(size, radius, strokes, stroke_widths); + let current = corners.iter().find(|c| !c.same).map(|c| c.corner); + if let Some(mut current) = current { + // multiple segments + // start at a corner with a change between sides and iterate clockwise all other corners + let mut last = current; + for _ in 0..4 { + current = current.next_cw(); + if corners.get_ref(current).same { + continue; + } + // create segment + let start = last; + let end = current; + last = current; + path_segment(start, end, &corners, &mut path); + } + } else if strokes.top.is_some() { + // single segment + path_segment(Corner::TopLeft, Corner::TopLeft, &corners, &mut path); + } + path +} + +/// Use stroke and fill for the rectangle +fn segmented_rect( + size: Size, + radius: Corners>, + fill: Option, + strokes: Sides>, +) -> Vec { + let mut res = vec![]; + let stroke_widths = strokes + .as_ref() + .map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0)); + + let max_radius = (size.x.min(size.y)) / 2.0 + + stroke_widths.iter().cloned().min().unwrap_or(Abs::zero()); + + let radius = radius.map(|side| side.relative_to(max_radius * 2.0).min(max_radius)); + + let corners = corners_control_points(size, radius, &strokes, stroke_widths); // insert stroked sides below filled sides let mut stroke_insert = 0; @@ -171,6 +233,43 @@ fn segmented_rect( res } +fn path_segment( + start: Corner, + end: Corner, + corners: &Corners, + path: &mut Path, +) { + // create start corner + let c = corners.get_ref(start); + if start == end || !c.arc() { + path.move_to(c.end()); + } else { + path.arc_move(c.mid(), c.center(), c.end()); + } + + // create corners between start and end + let mut current = start.next_cw(); + while current != end { + let c = corners.get_ref(current); + if c.arc() { + path.arc_line(c.start(), c.center(), c.end()); + } else { + path.line_to(c.end()); + } + current = current.next_cw(); + } + + // create end corner + let c = corners.get_ref(end); + if !c.arc() { + path.line_to(c.start()); + } else if start == end { + path.arc_line(c.start(), c.center(), c.end()); + } else { + path.arc_line(c.start(), c.center(), c.mid()); + } +} + /// Returns the shape for the segment and whether the shape should be drawn on top. fn segment( start: Corner, @@ -228,35 +327,8 @@ fn stroke_segment( stroke: FixedStroke, ) -> Shape { // create start corner - let c = corners.get_ref(start); let mut path = Path::new(); - if start == end || !c.arc() { - path.move_to(c.end()); - } else { - path.arc_move(c.mid(), c.center(), c.end()); - } - - // create corners between start and end - let mut current = start.next_cw(); - while current != end { - let c = corners.get_ref(current); - if c.arc() { - path.arc_line(c.start(), c.center(), c.end()); - } else { - path.line_to(c.end()); - } - current = current.next_cw(); - } - - // create end corner - let c = corners.get_ref(end); - if !c.arc() { - path.line_to(c.start()); - } else if start == end { - path.arc_line(c.start(), c.center(), c.end()); - } else { - path.arc_line(c.start(), c.center(), c.mid()); - } + path_segment(start, end, corners, &mut path); Shape { geometry: Geometry::Path(path), diff --git a/crates/typst/src/geom/sides.rs b/crates/typst/src/geom/sides.rs index e21fe63f..38477f36 100644 --- a/crates/typst/src/geom/sides.rs +++ b/crates/typst/src/geom/sides.rs @@ -46,6 +46,16 @@ impl Sides { } } + /// Convert from `&Sides` to `Sides<&T>`. + pub fn as_ref(&self) -> Sides<&T> { + Sides { + left: &self.left, + top: &self.top, + right: &self.right, + bottom: &self.bottom, + } + } + /// Zip two instances into one. pub fn zip(self, other: Sides) -> Sides<(T, U)> { Sides { diff --git a/tests/ref/layout/clip.png b/tests/ref/layout/clip.png index 53565a9827d7c3974cdefab20fa14bc332a531df..c847fc63d8f03bdde9f7620734031495a8fcec6b 100644 GIT binary patch literal 29586 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 Xa)H?*$tT6)KWpTqlqKuLVIlt)+MsvS literal 25673 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 diff --git a/tests/typ/layout/clip.typ b/tests/typ/layout/clip.typ index 3baa8b80..d05fdb74 100644 --- a/tests/typ/layout/clip.typ +++ b/tests/typ/layout/clip.typ @@ -7,13 +7,13 @@ world 1 Space -Hello #box(width: 1em, height: 1em, clip: true)[#rect(width: 3em, height: 3em, fill: red)] +Hello #box(width: 1em, height: 1em, clip: true)[#rect(width: 3em, height: 3em, fill: red)] world 2 --- // Test cliping text #block(width: 5em, height: 2em, clip: false, stroke: 1pt + black)[ - But, soft! what light through + But, soft! what light through ] #v(2em) @@ -24,7 +24,7 @@ world 2 ] --- -// Test cliping svg glyphs +// Test clipping svg glyphs Emoji: #box(height: 0.5em, stroke: 1pt + black)[🐪, 🌋, 🏞] Emoji: #box(height: 0.5em, clip: true, stroke: 1pt + black)[🐪, 🌋, 🏞] @@ -40,3 +40,17 @@ First! But, soft! what light through yonder window breaks? It is the east, and Juliet is the sun. ] + +--- +// Test clipping with `radius`. + +#set page(height: 60pt) + +#box( + radius: 5pt, + stroke: 2pt + black, + width: 20pt, + height: 20pt, + clip: true, + image("/files/rhino.png", width: 30pt) +)