diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 52880f14a1..35e0e78721 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -831,6 +831,8 @@ impl RenderState { let text_content = text_content.new_bounds(shape.selrect()); let count_inner_strokes = shape.count_visible_inner_strokes(); + let text_stroke_blur_outset = + Stroke::max_bounds_width(shape.visible_strokes(), false); let mut paragraph_builders = text_content.paragraph_builder_group_from_text(None); let mut stroke_paragraphs_list = shape .visible_strokes() @@ -858,7 +860,7 @@ impl RenderState { ); for stroke_paragraphs in stroke_paragraphs_list.iter_mut() { - text::render( + text::render_with_bounds_outset( Some(self), None, &shape, @@ -866,6 +868,7 @@ impl RenderState { Some(strokes_surface_id), None, None, + text_stroke_blur_outset, ); } } else { @@ -957,7 +960,7 @@ impl RenderState { // 4. Stroke fills for stroke_paragraphs in stroke_paragraphs_list.iter_mut() { - text::render( + text::render_with_bounds_outset( Some(self), None, &shape, @@ -965,6 +968,7 @@ impl RenderState { Some(strokes_surface_id), None, blur_filter.as_ref(), + text_stroke_blur_outset, ); } diff --git a/render-wasm/src/render/text.rs b/render-wasm/src/render/text.rs index ba14112921..2761962071 100644 --- a/render-wasm/src/render/text.rs +++ b/render-wasm/src/render/text.rs @@ -156,7 +156,8 @@ fn get_text_stroke_paints( paints } -pub fn render( +#[allow(clippy::too_many_arguments)] +pub fn render_with_bounds_outset( render_state: Option<&mut RenderState>, canvas: Option<&Canvas>, shape: &Shape, @@ -164,12 +165,20 @@ pub fn render( surface_id: Option, shadow: Option<&Paint>, blur: Option<&ImageFilter>, + stroke_bounds_outset: f32, ) { if let Some(render_state) = render_state { let target_surface = surface_id.unwrap_or(SurfaceId::Fills); if let Some(blur_filter) = blur { - let bounds = blur_filter.compute_fast_bounds(shape.selrect); + let mut text_bounds = shape + .get_text_content() + .calculate_bounds(shape, false) + .to_rect(); + if stroke_bounds_outset > 0.0 { + text_bounds.inset((-stroke_bounds_outset, -stroke_bounds_outset)); + } + let bounds = blur_filter.compute_fast_bounds(text_bounds); if bounds.is_finite() && bounds.width() > 0.0 && bounds.height() > 0.0 { let blur_filter_clone = blur_filter.clone(); if filters::render_with_filter_surface( @@ -202,6 +211,27 @@ pub fn render( } } +pub fn render( + render_state: Option<&mut RenderState>, + canvas: Option<&Canvas>, + shape: &Shape, + paragraph_builders: &mut [Vec], + surface_id: Option, + shadow: Option<&Paint>, + blur: Option<&ImageFilter>, +) { + render_with_bounds_outset( + render_state, + canvas, + shape, + paragraph_builders, + surface_id, + shadow, + blur, + 0.0, + ); +} + fn render_text_on_canvas( canvas: &Canvas, shape: &Shape,