[librsvg: 1/36] gradient: refactor set_atts
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 1/36] gradient: refactor set_atts
- Date: Mon, 1 Jul 2019 01:53:43 +0000 (UTC)
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]