diff options
author | Federico Mena Quintero <federico@gnome.org> | 2023-03-22 13:18:26 -0600 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2023-03-23 01:41:14 +0000 |
commit | 359fae89bc2f8ad94f73d866f5a8212fd6f21654 (patch) | |
tree | 9d89ba1b1cd64d697e3892e9229ebe49d243765a | |
parent | d0ed58c1b92998d98d366fe0a5fe4de1b55b4346 (diff) | |
download | librsvg-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.rs | 30 | ||||
-rw-r--r-- | src/layout.rs | 46 |
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, ¶ms, 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, ¶ms, 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); } } |