[librsvg: 4/20] New method to resolve Primitive early
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 4/20] New method to resolve Primitive early
- Date: Wed, 17 Mar 2021 19:08:05 +0000 (UTC)
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, ¶ms, &filter_ctx, acquired_nodes, draw_ctx)
+ render_primitive(
+ &primitive.resolve()?,
+ ¶ms,
+ &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]