diff options
author | Marge Bot <marge-bot@gnome.org> | 2022-08-27 02:28:48 +0000 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2022-08-27 02:28:48 +0000 |
commit | f5bda04dabf4c52f0c894e0a53c84023c00498ed (patch) | |
tree | 281e2794c18750ee5a1efb3b3d6dd25dcdbdfd36 | |
parent | d823f14c26881d38803bb04829d1c008b7b74f98 (diff) | |
parent | e3aaec5a619352f7640d5a30c4970067550bf61a (diff) | |
download | librsvg-f5bda04dabf4c52f0c894e0a53c84023c00498ed.tar.gz |
Merge branch '92-symbol-clip' into 'main'
(#92): In the use element, honor the overflow:hidden property of a referenced symbol
Closes #92
See merge request GNOME/librsvg!737
-rw-r--r-- | src/drawing_ctx.rs | 27 | ||||
-rw-r--r-- | src/structure.rs | 5 | ||||
-rw-r--r-- | tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg | 5 | ||||
-rw-r--r-- | tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg | 12 | ||||
-rw-r--r-- | tests/src/reference.rs | 6 |
5 files changed, 36 insertions, 19 deletions
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs index 6347304f..836f434f 100644 --- a/src/drawing_ctx.rs +++ b/src/drawing_ctx.rs @@ -108,7 +108,7 @@ pub struct FontOptions { #[derive(Debug, Copy, Clone, PartialEq)] pub enum ClipMode { ClipToViewport, - ClipToVbox, + NoClip, } /// Set path on the cairo context, or clear it. @@ -486,9 +486,9 @@ impl DrawingCtx { vbox: Option<ViewBox>, viewport: Rect, preserve_aspect_ratio: AspectRatio, - clip_mode: Option<ClipMode>, + clip_mode: ClipMode, ) -> Option<ViewParams> { - if let Some(ClipMode::ClipToViewport) = clip_mode { + if let ClipMode::ClipToViewport = clip_mode { clip_to_rectangle(&self.cr, &viewport); } @@ -515,12 +515,6 @@ impl DrawingCtx { .map(|t| { self.cr.transform(t.into()); - if let Some(vbox) = vbox { - if let Some(ClipMode::ClipToVbox) = clip_mode { - clip_to_rectangle(&self.cr, &*vbox); - } - } - let top_viewport = self.get_top_viewport(); self.push_viewport(Viewport { @@ -1362,9 +1356,9 @@ impl DrawingCtx { || image.overflow == Overflow::Visible) && image.aspect.is_slice() { - Some(ClipMode::ClipToViewport) + ClipMode::ClipToViewport } else { - None + ClipMode::NoClip }; // The bounding box for <image> is decided by the values of the image's x, y, w, h @@ -1690,14 +1684,13 @@ impl DrawingCtx { let elt = child.borrow_element(); let symbol = borrow_element_as!(child, Symbol); + let symbol_values = elt.get_computed_values(); - let clip_mode = if !values.is_overflow() - || (values.overflow() == Overflow::Visible - && elt.get_specified_values().is_overflow()) - { - Some(ClipMode::ClipToVbox) + // FIXME: do we need to look at preserveAspectRatio.slice, like in draw_image()? + let clip_mode = if !symbol_values.is_overflow() { + ClipMode::ClipToViewport } else { - None + ClipMode::NoClip }; let stacking_ctx = StackingContext::new( diff --git a/src/structure.rs b/src/structure.rs index cfc8cbcd..da42551a 100644 --- a/src/structure.rs +++ b/src/structure.rs @@ -226,10 +226,11 @@ impl Svg { let has_parent = node.parent().is_some(); + // FIXME: do we need to look at preserveAspectRatio.slice, like in DrawingCtx::draw_image()? let clip_mode = if !values.is_overflow() && has_parent { - Some(ClipMode::ClipToViewport) + ClipMode::ClipToViewport } else { - None + ClipMode::NoClip }; let svg_viewport = self.get_viewport(¶ms, values, !has_parent); diff --git a/tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg b/tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg new file mode 100644 index 00000000..c319e2fa --- /dev/null +++ b/tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + width="100" height="100" viewBox="0 0 100 100"> + <rect x="0" y="0" width="40" height="40" fill="lime"/> +</svg> diff --git a/tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg b/tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg new file mode 100644 index 00000000..f25b65b2 --- /dev/null +++ b/tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + width="100" height="100" viewBox="0 0 100 100"> + <defs> + <symbol id="foo" viewBox="0 0 50 50"> + <rect x="0" y="0" width="40" height="40" fill="lime"/> + <rect x="50" y="0" width="40" height="40" fill="red"/> + </symbol> + </defs> + + <use x="0" y="0" width="50" height="50" xlink:href="#foo"/> +</svg> diff --git a/tests/src/reference.rs b/tests/src/reference.rs index 665baec0..00d6428c 100644 --- a/tests/src/reference.rs +++ b/tests/src/reference.rs @@ -406,3 +406,9 @@ test_svg_reference!( "tests/fixtures/reftests/bugs-reftests/880-stroke-wide-line.svg", "tests/fixtures/reftests/bugs-reftests/880-stroke-wide-line-ref.svg" ); + +test_svg_reference!( + bug_92_symbol_clip, + "tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg", + "tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg" +); |