From 79e1c29306f246c1b902fb97eefd8ad4ae736d35 Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Fri, 6 Jun 2025 09:37:54 +0200 Subject: [PATCH 1/3] :bug: Fix emoji detection and load --- frontend/src/app/render_wasm/api.cljs | 5 ++--- frontend/src/app/render_wasm/api/texts.cljs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index dbaac9252..c3356ef84 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -640,9 +640,10 @@ (swap! languages into (t/get-languages text)) (t/write-shape-text leaves paragraph text)) (recur (inc index)))))) + (let [updated-fonts (-> fonts - (cond-> emoji? (f/add-emoji-font)) + (cond-> @emoji? (f/add-emoji-font)) (f/add-noto-fonts @languages))] (f/store-fonts updated-fonts)))) @@ -742,8 +743,6 @@ (set-shape-svg-raw-content (get-static-markup shape))) (when (some? corners) (set-shape-corners corners)) (when (some? shadows) (set-shape-shadows shadows)) - (when (and (= type :text) (some? content)) - (set-shape-text content)) (when (= type :text) (set-shape-grow-type grow-type)) (when (or (ctl/any-layout? shape) diff --git a/frontend/src/app/render_wasm/api/texts.cljs b/frontend/src/app/render_wasm/api/texts.cljs index 8e56eca51..70418f009 100644 --- a/frontend/src/app/render_wasm/api/texts.cljs +++ b/frontend/src/app/render_wasm/api/texts.cljs @@ -148,7 +148,7 @@ (h/call wasm/internal-module "_set_shape_text_content")) -(def ^:private emoji-pattern #"[\uD83C-\uDBFF][\uDC00-\uDFFF]") +(def ^:private emoji-pattern #"[\uD83C-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27BF]") (def ^:private unicode-ranges {:japanese #"[\u3040-\u30FF\u31F0-\u31FF\uFF66-\uFF9F]" @@ -198,7 +198,7 @@ (defn contains-emoji? [text] - (boolean (re-find emoji-pattern text))) + (boolean (some #(re-find emoji-pattern %) (seq text)))) (defn get-languages [text] (reduce-kv (fn [result lang pattern] From 8c20159fb009330aee4281ecb40dcc031ee2d8f0 Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Fri, 6 Jun 2025 09:51:15 +0200 Subject: [PATCH 2/3] :bug: Cache emoji font correctly --- frontend/src/app/render_wasm/api/fonts.cljs | 3 ++- render-wasm/src/render/fonts.rs | 13 +++++++++---- render-wasm/src/wasm/fonts.rs | 12 ++++++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/render_wasm/api/fonts.cljs b/frontend/src/app/render_wasm/api/fonts.cljs index bb52dca1c..3c041ab85 100644 --- a/frontend/src/app/render_wasm/api/fonts.cljs +++ b/frontend/src/app/render_wasm/api/fonts.cljs @@ -131,7 +131,8 @@ (aget id-buffer 2) (aget id-buffer 3) (:weight font-data) - (:style font-data)))] + (:style font-data) + emoji?))] (when-not font-stored? (store-font-url font-data uri emoji? fallback?))))) diff --git a/render-wasm/src/render/fonts.rs b/render-wasm/src/render/fonts.rs index 6b2fd465a..e936c77a7 100644 --- a/render-wasm/src/render/fonts.rs +++ b/render-wasm/src/render/fonts.rs @@ -66,7 +66,7 @@ impl FontStore { is_emoji: bool, is_fallback: bool, ) -> Result<(), String> { - if self.has_family(&family) { + if self.has_family(&family, is_emoji) { return Ok(()); } @@ -92,9 +92,14 @@ impl FontStore { Ok(()) } - pub fn has_family(&self, family: &FontFamily) -> bool { - let serialized = format!("{}", family); - self.font_provider.family_names().any(|x| x == serialized) + pub fn has_family(&self, family: &FontFamily, is_emoji: bool) -> bool { + let alias = format!("{}", family); + let font_name = if is_emoji { + DEFAULT_EMOJI_FONT + } else { + alias.as_str() + }; + self.font_provider.family_names().any(|x| x == font_name) } pub fn get_fallback(&self) -> &HashSet { diff --git a/render-wasm/src/wasm/fonts.rs b/render-wasm/src/wasm/fonts.rs index 84ef27703..e3e9b3ed2 100644 --- a/render-wasm/src/wasm/fonts.rs +++ b/render-wasm/src/wasm/fonts.rs @@ -31,11 +31,19 @@ pub extern "C" fn store_font( } #[no_mangle] -pub extern "C" fn is_font_uploaded(a: u32, b: u32, c: u32, d: u32, weight: u32, style: u8) -> bool { +pub extern "C" fn is_font_uploaded( + a: u32, + b: u32, + c: u32, + d: u32, + weight: u32, + style: u8, + is_emoji: bool, +) -> bool { with_state!(state, { let id = uuid_from_u32_quartet(a, b, c, d); let family = FontFamily::new(id, weight, style.into()); - let res = state.render_state().fonts().has_family(&family); + let res = state.render_state().fonts().has_family(&family, is_emoji); res }) From a8d4b293dca391bf16f9f0504a9e12d2ff50c3eb Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Fri, 6 Jun 2025 12:15:33 +0200 Subject: [PATCH 3/3] :bug: Fix loading same resources multiple times --- frontend/src/app/render_wasm/api.cljs | 69 ++++++++++----------- frontend/src/app/render_wasm/api/fonts.cljs | 15 ++--- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/frontend/src/app/render_wasm/api.cljs b/frontend/src/app/render_wasm/api.cljs index c3356ef84..92bb97577 100644 --- a/frontend/src/app/render_wasm/api.cljs +++ b/frontend/src/app/render_wasm/api.cljs @@ -189,27 +189,28 @@ (defn- get-string-length [string] (+ (count string) 1)) -(defn- store-image +(defn- fetch-image [id] (let [buffer (uuid/get-u32 id) url (cf/resolve-file-media {:id id})] - (->> (http/send! {:method :get - :uri url - :response-type :blob}) - (rx/map :body) - (rx/mapcat wapi/read-file-as-array-buffer) - (rx/map (fn [image] - (let [size (.-byteLength image) - offset (mem/alloc-bytes size) - heap (mem/get-heap-u8) - data (js/Uint8Array. image)] - (.set heap data offset) - (h/call wasm/internal-module "_store_image" - (aget buffer 0) - (aget buffer 1) - (aget buffer 2) - (aget buffer 3)) - true)))))) + {:key url + :callback #(->> (http/send! {:method :get + :uri url + :response-type :blob}) + (rx/map :body) + (rx/mapcat wapi/read-file-as-array-buffer) + (rx/map (fn [image] + (let [size (.-byteLength image) + offset (mem/alloc-bytes size) + heap (mem/get-heap-u8) + data (js/Uint8Array. image)] + (.set heap data offset) + (h/call wasm/internal-module "_store_image" + (aget buffer 0) + (aget buffer 1) + (aget buffer 2) + (aget buffer 3)) + true))))})) (defn- get-fill-images [leaf] @@ -227,7 +228,7 @@ (aget buffer 2) (aget buffer 3))] (when (zero? cached-image?) - (store-image id)))))) + (fetch-image id)))))) (defn set-shape-text-images [content] @@ -269,7 +270,7 @@ (aget buffer 2) (aget buffer 3))] (when (zero? cached-image?) - (store-image id)))) + (fetch-image id)))) image-fills)))) (defn set-shape-strokes @@ -308,7 +309,7 @@ (dm/get-prop image :height)) (h/call wasm/internal-module "_add_shape_stroke_fill") (when (== cached-image? 0) - (store-image id))) + (fetch-image id))) (some? color) (do @@ -763,16 +764,20 @@ pending))) +(defn process-pending + [pending] + (when-let [pending (-> (d/index-by :key :callback pending) vals)] + (->> (rx/from pending) + (rx/mapcat (fn [callback] (callback))) + (rx/reduce conj []) + (rx/subs! (fn [_] + (clear-drawing-cache) + (request-render "set-objects")))))) + (defn process-object [shape] (let [pending (set-object [] shape)] - (when-let [pending (seq pending)] - (->> (rx/from pending) - (rx/mapcat identity) - (rx/reduce conj []) - (rx/subs! (fn [_] - (clear-drawing-cache) - (request-render "set-objects"))))))) + (process-pending pending))) (defn set-objects [objects] @@ -789,13 +794,7 @@ (perf/end-measure "set-objects") (clear-drawing-cache) (request-render "set-objects") - (when-let [pending (seq pending)] - (->> (rx/from pending) - (rx/mapcat identity) - (rx/reduce conj []) - (rx/subs! (fn [_] - (clear-drawing-cache) - (request-render "set-objects"))))))) + (process-pending pending))) (defn set-structure-modifiers [entries] diff --git a/frontend/src/app/render_wasm/api/fonts.cljs b/frontend/src/app/render_wasm/api/fonts.cljs index 3c041ab85..9e90287be 100644 --- a/frontend/src/app/render_wasm/api/fonts.cljs +++ b/frontend/src/app/render_wasm/api/fonts.cljs @@ -94,13 +94,14 @@ fallback?) true)) -(defn- store-font-url +(defn- fetch-font [font-data font-url emoji? fallback?] - (->> (http/send! {:method :get - :uri font-url - :response-type :buffer}) - (rx/map (fn [{:keys [body]}] - (store-font-buffer font-data body emoji? fallback?))))) + {:key font-url + :callback #(->> (http/send! {:method :get + :uri font-url + :response-type :buffer}) + (rx/map (fn [{:keys [body]}] + (store-font-buffer font-data body emoji? fallback?))))}) (defn- google-font-ttf-url [font-id font-variant-id] @@ -134,7 +135,7 @@ (:style font-data) emoji?))] (when-not font-stored? - (store-font-url font-data uri emoji? fallback?))))) + (fetch-font font-data uri emoji? fallback?))))) (defn serialize-font-style [font-style]