From 0b7444e8ffc5d713fe64c1fdbe41cf8374014e0f Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Fri, 22 Aug 2025 09:54:15 +0200 Subject: [PATCH] :bug: Use SrcIn only when there is only one inner stroke, otherwise use erode filter --- render-wasm/src/render.rs | 2 ++ render-wasm/src/shapes.rs | 7 +++++++ render-wasm/src/shapes/text.rs | 24 +++++++++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 304198323f..a836135063 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -520,6 +520,7 @@ impl RenderState { shadows::render_text_drop_shadows(self, &shape, &mut paragraphs, antialias); } + let count_inner_strokes = shape.count_visible_inner_strokes(); text::render(self, &shape, &mut paragraphs, None, None); for stroke in shape.visible_strokes().rev() { @@ -528,6 +529,7 @@ impl RenderState { &shape.selrect(), shape.image_filter(1.).as_ref(), shape.mask_filter(1.).as_ref(), + count_inner_strokes, ); shadows::render_text_drop_shadows( self, diff --git a/render-wasm/src/shapes.rs b/render-wasm/src/shapes.rs index af28641c92..1b7a5d922c 100644 --- a/render-wasm/src/shapes.rs +++ b/render-wasm/src/shapes.rs @@ -1109,6 +1109,13 @@ impl Shape { pub fn has_visible_inner_strokes(&self) -> bool { self.visible_strokes().any(|s| s.kind == StrokeKind::Inner) } + + pub fn count_visible_inner_strokes(&self) -> usize { + self.visible_strokes() + .filter(|s| s.kind == StrokeKind::Inner) + .count() + } + /* Returns the list of children taking into account the structure modifiers */ diff --git a/render-wasm/src/shapes/text.rs b/render-wasm/src/shapes/text.rs index c232e2a34b..366f8f989f 100644 --- a/render-wasm/src/shapes/text.rs +++ b/render-wasm/src/shapes/text.rs @@ -124,6 +124,7 @@ impl TextContent { bounds: &Rect, blur: Option<&ImageFilter>, blur_mask: Option<&MaskFilter>, + count_inner_strokes: usize, ) -> Vec> { let fallback_fonts = get_fallback_fonts(); let fonts = get_font_collection(); @@ -138,8 +139,14 @@ impl TextContent { if let Some(blur_mask) = blur_mask { text_paint.set_mask_filter(blur_mask.clone()); } - let stroke_paints = - get_text_stroke_paints(stroke, bounds, &text_paint, blur, blur_mask); + let stroke_paints = get_text_stroke_paints( + stroke, + bounds, + &text_paint, + blur, + blur_mask, + count_inner_strokes, + ); let text: String = leaf.apply_text_transform(); for (paint_idx, stroke_paint) in stroke_paints.iter().enumerate() { @@ -198,8 +205,15 @@ impl TextContent { bounds: &Rect, blur: Option<&ImageFilter>, blur_mask: Option<&MaskFilter>, + count_inner_strokes: usize, ) -> Vec> { - self.collect_paragraphs(self.to_stroke_paragraphs(stroke, bounds, blur, blur_mask)) + self.collect_paragraphs(self.to_stroke_paragraphs( + stroke, + bounds, + blur, + blur_mask, + count_inner_strokes, + )) } pub fn grow_type(&self) -> GrowType { @@ -751,6 +765,7 @@ fn get_text_stroke_paints( text_paint: &Paint, blur: Option<&ImageFilter>, blur_mask: Option<&MaskFilter>, + count_inner_strokes: usize, ) -> Vec { let mut paints = Vec::new(); @@ -763,7 +778,7 @@ fn get_text_stroke_paints( is_opaque = shader.unwrap().is_opaque(); } - if is_opaque { + if is_opaque && count_inner_strokes == 1 { let mut paint = text_paint.clone(); paint.set_style(skia::PaintStyle::Fill); paint.set_anti_alias(true); @@ -771,7 +786,6 @@ fn get_text_stroke_paints( paint.set_image_filter(blur.clone()); } paints.push(paint); - let mut paint = skia::Paint::default(); paint.set_style(skia::PaintStyle::Stroke); paint.set_blend_mode(skia::BlendMode::SrcIn);