[librsvg: 2/9] node: use get_impl instead of with_impl



commit 26ef3bd0cef83fa4f7a04e2b3f3e4e8c41dceecd
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat May 25 18:31:46 2019 +0200

    node: use get_impl instead of with_impl
    
    Just use one way for downcasting and remove the variant with
    the closure since it is awkward.

 rsvg_internals/src/drawing_ctx.rs   | 36 ++++++++++++--------------
 rsvg_internals/src/filters/merge.rs | 18 ++++++++-----
 rsvg_internals/src/filters/mod.rs   |  2 +-
 rsvg_internals/src/gradient.rs      | 51 +++++++++++++++----------------------
 rsvg_internals/src/handle.rs        |  2 +-
 rsvg_internals/src/marker.rs        | 20 +++++++--------
 rsvg_internals/src/node.rs          | 12 ---------
 rsvg_internals/src/pattern.rs       |  5 ++--
 rsvg_internals/src/structure.rs     | 48 +++++++++++++++++-----------------
 rsvg_internals/src/style.rs         |  2 +-
 rsvg_internals/src/svg.rs           |  2 +-
 rsvg_internals/src/text.rs          | 39 ++++++++++++++++++----------
 rsvg_internals/src/xml.rs           |  6 ++---
 13 files changed, 115 insertions(+), 128 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 5d1bc254..1e2d179c 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -351,8 +351,7 @@ impl DrawingCtx {
         {
             let clip_node = clip_node.get().clone();
 
-            let ClipPathUnits(units) =
-                clip_node.with_impl(|clip_path: &NodeClipPath| clip_path.get_units());
+            let ClipPathUnits(units) = clip_node.get_impl::<NodeClipPath>().get_units();
 
             if units == CoordUnits::UserSpaceOnUse {
                 (Some(clip_node), None)
@@ -366,12 +365,11 @@ impl DrawingCtx {
     }
 
     fn clip_to_node(&mut self, clip_node: &Option<RsvgNode>) -> Result<(), RenderingError> {
-        if let Some(clip_node) = clip_node {
+        if let Some(node) = clip_node {
             let orig_bbox = self.bbox;
 
-            let res = clip_node.with_impl(|clip_path: &NodeClipPath| {
-                clip_path.to_cairo_context(&clip_node, self, &orig_bbox)
-            });
+            let clip_path = node.get_impl::<NodeClipPath>();
+            let res = clip_path.to_cairo_context(&node, self, &orig_bbox);
 
             // FIXME: this is an EPIC HACK to keep the clipping context from
             // accumulating bounding boxes.  We'll remove this later, when we
@@ -487,10 +485,10 @@ impl DrawingCtx {
                             let mask_node = acquired.get();
 
                             res = res.and_then(|_| {
-                                mask_node.with_impl(|mask: &NodeMask| {
-                                    let bbox = dc.bbox;
-                                    mask.generate_cairo_mask(&mask_node, &affines, dc, &bbox)
-                                })
+                                let bbox = dc.bbox;
+                                mask_node
+                                    .get_impl::<NodeMask>()
+                                    .generate_cairo_mask(&mask_node, &affines, dc, &bbox)
                             });
                         } else {
                             rsvg_log!("element {} references nonexistent mask \"{}\"", node, mask);
@@ -634,16 +632,14 @@ impl DrawingCtx {
                 if let Some(acquired) = self.acquired_nodes.get_node(iri) {
                     let node = acquired.get();
 
-                    if node.get_type() == NodeType::LinearGradient
-                        || node.get_type() == NodeType::RadialGradient
-                    {
-                        had_paint_server = node.with_impl(|n: &NodeGradient| {
-                            n.resolve_fallbacks_and_set_pattern(&node, self, opacity, bbox)
-                        })?;
-                    } else if node.get_type() == NodeType::Pattern {
-                        had_paint_server = node.with_impl(|n: &NodePattern| {
-                            n.resolve_fallbacks_and_set_pattern(&node, self, opacity, bbox)
-                        })?;
+                    had_paint_server = match node.get_type() {
+                        NodeType::LinearGradient | NodeType::RadialGradient => node
+                            .get_impl::<NodeGradient>()
+                            .resolve_fallbacks_and_set_pattern(&node, self, opacity, bbox)?,
+                        NodeType::Pattern => node
+                            .get_impl::<NodePattern>()
+                            .resolve_fallbacks_and_set_pattern(&node, self, opacity, bbox)?,
+                        _ => false,
                     }
                 }
 
diff --git a/rsvg_internals/src/filters/merge.rs b/rsvg_internals/src/filters/merge.rs
index e67be776..5ff87210 100644
--- a/rsvg_internals/src/filters/merge.rs
+++ b/rsvg_internals/src/filters/merge.rs
@@ -135,10 +135,11 @@ impl Filter for Merge {
                 return Err(FilterError::ChildNodeInError);
             }
 
-            bounds = bounds.add_input(
-                &child
-                    .with_impl(|c: &MergeNode| ctx.get_input(draw_ctx, c.in_.borrow().as_ref()))?,
-            );
+            let input = ctx.get_input(
+                draw_ctx,
+                child.get_impl::<MergeNode>().in_.borrow().as_ref(),
+            )?;
+            bounds = bounds.add_input(&input);
         }
         let bounds = bounds.into_irect(draw_ctx);
 
@@ -148,9 +149,12 @@ impl Filter for Merge {
             .children()
             .filter(|c| c.get_type() == NodeType::FeMergeNode)
         {
-            output_surface = Some(
-                child.with_impl(|c: &MergeNode| c.render(ctx, draw_ctx, bounds, output_surface))?,
-            );
+            output_surface = Some(child.get_impl::<MergeNode>().render(
+                ctx,
+                draw_ctx,
+                bounds,
+                output_surface,
+            )?);
         }
 
         let output_surface = match output_surface {
diff --git a/rsvg_internals/src/filters/mod.rs b/rsvg_internals/src/filters/mod.rs
index 9f18f102..971b2faa 100644
--- a/rsvg_internals/src/filters/mod.rs
+++ b/rsvg_internals/src/filters/mod.rs
@@ -118,7 +118,7 @@ impl NodeTrait for Primitive {
             .parent()
             .and_then(|parent| {
                 if parent.get_type() == NodeType::Filter {
-                    Some(parent.with_impl(|f: &NodeFilter| f.primitiveunits.get()))
+                    Some(parent.get_impl::<NodeFilter>().primitiveunits.get())
                 } else {
                     None
                 }
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index da60352c..24a567ac 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -370,33 +370,24 @@ impl Gradient {
                 || node.get_type() == NodeType::RadialGradient
         );
 
-        node.children()
-            .into_iter()
-            // just ignore this child; we are only interested in gradient stops
+        for child in node
+            .children()
             .filter(|child| child.get_type() == NodeType::Stop)
-            // don't add any more stops, Eq to break in for-loop
-            .take_while(|child| {
-                let in_error = child.is_in_error();
-
-                if in_error {
-                    rsvg_log!("(not using gradient stop {} because it is in error)", child);
-                }
-
-                !in_error
-            })
-            .for_each(|child| {
-                child.with_impl(|stop: &NodeStop| {
-                    let cascaded = CascadedValues::new_from_node(&child);
-                    let values = cascaded.get();
-
-                    let rgba = match values.stop_color {
-                        StopColor(cssparser::Color::CurrentColor) => values.color.0,
-                        StopColor(cssparser::Color::RGBA(ref rgba)) => *rgba,
-                    };
-
-                    self.add_color_stop(stop.get_offset(), rgba, values.stop_opacity.0);
-                })
-            });
+        {
+            if child.is_in_error() {
+                rsvg_log!("(not using gradient stop {} because it is in error)", child);
+            } else {
+                let offset = child.get_impl::<NodeStop>().get_offset();
+                let cascaded = CascadedValues::new_from_node(&child);
+                let values = cascaded.get();
+                let rgba = match values.stop_color {
+                    StopColor(cssparser::Color::CurrentColor) => values.color.0,
+                    StopColor(cssparser::Color::RGBA(ref rgba)) => *rgba,
+                };
+
+                self.add_color_stop(offset, rgba, values.stop_opacity.0);
+            }
+        }
     }
 
     fn add_color_stop(
@@ -549,10 +540,10 @@ impl PaintSource for NodeGradient {
                     return Err(RenderingError::CircularReference);
                 }
 
-                a_node.with_impl(|i: &NodeGradient| {
-                    let fallback_grad = i.get_gradient_with_color_stops_from_node(&a_node);
-                    result.resolve_from_fallback(&fallback_grad)
-                });
+                let fallback = a_node
+                    .get_impl::<NodeGradient>()
+                    .get_gradient_with_color_stops_from_node(&a_node);
+                result.resolve_from_fallback(&fallback);
 
                 stack.push(a_node);
                 continue;
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 1bbf5c30..4fb1846f 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -240,7 +240,7 @@ impl Handle {
             let values = cascaded.get();
 
             if let Some((root_width, root_height)) =
-                node.with_impl(|svg: &NodeSvg| svg.get_size(&values, dpi))
+                node.get_impl::<NodeSvg>().get_size(&values, dpi)
             {
                 let ink_r = RsvgRectangle {
                     x: 0.0,
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 0ae3c372..836db1c3 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -603,17 +603,15 @@ fn emit_marker_by_name(
     {
         let node = acquired.get();
 
-        node.with_impl(|marker: &NodeMarker| {
-            marker.render(
-                &node,
-                draw_ctx,
-                xpos,
-                ypos,
-                computed_angle,
-                line_width,
-                clipping,
-            )
-        })
+        node.get_impl::<NodeMarker>().render(
+            &node,
+            draw_ctx,
+            xpos,
+            ypos,
+            computed_angle,
+            line_width,
+            clipping,
+        )
     } else {
         rsvg_log!("marker \"{}\" not found", name);
         Ok(())
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index b3e55ff8..143b778b 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -488,18 +488,6 @@ impl RsvgNode {
         self.borrow().result.borrow().is_err()
     }
 
-    pub fn with_impl<T, F, U>(&self, f: F) -> U
-    where
-        T: NodeTrait,
-        F: FnOnce(&T) -> U,
-    {
-        if let Some(t) = (&self.borrow().node_impl).downcast_ref::<T>() {
-            f(t)
-        } else {
-            panic!("could not downcast");
-        }
-    }
-
     pub fn get_impl<T: NodeTrait>(&self) -> &T {
         if let Some(t) = (&self.borrow().node_impl).downcast_ref::<T>() {
             t
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index bc07ece6..a684a733 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -243,9 +243,8 @@ impl PaintSource for NodePattern {
                     return Err(RenderingError::CircularReference);
                 }
 
-                a_node.with_impl(|i: &NodePattern| {
-                    result.resolve_from_fallback(&*i.pattern.borrow())
-                });
+                let fallback = a_node.get_impl::<NodePattern>().pattern.borrow();
+                result.resolve_from_fallback(&fallback);
 
                 stack.push(a_node);
             } else {
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 8bc3809b..b35e6f37 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -53,7 +53,7 @@ impl NodeTrait for NodeGroup {
 /// render itself or its children.  This is just that kind of node.
 pub struct NodeNonRendering;
 
-impl NodeNonRendering{
+impl NodeNonRendering {
     pub fn new() -> NodeNonRendering {
         NodeNonRendering
     }
@@ -430,29 +430,29 @@ impl NodeTrait for NodeUse {
                 )
             })
         } else {
-            child.with_impl(|symbol: &NodeSymbol| {
-                let clip_mode = if !values.is_overflow()
-                    || (values.overflow == Overflow::Visible && child.is_overflow())
-                {
-                    Some(ClipMode::ClipToVbox)
-                } else {
-                    None
-                };
-
-                draw_ctx.with_discrete_layer(node, values, clipping, &mut |dc| {
-                    let _params = dc.push_new_viewport(
-                        symbol.vbox.get(),
-                        &viewport,
-                        symbol.preserve_aspect_ratio.get(),
-                        clip_mode,
-                    );
-
-                    child.draw_children(
-                        &CascadedValues::new_from_values(&child, values),
-                        dc,
-                        clipping,
-                    )
-                })
+            let symbol = child.get_impl::<NodeSymbol>();
+
+            let clip_mode = if !values.is_overflow()
+                || (values.overflow == Overflow::Visible && child.is_overflow())
+            {
+                Some(ClipMode::ClipToVbox)
+            } else {
+                None
+            };
+
+            draw_ctx.with_discrete_layer(node, values, clipping, &mut |dc| {
+                let _params = dc.push_new_viewport(
+                    symbol.vbox.get(),
+                    &viewport,
+                    symbol.preserve_aspect_ratio.get(),
+                    clip_mode,
+                );
+
+                child.draw_children(
+                    &CascadedValues::new_from_values(&child, values),
+                    dc,
+                    clipping,
+                )
             })
         }
     }
diff --git a/rsvg_internals/src/style.rs b/rsvg_internals/src/style.rs
index 4e92a9d7..61e92576 100644
--- a/rsvg_internals/src/style.rs
+++ b/rsvg_internals/src/style.rs
@@ -41,7 +41,7 @@ impl NodeStyle {
                 .into_iter()
                 .filter_map(|child| {
                     if child.get_type() == NodeType::Chars {
-                        Some(child.with_impl(|chars: &NodeChars| chars.get_string()))
+                        Some(child.get_impl::<NodeChars>().get_string())
                     } else {
                         None
                     }
diff --git a/rsvg_internals/src/svg.rs b/rsvg_internals/src/svg.rs
index 64f0cbd2..b9596061 100644
--- a/rsvg_internals/src/svg.rs
+++ b/rsvg_internals/src/svg.rs
@@ -90,7 +90,7 @@ impl Svg {
 
         assert!(root.get_type() == NodeType::Svg);
 
-        root.with_impl(|svg: &NodeSvg| svg.get_intrinsic_dimensions())
+        root.get_impl::<NodeSvg>().get_intrinsic_dimensions()
     }
 }
 
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index 68b87dcd..5890f85c 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -419,20 +419,34 @@ fn children_to_chunks(
 ) {
     for child in node.children() {
         match child.get_type() {
-            NodeType::Chars => child.with_impl(|chars: &NodeChars| {
+            NodeType::Chars => {
                 let values = cascaded.get();
-                chars.to_chunks(&child, values, chunks, dx, dy, depth);
-            }),
+                child
+                    .get_impl::<NodeChars>()
+                    .to_chunks(&child, values, chunks, dx, dy, depth);
+            }
 
-            NodeType::TSpan => child.with_impl(|tspan: &NodeTSpan| {
+            NodeType::TSpan => {
                 let cascaded = CascadedValues::new(cascaded, &child);
-                tspan.to_chunks(&child, &cascaded, draw_ctx, chunks, depth + 1);
-            }),
+                child.get_impl::<NodeTSpan>().to_chunks(
+                    &child,
+                    &cascaded,
+                    draw_ctx,
+                    chunks,
+                    depth + 1,
+                );
+            }
 
-            NodeType::TRef => child.with_impl(|tref: &NodeTRef| {
+            NodeType::TRef => {
                 let cascaded = CascadedValues::new(cascaded, &child);
-                tref.to_chunks(&child, &cascaded, draw_ctx, chunks, depth + 1);
-            }),
+                child.get_impl::<NodeTRef>().to_chunks(
+                    &child,
+                    &cascaded,
+                    draw_ctx,
+                    chunks,
+                    depth + 1,
+                );
+            }
 
             _ => (),
         }
@@ -695,10 +709,9 @@ fn extract_chars_children_to_chunks_recursively(
 ) {
     for child in node.children() {
         match child.get_type() {
-            NodeType::Chars => child.with_impl(|chars: &NodeChars| {
-                chars.to_chunks(&child, values, chunks, None, None, depth);
-            }),
-
+            NodeType::Chars => child
+                .get_impl::<NodeChars>()
+                .to_chunks(&child, values, chunks, None, None, depth),
             _ => extract_chars_children_to_chunks_recursively(chunks, &child, values, depth + 1),
         }
     }
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index 657ae1e3..9029196d 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -273,7 +273,7 @@ impl XmlState {
         let node = self.current_node.take().unwrap();
 
         if node.get_type() == NodeType::Style {
-            let css_data = node.with_impl(|style: &NodeStyle| style.get_css(&node));
+            let css_data = node.get_impl::<NodeStyle>().get_css(&node);
 
             let css_rules = self.css_rules.as_mut().unwrap();
 
@@ -309,9 +309,7 @@ impl XmlState {
                 child
             };
 
-            chars_node.with_impl(|chars: &NodeChars| {
-                chars.append(text);
-            });
+            chars_node.get_impl::<NodeChars>().append(text);
         }
     }
 


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