From 3efa1f04f1b2be986c7c7bb18e8f92212a5753b5 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Mon, 23 Mar 2020 10:06:07 +0100 Subject: [PATCH] Start work. Goal remove maximun of unoptimiced forced transforms and provide a way to full control transforms from LPE --- src/live_effects/effect.cpp | 4 +-- src/live_effects/effect.h | 2 +- src/live_effects/lpe-bendpath.cpp | 4 +-- src/live_effects/lpe-bendpath.h | 2 +- src/live_effects/lpe-copy_rotate.cpp | 16 ++++++++++ src/live_effects/lpe-copy_rotate.h | 1 + src/live_effects/lpe-envelope.cpp | 10 +++---- src/live_effects/lpe-envelope.h | 2 +- src/live_effects/lpe-interpolate.cpp | 4 +-- src/live_effects/lpe-interpolate.h | 2 +- src/live_effects/lpe-jointype.cpp | 4 +-- src/live_effects/lpe-jointype.h | 3 +- src/live_effects/lpe-lattice2.cpp | 29 +++++++++++++++++++ src/live_effects/lpe-lattice2.h | 2 ++ src/live_effects/lpe-measure-segments.cpp | 23 ++++++++------- src/live_effects/lpe-measure-segments.h | 1 + src/live_effects/lpe-mirror_symmetry.cpp | 9 ++++++ src/live_effects/lpe-mirror_symmetry.h | 1 + src/live_effects/lpe-offset.cpp | 4 +-- src/live_effects/lpe-offset.h | 2 +- src/live_effects/lpe-patternalongpath.cpp | 4 +-- src/live_effects/lpe-patternalongpath.h | 2 +- src/live_effects/lpe-perspective-envelope.cpp | 10 +++---- src/live_effects/lpe-perspective-envelope.h | 2 +- src/live_effects/lpe-powerstroke.cpp | 4 +-- src/live_effects/lpe-powerstroke.h | 2 +- src/live_effects/lpe-taperstroke.cpp | 4 +-- src/live_effects/lpe-taperstroke.h | 2 +- src/live_effects/lpe-transform_2pts.cpp | 6 ++-- src/live_effects/lpe-transform_2pts.h | 2 +- src/live_effects/parameter/parameter.cpp | 10 ++----- src/live_effects/parameter/parameter.h | 4 +-- src/live_effects/parameter/path.cpp | 16 ++++++++-- src/live_effects/parameter/path.h | 4 +-- src/live_effects/parameter/point.cpp | 13 +++++++-- src/live_effects/parameter/point.h | 2 +- .../parameter/powerstrokepointarray.cpp | 2 +- .../parameter/powerstrokepointarray.h | 2 +- .../parameter/satellitesarray.cpp | 2 +- src/live_effects/parameter/satellitesarray.h | 2 +- .../parameter/transformedpoint.cpp | 18 ++++++++++-- src/live_effects/parameter/transformedpoint.h | 2 +- src/live_effects/parameter/vector.cpp | 19 ++++++++++-- src/live_effects/parameter/vector.h | 2 +- src/object/sp-ellipse.cpp | 8 ++--- src/object/sp-lpe-item.cpp | 13 ++++----- src/object/sp-lpe-item.h | 4 +-- src/object/sp-path.cpp | 18 ++++++++++-- src/object/sp-rect.cpp | 7 ++--- src/object/sp-spiral.cpp | 27 ++++++++++++----- src/object/sp-star.cpp | 28 +++++++++++------- 51 files changed, 250 insertions(+), 116 deletions(-) diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 86eda6984c..848d490d1e 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -1156,9 +1156,9 @@ Effect::setCurrentZoom(double cZ) } /** - * Overrided function to apply transforms for example to powerstrole, jointtype or tapperstroke + * Overrided function to apply transforms */ -void Effect::transform_multiply(Geom::Affine const &postmul, bool /*set*/) {} +void Effect::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) {} void Effect::setSelectedNodePoints(std::vector sNP) diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index f631646a79..80de233d5d 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -76,7 +76,7 @@ public: bool isNodePointSelected(Geom::Point const &nodePoint) const; virtual void doOnApply (SPLPEItem const* lpeitem); virtual void doBeforeEffect (SPLPEItem const* lpeitem); - virtual void transform_multiply(Geom::Affine const &postmul, bool set); + virtual void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = false); virtual void doAfterEffect (SPLPEItem const* lpeitem); virtual void doOnException(SPLPEItem const *lpeitem); virtual void doOnRemove (SPLPEItem const* lpeitem); diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index 58f27f4bdb..06296168fe 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -96,9 +96,9 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem) } } -void LPEBendPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEBendPath::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - bend_path.param_transform_multiply(postmul, false); + bend_path.param_transform_multiply(premul, postmul, set); } Geom::Piecewise > diff --git a/src/live_effects/lpe-bendpath.h b/src/live_effects/lpe-bendpath.h index b34f2886b1..baa997aba1 100644 --- a/src/live_effects/lpe-bendpath.h +++ b/src/live_effects/lpe-bendpath.h @@ -44,7 +44,7 @@ public: void resetDefaults(SPItem const* item) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector &hp_vec) override; diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp index ccfa7aebae..23418960c1 100644 --- a/src/live_effects/lpe-copy_rotate.cpp +++ b/src/live_effects/lpe-copy_rotate.cpp @@ -109,6 +109,22 @@ LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) : LPECopyRotate::~LPECopyRotate() = default; +void LPECopyRotate::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) +{ + Geom::Point origmul = Geom::Point(); + // origin keep normal translation but starting point is rotated bsaed on BBOX + origin.param_transform_multiply(premul, postmul, set, origmul); + Geom::Affine transform = premul; + if (!set) { + transform = premul * postmul.inverse(); + } + origmul = transform.rotationCenter(); + if (!origmul.isFinite()) { + origmul = sp_lpe_item->getCenter(); + } + starting_point.param_transform_multiply(premul, postmul, set, origmul); +} + void LPECopyRotate::doAfterEffect (SPLPEItem const* lpeitem) { diff --git a/src/live_effects/lpe-copy_rotate.h b/src/live_effects/lpe-copy_rotate.h index 7bf203fcb5..29020deca8 100644 --- a/src/live_effects/lpe-copy_rotate.h +++ b/src/live_effects/lpe-copy_rotate.h @@ -44,6 +44,7 @@ public: void resetDefaults(SPItem const* item) override; void doOnRemove (SPLPEItem const* /*lpeitem*/) override; void doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; Gtk::Widget * newWidget() override; void cloneStyle(SPObject *orig, SPObject *dest); Geom::PathVector doEffect_path_post (Geom::PathVector const & path_in); diff --git a/src/live_effects/lpe-envelope.cpp b/src/live_effects/lpe-envelope.cpp index cac8d7b367..838b0000be 100644 --- a/src/live_effects/lpe-envelope.cpp +++ b/src/live_effects/lpe-envelope.cpp @@ -35,12 +35,12 @@ LPEEnvelope::LPEEnvelope(LivePathEffectObject *lpeobject) : LPEEnvelope::~LPEEnvelope() = default; -void LPEEnvelope::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEEnvelope::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - bend_path1.param_transform_multiply(postmul, false); - bend_path2.param_transform_multiply(postmul, false); - bend_path3.param_transform_multiply(postmul, false); - bend_path4.param_transform_multiply(postmul, false); + bend_path1.param_transform_multiply(premul, postmul, set); + bend_path2.param_transform_multiply(premul, postmul, set); + bend_path3.param_transform_multiply(premul, postmul, set); + bend_path4.param_transform_multiply(premul, postmul, set); } void diff --git a/src/live_effects/lpe-envelope.h b/src/live_effects/lpe-envelope.h index 0cf2bfd3f0..800abb65fa 100644 --- a/src/live_effects/lpe-envelope.h +++ b/src/live_effects/lpe-envelope.h @@ -33,7 +33,7 @@ public: ~LPEEnvelope() override; void doBeforeEffect (SPLPEItem const* lpeitem) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; Geom::Piecewise > doEffect_pwd2 (Geom::Piecewise > const & pwd2_in) override; diff --git a/src/live_effects/lpe-interpolate.cpp b/src/live_effects/lpe-interpolate.cpp index 7012aa528c..6f98781711 100644 --- a/src/live_effects/lpe-interpolate.cpp +++ b/src/live_effects/lpe-interpolate.cpp @@ -47,9 +47,9 @@ LPEInterpolate::LPEInterpolate(LivePathEffectObject *lpeobject) LPEInterpolate::~LPEInterpolate() = default; -void LPEInterpolate::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEInterpolate::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - trajectory_path.param_transform_multiply(postmul, false); + trajectory_path.param_transform_multiply(premul, postmul, set); } /* diff --git a/src/live_effects/lpe-interpolate.h b/src/live_effects/lpe-interpolate.h index 1c943965ee..873927df6e 100644 --- a/src/live_effects/lpe-interpolate.h +++ b/src/live_effects/lpe-interpolate.h @@ -29,7 +29,7 @@ class LPEInterpolate : public Effect { ~LPEInterpolate() override; Geom::PathVector doEffect_path(Geom::PathVector const &path_in) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void resetDefaults(SPItem const *item) override; diff --git a/src/live_effects/lpe-jointype.cpp b/src/live_effects/lpe-jointype.cpp index 7617f54279..cd6046261b 100644 --- a/src/live_effects/lpe-jointype.cpp +++ b/src/live_effects/lpe-jointype.cpp @@ -128,12 +128,12 @@ void LPEJoinType::doOnApply(SPLPEItem const* lpeitem) } } -void LPEJoinType::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEJoinType::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool transform_stroke = prefs ? prefs->getBool("/options/transform/stroke", true) : true; if (transform_stroke) { - line_width.param_transform_multiply(postmul, false); + line_width.param_transform_multiply(premul, postmul, set); } } diff --git a/src/live_effects/lpe-jointype.h b/src/live_effects/lpe-jointype.h index 5d5e20c60e..573954e710 100644 --- a/src/live_effects/lpe-jointype.h +++ b/src/live_effects/lpe-jointype.h @@ -25,7 +25,8 @@ public: void doOnApply(SPLPEItem const* lpeitem) override; void doOnRemove(SPLPEItem const* lpeitem) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; + Geom::PathVector doEffect_path (Geom::PathVector const & path_in) override; private: diff --git a/src/live_effects/lpe-lattice2.cpp b/src/live_effects/lpe-lattice2.cpp index 0f0a44235e..09e979066c 100644 --- a/src/live_effects/lpe-lattice2.cpp +++ b/src/live_effects/lpe-lattice2.cpp @@ -101,6 +101,35 @@ LPELattice2::LPELattice2(LivePathEffectObject *lpeobject) : LPELattice2::~LPELattice2() = default; +void LPELattice2::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) +{ + grid_point_0.param_transform_multiply(premul, postmul, set); + grid_point_1.param_transform_multiply(premul, postmul, set); + grid_point_2.param_transform_multiply(premul, postmul, set); + grid_point_3.param_transform_multiply(premul, postmul, set); + grid_point_4.param_transform_multiply(premul, postmul, set); + grid_point_5.param_transform_multiply(premul, postmul, set); + grid_point_6.param_transform_multiply(premul, postmul, set); + grid_point_7.param_transform_multiply(premul, postmul, set); + grid_point_8x9.param_transform_multiply(premul, postmul, set); + grid_point_10x11.param_transform_multiply(premul, postmul, set); + grid_point_12.param_transform_multiply(premul, postmul, set); + grid_point_13.param_transform_multiply(premul, postmul, set); + grid_point_14.param_transform_multiply(premul, postmul, set); + grid_point_15.param_transform_multiply(premul, postmul, set); + grid_point_16.param_transform_multiply(premul, postmul, set); + grid_point_17.param_transform_multiply(premul, postmul, set); + grid_point_18.param_transform_multiply(premul, postmul, set); + grid_point_19.param_transform_multiply(premul, postmul, set); + grid_point_20x21.param_transform_multiply(premul, postmul, set); + grid_point_22x23.param_transform_multiply(premul, postmul, set); + grid_point_24x26.param_transform_multiply(premul, postmul, set); + grid_point_25x27.param_transform_multiply(premul, postmul, set); + grid_point_28x30.param_transform_multiply(premul, postmul, set); + grid_point_29x31.param_transform_multiply(premul, postmul, set); + grid_point_32x33x34x35.param_transform_multiply(premul, postmul, set); +} + Geom::Piecewise > LPELattice2::doEffect_pwd2 (Geom::Piecewise > const & pwd2_in) { diff --git a/src/live_effects/lpe-lattice2.h b/src/live_effects/lpe-lattice2.h index 319a0dc02c..a8fb9950c4 100644 --- a/src/live_effects/lpe-lattice2.h +++ b/src/live_effects/lpe-lattice2.h @@ -44,6 +44,8 @@ public: void doBeforeEffect(SPLPEItem const* lpeitem) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; + Gtk::Widget * newWidget() override; void calculateCurve(Geom::Point a,Geom::Point b, SPCurve *c, bool horizontal, bool move); diff --git a/src/live_effects/lpe-measure-segments.cpp b/src/live_effects/lpe-measure-segments.cpp index 6635855558..05fff4a948 100644 --- a/src/live_effects/lpe-measure-segments.cpp +++ b/src/live_effects/lpe-measure-segments.cpp @@ -209,6 +209,11 @@ LPEMeasureSegments::~LPEMeasureSegments() { doOnRemove(nullptr); } +void LPEMeasureSegments::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) +{ + +} + Gtk::Widget * LPEMeasureSegments::newWidget() { @@ -514,9 +519,7 @@ LPEMeasureSegments::createTextLabel(Geom::Point pos, size_t counter, double leng if (showindex) { label_value = Glib::ustring("[") + Glib::ustring::format(counter) + Glib::ustring("] ") + label_value; } - if (!valid) { - label_value = Glib::ustring(_("Non Uniform Scale")); - } + rstring->setContent(label_value.c_str()); // this boring hack is to update the text with document scale inituialy loaded without root transform Geom::OptRect bounds = SP_ITEM(elemref)->geometricBounds(); @@ -657,7 +660,7 @@ LPEMeasureSegments::createLine(Geom::Point start,Geom::Point end, Glib::ustring sp_repr_css_write_string(css,css_str); line->setAttributeOrRemoveIfEmpty("style", css_str); if (!elemref) { - elemref = document->getRoot()->appendChildRepr(line); + elemref = sp_lpe_item->parent->appendChildRepr(line); Inkscape::GC::release(line); } } @@ -844,7 +847,6 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) //Avoid crashes on previews Geom::Affine parentaffinetransform = i2anc_affine(SP_OBJECT(lpeitem->parent), SP_OBJECT(document->getRoot())); Geom::Affine affinetransform = i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(document->getRoot())); - Geom::Affine itemtransform = affinetransform * parentaffinetransform.inverse(); //Projection prepare Geom::PathVector pathvector; std::vector< Point > nodes; @@ -853,7 +855,7 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) if (bbox) { Geom::Point mid = bbox->midpoint(); double angle = Geom::rad_from_deg(angle_projection); - Geom::Affine transform = itemtransform; + Geom::Affine transform = affinetransform * parentaffinetransform.inverse(); transform *= Geom::Translate(mid).inverse(); transform *= Geom::Rotate(angle).inverse(); transform *= Geom::Translate(mid); @@ -864,8 +866,9 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) if (iter->ref.isAttached() && iter->actived && (obj = iter->ref.getObject()) && SP_IS_ITEM(obj)) { SPItem * item = dynamic_cast(obj); if (item) { + Geom::Affine parentaffinetransform_sub = i2anc_affine(SP_OBJECT(item->parent), SP_OBJECT(document->getRoot())); Geom::Affine affinetransform_sub = i2anc_affine(SP_OBJECT(item), SP_OBJECT(document->getRoot())); - Geom::Affine transform = affinetransform_sub ; + transform = affinetransform_sub * parentaffinetransform_sub.inverse(); transform *= Geom::Translate(-mid); transform *= Geom::Rotate(angle).inverse(); transform *= Geom::Translate(mid); @@ -941,7 +944,7 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) Geom::Point next_stored = Geom::Point(0,0); if (!active_projection) { pathvector = pathv_to_linear_and_cubic_beziers(c->get_pathvector()); - pathvector *= affinetransform; + pathvector *= affinetransform * parentaffinetransform.inverse(); } c->unref(); auto format_str = format.param_getSVGValue(); @@ -1189,8 +1192,8 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) pos = pos + Point::polar(angle_cross, text_top_bottom + (fontsize/2.5)); } double parents_scale = (parentaffinetransform.expansionX() + parentaffinetransform.expansionY()) / 2.0; - if (!scale_sensitive) { - length /= parents_scale; + if (scale_sensitive) { + length *= parents_scale; } if ((anotation_width/2) > Geom::distance(hstart,hend)/2.0) { if (avoid_overlapping) { diff --git a/src/live_effects/lpe-measure-segments.h b/src/live_effects/lpe-measure-segments.h index ea7c8e7a87..df53c2c886 100644 --- a/src/live_effects/lpe-measure-segments.h +++ b/src/live_effects/lpe-measure-segments.h @@ -41,6 +41,7 @@ public: void doOnRemove(SPLPEItem const* /*lpeitem*/) override; void doEffect (SPCurve * curve) override {}; void doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; Gtk::Widget * newWidget() override; void createLine(Geom::Point start,Geom::Point end, Glib::ustring name, size_t counter, bool main, bool remove, bool arrows = false); void createTextLabel(Geom::Point pos, size_t counter, double length, Geom::Coord angle, bool remove, bool valid); diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index fe764878ba..93f881b380 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -81,6 +81,15 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : LPEMirrorSymmetry::~LPEMirrorSymmetry() = default; +void LPEMirrorSymmetry::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) +{ + // origin keep normal translation but starting point is rotated bsaed on BBOX + start_point.param_transform_multiply(premul, postmul, set); + end_point.param_transform_multiply(premul, postmul, set); + center_point.param_transform_multiply(premul, postmul, set); + previous_center = center_point; +} + void LPEMirrorSymmetry::doAfterEffect (SPLPEItem const* lpeitem) { diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index aaddb3836d..3d439d1082 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -46,6 +46,7 @@ public: void doBeforeEffect (SPLPEItem const* lpeitem) override; void doAfterEffect (SPLPEItem const* lpeitem) override; Geom::PathVector doEffect_path (Geom::PathVector const & path_in) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void doOnRemove (SPLPEItem const* /*lpeitem*/) override; void doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) override; Gtk::Widget * newWidget() override; diff --git a/src/live_effects/lpe-offset.cpp b/src/live_effects/lpe-offset.cpp index e88b798150..920748192b 100644 --- a/src/live_effects/lpe-offset.cpp +++ b/src/live_effects/lpe-offset.cpp @@ -136,9 +136,9 @@ LPEOffset::get_nearest_point(Geom::PathVector pathv, Geom::Point point) const return res; } -void LPEOffset::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEOffset::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - offset.param_transform_multiply(postmul, true); + offset.param_transform_multiply(premul, postmul, set); offset_pt = Geom::Point(Geom::infinity(), Geom::infinity()); } diff --git a/src/live_effects/lpe-offset.h b/src/live_effects/lpe-offset.h index 83d9f2e59d..d09e7e6ce8 100644 --- a/src/live_effects/lpe-offset.h +++ b/src/live_effects/lpe-offset.h @@ -37,7 +37,7 @@ public: ~LPEOffset() override; void doBeforeEffect (SPLPEItem const* lpeitem) override; Geom::PathVector doEffect_path (Geom::PathVector const & path_in) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void addKnotHolderEntities(KnotHolder * knotholder, SPItem * item) override; void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector &hp_vec) override; void calculateOffset (Geom::PathVector const & path_in); diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp index 2eb3fcd8aa..76e2fc4712 100644 --- a/src/live_effects/lpe-patternalongpath.cpp +++ b/src/live_effects/lpe-patternalongpath.cpp @@ -114,9 +114,9 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) : LPEPatternAlongPath::~LPEPatternAlongPath() = default; -void LPEPatternAlongPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEPatternAlongPath::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - pattern.param_transform_multiply(postmul, false); + pattern.param_transform_multiply(premul, postmul, set); } void diff --git a/src/live_effects/lpe-patternalongpath.h b/src/live_effects/lpe-patternalongpath.h index 690aaa99f3..9b5b3a8638 100644 --- a/src/live_effects/lpe-patternalongpath.h +++ b/src/live_effects/lpe-patternalongpath.h @@ -40,7 +40,7 @@ public: Geom::Piecewise > doEffect_pwd2 (Geom::Piecewise > const & pwd2_in) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector &hp_vec) override; diff --git a/src/live_effects/lpe-perspective-envelope.cpp b/src/live_effects/lpe-perspective-envelope.cpp index 0d80b683c6..2d885ae9e7 100644 --- a/src/live_effects/lpe-perspective-envelope.cpp +++ b/src/live_effects/lpe-perspective-envelope.cpp @@ -67,12 +67,12 @@ LPEPerspectiveEnvelope::LPEPerspectiveEnvelope(LivePathEffectObject *lpeobject) LPEPerspectiveEnvelope::~LPEPerspectiveEnvelope() = default; -void LPEPerspectiveEnvelope::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEPerspectiveEnvelope::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - up_left_point.param_transform_multiply(postmul, false); - up_right_point.param_transform_multiply(postmul, false); - down_left_point.param_transform_multiply(postmul, false); - down_right_point.param_transform_multiply(postmul, false); + up_left_point.param_transform_multiply(premul, postmul, set); + up_right_point.param_transform_multiply(premul, postmul, set); + down_left_point.param_transform_multiply(premul, postmul, set); + down_right_point.param_transform_multiply(premul, postmul, set); } bool pointInTriangle(Geom::Point const &p, std::vector points) diff --git a/src/live_effects/lpe-perspective-envelope.h b/src/live_effects/lpe-perspective-envelope.h index 7aa32ecc1a..d01e4ab7cb 100644 --- a/src/live_effects/lpe-perspective-envelope.h +++ b/src/live_effects/lpe-perspective-envelope.h @@ -37,7 +37,7 @@ public: virtual Geom::Point projectPoint(Geom::Point p); - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; virtual Geom::Point projectPoint(Geom::Point p, double m[][3]); diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index ca20076ba9..80916cbf0a 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -847,9 +847,9 @@ LPEPowerStroke::doEffect_path (Geom::PathVector const & path_in) return path_out; } -void LPEPowerStroke::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPEPowerStroke::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - offset_points.param_transform_multiply(postmul, false); + offset_points.param_transform_multiply(premul, postmul, set); } void LPEPowerStroke::doAfterEffect(SPLPEItem const *lpeitem) diff --git a/src/live_effects/lpe-powerstroke.h b/src/live_effects/lpe-powerstroke.h index ecf107b74e..1032d4915d 100644 --- a/src/live_effects/lpe-powerstroke.h +++ b/src/live_effects/lpe-powerstroke.h @@ -44,7 +44,7 @@ public: void doOnApply(SPLPEItem const* lpeitem) override; void doOnRemove(SPLPEItem const* lpeitem) override; void doAfterEffect(SPLPEItem const *lpeitem) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void applyStyle(SPLPEItem *lpeitem); // methods called by path-manipulator upon edits void adjustForNewPath(Geom::PathVector const & path_in); diff --git a/src/live_effects/lpe-taperstroke.cpp b/src/live_effects/lpe-taperstroke.cpp index 2db2e017d3..e5673a6ca6 100644 --- a/src/live_effects/lpe-taperstroke.cpp +++ b/src/live_effects/lpe-taperstroke.cpp @@ -94,12 +94,12 @@ LPETaperStroke::LPETaperStroke(LivePathEffectObject *lpeobject) : // from LPEPowerStroke -- sets fill if stroke color because we will // be converting to a fill to make the new join. -void LPETaperStroke::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPETaperStroke::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool transform_stroke = prefs ? prefs->getBool("/options/transform/stroke", true) : true; if (transform_stroke) { - line_width.param_transform_multiply(postmul, false); + line_width.param_transform_multiply(premul, postmul, set); } } diff --git a/src/live_effects/lpe-taperstroke.h b/src/live_effects/lpe-taperstroke.h index 6b4900c1da..78b61cee74 100644 --- a/src/live_effects/lpe-taperstroke.h +++ b/src/live_effects/lpe-taperstroke.h @@ -36,7 +36,7 @@ public: Geom::PathVector doEffect_path (Geom::PathVector const& path_in) override; Geom::PathVector doEffect_simplePath(Geom::PathVector const& path_in); - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; void addKnotHolderEntities(KnotHolder * knotholder, SPItem * item) override; diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp index a426018625..2e6e31d75c 100644 --- a/src/live_effects/lpe-transform_2pts.cpp +++ b/src/live_effects/lpe-transform_2pts.cpp @@ -117,10 +117,10 @@ LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem) end.param_set_default(); } -void LPETransform2Pts::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void LPETransform2Pts::transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { - start.param_transform_multiply(postmul, false); - end.param_transform_multiply(postmul, false); + start.param_transform_multiply(premul, postmul, set); + end.param_transform_multiply(premul, postmul, set); } void diff --git a/src/live_effects/lpe-transform_2pts.h b/src/live_effects/lpe-transform_2pts.h index d72e69a6c3..b15d04779c 100644 --- a/src/live_effects/lpe-transform_2pts.h +++ b/src/live_effects/lpe-transform_2pts.h @@ -34,7 +34,7 @@ public: void doBeforeEffect (SPLPEItem const* lpeitem) override; - void transform_multiply(Geom::Affine const &postmul, bool set) override; + void transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0) override; Gtk::Widget *newWidget() override; diff --git a/src/live_effects/parameter/parameter.cpp b/src/live_effects/parameter/parameter.cpp index 355e7dde71..1d2dbdc6c3 100644 --- a/src/live_effects/parameter/parameter.cpp +++ b/src/live_effects/parameter/parameter.cpp @@ -108,15 +108,9 @@ void ScalarParam::param_update_default(const gchar *default_value) } } -void ScalarParam::param_transform_multiply(Geom::Affine const &postmul, bool set) +void ScalarParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { - // Check if proportional stroke-width scaling is on - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool transform_stroke = prefs ? prefs->getBool("/options/transform/stroke", true) : true; - if (transform_stroke || set) { - param_set_value(value * postmul.descrim()); - write_to_SVG(); - } + param_set_value(value * postmul.descrim()); } void ScalarParam::param_set_value(gdouble val) diff --git a/src/live_effects/parameter/parameter.h b/src/live_effects/parameter/parameter.h index b73a5fe830..99dd1ed467 100644 --- a/src/live_effects/parameter/parameter.h +++ b/src/live_effects/parameter/parameter.h @@ -80,7 +80,7 @@ class Parameter { virtual void param_editOncanvas(SPItem * /*item*/, SPDesktop * /*dt*/){}; virtual void param_setup_nodepath(Inkscape::NodePath::Path * /*np*/){}; - virtual void param_transform_multiply(Geom::Affine const & /*postmul*/, bool set){}; + virtual void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()){}; Glib::ustring param_key; Glib::ustring param_tooltip; @@ -109,7 +109,7 @@ class ScalarParam : public Parameter { bool param_readSVGValue(const gchar *strvalue) override; Glib::ustring param_getSVGValue() const override; Glib::ustring param_getDefaultSVGValue() const override; - void param_transform_multiply(Geom::Affine const &postmul, bool set) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void param_set_default() override; void param_update_default(gdouble default_value); diff --git a/src/live_effects/parameter/path.cpp b/src/live_effects/parameter/path.cpp index 9b51c2da9b..f2b0d1fba4 100644 --- a/src/live_effects/parameter/path.cpp +++ b/src/live_effects/parameter/path.cpp @@ -317,11 +317,23 @@ PathParam::addCanvasIndicators(SPLPEItem const*/*lpeitem*/, std::vector &hp_vec) override; - - void param_transform_multiply(Geom::Affine const &postmul, bool set) override; + + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void setFromOriginalD(bool from_original_d){ _from_original_d = from_original_d; }; sigc::signal signal_path_pasted; diff --git a/src/live_effects/parameter/point.cpp b/src/live_effects/parameter/point.cpp index 8f627a952b..1cd39f921b 100644 --- a/src/live_effects/parameter/point.cpp +++ b/src/live_effects/parameter/point.cpp @@ -141,9 +141,18 @@ PointParam::param_getDefaultSVGValue() const } void -PointParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/) +PointParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { - param_setValue( (*this) * postmul, true); + if (!Geom::are_near(origmul, Geom::Point())) { + Geom::Point gap = origmul - (*this); + Geom::Affine transform = Geom::identity(); + transform *= Geom::Translate(gap); + transform *= postmul; + transform *= Geom::Translate(gap).inverse(); + param_setValue( (*this) * transform, true); + } else { + param_setValue( (*this) * postmul, true); + } } Gtk::Widget * diff --git a/src/live_effects/parameter/point.h b/src/live_effects/parameter/point.h index 26e0e32c81..4be84928d7 100644 --- a/src/live_effects/parameter/point.h +++ b/src/live_effects/parameter/point.h @@ -49,7 +49,7 @@ public: void param_update_default(Geom::Point default_point); void param_update_default(const gchar * default_point) override; - void param_transform_multiply(Geom::Affine const & /*postmul*/, bool set) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color); diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index e90364f849..7f23e68d38 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -43,7 +43,7 @@ PowerStrokePointArrayParam::param_newWidget() return nullptr; } -void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { // Check if proportional stroke-width scaling is on Inkscape::Preferences *prefs = Inkscape::Preferences::get(); diff --git a/src/live_effects/parameter/powerstrokepointarray.h b/src/live_effects/parameter/powerstrokepointarray.h index 36c44322b8..1e66646911 100644 --- a/src/live_effects/parameter/powerstrokepointarray.h +++ b/src/live_effects/parameter/powerstrokepointarray.h @@ -35,7 +35,7 @@ public: Gtk::Widget * param_newWidget() override; - void param_transform_multiply(Geom::Affine const& postmul, bool /*set*/) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color); diff --git a/src/live_effects/parameter/satellitesarray.cpp b/src/live_effects/parameter/satellitesarray.cpp index 7f15298cf3..574c193877 100644 --- a/src/live_effects/parameter/satellitesarray.cpp +++ b/src/live_effects/parameter/satellitesarray.cpp @@ -176,7 +176,7 @@ void SatellitesArrayParam::addCanvasIndicators( hp_vec.push_back(_hp); } -void SatellitesArrayParam::param_transform_multiply(Geom::Affine const &postmul, bool /*set*/) +void SatellitesArrayParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); diff --git a/src/live_effects/parameter/satellitesarray.h b/src/live_effects/parameter/satellitesarray.h index c15b7107bb..25f3a23580 100644 --- a/src/live_effects/parameter/satellitesarray.h +++ b/src/live_effects/parameter/satellitesarray.h @@ -50,7 +50,7 @@ public: { return true; } - void param_transform_multiply(Geom::Affine const &postmul, bool /*set*/) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void setUseDistance(bool use_knot_distance); void setCurrentZoom(double current_zoom); void setGlobalKnotHide(bool global_knot_hide); diff --git a/src/live_effects/parameter/transformedpoint.cpp b/src/live_effects/parameter/transformedpoint.cpp index 694f946adb..35d12905ff 100644 --- a/src/live_effects/parameter/transformedpoint.cpp +++ b/src/live_effects/parameter/transformedpoint.cpp @@ -137,10 +137,24 @@ TransformedPointParam::set_and_write_new_values(Geom::Point const &new_origin, G } void -TransformedPointParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/) +TransformedPointParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { if (!noTransform) { - set_and_write_new_values( origin * postmul, vector * postmul.withoutTranslation() ); + if (!Geom::are_near(origmul, Geom::Point())) { + Geom::Point gap = origmul - origin; + Geom::Affine transform = Geom::identity(); + transform *= Geom::Translate(gap); + transform *= postmul; + transform *= Geom::Translate(gap).inverse(); + gap = origmul - vector; + Geom::Affine transformv = Geom::identity(); + transformv *= Geom::Translate(gap); + transformv *= postmul; + transformv *= Geom::Translate(gap).inverse(); + set_and_write_new_values( origin * transform, vector * transformv.withoutTranslation() ); + } else { + set_and_write_new_values( origin * postmul, vector * postmul.withoutTranslation() ); + } } } diff --git a/src/live_effects/parameter/transformedpoint.h b/src/live_effects/parameter/transformedpoint.h index 3fd6989be2..a0784aee98 100644 --- a/src/live_effects/parameter/transformedpoint.h +++ b/src/live_effects/parameter/transformedpoint.h @@ -49,7 +49,7 @@ public: void set_and_write_new_values(Geom::Point const &new_origin, Geom::Point const &new_vector); - void param_transform_multiply(Geom::Affine const &postmul, bool set) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color); void set_oncanvas_color(guint32 color); diff --git a/src/live_effects/parameter/vector.cpp b/src/live_effects/parameter/vector.cpp index ab0a9aea48..b52d8a9e06 100644 --- a/src/live_effects/parameter/vector.cpp +++ b/src/live_effects/parameter/vector.cpp @@ -137,12 +137,25 @@ VectorParam::set_and_write_new_values(Geom::Point const &new_origin, Geom::Point } void -VectorParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/) +VectorParam::param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set, Geom::Point origmul) { - set_and_write_new_values( origin * postmul, vector * postmul.withoutTranslation() ); + if (!Geom::are_near(origmul, Geom::Point())) { + Geom::Point gap = origmul - origin; + Geom::Affine transform = Geom::identity(); + transform *= Geom::Translate(gap); + transform *= postmul; + transform *= Geom::Translate(gap).inverse(); + gap = origmul - vector; + Geom::Affine transformv = Geom::identity(); + transformv *= Geom::Translate(gap); + transformv *= postmul; + transformv *= Geom::Translate(gap).inverse(); + set_and_write_new_values( origin * transform, vector * transformv.withoutTranslation() ); + } else { + set_and_write_new_values( origin * postmul, vector * postmul.withoutTranslation() ); + } } - void VectorParam::set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color) { diff --git a/src/live_effects/parameter/vector.h b/src/live_effects/parameter/vector.h index d9894e92c7..a4ecc761b2 100644 --- a/src/live_effects/parameter/vector.h +++ b/src/live_effects/parameter/vector.h @@ -48,7 +48,7 @@ public: void set_and_write_new_values(Geom::Point const &new_origin, Geom::Point const &new_vector); - void param_transform_multiply(Geom::Affine const &postmul, bool set) override; + void param_transform_multiply(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = 0, Geom::Point origmul = Geom::Point()) override; void set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color); void set_origin_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color); diff --git a/src/object/sp-ellipse.cpp b/src/object/sp-ellipse.cpp index 6b30516e12..4b022d7506 100644 --- a/src/object/sp-ellipse.cpp +++ b/src/object/sp-ellipse.cpp @@ -500,11 +500,6 @@ void SPGenericEllipse::set_shape() Geom::Affine SPGenericEllipse::set_transform(Geom::Affine const &xform) { - notifyTransform(xform); - if (pathEffectsEnabled() && !optimizeTransforms()) { - return xform; - } - /* Calculate ellipse start in parent coords. */ Geom::Point pos(Geom::Point(this->cx.computed, this->cy.computed) * xform); @@ -554,6 +549,9 @@ Geom::Affine SPGenericEllipse::set_transform(Geom::Affine const &xform) // Adjust gradient fill this->adjust_gradient(xform * ret.inverse()); + // Adjust LPE + this->adjust_livepatheffect(xform, ret, !Geom::are_near(Geom::identity(),ret)); + return ret; } diff --git a/src/object/sp-lpe-item.cpp b/src/object/sp-lpe-item.cpp index cab9fab81a..3ef03f8de3 100755 --- a/src/object/sp-lpe-item.cpp +++ b/src/object/sp-lpe-item.cpp @@ -290,7 +290,7 @@ bool SPLPEItem::performOnePathEffect(SPCurve *curve, SPShape *current, Inkscape: /** * returns true when LPE write unoptimiced */ -bool SPLPEItem::optimizeTransforms() +bool SPLPEItem::optimizeTransforms(Geom::Affine const &transform) { bool ret = true; if (dynamic_cast(this)) { @@ -309,12 +309,11 @@ bool SPLPEItem::optimizeTransforms() if (lpeobj) { Inkscape::LivePathEffect::Effect *lpe = lpeobj->get_lpe(); if (lpe) { - if (dynamic_cast(lpe) || + if (//dynamic_cast(lpe) || dynamic_cast(lpe) || - dynamic_cast(lpe) || - dynamic_cast(lpe) || dynamic_cast(lpe) || - dynamic_cast(lpe)) { + (dynamic_cast(lpe) && transform.withoutTranslation() != Geom::identity())) + { ret = false; } } @@ -326,7 +325,7 @@ bool SPLPEItem::optimizeTransforms() /** * notify tranbsform applied to a LPE */ -void SPLPEItem::notifyTransform(Geom::Affine const &postmul) +void SPLPEItem::adjust_livepatheffect(Geom::Affine const &premul, Geom::Affine const &postmul, bool set) { std::list::iterator i; for (i = this->path_effect_list->begin(); i != this->path_effect_list->end(); ++i) { @@ -338,7 +337,7 @@ void SPLPEItem::notifyTransform(Geom::Affine const &postmul) if (lpeobj) { Inkscape::LivePathEffect::Effect *lpe = lpeobj->get_lpe(); if (lpe && !lpe->is_load) { - lpe->transform_multiply(postmul, false); + lpe->transform_multiply(premul, postmul, set); } } } diff --git a/src/object/sp-lpe-item.h b/src/object/sp-lpe-item.h index 907b1f89fe..a1c28e4716 100644 --- a/src/object/sp-lpe-item.h +++ b/src/object/sp-lpe-item.h @@ -70,8 +70,8 @@ public: Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags) override; virtual void update_patheffect(bool write); - bool optimizeTransforms(); - void notifyTransform(Geom::Affine const &postmul); + bool optimizeTransforms(Geom::Affine const &transform); + void adjust_livepatheffect(Geom::Affine const &premul, Geom::Affine const &postmul, bool set = false); bool performPathEffect(SPCurve *curve, SPShape *current, bool is_clip_or_mask = false); bool performOnePathEffect(SPCurve *curve, SPShape *current, Inkscape::LivePathEffect::Effect *lpe, bool is_clip_or_mask = false); bool pathEffectsEnabled() const; diff --git a/src/object/sp-path.cpp b/src/object/sp-path.cpp index 54f5700129..8e27e88eb3 100644 --- a/src/object/sp-path.cpp +++ b/src/object/sp-path.cpp @@ -344,15 +344,26 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { return Geom::identity(); } - if (pathEffectsEnabled() && !optimizeTransforms()) { + if (!optimizeTransforms(transform)) { + // Adjust stroke + this->adjust_stroke(transform.descrim()); + + // Adjust pattern fill + this->adjust_pattern(transform); + + // Adjust gradient fill + this->adjust_gradient(transform); + + // Adjust LPE + this->adjust_livepatheffect(Geom::identity(), transform, true); return transform; } + if (hasPathEffectRecursive() && pathEffectsEnabled()) { _curve_before_lpe->transform(transform); } else { _curve->transform(transform); } - notifyTransform(transform); // Adjust stroke this->adjust_stroke(transform.descrim()); @@ -362,6 +373,9 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { // Adjust gradient fill this->adjust_gradient(transform); + // Adjust LPE + this->adjust_livepatheffect(transform, Geom::identity(), false); + // nothing remains - we've written all of the transform, so return identity return Geom::identity(); } diff --git a/src/object/sp-rect.cpp b/src/object/sp-rect.cpp index fda6ee402f..a8ff15995f 100644 --- a/src/object/sp-rect.cpp +++ b/src/object/sp-rect.cpp @@ -378,10 +378,6 @@ void SPRect::update_patheffect(bool write) { } Geom::Affine SPRect::set_transform(Geom::Affine const& xform) { - if (pathEffectsEnabled() && !optimizeTransforms()) { - return xform; - } - notifyTransform(xform); /* Calculate rect start in parent coords. */ Geom::Point pos(Geom::Point(this->x.computed, this->y.computed) * xform); @@ -435,6 +431,9 @@ Geom::Affine SPRect::set_transform(Geom::Affine const& xform) { // Adjust gradient fill this->adjust_gradient(xform * ret.inverse()); + // Adjust LPE + this->adjust_livepatheffect(xform, ret, !Geom::are_near(Geom::identity(),ret)); + return ret; } diff --git a/src/object/sp-spiral.cpp b/src/object/sp-spiral.cpp index 69f85a555c..2dacb15dc0 100644 --- a/src/object/sp-spiral.cpp +++ b/src/object/sp-spiral.cpp @@ -409,21 +409,29 @@ void SPSpiral::snappoints(std::vector &p, Inkscape */ Geom::Affine SPSpiral::set_transform(Geom::Affine const &xform) { - if (pathEffectsEnabled() && !optimizeTransforms()) { - return xform; - } + /* This function takes care of translation and scaling, we return whatever parts we can't + handle. */ + Geom::Affine ret(Geom::Affine(xform).withoutTranslation()); + gdouble const s = hypot(ret[0], ret[1]); // Only set transform with proportional scaling if (!xform.withoutTranslation().isUniformScale()) { + // Adjust stroke width + this->adjust_stroke(s); + + // Adjust pattern fill + this->adjust_pattern(xform); + + // Adjust gradient fill + this->adjust_gradient(xform); + + // Adjust LPE + adjust_livepatheffect(Geom::identity(), xform , true); return xform; } - notifyTransform(xform); + /* Calculate spiral start in parent coords. */ Geom::Point pos( Geom::Point(this->cx, this->cy) * xform ); - /* This function takes care of translation and scaling, we return whatever parts we can't - handle. */ - Geom::Affine ret(Geom::Affine(xform).withoutTranslation()); - gdouble const s = hypot(ret[0], ret[1]); if (s > 1e-9) { ret[0] /= s; ret[1] /= s; @@ -454,6 +462,9 @@ Geom::Affine SPSpiral::set_transform(Geom::Affine const &xform) // Adjust gradient fill this->adjust_gradient(xform * ret.inverse()); + // Adjust LPE + this->adjust_livepatheffect(xform, ret, !Geom::are_near(Geom::identity(),ret)); + return ret; } diff --git a/src/object/sp-star.cpp b/src/object/sp-star.cpp index 11835dc829..2c554b90e0 100644 --- a/src/object/sp-star.cpp +++ b/src/object/sp-star.cpp @@ -491,23 +491,28 @@ void SPStar::snappoints(std::vector &p, Inkscape:: Geom::Affine SPStar::set_transform(Geom::Affine const &xform) { bool opt_trans = (randomized == 0); - if (pathEffectsEnabled() && !optimizeTransforms()) { - return xform; - } + /* This function takes care of translation and scaling, we return whatever parts we can't + handle. */ + Geom::Affine ret(opt_trans ? xform.withoutTranslation() : xform); + gdouble const s = hypot(ret[0], ret[1]); // Only set transform with proportional scaling if (!xform.withoutTranslation().isUniformScale()) { - return xform; - } - notifyTransform(xform); + // Adjust stroke width + this->adjust_stroke(s); + + // Adjust pattern fill + this->adjust_pattern(xform); + // Adjust gradient fill + this->adjust_gradient(xform); + adjust_livepatheffect(Geom::identity(), xform, true); + return xform; + } /* Calculate star start in parent coords. */ Geom::Point pos( this->center * xform ); - /* This function takes care of translation and scaling, we return whatever parts we can't - handle. */ - Geom::Affine ret(opt_trans ? xform.withoutTranslation() : xform); - gdouble const s = hypot(ret[0], ret[1]); + if (s > 1e-9) { ret[0] /= s; ret[1] /= s; @@ -538,6 +543,9 @@ Geom::Affine SPStar::set_transform(Geom::Affine const &xform) // Adjust gradient fill this->adjust_gradient(xform * ret.inverse()); + // Adjust LPE + this->adjust_livepatheffect(xform, ret, !Geom::are_near(Geom::identity(),ret)); + return ret; } -- GitLab