[librsvg/rustification] gradient.rs: Avoid copying a gradient when resolving



commit 6438cb7e678155b58bc6189421079d2e03366482
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Dec 1 12:08:26 2016 -0600

    gradient.rs: Avoid copying a gradient when resolving
    
    We used to call into the C helper code to get a Gradient from a URI.
    Then we would clone() that gradient and operate on it.
    
    Now we operate directly on the Gradient that we got from the C helper
    code, without cloning it.  We create a box from that Gradient pointer
    and pass that Box around.  We own that Gradient, after all!

 rust/src/gradient.rs |   15 ++++++---------
 1 files changed, 6 insertions(+), 9 deletions(-)
---
diff --git a/rust/src/gradient.rs b/rust/src/gradient.rs
index aa27c9b..887f225 100644
--- a/rust/src/gradient.rs
+++ b/rust/src/gradient.rs
@@ -272,21 +272,21 @@ impl Clone for Gradient {
 }
 
 trait FallbackSource {
-    fn get_fallback (&mut self, name: &str) -> Option<Gradient>;
+    fn get_fallback (&mut self, name: &str) -> Option<Box<Gradient>>;
 }
 
 fn resolve_gradient (gradient: &Gradient, fallback_source: &mut FallbackSource) -> Gradient {
     let mut result = gradient.clone ();
 
     while !result.is_resolved () {
-        let mut opt_fallback: Option<Gradient> = None;
+        let mut opt_fallback: Option<Box<Gradient>> = None;
 
         if let Some (ref fallback_name) = result.common.fallback {
             opt_fallback = fallback_source.get_fallback (&**fallback_name);
         }
 
         if let Some (fallback_gradient) = opt_fallback {
-            result.resolve_from_fallback (&fallback_gradient);
+            result.resolve_from_fallback (&*fallback_gradient);
         } else {
             result.resolve_from_defaults ();
             break;
@@ -323,7 +323,7 @@ extern "C" {
 }
 
 impl FallbackSource for NodeFallbackSource {
-    fn get_fallback (&mut self, name: &str) -> Option<Gradient> {
+    fn get_fallback (&mut self, name: &str) -> Option<Box<Gradient>> {
         let fallback_node = drawing_ctx::acquire_node (self.draw_ctx, name);
 
         if fallback_node.is_null () {
@@ -338,12 +338,9 @@ impl FallbackSource for NodeFallbackSource {
             return None;
         }
 
-        let fallback_gradient: &mut Gradient = unsafe { &mut (*raw_fallback_gradient) };
-        let cloned = fallback_gradient.clone ();
+        let fallback_gradient = unsafe { Box::from_raw (raw_fallback_gradient) };
 
-        unsafe { gradient_destroy (raw_fallback_gradient); }
-
-        return Some (cloned);
+        return Some (fallback_gradient);
     }
 }
 


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