[librsvg/rustification] gradient.rs: Avoid copying a gradient when resolving
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/rustification] gradient.rs: Avoid copying a gradient when resolving
- Date: Thu, 1 Dec 2016 18:11:40 +0000 (UTC)
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]