[librsvg: 2/9] node: use get_impl instead of with_impl
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 2/9] node: use get_impl instead of with_impl
- Date: Mon, 27 May 2019 14:23:15 +0000 (UTC)
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]