From 6d419a45ae2b141c25e12f4f73eb1dc3a8d88658 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 20 Nov 2024 10:44:25 +0100 Subject: [PATCH] :sparkles: Add initial prototype for path content encoding --- common/src/app/common/svg/path.cljc | 73 +++++++++++++++++++++++++ frontend/src/app/render_wasm/shape.cljs | 1 + 2 files changed, 74 insertions(+) diff --git a/common/src/app/common/svg/path.cljc b/common/src/app/common/svg/path.cljc index 5951002a1..ac89be9d0 100644 --- a/common/src/app/common/svg/path.cljc +++ b/common/src/app/common/svg/path.cljc @@ -40,3 +40,76 @@ (map (fn [segment] (.toPersistentMap ^js segment))) (parser/parse path-str))))) + +#?(:cljs + (defn content->buffer + "Converts the path content into binary format." + [content] + (let [total (count content) + ssize 28 + buffer (new js/ArrayBuffer (* total ssize)) + dview (new js/DataView buffer)] + (loop [index 0] + (when (< index total) + (let [segment (nth content index) + offset (* index ssize)] + (case (:command segment) + :move-to + (let [{:keys [x y]} (:params segment)] + (.setInt16 dview (+ offset 0) 1) + (.setFloat32 dview (+ offset 20) x) + (.setFloat32 dview (+ offset 24) y)) + :line-to + (let [{:keys [x y]} (:params segment)] + (.setInt16 dview (+ offset 0) 2) + (.setFloat32 dview (+ offset 20) x) + (.setFloat32 dview (+ offset 24) y)) + :curve-to + (let [{:keys [c1x c1y c2x c2y x y]} (:params segment)] + (.setInt16 dview (+ offset 0) 3) + (.setFloat32 dview (+ offset 4) c1x) + (.setFloat32 dview (+ offset 8) c1y) + (.setFloat32 dview (+ offset 12) c2x) + (.setFloat32 dview (+ offset 16) c2y) + (.setFloat32 dview (+ offset 20) x) + (.setFloat32 dview (+ offset 24) y)) + + :close-path + (.setInt16 dview (+ offset 0) 4)) + (recur (inc index))))) + buffer))) + +#?(:cljs + (defn buffer->content + "Converts the a buffer to a path content vector" + [buffer] + (assert (instance? js/ArrayBuffer buffer) "expected ArrayBuffer instance") + (let [ssize 28 + total (/ (.-byteLength buffer) ssize) + dview (new js/DataView buffer)] + (loop [index 0 + result []] + (if (< index total) + (let [offset (* index ssize) + type (.getInt16 dview (+ offset 0)) + command (case type + 1 :move-to + 2 :line-to + 3 :curve-to + 4 :close-path) + params (case type + 1 {:x (.getFloat32 dview (+ offset 20)) + :y (.getFloat32 dview (+ offset 24))} + 2 {:x (.getFloat32 dview (+ offset 20)) + :y (.getFloat32 dview (+ offset 24))} + 3 {:c1x (.getFloat32 dview (+ offset 4)) + :c1y (.getFloat32 dview (+ offset 8)) + :c2x (.getFloat32 dview (+ offset 12)) + :c2y (.getFloat32 dview (+ offset 16)) + :x (.getFloat32 dview (+ offset 20)) + :y (.getFloat32 dview (+ offset 24))} + 4 {})] + (recur (inc index) + (conj result {:command command + :params params}))) + result))))) diff --git a/frontend/src/app/render_wasm/shape.cljs b/frontend/src/app/render_wasm/shape.cljs index 39d5557a9..5082fbf3d 100644 --- a/frontend/src/app/render_wasm/shape.cljs +++ b/frontend/src/app/render_wasm/shape.cljs @@ -8,6 +8,7 @@ (:require [app.common.transit :as t] [app.common.types.shape :as shape] + ;; [app.common.svg.path :as path] [app.render-wasm.api :as api] [clojure.core :as c] [cuerdas.core :as str]))