[librsvg: 1/36] gradient: refactor set_atts



commit 18ab3f324599c9f5b682caa713f913da90ef838c
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Jun 30 09:08:39 2019 +0200

    gradient: refactor set_atts
    
    Delegate to the inner structs, so that code parsing common attrs
    is shared.

 rsvg_internals/src/gradient.rs | 137 ++++++++++++++++++++---------------------
 1 file changed, 67 insertions(+), 70 deletions(-)
---
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 03a95384..66c9658d 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -116,6 +116,22 @@ impl Resolve for GradientCommon {
 }
 
 impl GradientCommon {
+    fn set_atts(&mut self, pbag: &PropertyBag<'_>) -> NodeResult {
+        for (attr, value) in pbag.iter() {
+            match attr {
+                local_name!("gradientUnits") => self.units = Some(attr.parse(value)?),
+                local_name!("gradientTransform") => self.affine = Some(attr.parse(value)?),
+                local_name!("spreadMethod") => self.spread = Some(attr.parse(value)?),
+                local_name!("xlink:href") => {
+                    self.fallback = Some(Fragment::parse(value).attribute(attr)?)
+                }
+                _ => (),
+            }
+        }
+
+        Ok(())
+    }
+
     fn clone_stops(&self) -> Option<Vec<ColorStop>> {
         if let Some(ref stops) = self.stops {
             Some(stops.clone())
@@ -272,6 +288,22 @@ impl Resolve for GradientLinear {
     }
 }
 
+impl GradientLinear {
+    fn set_atts(&mut self, pbag: &PropertyBag<'_>) -> NodeResult {
+        for (attr, value) in pbag.iter() {
+            match attr {
+                local_name!("x1") => self.x1 = Some(attr.parse(value)?),
+                local_name!("y1") => self.y1 = Some(attr.parse(value)?),
+                local_name!("x2") => self.x2 = Some(attr.parse(value)?),
+                local_name!("y2") => self.y2 = Some(attr.parse(value)?),
+                _ => (),
+            }
+        }
+
+        Ok(())
+    }
+}
+
 #[derive(Copy, Clone, Default)]
 pub struct GradientRadial {
     cx: Option<LengthHorizontal>,
@@ -310,6 +342,23 @@ impl Resolve for GradientRadial {
     }
 }
 
+impl GradientRadial {
+    fn set_atts(&mut self, pbag: &PropertyBag<'_>) -> NodeResult {
+        for (attr, value) in pbag.iter() {
+            match attr {
+                local_name!("cx") => self.cx = Some(attr.parse(value)?),
+                local_name!("cy") => self.cy = Some(attr.parse(value)?),
+                local_name!("r") => self.r = Some(attr.parse(value)?),
+                local_name!("fx") => self.fx = Some(attr.parse(value)?),
+                local_name!("fy") => self.fy = Some(attr.parse(value)?),
+                _ => (),
+            }
+        }
+
+        Ok(())
+    }
+}
+
 // SVG defines radial gradients as being inside a circle (cx, cy, radius).  The
 // gradient projects out from a focus point (fx, fy), which is assumed to be
 // inside the circle, to the edge of the circle.
@@ -387,6 +436,22 @@ impl NodeTrait for NodeStop {
     }
 }
 
+macro_rules! impl_node_trait {
+    ($gradient_type:ty) => {
+        impl NodeTrait for $gradient_type {
+            fn set_atts(&self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
+                let mut common = self.common.borrow_mut();
+                common.set_atts(pbag)?;
+
+                let mut variant = self.variant.borrow_mut();
+                variant.set_atts(pbag)?;
+
+                Ok(())
+            }
+        }
+    };
+}
+
 macro_rules! impl_resolve {
     ($gradient_type:ty) => {
         impl Resolve for $gradient_type {
@@ -496,40 +561,7 @@ pub struct NodeLinearGradient {
     pub variant: RefCell<GradientLinear>,
 }
 
-impl NodeTrait for NodeLinearGradient {
-    fn set_atts(&self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
-        let mut common = self.common.borrow_mut();
-
-        let mut x1 = None;
-        let mut y1 = None;
-        let mut x2 = None;
-        let mut y2 = None;
-
-        for (attr, value) in pbag.iter() {
-            match attr {
-                // Attributes common to linear and radial gradients
-                local_name!("gradientUnits") => common.units = Some(attr.parse(value)?),
-                local_name!("gradientTransform") => common.affine = Some(attr.parse(value)?),
-                local_name!("spreadMethod") => common.spread = Some(attr.parse(value)?),
-                local_name!("xlink:href") => {
-                    common.fallback = Some(Fragment::parse(value).attribute(attr)?)
-                }
-
-                // Attributes specific to linear gradient
-                local_name!("x1") => x1 = Some(attr.parse(value)?),
-                local_name!("y1") => y1 = Some(attr.parse(value)?),
-                local_name!("x2") => x2 = Some(attr.parse(value)?),
-                local_name!("y2") => y2 = Some(attr.parse(value)?),
-
-                _ => (),
-            }
-        }
-
-        *self.variant.borrow_mut() = GradientLinear { x1, y1, x2, y2 };
-
-        Ok(())
-    }
-}
+impl_node_trait!(NodeLinearGradient);
 
 impl_resolve!(NodeLinearGradient);
 
@@ -585,42 +617,7 @@ pub struct NodeRadialGradient {
     pub variant: RefCell<GradientRadial>,
 }
 
-impl NodeTrait for NodeRadialGradient {
-    fn set_atts(&self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
-        let mut common = self.common.borrow_mut();
-
-        let mut cx = None;
-        let mut cy = None;
-        let mut r = None;
-        let mut fx = None;
-        let mut fy = None;
-
-        for (attr, value) in pbag.iter() {
-            match attr {
-                // Attributes common to linear and radial gradients
-                local_name!("gradientUnits") => common.units = Some(attr.parse(value)?),
-                local_name!("gradientTransform") => common.affine = Some(attr.parse(value)?),
-                local_name!("spreadMethod") => common.spread = Some(attr.parse(value)?),
-                local_name!("xlink:href") => {
-                    common.fallback = Some(Fragment::parse(value).attribute(attr)?)
-                }
-
-                // Attributes specific to radial gradient
-                local_name!("cx") => cx = Some(attr.parse(value)?),
-                local_name!("cy") => cy = Some(attr.parse(value)?),
-                local_name!("r") => r = Some(attr.parse(value)?),
-                local_name!("fx") => fx = Some(attr.parse(value)?),
-                local_name!("fy") => fy = Some(attr.parse(value)?),
-
-                _ => (),
-            }
-        }
-
-        *self.variant.borrow_mut() = GradientRadial { cx, cy, r, fx, fy };
-
-        Ok(())
-    }
-}
+impl_node_trait!(NodeRadialGradient);
 
 impl_resolve!(NodeRadialGradient);
 


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