From e7c06fed2249df1c1a7561e520792bf759a9d098 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 24 Jan 2025 09:15:41 +0100 Subject: [PATCH 1/2] :tada: Improve clipping objects for wasm render --- frontend/src/app/render_wasm/api.cljs | 4 +++- frontend/src/app/render_wasm/shape.cljs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index de3a875d6..376acfde5 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -493,7 +493,9 @@ id (dm/get-prop shape :id) type (dm/get-prop shape :type) selrect (dm/get-prop shape :selrect) - clip-content (not (dm/get-prop shape :show-content)) + clip-content (if (= type :frame) + (not (dm/get-prop shape :show-content)) + false) rotation (dm/get-prop shape :rotation) transform (dm/get-prop shape :transform) fills (if (= type :group) diff --git a/frontend/src/app/render_wasm/shape.cljs b/frontend/src/app/render_wasm/shape.cljs index 0e76ddefc..843bec2b4 100644 --- a/frontend/src/app/render_wasm/shape.cljs +++ b/frontend/src/app/render_wasm/shape.cljs @@ -115,7 +115,9 @@ :bool-type (api/set-shape-bool-type v) :bool-content (api/set-shape-bool-content v) :selrect (api/set-shape-selrect v) - :show-content (api/set-shape-clip-content (not v)) + :show-content (if (= (:type self) :frame) + (api/set-shape-clip-content (not v)) + (api/set-shape-clip-content false)) :rotation (api/set-shape-rotation v) :transform (api/set-shape-transform v) :fills (api/set-shape-fills v) From f70b05a09e59ec2ede87c3fad0b716adf5a9575c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 24 Jan 2025 09:16:04 +0100 Subject: [PATCH 2/2] :bug: Fix blend modes for wasm render --- render-wasm/src/render.rs | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index c51a4a9f0..f1278bb38 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -142,7 +142,7 @@ impl RenderState { pub fn reset_canvas(&mut self) { self.drawing_surface .canvas() - .clear(skia::Color::TRANSPARENT) + .clear(self.background_color) .reset_matrix(); self.final_surface .canvas() @@ -154,7 +154,20 @@ impl RenderState { .reset_matrix(); } - pub fn render_shape(&mut self, shape: &mut Shape) { + pub fn apply_drawing_to_final_canvas(&mut self) { + self.drawing_surface.draw( + &mut self.final_surface.canvas(), + (0.0, 0.0), + skia::SamplingOptions::new(skia::FilterMode::Linear, skia::MipmapMode::Nearest), + Some(&skia::Paint::default()), + ); + + self.drawing_surface + .canvas() + .clear(skia::Color::TRANSPARENT); + } + + pub fn render_shape(&mut self, shape: &mut Shape, clip: bool) { let transform = shape.transform.to_skia_matrix(); // Check transform-matrix code from common/src/app/common/geom/shapes/transforms.cljc @@ -195,16 +208,13 @@ impl RenderState { } }; - self.drawing_surface.draw( - &mut self.final_surface.canvas(), - (0.0, 0.0), - skia::SamplingOptions::new(skia::FilterMode::Linear, skia::MipmapMode::Nearest), - Some(&skia::Paint::default()), - ); + if clip { + self.drawing_surface + .canvas() + .clip_rect(shape.bounds(), skia::ClipOp::Intersect, true); + } - self.drawing_surface - .canvas() - .clear(skia::Color::TRANSPARENT); + self.apply_drawing_to_final_canvas(); } pub fn zoom(&mut self, tree: &HashMap) -> Result<(), String> { @@ -325,17 +335,12 @@ impl RenderState { let layer_rec = skia::canvas::SaveLayerRec::default().paint(&paint); // This is needed so the next non-children shape does not carry this shape's transform self.final_surface.canvas().save_layer(&layer_rec); - self.drawing_surface.canvas().save(); + self.drawing_surface.canvas().save(); if !root_id.is_nil() { - self.render_shape(&mut element.clone()); - if element.clip() { - self.drawing_surface.canvas().clip_rect( - element.bounds(), - skia::ClipOp::Intersect, - true, - ); - } + self.render_shape(&mut element.clone(), element.clip()); + } else { + self.apply_drawing_to_final_canvas(); } self.drawing_surface.canvas().restore();