From 065b50f5a278ae6ff682d8a8c651b7ab5557b722 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 25 Mar 2025 09:49:47 +0100 Subject: [PATCH] :bug: Fix asynchronous content dependant rendering (#6142) * :bug: Fix custom fonts rendering * :bug: Fix asynchronous content dependant rendering * :tada: Renaming clear_cache to clear_drawing_cache --- frontend/src/app/render_wasm/api.cljs | 14 +++++++++----- frontend/src/app/render_wasm/shape.cljs | 2 +- render-wasm/src/main.rs | 2 +- render-wasm/src/render/fonts.rs | 16 +++++++++++++--- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index 8dee31fd2..7cfd3676d 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -777,8 +777,8 @@ (h/call internal-module "_set_view" zoom (- (:x vbox)) (- (:y vbox))) (render nil)) -(defn clear-cache [] - (h/call internal-module "_clear_cache")) +(defn clear-drawing-cache [] + (h/call internal-module "_clear_drawing_cache")) (defn- store-all-fonts [fonts] @@ -803,7 +803,9 @@ (->> (rx/from pending) (rx/mapcat identity) (rx/reduce conj []) - (rx/subs! request-render)))) + (rx/subs! (fn [_] + (clear-drawing-cache) + (request-render "set-fonts")))))) (defn set-objects [objects] @@ -886,13 +888,15 @@ (let [pending' (concat (set-shape-fills fills) (set-shape-strokes strokes))] (recur (inc index) (into pending pending')))) pending))] - (clear-cache) + (clear-drawing-cache) (request-render "set-objects") (when-let [pending (seq pending)] (->> (rx/from pending) (rx/mapcat identity) (rx/reduce conj []) - (rx/subs! request-render))))) + (rx/subs! (fn [_] + (clear-drawing-cache) + (request-render "set-objects"))))))) (defn uuid->u8 [id] diff --git a/frontend/src/app/render_wasm/shape.cljs b/frontend/src/app/render_wasm/shape.cljs index d38bdd1aa..0824a507c 100644 --- a/frontend/src/app/render_wasm/shape.cljs +++ b/frontend/src/app/render_wasm/shape.cljs @@ -145,7 +145,7 @@ ;; when something synced with wasm ;; is modified, we need to request ;; a new render. - (api/clear-cache) + (api/clear-drawing-cache) (api/request-render "set-wasm-attrs"))) (defn- impl-assoc diff --git a/render-wasm/src/main.rs b/render-wasm/src/main.rs index 8206103cd..d687f2524 100644 --- a/render-wasm/src/main.rs +++ b/render-wasm/src/main.rs @@ -61,7 +61,7 @@ pub extern "C" fn clean_up() { } #[no_mangle] -pub extern "C" fn clear_cache() { +pub extern "C" fn clear_drawing_cache() { with_state!(state, { state.rebuild_tiles(); }); diff --git a/render-wasm/src/render/fonts.rs b/render-wasm/src/render/fonts.rs index 50d919216..d10193823 100644 --- a/render-wasm/src/render/fonts.rs +++ b/render-wasm/src/render/fonts.rs @@ -1,4 +1,4 @@ -use skia_safe::{self as skia, textlayout, Font}; +use skia_safe::{self as skia, textlayout, Font, FontMgr}; use crate::shapes::FontFamily; @@ -31,8 +31,8 @@ impl FontStore { font_provider.register_typeface(emoji_font, DEFAULT_EMOJI_FONT); let mut font_collection = skia::textlayout::FontCollection::new(); - font_collection.set_default_font_manager(Some(font_provider.clone().into()), None); - font_collection.set_dynamic_font_manager(Some(font_provider.clone().into())); + font_collection.set_default_font_manager(FontMgr::default(), None); + font_collection.set_dynamic_font_manager(FontMgr::from(font_provider.clone())); let debug_typeface = font_provider .match_family_style("robotomono-regular", skia::FontStyle::default()) @@ -72,6 +72,8 @@ impl FontStore { self.font_provider .register_typeface(typeface, alias.as_str()); + self.refresh_font_collection(); + Ok(()) } @@ -79,4 +81,12 @@ impl FontStore { let serialized = format!("{}", family); self.font_provider.family_names().any(|x| x == serialized) } + + fn refresh_font_collection(&mut self) { + self.font_collection = skia::textlayout::FontCollection::new(); + self.font_collection + .set_default_font_manager(FontMgr::default(), None); + self.font_collection + .set_dynamic_font_manager(FontMgr::from(self.font_provider.clone())); + } }