[librsvg: 1/20] filters::render() - Resolve the StrokePaint/FillPaint here, not deep inside FilterContext::get_input
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 1/20] filters::render() - Resolve the StrokePaint/FillPaint here, not deep inside FilterContext::get_input
- Date: Wed, 17 Mar 2021 19:08:05 +0000 (UTC)
commit a82d54ab55102407d22512e790b05aad7136f86f
Author: Federico Mena Quintero <federico gnome org>
Date: Fri Mar 12 13:16:41 2021 -0600
filters::render() - Resolve the StrokePaint/FillPaint here, not deep inside FilterContext::get_input
This lets us avoid using the computed_from_node_being_filtered deep in
there.
I was surprised to see that this makes FilterContext.node_bbox
unnecessary; it was just being used to compute the StrokePaint/FillPaint.
src/filters/context.rs | 34 +++++++++++++---------------------
src/filters/mod.rs | 17 +++++++++++++++++
2 files changed, 30 insertions(+), 21 deletions(-)
---
diff --git a/src/filters/context.rs b/src/filters/context.rs
index 172ff894..e377289c 100644
--- a/src/filters/context.rs
+++ b/src/filters/context.rs
@@ -6,6 +6,7 @@ use crate::coord_units::CoordUnits;
use crate::document::AcquiredNodes;
use crate::drawing_ctx::DrawingCtx;
use crate::filter::Filter;
+use crate::paint_server::UserSpacePaintSource;
use crate::parsers::CustomIdent;
use crate::properties::ComputedValues;
use crate::property_defs::ColorInterpolationFilters;
@@ -47,10 +48,14 @@ pub enum FilterInput {
/// The filter rendering context.
pub struct FilterContext {
- /// Bounding box of node being filtered
- node_bbox: BoundingBox,
/// Values from the node which referenced this filter.
computed_from_node_being_filtered: ComputedValues,
+
+ /// Paint source for primitives which have an input value equal to `StrokePaint`.
+ stroke_paint: UserSpacePaintSource,
+ /// Paint source for primitives which have an input value equal to `FillPaint`.
+ fill_paint: UserSpacePaintSource,
+
/// The source graphic surface.
source_surface: SharedImageSurface,
/// Output of the last filter primitive.
@@ -100,6 +105,8 @@ impl FilterContext {
pub fn new(
filter: &Filter,
computed_from_node_being_filtered: &ComputedValues,
+ stroke_paint: UserSpacePaintSource,
+ fill_paint: UserSpacePaintSource,
source_surface: SharedImageSurface,
draw_ctx: &mut DrawingCtx,
draw_transform: Transform,
@@ -160,8 +167,9 @@ impl FilterContext {
};
Self {
- node_bbox,
computed_from_node_being_filtered: computed_from_node_being_filtered.clone(),
+ stroke_paint,
+ fill_paint,
source_surface,
last_result: None,
previous_results: HashMap::new(),
@@ -207,20 +215,12 @@ impl FilterContext {
draw_ctx: &mut DrawingCtx,
) -> Result<SharedImageSurface, FilterError> {
let res = self.stroke_paint_surface.get_or_init(|| {
- let values = &self.computed_from_node_being_filtered;
-
- let stroke_paint_source = values
- .stroke()
- .0
- .resolve(acquired_nodes, values.stroke_opacity().0, values.color().0)?
- .to_user_space(&self.node_bbox, draw_ctx, values);
-
draw_ctx
.get_paint_source_surface(
self.source_surface.width(),
self.source_surface.height(),
acquired_nodes,
- &stroke_paint_source,
+ &self.stroke_paint,
)
.map_err(FilterError::CairoError)
});
@@ -237,20 +237,12 @@ impl FilterContext {
draw_ctx: &mut DrawingCtx,
) -> Result<SharedImageSurface, FilterError> {
let res = self.fill_paint_surface.get_or_init(|| {
- let values = &self.computed_from_node_being_filtered;
-
- let fill_paint_source = values
- .fill()
- .0
- .resolve(acquired_nodes, values.fill_opacity().0, values.color().0)?
- .to_user_space(&self.node_bbox, draw_ctx, values);
-
draw_ctx
.get_paint_source_surface(
self.source_surface.width(),
self.source_surface.height(),
acquired_nodes,
- &fill_paint_source,
+ &self.fill_paint,
)
.map_err(FilterError::CairoError)
});
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index 0d292797..08007083 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -235,9 +235,26 @@ pub fn render(
}
let filter = borrow_element_as!(filter_node, Filter);
+
+ let values = computed_from_node_being_filtered;
+
+ let stroke_paint_source = values
+ .stroke()
+ .0
+ .resolve(acquired_nodes, values.stroke_opacity().0, values.color().0)?
+ .to_user_space(&node_bbox, draw_ctx, values);
+
+ let fill_paint_source = values
+ .fill()
+ .0
+ .resolve(acquired_nodes, values.fill_opacity().0, values.color().0)?
+ .to_user_space(&node_bbox, draw_ctx, values);
+
let mut filter_ctx = FilterContext::new(
&filter,
computed_from_node_being_filtered,
+ stroke_paint_source,
+ fill_paint_source,
source_surface,
draw_ctx,
transform,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]