[librsvg] Defs::lookup() - Take a Fragment, not just any Href that may not have one
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] Defs::lookup() - Take a Fragment, not just any Href that may not have one
- Date: Thu, 29 Nov 2018 18:06:30 +0000 (UTC)
commit eaab71ba7197fc26d859f32d0c2e3c1e23c76a53
Author: Federico Mena Quintero <federico gnome org>
Date: Thu Nov 29 10:06:29 2018 -0600
Defs::lookup() - Take a Fragment, not just any Href that may not have one
rsvg_internals/src/defs.rs | 45 ++++++++++++++++++++-------------------
rsvg_internals/src/drawing_ctx.rs | 7 +++++-
2 files changed, 29 insertions(+), 23 deletions(-)
---
diff --git a/rsvg_internals/src/defs.rs b/rsvg_internals/src/defs.rs
index 53ef3c72..c156bd01 100644
--- a/rsvg_internals/src/defs.rs
+++ b/rsvg_internals/src/defs.rs
@@ -28,26 +28,23 @@ impl Defs {
self.nodes.entry(id.to_string()).or_insert(node.clone());
}
- /// Returns a node from an URI reference, or `None`
+ /// Returns a node referenced by a fragment ID
///
- /// This may return a node within the same RSVG handle, or a node in a secondary RSVG
- /// handle that is referenced by the current one. If the element's id is not found,
- /// returns `None`.
- pub fn lookup(&mut self, handle: *const RsvgHandle, reference: &Href) -> Option<&Rc<Node>> {
- match reference {
- Href::PlainUri(_) => None,
- Href::WithFragment(ref fragment) => {
- if let Some(ref href) = fragment.uri() {
- match self.get_extern_handle(handle, href) {
- Ok(extern_handle) => handle::get_defs(extern_handle)
- .nodes
- .get(fragment.fragment()),
- Err(()) => None,
- }
- } else {
- self.nodes.get(fragment.fragment())
- }
+ /// If the `Fragment`'s URL is `None`, then the fragment ID refers
+ /// to the RSVG handle in question. Otherwise, it will refer to
+ /// an externally-loaded SVG file that is referenced by the
+ /// current one. If the element's id is not found, returns
+ /// `None`.
+ pub fn lookup(&mut self, handle: *const RsvgHandle, fragment: &Fragment) -> Option<&Rc<Node>> {
+ if let Some(ref href) = fragment.uri() {
+ match self.get_extern_handle(handle, href) {
+ Ok(extern_handle) => handle::get_defs(extern_handle)
+ .nodes
+ .get(fragment.fragment()),
+ Err(()) => None,
}
+ } else {
+ self.nodes.get(fragment.fragment())
}
}
@@ -187,14 +184,18 @@ pub extern "C" fn rsvg_defs_lookup(
let defs = unsafe { &mut *(defs as *mut Defs) };
let name = unsafe { utf8_cstr(name) };
- let r = Href::parse(name);
+ let r = Href::with_fragment(name);
if r.is_err() {
return ptr::null();
}
- match defs.lookup(handle, &r.unwrap()) {
- Some(n) => n as *const RsvgNode,
- None => ptr::null(),
+ match r.unwrap() {
+ Href::WithFragment(fragment) => match defs.lookup(handle, &fragment) {
+ Some(n) => n as *const RsvgNode,
+ None => ptr::null(),
+ },
+
+ _ => unreachable!(),
}
}
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index a2303876..15d8f895 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -294,7 +294,12 @@ impl<'a> DrawingCtx<'a> {
pub fn get_acquired_node(&mut self, url: &str) -> Option<AcquiredNode> {
let href = Href::parse(url).ok()?;
- if let Some(node) = self.defs.borrow_mut().lookup(self.handle, &href) {
+ let fragment = match href {
+ Href::WithFragment(f) => f,
+ _ => return None,
+ };
+
+ if let Some(node) = self.defs.borrow_mut().lookup(self.handle, &fragment) {
if !self.acquired_nodes_contains(node) {
self.acquired_nodes.borrow_mut().push(node.clone());
let acq = AcquiredNode(self.acquired_nodes.clone(), node.clone());
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]