From 4c81ac43862c34431df336039e4c08ea81a81d9c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 16 Feb 2024 09:43:38 +0100 Subject: [PATCH] :bug: Fix problem with strokes exporting images --- common/src/app/common/geom/shapes/bounds.cljc | 81 ++++++++++--------- frontend/src/app/main/render.cljs | 2 +- .../src/app/main/ui/shapes/custom_stroke.cljs | 5 +- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/common/src/app/common/geom/shapes/bounds.cljc b/common/src/app/common/geom/shapes/bounds.cljc index c60840d7a..854d24440 100644 --- a/common/src/app/common/geom/shapes/bounds.cljc +++ b/common/src/app/common/geom/shapes/bounds.cljc @@ -15,8 +15,8 @@ (defn shape-stroke-margin [shape stroke-width] (if (cfh/path-shape? shape) - ;; TODO: Calculate with the stroke offset (not implemented yet - (mth/sqrt (* 2 stroke-width stroke-width)) + ;; TODO: Calculate with the stroke offset (not implemented yet) + (+ stroke-width (mth/sqrt (* 2 stroke-width stroke-width))) (- (mth/sqrt (* 2 stroke-width stroke-width)) stroke-width))) (defn- apply-filters @@ -104,7 +104,7 @@ 0)) (reduce d/max 0)) - margin + stroke-margin (if ignore-margin? 0 (shape-stroke-margin shape stroke-width)) @@ -124,9 +124,8 @@ :drop-shadow (+ (mth/abs (:offset-y %)) (* (:spread %) 2) (* (:blur %) 2) 10) 0)) (reduce d/max 0))] - - {:horizontal (mth/ceil (+ stroke-width margin shadow-width)) - :vertical (mth/ceil (+ stroke-width margin shadow-height))}))) + {:horizontal (mth/ceil (+ stroke-margin shadow-width)) + :vertical (mth/ceil (+ stroke-margin shadow-height))}))) (defn- add-padding [bounds padding] @@ -143,47 +142,51 @@ (update :height + (* 2 v-padding))))) (defn calculate-base-bounds - [shape] - (-> (get-shape-filter-bounds shape) - (add-padding (calculate-padding shape true)))) + ([shape] + (calculate-base-bounds shape true)) + ([shape ignore-margin?] + (-> (get-shape-filter-bounds shape) + (add-padding (calculate-padding shape ignore-margin?))))) (defn get-object-bounds - [objects shape] - (let [base-bounds (calculate-base-bounds shape) - bounds - (cond - (or (empty? (:shapes shape)) - (or (:masked-group shape) (= :bool (:type shape))) - (and (cfh/frame-shape? shape) (not (:show-content shape)))) - [base-bounds] + ([objects shape] + (get-object-bounds objects shape nil)) + ([objects shape {:keys [ignore-margin?] :or {ignore-margin? true}}] + (let [base-bounds (calculate-base-bounds shape ignore-margin?) + bounds + (cond + (or (empty? (:shapes shape)) + (or (:masked-group shape) (= :bool (:type shape))) + (and (cfh/frame-shape? shape) (not (:show-content shape)))) + [base-bounds] - :else - (cfh/reduce-objects - objects + :else + (cfh/reduce-objects + objects - (fn [shape] - (and (not (:hidden shape)) - (d/not-empty? (:shapes shape)) - (or (not (cfh/frame-shape? shape)) - (:show-content shape)) + (fn [shape] + (and (not (:hidden shape)) + (d/not-empty? (:shapes shape)) + (or (not (cfh/frame-shape? shape)) + (:show-content shape)) - (or (not (cfh/group-shape? shape)) - (not (:masked-group shape))))) - (:id shape) + (or (not (cfh/group-shape? shape)) + (not (:masked-group shape))))) + (:id shape) - (fn [result child] - (cond-> result - (not (:hidden child)) - (conj (calculate-base-bounds child)))) + (fn [result child] + (cond-> result + (not (:hidden child)) + (conj (calculate-base-bounds child)))) - [base-bounds])) + [base-bounds])) - children-bounds - (cond->> (grc/join-rects bounds) - (not (cfh/frame-shape? shape)) (or (:children-bounds shape))) + children-bounds + (cond->> (grc/join-rects bounds) + (not (cfh/frame-shape? shape)) (or (:children-bounds shape))) - filters (shape->filters shape) - blur-value (or (-> shape :blur :value) 0)] + filters (shape->filters shape) + blur-value (or (-> shape :blur :value) 0)] - (get-rect-filter-bounds children-bounds filters blur-value))) + (get-rect-filter-bounds children-bounds filters blur-value)))) diff --git a/frontend/src/app/main/render.cljs b/frontend/src/app/main/render.cljs index 0a19c8a84..be312cae2 100644 --- a/frontend/src/app/main/render.cljs +++ b/frontend/src/app/main/render.cljs @@ -449,7 +449,7 @@ (assoc :fills [])) - {:keys [width height] :as bounds} (gsb/get-object-bounds objects object) + {:keys [width height] :as bounds} (gsb/get-object-bounds objects object {:ignore-margin? false}) vbox (format-viewbox bounds) fonts (ff/shape->fonts object objects) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index 6366c42e0..fa27d4e52 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -13,6 +13,7 @@ [app.common.geom.shapes :as gsh] [app.common.geom.shapes.bounds :as gsb] [app.common.geom.shapes.text :as gst] + [app.common.math :as mth] [app.config :as cf] [app.main.ui.context :as muc] [app.main.ui.shapes.attrs :as attrs] @@ -47,7 +48,7 @@ :center (/ (:stroke-width stroke 0) 2) :outer (:stroke-width stroke 0) 0) - margin (gsb/shape-stroke-margin stroke stroke-width) + stroke-margin (gsb/shape-stroke-margin shape stroke-width) ;; NOTE: for performance reasons we may can delimit a bit the ;; dependencies to really useful shape attrs instead of using @@ -57,8 +58,6 @@ (gst/shape->rect shape) (grc/points->rect (:points shape)))) - stroke-margin (+ stroke-width margin) - x (- (dm/get-prop selrect :x) stroke-margin) y (- (dm/get-prop selrect :y) stroke-margin) w (+ (dm/get-prop selrect :width) (* 2 stroke-margin))