mirror of
https://github.com/penpot/penpot.git
synced 2025-05-16 11:06:20 +02:00
✨ Add initial prototype for path content encoding
This commit is contained in:
parent
30d7ba7136
commit
6d419a45ae
2 changed files with 74 additions and 0 deletions
|
@ -40,3 +40,76 @@
|
||||||
(map (fn [segment]
|
(map (fn [segment]
|
||||||
(.toPersistentMap ^js segment)))
|
(.toPersistentMap ^js segment)))
|
||||||
(parser/parse path-str)))))
|
(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)))))
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
(:require
|
(:require
|
||||||
[app.common.transit :as t]
|
[app.common.transit :as t]
|
||||||
[app.common.types.shape :as shape]
|
[app.common.types.shape :as shape]
|
||||||
|
;; [app.common.svg.path :as path]
|
||||||
[app.render-wasm.api :as api]
|
[app.render-wasm.api :as api]
|
||||||
[clojure.core :as c]
|
[clojure.core :as c]
|
||||||
[cuerdas.core :as str]))
|
[cuerdas.core :as str]))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue