0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-28 09:46:51 -05:00

🐛 Fix rendering order of inner shadows when shape has no fills (wasm)

This commit is contained in:
Belén Albeza 2025-02-26 09:44:49 +01:00 committed by Alonso Torres
parent c0ccb86e3a
commit 0416e883ca
2 changed files with 45 additions and 12 deletions

View file

@ -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

View file

@ -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