summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2023-03-22 13:18:26 -0600
committerMarge Bot <marge-bot@gnome.org>2023-03-23 01:41:14 +0000
commit359fae89bc2f8ad94f73d866f5a8212fd6f21654 (patch)
tree9d89ba1b1cd64d697e3892e9229ebe49d243765a
parentd0ed58c1b92998d98d366fe0a5fe4de1b55b4346 (diff)
downloadlibrsvg-359fae89bc2f8ad94f73d866f5a8212fd6f21654.tar.gz
layout::Filter - resolve the stroke/fill paint sources here
Instead of in with_discrete_layer(). There, we only turn them to user-space coordinates. Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/816>
-rw-r--r--src/drawing_ctx.rs30
-rw-r--r--src/layout.rs46
2 files changed, 44 insertions, 32 deletions
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index cdb84f16..768c6610 100644
--- a/src/drawing_ctx.rs
+++ b/src/drawing_ctx.rs
@@ -798,36 +798,14 @@ impl DrawingCtx {
let params = temporary_draw_ctx.get_view_params();
- // TODO: the stroke/fill paint are already resolved for shapes. Outside of shapes,
- // they are also needed for filters in all elements. Maybe we should make them part
- // of the StackingContext instead of Shape?
let stroke_paint_source = Rc::new(
- values
- .stroke()
- .0
- .resolve(
- acquired_nodes,
- values.stroke_opacity().0,
- filter.current_color,
- None,
- None,
- self.session(),
- )
+ filter
+ .stroke_paint_source
.to_user_space(&bbox.rect, &params, values),
);
-
let fill_paint_source = Rc::new(
- values
- .fill()
- .0
- .resolve(
- acquired_nodes,
- values.fill_opacity().0,
- filter.current_color,
- None,
- None,
- self.session(),
- )
+ filter
+ .fill_paint_source
.to_user_space(&bbox.rect, &params, values),
);
diff --git a/src/layout.rs b/src/layout.rs
index 6504a6d1..d867f837 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -153,24 +153,58 @@ pub struct FontProperties {
pub struct Filter {
pub filter_list: FilterValueList,
pub current_color: RGBA,
+ pub stroke_paint_source: Arc<PaintSource>,
+ pub fill_paint_source: Arc<PaintSource>,
}
-fn get_filter(values: &ComputedValues) -> Option<Filter> {
+fn get_filter(
+ values: &ComputedValues,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ session: &Session,
+) -> Option<Filter> {
match values.filter() {
properties::Filter::None => None,
- properties::Filter::List(filter_list) => {
- Some(get_filter_from_filter_list(filter_list, values))
- }
+ properties::Filter::List(filter_list) => Some(get_filter_from_filter_list(
+ filter_list,
+ acquired_nodes,
+ values,
+ session,
+ )),
}
}
-fn get_filter_from_filter_list(filter_list: FilterValueList, values: &ComputedValues) -> Filter {
+fn get_filter_from_filter_list(
+ filter_list: FilterValueList,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ values: &ComputedValues,
+ session: &Session,
+) -> Filter {
let current_color = values.color().0;
+ let stroke_paint_source = values.stroke().0.resolve(
+ acquired_nodes,
+ values.stroke_opacity().0,
+ current_color,
+ None,
+ None,
+ session,
+ );
+
+ let fill_paint_source = values.fill().0.resolve(
+ acquired_nodes,
+ values.fill_opacity().0,
+ current_color,
+ None,
+ None,
+ session,
+ );
+
Filter {
filter_list,
current_color,
+ stroke_paint_source,
+ fill_paint_source,
}
}
@@ -197,7 +231,7 @@ impl StackingContext {
_ => {
opacity = values.opacity();
- filter = get_filter(values);
+ filter = get_filter(values, acquired_nodes, session);
}
}