mirror of
https://github.com/penpot/penpot.git
synced 2025-12-12 06:24:17 +01:00
⚡ Optimize handler->point path segment helper fn
More or les x2 speed improvement and reduced the generation of objects garbage.
This commit is contained in:
@@ -102,21 +102,19 @@
|
|||||||
(->> (d/enumerate content)
|
(->> (d/enumerate content)
|
||||||
(filterv (fn [[_ segment]] (= (helpers/segment->point segment) point)))))
|
(filterv (fn [[_ segment]] (= (helpers/segment->point segment) point)))))
|
||||||
|
|
||||||
;; FIXME: candidate to be optimized with native data type operation
|
|
||||||
(defn handler->point
|
(defn handler->point
|
||||||
[content index prefix]
|
[content index prefix]
|
||||||
(when (and (some? index)
|
(when (and (some? index)
|
||||||
(some? prefix))
|
(some? prefix))
|
||||||
(when (and (<= 0 index)
|
(impl/-lookup content index
|
||||||
(< index (count content)))
|
(fn [command c1x c1y c2x c2y x y]
|
||||||
(let [segment (nth content index)
|
(let [prefix (if (= :curve-to command)
|
||||||
params (get segment :params)]
|
prefix
|
||||||
(if (= :curve-to (:command segment))
|
nil)]
|
||||||
(let [[cx cy] (helpers/prefix->coords prefix)]
|
(case prefix
|
||||||
(gpt/point (get params cx)
|
:c1 (gpt/point c1x c1y)
|
||||||
(get params cy)))
|
:c2 (gpt/point c2x c2y)
|
||||||
(gpt/point (get params :x)
|
(gpt/point x y)))))))
|
||||||
(get params :y)))))))
|
|
||||||
|
|
||||||
;; FIXME: revisit this function
|
;; FIXME: revisit this function
|
||||||
(defn handler->node
|
(defn handler->node
|
||||||
|
|||||||
@@ -303,3 +303,40 @@
|
|||||||
:index 6}]]
|
:index 6}]]
|
||||||
|
|
||||||
(t/is (= result expect))))
|
(t/is (= result expect))))
|
||||||
|
|
||||||
|
(defn handler->point
|
||||||
|
"A legacy impl of handler point, used as reference for test"
|
||||||
|
[content index prefix]
|
||||||
|
(when (and (some? index)
|
||||||
|
(some? prefix))
|
||||||
|
(when (and (<= 0 index)
|
||||||
|
(< index (count content)))
|
||||||
|
(let [segment (nth content index)
|
||||||
|
params (get segment :params)]
|
||||||
|
(if (= :curve-to (:command segment))
|
||||||
|
(let [[cx cy] (path.helpers/prefix->coords prefix)]
|
||||||
|
(gpt/point (get params cx)
|
||||||
|
(get params cy)))
|
||||||
|
(gpt/point (get params :x)
|
||||||
|
(get params :y)))))))
|
||||||
|
|
||||||
|
(t/deftest handler-to-point
|
||||||
|
(let [content (path/content sample-content-2)
|
||||||
|
result1 (handler->point content 3 :c1)
|
||||||
|
result2 (handler->point content 1 :c1)
|
||||||
|
result3 (handler->point content 0 :c1)
|
||||||
|
|
||||||
|
expect1 (gpt/point 3.0 7.0)
|
||||||
|
expect2 (gpt/point 439.0 802.0)
|
||||||
|
expect3 (gpt/point 480.0 839.0)
|
||||||
|
|
||||||
|
result4 (path.segment/handler->point content 3 :c1)
|
||||||
|
result5 (path.segment/handler->point content 1 :c1)
|
||||||
|
result6 (path.segment/handler->point content 0 :c1)]
|
||||||
|
|
||||||
|
(t/is (= result1 expect1))
|
||||||
|
(t/is (= result2 expect2))
|
||||||
|
(t/is (= result3 expect3))
|
||||||
|
(t/is (= result4 expect1))
|
||||||
|
(t/is (= result5 expect2))
|
||||||
|
(t/is (= result6 expect3))))
|
||||||
|
|||||||
Reference in New Issue
Block a user