[librsvg: 15/22] Make get_node_from_type() return a Result, not an Option
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 15/22] Make get_node_from_type() return a Result, not an Option
- Date: Wed, 2 Oct 2019 21:44:53 +0000 (UTC)
commit 8a90d6cdc9f5aa3322db2447a936a73ae4a8ec92
Author: Federico Mena Quintero <federico gnome org>
Date: Wed Oct 2 09:11:00 2019 -0500
Make get_node_from_type() return a Result, not an Option
rsvg_internals/src/drawing_ctx.rs | 19 +++++++++----------
rsvg_internals/src/marker.rs | 2 +-
rsvg_internals/src/pattern.rs | 38 +++++++++++++++++++++-----------------
3 files changed, 31 insertions(+), 28 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 08cb19b6..69574cad 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -11,7 +11,7 @@ use crate::bbox::BoundingBox;
use crate::clip_path::{ClipPathUnits, NodeClipPath};
use crate::coord_units::CoordUnits;
use crate::dpi::Dpi;
-use crate::error::RenderingError;
+use crate::error::{AcquireError, RenderingError};
use crate::filters;
use crate::gradient::{NodeLinearGradient, NodeRadialGradient};
use crate::length::Dasharray;
@@ -341,7 +341,7 @@ impl DrawingCtx {
) -> (Option<RsvgNode>, Option<RsvgNode>) {
clip_uri
.and_then(|fragment| {
- self.acquired_nodes.get_node_of_type(fragment, NodeType::ClipPath)
+ self.acquired_nodes.get_node_of_type(fragment, NodeType::ClipPath).ok()
})
.and_then(|acquired| {
let clip_node = acquired.get().clone();
@@ -470,7 +470,7 @@ impl DrawingCtx {
// Mask
if let Some(fragment) = mask {
- if let Some(acquired) = dc
+ if let Ok(acquired) = dc
.acquired_nodes
.get_node_of_type(fragment, NodeType::Mask)
{
@@ -553,7 +553,7 @@ impl DrawingCtx {
.acquired_nodes
.get_node_of_type(filter_uri, NodeType::Filter)
{
- Some(acquired) => {
+ Ok(acquired) => {
let filter_node = acquired.get();
if !filter_node.borrow().is_in_error() {
@@ -564,7 +564,7 @@ impl DrawingCtx {
}
}
- None => {
+ Err(_) => {
rsvg_log!(
"element {} will not be rendered since its filter \"{}\" was not found",
node,
@@ -1117,19 +1117,18 @@ impl AcquiredNodes {
// Note that if you acquire a node, you have to release it before trying to
// acquire it again. If you acquire a node "#foo" and don't release it before
// trying to acquire "foo" again, you will obtain a None the second time.
-
- // FIXME: return a Result<AcquiredNode, RenderingError::InvalidReference>
pub fn get_node_of_type(
&self,
fragment: &Fragment,
node_type: NodeType,
- ) -> Option<AcquiredNode> {
+ ) -> Result<AcquiredNode, AcquireError> {
self.get_node(fragment)
+ .ok_or_else(|| AcquireError::LinkNotFound(fragment.clone()))
.and_then(|acquired| {
if acquired.get().borrow().get_type() == node_type {
- Some(acquired)
+ Ok(acquired)
} else {
- None
+ Err(AcquireError::InvalidLinkType(fragment.clone()))
}
})
}
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 3418234b..18c9c70b 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -588,7 +588,7 @@ fn emit_marker_by_name(
line_width: f64,
clipping: bool,
) -> Result<BoundingBox, RenderingError> {
- if let Some(acquired) = draw_ctx
+ if let Ok(acquired) = draw_ctx
.acquired_nodes()
.get_node_of_type(name, NodeType::Marker)
{
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index 80184847..e1ec12bb 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -170,29 +170,33 @@ impl PaintSource for NodePattern {
while !pattern.is_resolved() {
if let Some(ref fragment) = fallback {
- if let Some(acquired) = draw_ctx
- .acquired_nodes()
- .get_node_of_type(&fragment, NodeType::Pattern)
- {
- let acquired_node = acquired.get();
-
- if stack.contains(acquired_node) {
- return Err(AcquireError::CircularReference(fragment.clone()));
- }
+ match draw_ctx.acquired_nodes().get_node_of_type(&fragment, NodeType::Pattern) {
+ Ok(acquired) => {
+ let acquired_node = acquired.get();
+
+ if stack.contains(acquired_node) {
+ return Err(AcquireError::CircularReference(fragment.clone()));
+ }
- let borrowed_node = acquired_node.borrow();
- let borrowed_pattern = borrowed_node.get_impl::<NodePattern>();
- let unresolved = borrowed_pattern.get_unresolved(&acquired_node);
+ let borrowed_node = acquired_node.borrow();
+ let borrowed_pattern = borrowed_node.get_impl::<NodePattern>();
+ let unresolved = borrowed_pattern.get_unresolved(&acquired_node);
- pattern = pattern.resolve_from_fallback(&unresolved.pattern);
- fallback = unresolved.fallback;
+ pattern = pattern.resolve_from_fallback(&unresolved.pattern);
+ fallback = unresolved.fallback;
- stack.push(acquired_node);
- } else {
- pattern = pattern.resolve_from_defaults();
+ stack.push(acquired_node);
+ }
+
+ Err(e) => {
+ rsvg_log!("Stopping pattern resolution: {}", e);
+ pattern = pattern.resolve_from_defaults();
+ break;
+ }
}
} else {
pattern = pattern.resolve_from_defaults();
+ break;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]