[librsvg: 4/5] node: turn overflow_hidden() in a method of the trait



commit a376c96cba64c02de9c0c9e7f50b27edd733ca4a
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat May 18 01:19:22 2019 +0200

    node: turn overflow_hidden() in a method of the trait
    
    Instead of a RsvgNode method called by trait implementation,
    add a method to the trait and call it from the common code.

 rsvg_internals/src/image.rs     | 10 +++++-----
 rsvg_internals/src/marker.rs    | 10 +++++-----
 rsvg_internals/src/node.rs      | 16 +++++++++++-----
 rsvg_internals/src/pattern.rs   |  8 ++++----
 rsvg_internals/src/structure.rs | 18 +++++++++---------
 5 files changed, 34 insertions(+), 28 deletions(-)
---
diff --git a/rsvg_internals/src/image.rs b/rsvg_internals/src/image.rs
index 472a1dab..e351db5d 100644
--- a/rsvg_internals/src/image.rs
+++ b/rsvg_internals/src/image.rs
@@ -38,11 +38,7 @@ impl NodeImage {
 }
 
 impl NodeTrait for NodeImage {
-    fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
-        // SVG element has overflow:hidden
-        // https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-        node.set_overflow_hidden();
-
+    fn set_atts(&self, _node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr {
                 local_name!("x") => self.x.set(attr.parse(value)?),
@@ -72,6 +68,10 @@ impl NodeTrait for NodeImage {
         Ok(())
     }
 
+    fn overflow_hidden(&self) -> bool {
+        true
+    }
+
     fn draw(
         &self,
         node: &RsvgNode,
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 045233e0..0ae3c372 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -197,11 +197,7 @@ impl NodeMarker {
 }
 
 impl NodeTrait for NodeMarker {
-    fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
-        // marker element has overflow:hidden
-        // https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-        node.set_overflow_hidden();
-
+    fn set_atts(&self, _node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr {
                 local_name!("markerUnits") => self.units.set(attr.parse(value)?),
@@ -231,6 +227,10 @@ impl NodeTrait for NodeMarker {
         Ok(())
     }
 
+    fn overflow_hidden(&self) -> bool {
+        true
+    }
+
     fn set_overridden_properties(&self, values: &mut SpecifiedValues) {
         // markers are always displayed, even if <marker> or its ancestors are display:none
         values.display = SpecifiedValue::Specified(Default::default());
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index 6c35b9cc..babf6933 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -86,6 +86,11 @@ impl NodeData {
     }
 
     pub fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>, locale: &Locale) {
+        if self.node_impl.overflow_hidden() {
+            let mut specified_values = self.specified_values.borrow_mut();
+            specified_values.overflow = SpecifiedValue::Specified(Overflow::Hidden);
+        }
+
         self.save_style_attribute(pbag);
 
         if let Err(e) = self
@@ -328,6 +333,12 @@ pub trait NodeTrait: Downcast {
     /// from defaults in the node's `SpecifiedValues`.
     fn set_overridden_properties(&self, _values: &mut SpecifiedValues) {}
 
+    /// Whether this node has overflow:hidden.
+    /// https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
+    fn overflow_hidden(&self) -> bool {
+        false
+    }
+
     fn draw(
         &self,
         _node: &RsvgNode,
@@ -588,11 +599,6 @@ impl RsvgNode {
     pub fn is_overflow(&self) -> bool {
         self.borrow().specified_values.borrow().is_overflow()
     }
-
-    pub fn set_overflow_hidden(&self) {
-        let mut specified_values = self.borrow().specified_values.borrow_mut();
-        specified_values.overflow = SpecifiedValue::Specified(Overflow::Hidden);
-    }
 }
 
 impl fmt::Display for RsvgNode {
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index 323ceba1..cc55519e 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -171,10 +171,6 @@ impl NodePattern {
 
 impl NodeTrait for NodePattern {
     fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
-        // pattern element has overflow:hidden
-        // https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-        node.set_overflow_hidden();
-
         let mut p = self.pattern.borrow_mut();
 
         p.node = Some(node.downgrade());
@@ -217,6 +213,10 @@ impl NodeTrait for NodePattern {
 
         Ok(())
     }
+
+    fn overflow_hidden(&self) -> bool {
+        true
+    }
 }
 
 impl PaintSource for NodePattern {
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 2df500c7..fd849872 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -203,10 +203,6 @@ impl NodeSvg {
 
 impl NodeTrait for NodeSvg {
     fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
-        // SVG element has overflow:hidden
-        // https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-        node.set_overflow_hidden();
-
         // x & y attributes have no effect on outermost svg
         // http://www.w3.org/TR/SVG/struct.html#SVGElement
         let is_inner_svg = node.parent().is_some();
@@ -246,6 +242,10 @@ impl NodeTrait for NodeSvg {
         Ok(())
     }
 
+    fn overflow_hidden(&self) -> bool {
+        true
+    }
+
     fn draw(
         &self,
         node: &RsvgNode,
@@ -469,11 +469,7 @@ impl NodeSymbol {
 }
 
 impl NodeTrait for NodeSymbol {
-    fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
-        // symbol element has overflow:hidden
-        // https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-        node.set_overflow_hidden();
-
+    fn set_atts(&self, _node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
             match attr {
                 local_name!("preserveAspectRatio") => {
@@ -488,4 +484,8 @@ impl NodeTrait for NodeSymbol {
 
         Ok(())
     }
+
+    fn overflow_hidden(&self) -> bool {
+        true
+    }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]