[librsvg] filters/image.rs: Pass the Href to the worker functions, not a string



commit 26c3b08632d9ec4de2e1f84845fb780619eaef7a
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Nov 28 13:29:40 2018 -0600

    filters/image.rs: Pass the Href to the worker functions, not a string

 rsvg_internals/src/filters/image.rs | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)
---
diff --git a/rsvg_internals/src/filters/image.rs b/rsvg_internals/src/filters/image.rs
index 311e852d..f6a28d69 100644
--- a/rsvg_internals/src/filters/image.rs
+++ b/rsvg_internals/src/filters/image.rs
@@ -48,13 +48,15 @@ impl Image {
         ctx: &FilterContext,
         draw_ctx: &mut DrawingCtx<'_>,
         bounds: IRect,
-        href: &str,
+        href: &Href,
     ) -> Result<ImageSurface, FilterError> {
-        // TODO: Port more of this to Rust.
-        // Currently this is essentially a direct port of the C function.
-        let acquired_drawable = draw_ctx
-            .get_acquired_node(href)
-            .ok_or(FilterError::InvalidInput)?;
+        let url = match *href {
+            Href::FragmentId(ref f) => format!("#{}", f),
+            Href::UriWithFragmentId(ref u, ref f) => format!("{}#{}", u, f),
+            _ => unreachable!(),
+        };
+
+        let acquired_drawable = draw_ctx.get_acquired_node(&url).ok_or(FilterError::InvalidInput)?;
         let drawable = acquired_drawable.get();
 
         let surface = ImageSurface::create(
@@ -114,10 +116,16 @@ impl Image {
         ctx: &FilterContext,
         draw_ctx: &mut DrawingCtx<'_>,
         bounds_builder: BoundsBuilder<'_>,
-        uri: &str,
+        href: &Href,
     ) -> Result<ImageSurface, FilterError> {
+        let url = if let Href::PlainUri(ref url) = *href {
+            url
+        } else {
+            unreachable!();
+        };
+
         // FIXME: translate the error better here
-        let surface = handle::image_surface_new_from_href(self.handle.get() as *mut _, uri)
+        let surface = handle::image_surface_new_from_href(self.handle.get() as *mut _, url)
             .map_err(|_| FilterError::InvalidInput)?;
 
         let output_surface = ImageSurface::create(
@@ -213,10 +221,10 @@ impl Filter for Image {
         let href = Href::parse(href_str).map_err(|_| FilterError::InvalidInput)?;
 
         let output_surface = match href {
-            Href::PlainUri(ref uri) => {
-                self.render_external_image(ctx, draw_ctx, bounds_builder, uri)?
+            Href::PlainUri(_) => {
+                self.render_external_image(ctx, draw_ctx, bounds_builder, &href)?
             }
-            _ => self.render_node(ctx, draw_ctx, bounds, href_str)?,
+            _ => self.render_node(ctx, draw_ctx, bounds, &href)?,
         };
 
         Ok(FilterResult {


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