From 80abc3fe3dfef423db7f06d72620d9ec0d8cb2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Torr=C3=B3?= Date: Wed, 17 Jun 2026 18:41:41 +0200 Subject: [PATCH] :bug: Fix shape fill flickering from color picker (#10273) --- render-wasm/src/render.rs | 10 ++++++++-- render-wasm/src/state.rs | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 96baba5c5b..df284816f6 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -2271,7 +2271,11 @@ impl RenderState { if sync_render { frame_type = self.render_shape_tree_sync(base_object, tree, timestamp)?; } else { - frame_type = self.continue_render_loop(base_object, tree, timestamp)?; + // Keep progressive yielding, except for a localized shape edit on a + // stable viewbox (e.g. recoloring) which renders in one frame. + let allow_stop = + !preserve_target || self.zoom_changed() || self.options.is_interactive_transform(); + frame_type = self.continue_render_loop(base_object, tree, timestamp, allow_stop)?; // This is an option to debug frames. if self.options.capture_frames > 0 { @@ -2331,9 +2335,11 @@ impl RenderState { base_object: Option<&Uuid>, tree: ShapesPoolRef, timestamp: i32, + allow_stop: bool, ) -> Result { performance::begin_measure!("continue_render_loop"); - let frame_type = self.render_shape_tree_partial(base_object, tree, timestamp, true)?; + let frame_type = + self.render_shape_tree_partial(base_object, tree, timestamp, allow_stop)?; if !self.options.is_interactive_transform() { self.surfaces.draw_tile_atlas_to_backbuffer( diff --git a/render-wasm/src/state.rs b/render-wasm/src/state.rs index 6e1a283110..2ae6ba4067 100644 --- a/render-wasm/src/state.rs +++ b/render-wasm/src/state.rs @@ -115,7 +115,8 @@ impl State { } pub fn continue_render_loop(&mut self, timestamp: i32) -> Result { - get_render_state().continue_render_loop(None, &self.shapes, timestamp) + let allow_stop = true; + get_render_state().continue_render_loop(None, &self.shapes, timestamp, allow_stop) } pub fn clear_focus_mode(&mut self) {