summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarge Bot <marge-bot@gnome.org>2022-08-27 02:28:48 +0000
committerMarge Bot <marge-bot@gnome.org>2022-08-27 02:28:48 +0000
commitf5bda04dabf4c52f0c894e0a53c84023c00498ed (patch)
tree281e2794c18750ee5a1efb3b3d6dd25dcdbdfd36
parentd823f14c26881d38803bb04829d1c008b7b74f98 (diff)
parente3aaec5a619352f7640d5a30c4970067550bf61a (diff)
downloadlibrsvg-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.rs27
-rw-r--r--src/structure.rs5
-rw-r--r--tests/fixtures/reftests/bugs-reftests/92-symbol-clip-ref.svg5
-rw-r--r--tests/fixtures/reftests/bugs-reftests/92-symbol-clip.svg12
-rw-r--r--tests/src/reference.rs6
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(&params, 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"
+);