[librsvg: 3/9] Do not consume the stroke_paint / fill_paint in filters::render()




commit 309a29df049780959bca9efd85c7113e9999456f
Author: Federico Mena Quintero <federico gnome org>
Date:   Mon Apr 19 14:14:41 2021 -0500

    Do not consume the stroke_paint / fill_paint in filters::render()
    
    We pass a Rc<UserSpacePaintSource> for both arguments now.  This could
    be done by passing &UserSpacePaintSource and keeping lifetimes in
    FilterContext, but maybe Rc is easier for now?

 src/drawing_ctx.rs     | 34 +++++++++++++++++++++-------------
 src/filters/context.rs |  9 +++++----
 src/filters/mod.rs     |  5 +++--
 3 files changed, 29 insertions(+), 19 deletions(-)
---
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index d4a61254..e5382372 100644
--- a/src/drawing_ctx.rs
+++ b/src/drawing_ctx.rs
@@ -949,22 +949,30 @@ impl DrawingCtx {
                             return Ok(surface_to_filter);
                         }
 
-                        let stroke_paint_source = values
-                            .stroke()
-                            .0
-                            .resolve(acquired_nodes, values.stroke_opacity().0, values.color().0)?
-                            .to_user_space(&node_bbox, self, values);
-
-                        let fill_paint_source = values
-                            .fill()
-                            .0
-                            .resolve(acquired_nodes, values.fill_opacity().0, values.color().0)?
-                            .to_user_space(&node_bbox, self, values);
+                        let stroke_paint_source = Rc::new(
+                            values
+                                .stroke()
+                                .0
+                                .resolve(
+                                    acquired_nodes,
+                                    values.stroke_opacity().0,
+                                    values.color().0,
+                                )?
+                                .to_user_space(&node_bbox, self, values),
+                        );
+
+                        let fill_paint_source = Rc::new(
+                            values
+                                .fill()
+                                .0
+                                .resolve(acquired_nodes, values.fill_opacity().0, values.color().0)?
+                                .to_user_space(&node_bbox, self, values),
+                        );
 
                         return filters::render(
                             &node,
-                            stroke_paint_source,
-                            fill_paint_source,
+                            stroke_paint_source.clone(),
+                            fill_paint_source.clone(),
                             surface_to_filter,
                             acquired_nodes,
                             self,
diff --git a/src/filters/context.rs b/src/filters/context.rs
index b37282c9..a391f1a8 100644
--- a/src/filters/context.rs
+++ b/src/filters/context.rs
@@ -1,5 +1,6 @@
 use once_cell::sync::OnceCell;
 use std::collections::HashMap;
+use std::rc::Rc;
 
 use crate::bbox::BoundingBox;
 use crate::coord_units::CoordUnits;
@@ -48,9 +49,9 @@ pub enum FilterInput {
 /// The filter rendering context.
 pub struct FilterContext {
     /// Paint source for primitives which have an input value equal to `StrokePaint`.
-    stroke_paint: UserSpacePaintSource,
+    stroke_paint: Rc<UserSpacePaintSource>,
     /// Paint source for primitives which have an input value equal to `FillPaint`.
-    fill_paint: UserSpacePaintSource,
+    fill_paint: Rc<UserSpacePaintSource>,
 
     /// The source graphic surface.
     source_surface: SharedImageSurface,
@@ -100,8 +101,8 @@ impl FilterContext {
     /// Creates a new `FilterContext`.
     pub fn new(
         filter: &UserSpaceFilter,
-        stroke_paint: UserSpacePaintSource,
-        fill_paint: UserSpacePaintSource,
+        stroke_paint: Rc<UserSpacePaintSource>,
+        fill_paint: Rc<UserSpacePaintSource>,
         source_surface: &SharedImageSurface,
         draw_transform: Transform,
         node_bbox: BoundingBox,
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index ed2961aa..57f7c9a2 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -2,6 +2,7 @@
 
 use cssparser::{BasicParseError, Parser};
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use std::rc::Rc;
 use std::time::Instant;
 
 use crate::bbox::BoundingBox;
@@ -316,8 +317,8 @@ pub fn extract_filter_from_filter_node(
 /// Applies a filter and returns the resulting surface.
 pub fn render(
     filter_node: &Node,
-    stroke_paint_source: UserSpacePaintSource,
-    fill_paint_source: UserSpacePaintSource,
+    stroke_paint_source: Rc<UserSpacePaintSource>,
+    fill_paint_source: Rc<UserSpacePaintSource>,
     source_surface: SharedImageSurface,
     acquired_nodes: &mut AcquiredNodes<'_>,
     draw_ctx: &mut DrawingCtx,


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