[librsvg: 13/23] feGaussianBlur - resolve and render separately




commit a2a5379b26b55a875711e7a618487b8154b5b46f
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Mar 11 15:35:24 2021 -0600

    feGaussianBlur - resolve and render separately

 src/filters/gaussian_blur.rs | 33 +++++++++++++++++++++++++--------
 src/filters/mod.rs           |  5 ++---
 2 files changed, 27 insertions(+), 11 deletions(-)
---
diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs
index 3351f9c4..9e013839 100644
--- a/src/filters/gaussian_blur.rs
+++ b/src/filters/gaussian_blur.rs
@@ -9,6 +9,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{ElementResult, SetAttributes};
 use crate::node::{CascadedValues, Node};
 use crate::parsers::{NonNegative, NumberOptionalNumber, ParseValue};
+use crate::property_defs::ColorInterpolationFilters;
 use crate::rect::IRect;
 use crate::surface_utils::{
     shared_surface::{BlurDirection, Horizontal, SharedImageSurface, Vertical},
@@ -31,6 +32,14 @@ pub struct FeGaussianBlur {
     std_deviation: (f64, f64),
 }
 
+/// Resolved `feGaussianBlur` primitive for rendering.
+pub struct GaussianBlur {
+    base: Primitive,
+    in1: Input,
+    std_deviation: (f64, f64),
+    color_interpolation_filters: ColorInterpolationFilters,
+}
+
 impl Default for FeGaussianBlur {
     /// Constructs a new `GaussianBlur` with empty properties.
     #[inline]
@@ -187,19 +196,19 @@ fn gaussian_blur(
     )?)
 }
 
-impl FeGaussianBlur {
+impl GaussianBlur {
     pub fn render(
         &self,
-        node: &Node,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
     ) -> Result<FilterResult, FilterError> {
-        let cascaded = CascadedValues::new_from_node(node);
-        let values = cascaded.get();
-        let cif = values.color_interpolation_filters();
-
-        let input_1 = ctx.get_input(acquired_nodes, draw_ctx, &self.in1, cif)?;
+        let input_1 = ctx.get_input(
+            acquired_nodes,
+            draw_ctx,
+            &self.in1,
+            self.color_interpolation_filters,
+        )?;
         let bounds = self
             .base
             .get_bounds(ctx)?
@@ -249,6 +258,14 @@ impl FeGaussianBlur {
 
 impl FilterEffect for FeGaussianBlur {
     fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
-        Ok(PrimitiveParams::GaussianBlur(node.clone()))
+        let cascaded = CascadedValues::new_from_node(node);
+        let values = cascaded.get();
+
+        Ok(PrimitiveParams::GaussianBlur(GaussianBlur {
+            base: self.base.clone(),
+            in1: self.in1.clone(),
+            std_deviation: self.std_deviation.clone(),
+            color_interpolation_filters: values.color_interpolation_filters(),
+        }))
     }
 }
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index 80eb5665..ef3ebce9 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -52,7 +52,6 @@ pub mod offset;
 pub mod tile;
 pub mod turbulence;
 
-use gaussian_blur::FeGaussianBlur;
 use image::FeImage;
 use lighting::{FeDiffuseLighting, FeSpecularLighting};
 use merge::FeMerge;
@@ -76,7 +75,7 @@ pub enum PrimitiveParams {
     DiffuseLighting(Node),
     DisplacementMap(displacement_map::DisplacementMap),
     Flood(flood::Flood),
-    GaussianBlur(Node),
+    GaussianBlur(gaussian_blur::GaussianBlur),
     Image(Node),
     Merge(Node),
     Morphology(Node),
@@ -327,7 +326,7 @@ fn render_primitive(
         (Element::FeDiffuseLighting(ref inner), DiffuseLighting(node))     => 
FeDiffuseLighting::render(&inner.element_impl, &node, ctx, acquired_nodes, draw_ctx),
         (Element::FeDisplacementMap(_), DisplacementMap(p))     => p.render(ctx, acquired_nodes, draw_ctx),
         (Element::FeFlood(_), Flood(p))                         => p.render(ctx, acquired_nodes, draw_ctx),
-        (Element::FeGaussianBlur(ref inner), GaussianBlur(node))           => 
FeGaussianBlur::render(&inner.element_impl, &node, ctx, acquired_nodes, draw_ctx),
+        (Element::FeGaussianBlur(_), GaussianBlur(p))           => p.render(ctx, acquired_nodes, draw_ctx),
         (Element::FeImage(ref inner), Image(node))                         => 
FeImage::render(&inner.element_impl, &node, ctx, acquired_nodes, draw_ctx),
         (Element::FeMerge(ref inner), Merge(node))                         => 
FeMerge::render(&inner.element_impl, &node, ctx, acquired_nodes, draw_ctx),
         (Element::FeMorphology(ref inner), Morphology(node))               => 
FeMorphology::render(&inner.element_impl, &node, ctx, acquired_nodes, draw_ctx),


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