[librsvg: 15/45] Move the fallback field from CommonGradientData to NodeLinearGradient/NodeRadialGradient



commit deebf5c9502929a98676b7ba266e630f4de3a5e7
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Sep 27 09:50:30 2019 -0500

    Move the fallback field from CommonGradientData to NodeLinearGradient/NodeRadialGradient

 rsvg_internals/src/gradient.rs | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)
---
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 38d49e26..1381113d 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -84,7 +84,6 @@ struct CommonGradientData {
     units: Option<GradientUnits>,
     affine: Option<cairo::Matrix>,
     spread: Option<SpreadMethod>,
-    fallback: Option<Fragment>,
     stops: Option<Vec<ColorStop>>,
 }
 
@@ -159,8 +158,6 @@ impl Resolve for CommonGradientData {
         fallback_to!(self.affine, fallback.affine);
         fallback_to!(self.spread, fallback.spread);
         fallback_to!(self.stops, fallback.clone_stops());
-
-        self.fallback = fallback.fallback.clone();
     }
 
     fn resolve_from_defaults(&mut self) {
@@ -178,9 +175,6 @@ impl CommonGradientData {
                 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)?)
-                }
                 _ => (),
             }
         }
@@ -533,6 +527,16 @@ macro_rules! impl_node_trait {
             fn set_atts(&mut self, _: Option<&RsvgNode>, pbag: &PropertyBag<'_>) -> NodeResult {
                 self.common.set_atts(pbag)?;
                 self.variant.set_atts(pbag)?;
+
+                for (attr, value) in pbag.iter() {
+                    match attr {
+                        local_name!("xlink:href") => {
+                            self.fallback = Some(Fragment::parse(value).attribute(attr)?)
+                        }
+                        _ => (),
+                    }
+                }
+
                 Ok(())
             }
         }
@@ -545,7 +549,7 @@ macro_rules! impl_to_resolved {
             fn to_resolved(self) -> $resolved {
                 assert!(self.is_resolved());
 
-                let $gradient_type { common, variant } = self;
+                let $gradient_type { common, variant, .. } = self;
 
                 $resolved {
                     common: common.to_resolved(),
@@ -594,7 +598,7 @@ macro_rules! impl_paint_source {
                 let mut stack = NodeStack::new();
 
                 while !result.is_resolved() {
-                    let acquired = acquire_gradient(draw_ctx, result.common.fallback.as_ref());
+                    let acquired = acquire_gradient(draw_ctx, result.fallback.as_ref());
 
                     if let Some(acquired) = acquired {
                         let a_node = acquired.get();
@@ -683,6 +687,7 @@ fn acquire_gradient<'a>(
 pub struct NodeLinearGradient {
     common: CommonGradientData,
     variant: LinearGradientData,
+    fallback: Option<Fragment>,
 }
 
 pub struct ResolvedLinearGradient {
@@ -708,6 +713,7 @@ impl_paint_source!(
 pub struct NodeRadialGradient {
     common: CommonGradientData,
     variant: RadialGradientData,
+    fallback: Option<Fragment>,
 }
 
 pub struct ResolvedRadialGradient {


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