[librsvg: 4/20] New method to resolve Primitive early




commit 006dd1a6c87b647402f83059556de747acc9ff7d
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Mar 16 12:20:35 2021 -0600

    New method to resolve Primitive early
    
    Now all filters take a ResolvedPrimitive in their Render() methods.

 src/filters/blend.rs              |  4 ++--
 src/filters/color_matrix.rs       |  4 ++--
 src/filters/component_transfer.rs |  4 ++--
 src/filters/composite.rs          |  4 ++--
 src/filters/convolve_matrix.rs    |  4 ++--
 src/filters/displacement_map.rs   |  4 ++--
 src/filters/flood.rs              |  4 ++--
 src/filters/gaussian_blur.rs      |  4 ++--
 src/filters/image.rs              |  4 ++--
 src/filters/lighting.rs           |  4 ++--
 src/filters/merge.rs              |  4 ++--
 src/filters/mod.rs                | 30 ++++++++++++++++++++++++++++--
 src/filters/morphology.rs         |  4 ++--
 src/filters/offset.rs             |  4 ++--
 src/filters/tile.rs               |  4 ++--
 src/filters/turbulence.rs         |  4 ++--
 16 files changed, 58 insertions(+), 32 deletions(-)
---
diff --git a/src/filters/blend.rs b/src/filters/blend.rs
index a6ad4d6b..99f910ed 100755
--- a/src/filters/blend.rs
+++ b/src/filters/blend.rs
@@ -11,7 +11,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Enumeration of the possible blending modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -84,7 +84,7 @@ impl SetAttributes for FeBlend {
 impl Blend {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs
index eec92297..3d8681e5 100644
--- a/src/filters/color_matrix.rs
+++ b/src/filters/color_matrix.rs
@@ -16,7 +16,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Color matrix operation types.
 #[derive(Debug, Clone, Copy, Eq, PartialEq)]
@@ -150,7 +150,7 @@ impl SetAttributes for FeColorMatrix {
 impl ColorMatrix {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs
index 4904405c..14e4fd6b 100644
--- a/src/filters/component_transfer.rs
+++ b/src/filters/component_transfer.rs
@@ -17,7 +17,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feComponentTransfer` filter primitive.
 pub struct FeComponentTransfer {
@@ -297,7 +297,7 @@ macro_rules! get_func_x_node {
 impl ComponentTransfer {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/composite.rs b/src/filters/composite.rs
index 0a7b9b00..b44969a7 100644
--- a/src/filters/composite.rs
+++ b/src/filters/composite.rs
@@ -11,7 +11,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Enumeration of the possible compositing operations.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -89,7 +89,7 @@ impl SetAttributes for FeComposite {
 impl Composite {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs
index f69ffa2b..bc52f120 100644
--- a/src/filters/convolve_matrix.rs
+++ b/src/filters/convolve_matrix.rs
@@ -21,7 +21,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feConvolveMatrix` filter primitive.
 pub struct FeConvolveMatrix {
@@ -140,7 +140,7 @@ impl SetAttributes for FeConvolveMatrix {
 impl ConvolveMatrix {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/displacement_map.rs b/src/filters/displacement_map.rs
index b407ffa3..dce4c9d5 100644
--- a/src/filters/displacement_map.rs
+++ b/src/filters/displacement_map.rs
@@ -12,7 +12,7 @@ use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurf
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Enumeration of the color channels the displacement map can source.
 #[derive(Clone, Copy)]
@@ -84,7 +84,7 @@ impl SetAttributes for FeDisplacementMap {
 impl DisplacementMap {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/flood.rs b/src/filters/flood.rs
index 113cc4f4..670819f8 100644
--- a/src/filters/flood.rs
+++ b/src/filters/flood.rs
@@ -6,7 +6,7 @@ use crate::paint_server::resolve_color;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feFlood` filter primitive.
 pub struct FeFlood {
@@ -37,7 +37,7 @@ impl SetAttributes for FeFlood {
 impl Flood {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         _acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs
index 4f3e9c67..bbb87ba1 100644
--- a/src/filters/gaussian_blur.rs
+++ b/src/filters/gaussian_blur.rs
@@ -18,7 +18,7 @@ use crate::surface_utils::{
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The maximum gaussian blur kernel size.
 ///
@@ -198,7 +198,7 @@ fn gaussian_blur(
 impl GaussianBlur {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/image.rs b/src/filters/image.rs
index 85ae2a8e..29f084fa 100644
--- a/src/filters/image.rs
+++ b/src/filters/image.rs
@@ -13,7 +13,7 @@ use crate::viewbox::ViewBox;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feImage` filter primitive.
 #[derive(Clone)]
@@ -128,7 +128,7 @@ impl SetAttributes for FeImage {
 impl Image {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs
index d50ef0af..4e404184 100644
--- a/src/filters/lighting.rs
+++ b/src/filters/lighting.rs
@@ -12,7 +12,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{Draw, Element, ElementResult, SetAttributes};
 use crate::filters::{
     context::{FilterContext, FilterOutput, FilterResult},
-    FilterEffect, FilterError, Input, Primitive, PrimitiveParams,
+    FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive,
 };
 use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::paint_server::resolve_color;
@@ -430,7 +430,7 @@ macro_rules! impl_lighting_filter {
         impl $params_name {
             pub fn render(
                 &self,
-                primitive: &Primitive,
+                primitive: &ResolvedPrimitive,
                 ctx: &FilterContext,
                 acquired_nodes: &mut AcquiredNodes<'_>,
                 draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/merge.rs b/src/filters/merge.rs
index 8a1f7ab0..71352b2b 100644
--- a/src/filters/merge.rs
+++ b/src/filters/merge.rs
@@ -11,7 +11,7 @@ use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feMerge` filter primitive.
 pub struct FeMerge {
@@ -97,7 +97,7 @@ impl MergeNode {
 impl Merge {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index 988a099a..09b97db2 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -87,6 +87,14 @@ pub struct Primitive {
     result: Option<CustomIdent>,
 }
 
+pub struct ResolvedPrimitive {
+    x: Option<Length<Horizontal>>,
+    y: Option<Length<Vertical>>,
+    width: Option<ULength<Horizontal>>,
+    height: Option<ULength<Vertical>>,
+    result: Option<CustomIdent>,
+}
+
 /// An enumeration of possible inputs for a filter primitive.
 #[derive(Debug, Clone, Eq, PartialEq, Hash)]
 pub enum Input {
@@ -140,6 +148,18 @@ impl Primitive {
         }
     }
 
+    fn resolve(&self) -> Result<ResolvedPrimitive, FilterError> {
+        Ok(ResolvedPrimitive {
+            x: self.x,
+            y: self.y,
+            width: self.width,
+            height: self.height,
+            result: self.result.clone(),
+        })
+    }
+}
+
+impl ResolvedPrimitive {
     /// Validates attributes and returns the `BoundsBuilder` for bounds computation.
     #[inline]
     fn get_bounds(&self, ctx: &FilterContext) -> Result<BoundsBuilder, FilterError> {
@@ -292,7 +312,13 @@ pub fn render(
         if let Err(err) = filter
             .resolve(&c)
             .and_then(|(primitive, params)| {
-                render_primitive(&primitive, &params, &filter_ctx, acquired_nodes, draw_ctx)
+                render_primitive(
+                    &primitive.resolve()?,
+                    &params,
+                    &filter_ctx,
+                    acquired_nodes,
+                    draw_ctx,
+                )
             })
             .and_then(|result| filter_ctx.store_result(result))
         {
@@ -317,7 +343,7 @@ pub fn render(
 
 #[rustfmt::skip]
 fn render_primitive(
-    primitive: &Primitive,
+    primitive: &ResolvedPrimitive,
     params: &PrimitiveParams,
     ctx: &FilterContext,
     acquired_nodes: &mut AcquiredNodes<'_>,
diff --git a/src/filters/morphology.rs b/src/filters/morphology.rs
index b427575d..00ab4523 100644
--- a/src/filters/morphology.rs
+++ b/src/filters/morphology.rs
@@ -19,7 +19,7 @@ use crate::surface_utils::{
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Enumeration of the possible morphology operations.
 #[derive(Clone)]
@@ -78,7 +78,7 @@ impl SetAttributes for FeMorphology {
 impl Morphology {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/offset.rs b/src/filters/offset.rs
index 439313e9..4ef8aeb7 100644
--- a/src/filters/offset.rs
+++ b/src/filters/offset.rs
@@ -9,7 +9,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feOffset` filter primitive.
 #[derive(Clone)]
@@ -59,7 +59,7 @@ impl SetAttributes for FeOffset {
 impl Offset {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/tile.rs b/src/filters/tile.rs
index e192361c..6197cb09 100644
--- a/src/filters/tile.rs
+++ b/src/filters/tile.rs
@@ -6,7 +6,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterInput, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Input, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// The `feTile` filter primitive.
 #[derive(Clone)]
@@ -41,7 +41,7 @@ impl SetAttributes for FeTile {
 impl Tile {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs
index 9f8fe9b4..6acb341c 100644
--- a/src/filters/turbulence.rs
+++ b/src/filters/turbulence.rs
@@ -16,7 +16,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Primitive, PrimitiveParams};
+use super::{FilterEffect, FilterError, Primitive, PrimitiveParams, ResolvedPrimitive};
 
 /// Enumeration of the tile stitching modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -337,7 +337,7 @@ impl NoiseGenerator {
 impl Turbulence {
     pub fn render(
         &self,
-        primitive: &Primitive,
+        primitive: &ResolvedPrimitive,
         ctx: &FilterContext,
         _acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,


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