diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index fe8c4e27a..e2e4a3be5 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -187,7 +187,7 @@ impl RenderState { ); } - pub fn apply_drawing_to_render_canvas(&mut self) { + pub fn apply_drawing_to_render_canvas(&mut self, shape: &Shape) { self.surfaces .flush_and_submit(&mut self.gpu_state, SurfaceId::Fills); self.surfaces.draw_into( @@ -195,6 +195,18 @@ impl RenderState { SurfaceId::Current, Some(&skia::Paint::default()), ); + + let render_overlay_below_strokes = shape.fills().len() > 0; + if render_overlay_below_strokes { + self.surfaces + .flush_and_submit(&mut self.gpu_state, SurfaceId::Overlay); + self.surfaces.draw_into( + SurfaceId::Overlay, + SurfaceId::Current, + Some(&skia::Paint::default()), + ); + } + self.surfaces .flush_and_submit(&mut self.gpu_state, SurfaceId::Strokes); self.surfaces.draw_into( @@ -203,12 +215,20 @@ impl RenderState { Some(&skia::Paint::default()), ); - self.surfaces - .flush_and_submit(&mut self.gpu_state, SurfaceId::Current); - self.surfaces - .flush_and_submit(&mut self.gpu_state, SurfaceId::Overlay); + if !render_overlay_below_strokes { + self.surfaces + .flush_and_submit(&mut self.gpu_state, SurfaceId::Overlay); + self.surfaces.draw_into( + SurfaceId::Overlay, + SurfaceId::Current, + Some(&skia::Paint::default()), + ); + } + self.surfaces .draw_into(SurfaceId::Overlay, SurfaceId::Current, None); + self.surfaces + .flush_and_submit(&mut self.gpu_state, SurfaceId::Current); self.surfaces.apply_mut( &[ @@ -327,6 +347,7 @@ impl RenderState { self, shadow, self.viewbox.zoom * self.options.dpr(), + shape.fills().len() > 0, ); } @@ -340,7 +361,7 @@ impl RenderState { } }; - self.apply_drawing_to_render_canvas(); + self.apply_drawing_to_render_canvas(&shape); self.surfaces .apply_mut(&[SurfaceId::Fills, SurfaceId::Strokes], |s| { s.canvas().restore(); @@ -628,7 +649,7 @@ impl RenderState { if !node_render_state.id.is_nil() { self.render_shape(element, modifiers.get(&element.id), clip_bounds); } else { - self.apply_drawing_to_render_canvas(); + self.apply_drawing_to_render_canvas(&element); } // Set the node as visited_children before processing children diff --git a/render-wasm/src/render/shadows.rs b/render-wasm/src/render/shadows.rs index fbc98ff7a..b7d5f7eb2 100644 --- a/render-wasm/src/render/shadows.rs +++ b/render-wasm/src/render/shadows.rs @@ -8,6 +8,7 @@ pub fn render_drop_shadow(render_state: &mut RenderState, shadow: &Shadow, scale render_state .surfaces .draw_into(SurfaceId::Fills, SurfaceId::Shadow, Some(&shadow_paint)); + render_state .surfaces .draw_into(SurfaceId::Strokes, SurfaceId::Shadow, Some(&shadow_paint)); @@ -24,16 +25,27 @@ pub fn render_drop_shadow(render_state: &mut RenderState, shadow: &Shadow, scale .clear(skia::Color::TRANSPARENT); } -pub fn render_inner_shadow(render_state: &mut RenderState, shadow: &Shadow, scale: f32) { +pub fn render_inner_shadow( + render_state: &mut RenderState, + shadow: &Shadow, + scale: f32, + render_over_fills: bool, +) { let shadow_paint = shadow.to_paint(scale); - render_state - .surfaces - .draw_into(SurfaceId::Fills, SurfaceId::Shadow, Some(&shadow_paint)); + if render_over_fills { + render_state + .surfaces + .draw_into(SurfaceId::Fills, SurfaceId::Shadow, Some(&shadow_paint)); + } else { + render_state + .surfaces + .draw_into(SurfaceId::Strokes, SurfaceId::Shadow, Some(&shadow_paint)); + } render_state .surfaces - .draw_into(SurfaceId::Shadow, SurfaceId::Overlay, None); // , None + .draw_into(SurfaceId::Shadow, SurfaceId::Overlay, None); render_state .surfaces