[librsvg: 12/15] BoundsBuilder - return a new Bounds value instead of (clipped, unclipped)
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 12/15] BoundsBuilder - return a new Bounds value instead of (clipped, unclipped)
- Date: Thu, 8 Apr 2021 22:52:27 +0000 (UTC)
commit 8e2cf0a57ab6be5f9cc09b412f2271b304571cf3
Author: Federico Mena Quintero <federico gnome org>
Date: Thu Apr 8 17:06:53 2021 -0500
BoundsBuilder - return a new Bounds value instead of (clipped, unclipped)
This renames .into_rect() to compute(), and removes .into_irect(),
since that is just .into_rect().clipped.into::<IRect>().
src/filters/blend.rs | 7 +++++--
src/filters/bounds.rs | 24 ++++++++++++++----------
src/filters/color_matrix.rs | 7 ++++++-
src/filters/component_transfer.rs | 7 ++++++-
src/filters/composite.rs | 7 +++++--
src/filters/convolve_matrix.rs | 6 +++++-
src/filters/displacement_map.rs | 7 +++++--
src/filters/flood.rs | 3 ++-
src/filters/gaussian_blur.rs | 6 +++++-
src/filters/image.rs | 24 ++++++++----------------
src/filters/lighting.rs | 6 +++++-
src/filters/merge.rs | 2 +-
src/filters/morphology.rs | 6 +++++-
src/filters/offset.rs | 7 ++++++-
src/filters/tile.rs | 3 ++-
src/filters/turbulence.rs | 3 ++-
16 files changed, 82 insertions(+), 43 deletions(-)
---
diff --git a/src/filters/blend.rs b/src/filters/blend.rs
index 63dadcd0..637f6539 100644
--- a/src/filters/blend.rs
+++ b/src/filters/blend.rs
@@ -8,6 +8,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node};
use crate::parsers::{Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
@@ -89,10 +90,12 @@ impl Blend {
&self.in2,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder
+ let bounds: IRect = bounds_builder
.add_input(&input_1)
.add_input(&input_2)
- .into_irect(ctx);
+ .compute(ctx)
+ .clipped
+ .into();
let surface = input_1.surface().compose(
input_2.surface(),
diff --git a/src/filters/bounds.rs b/src/filters/bounds.rs
index c8d946e9..48fe137e 100644
--- a/src/filters/bounds.rs
+++ b/src/filters/bounds.rs
@@ -1,5 +1,5 @@
//! Filter primitive subregion computation.
-use crate::rect::{IRect, Rect};
+use crate::rect::Rect;
use crate::transform::Transform;
use super::context::{FilterContext, FilterInput};
@@ -25,6 +25,15 @@ pub struct BoundsBuilder {
rect: Option<Rect>,
}
+/// A filter primitive's subregion.
+pub struct Bounds {
+ /// Primitive's subregion, clipped to the filter effects region.
+ pub clipped: Rect,
+
+ /// Primitive's subregion, unclipped.
+ pub unclipped: Rect,
+}
+
impl BoundsBuilder {
/// Constructs a new `BoundsBuilder`.
#[inline]
@@ -71,7 +80,7 @@ impl BoundsBuilder {
}
/// Returns the final exact bounds, both with and without clipping to the effects region.
- pub fn into_rect(self, ctx: &FilterContext) -> (Rect, Rect) {
+ pub fn compute(self, ctx: &FilterContext) -> Bounds {
let effects_region = ctx.effects_region();
// The default value is the filter effects region converted into
@@ -103,17 +112,12 @@ impl BoundsBuilder {
}
// Convert into the surface coordinate system.
- let unclipped_rect = self.transform.transform_rect(&rect);
+ let unclipped = self.transform.transform_rect(&rect);
- let clipped_rect = unclipped_rect
+ let clipped = unclipped
.intersection(&effects_region)
.unwrap_or_else(Rect::default);
- (clipped_rect, unclipped_rect)
- }
-
- /// Returns the final pixel bounds, clipped to the effects region.
- pub fn into_irect(self, ctx: &FilterContext) -> IRect {
- self.into_rect(ctx).0.into()
+ Bounds { clipped, unclipped }
}
}
diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs
index 73e9c939..76bd198f 100644
--- a/src/filters/color_matrix.rs
+++ b/src/filters/color_matrix.rs
@@ -9,6 +9,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node};
use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::surface_utils::{
iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
};
@@ -163,7 +164,11 @@ impl ColorMatrix {
&self.in1,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let mut surface = ExclusiveImageSurface::new(
ctx.source_graphic().width(),
diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs
index 49448723..c6031d60 100644
--- a/src/filters/component_transfer.rs
+++ b/src/filters/component_transfer.rs
@@ -10,6 +10,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node, NodeBorrow};
use crate::parsers::{NumberList, NumberListLength, Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::surface_utils::{
iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
};
@@ -300,7 +301,11 @@ impl ComponentTransfer {
&self.in1,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
// Create the output surface.
let mut surface = ExclusiveImageSurface::new(
diff --git a/src/filters/composite.rs b/src/filters/composite.rs
index 082f98ac..a0707242 100644
--- a/src/filters/composite.rs
+++ b/src/filters/composite.rs
@@ -8,6 +8,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node};
use crate::parsers::{Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
@@ -88,10 +89,12 @@ impl Composite {
&self.in2,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder
+ let bounds: IRect = bounds_builder
.add_input(&input_1)
.add_input(&input_2)
- .into_irect(ctx);
+ .compute(ctx)
+ .clipped
+ .into();
let surface = if self.operator == Operator::Arithmetic {
input_1.surface().compose_arithmetic(
diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs
index 168fd993..0bfad70a 100644
--- a/src/filters/convolve_matrix.rs
+++ b/src/filters/convolve_matrix.rs
@@ -150,7 +150,11 @@ impl ConvolveMatrix {
&self.in1,
self.color_interpolation_filters,
)?;
- let mut bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let mut bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let original_bounds = bounds;
let target_x = match self.target_x {
diff --git a/src/filters/displacement_map.rs b/src/filters/displacement_map.rs
index 31a0fb3b..2d84967b 100644
--- a/src/filters/displacement_map.rs
+++ b/src/filters/displacement_map.rs
@@ -8,6 +8,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node};
use crate::parsers::{Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurface};
use crate::xml::Attributes;
@@ -93,10 +94,12 @@ impl DisplacementMap {
&self.in2,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder
+ let bounds: IRect = bounds_builder
.add_input(&input_1)
.add_input(&displacement_input)
- .into_irect(ctx);
+ .compute(ctx)
+ .clipped
+ .into();
// Displacement map's values need to be non-premultiplied.
let displacement_surface = displacement_input.surface().unpremultiply(bounds)?;
diff --git a/src/filters/flood.rs b/src/filters/flood.rs
index 9371dcae..dee1b01a 100644
--- a/src/filters/flood.rs
+++ b/src/filters/flood.rs
@@ -3,6 +3,7 @@ use crate::drawing_ctx::DrawingCtx;
use crate::element::{ElementResult, SetAttributes};
use crate::node::{CascadedValues, Node};
use crate::paint_server::resolve_color;
+use crate::rect::IRect;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
@@ -34,7 +35,7 @@ impl Flood {
_acquired_nodes: &mut AcquiredNodes<'_>,
_draw_ctx: &mut DrawingCtx,
) -> Result<FilterOutput, FilterError> {
- let bounds = bounds_builder.into_irect(ctx);
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
let surface = ctx.source_graphic().flood(bounds, self.color)?;
diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs
index 3699990d..6a44235b 100644
--- a/src/filters/gaussian_blur.rs
+++ b/src/filters/gaussian_blur.rs
@@ -199,7 +199,11 @@ impl GaussianBlur {
&self.in1,
self.color_interpolation_filters,
)?;
- let bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let (std_x, std_y) = self.std_deviation;
let (std_x, std_y) = ctx.paffine().transform_distance(std_x, std_y);
diff --git a/src/filters/image.rs b/src/filters/image.rs
index d68caa54..3e2614bb 100644
--- a/src/filters/image.rs
+++ b/src/filters/image.rs
@@ -13,7 +13,7 @@ use crate::surface_utils::shared_surface::SharedImageSurface;
use crate::viewbox::ViewBox;
use crate::xml::Attributes;
-use super::bounds::BoundsBuilder;
+use super::bounds::{Bounds, BoundsBuilder};
use super::context::{FilterContext, FilterOutput};
use super::{FilterEffect, FilterError, Primitive, PrimitiveParams};
@@ -79,8 +79,7 @@ impl Image {
ctx: &FilterContext,
acquired_nodes: &mut AcquiredNodes<'_>,
_draw_ctx: &DrawingCtx,
- bounds: Rect,
- unclipped_bounds: &Rect,
+ bounds: &Bounds,
url: &str,
) -> Result<SharedImageSurface, FilterError> {
// FIXME: translate the error better here
@@ -93,12 +92,12 @@ impl Image {
f64::from(image.width()),
f64::from(image.height()),
)),
- &unclipped_bounds,
+ &bounds.unclipped,
);
let surface = ctx
.source_graphic()
- .paint_image(bounds, &image, Some(rect))?;
+ .paint_image(bounds.clipped, &image, Some(rect))?;
Ok(surface)
}
@@ -135,27 +134,20 @@ impl Image {
acquired_nodes: &mut AcquiredNodes<'_>,
draw_ctx: &mut DrawingCtx,
) -> Result<FilterOutput, FilterError> {
- let (bounds, unclipped_bounds) = bounds_builder.into_rect(ctx);
+ let bounds = bounds_builder.compute(ctx);
let href = self.params.href.as_ref().ok_or(FilterError::InvalidInput)?;
let surface = if let Ok(node_id) = NodeId::parse(href) {
// if href has a fragment specified, render as a node
- self.render_node(ctx, acquired_nodes, draw_ctx, bounds, &node_id)
+ self.render_node(ctx, acquired_nodes, draw_ctx, bounds.clipped, &node_id)
} else {
- self.render_external_image(
- ctx,
- acquired_nodes,
- draw_ctx,
- bounds,
- &unclipped_bounds,
- href,
- )
+ self.render_external_image(ctx, acquired_nodes, draw_ctx, &bounds, href)
}?;
Ok(FilterOutput {
surface,
- bounds: bounds.into(),
+ bounds: bounds.clipped.into(),
})
}
}
diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs
index ea192705..fb5d6690 100644
--- a/src/filters/lighting.rs
+++ b/src/filters/lighting.rs
@@ -449,7 +449,11 @@ macro_rules! impl_lighting_filter {
&self.params.in1,
self.light.color_interpolation_filters,
)?;
- let mut bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let mut bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let original_bounds = bounds;
let scale = self
diff --git a/src/filters/merge.rs b/src/filters/merge.rs
index 3dd679c0..bf0b4ef0 100644
--- a/src/filters/merge.rs
+++ b/src/filters/merge.rs
@@ -114,7 +114,7 @@ impl Merge {
bounds_builder = bounds_builder.add_input(&input);
}
- let bounds = bounds_builder.into_irect(ctx);
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
// Now merge them all.
let mut output_surface = None;
diff --git a/src/filters/morphology.rs b/src/filters/morphology.rs
index 295e6696..073fdcf8 100644
--- a/src/filters/morphology.rs
+++ b/src/filters/morphology.rs
@@ -87,7 +87,11 @@ impl Morphology {
&self.in1,
ColorInterpolationFilters::Auto,
)?;
- let bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let (rx, ry) = self.radius;
let (rx, ry) = ctx.paffine().transform_distance(rx, ry);
diff --git a/src/filters/offset.rs b/src/filters/offset.rs
index 98c11a72..e97369d6 100644
--- a/src/filters/offset.rs
+++ b/src/filters/offset.rs
@@ -6,6 +6,7 @@ use crate::element::{ElementResult, SetAttributes};
use crate::node::Node;
use crate::parsers::ParseValue;
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
@@ -64,7 +65,11 @@ impl Offset {
&self.in1,
ColorInterpolationFilters::Auto,
)?;
- let bounds = bounds_builder.add_input(&input_1).into_irect(ctx);
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
let (dx, dy) = ctx.paffine().transform_distance(self.dx, self.dy);
diff --git a/src/filters/tile.rs b/src/filters/tile.rs
index 1683080d..6f431fbc 100644
--- a/src/filters/tile.rs
+++ b/src/filters/tile.rs
@@ -3,6 +3,7 @@ use crate::drawing_ctx::DrawingCtx;
use crate::element::{ElementResult, SetAttributes};
use crate::node::Node;
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
@@ -52,7 +53,7 @@ impl Tile {
)?;
// feTile doesn't consider its inputs in the filter primitive subregion calculation.
- let bounds = bounds_builder.into_irect(ctx);
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
let surface = match input_1 {
FilterInput::StandardInput(input_surface) => input_surface,
diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs
index f1bde0f6..02694185 100644
--- a/src/filters/turbulence.rs
+++ b/src/filters/turbulence.rs
@@ -8,6 +8,7 @@ use crate::error::*;
use crate::node::{CascadedValues, Node};
use crate::parsers::{NonNegative, NumberOptionalNumber, Parse, ParseValue};
use crate::property_defs::ColorInterpolationFilters;
+use crate::rect::IRect;
use crate::surface_utils::{
shared_surface::{ExclusiveImageSurface, SurfaceType},
ImageSurfaceDataExt, Pixel, PixelOps,
@@ -347,7 +348,7 @@ impl Turbulence {
_acquired_nodes: &mut AcquiredNodes<'_>,
_draw_ctx: &mut DrawingCtx,
) -> Result<FilterOutput, FilterError> {
- let bounds = bounds_builder.into_irect(ctx);
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
let affine = ctx.paffine().invert().unwrap();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]