From 3274e7a122962b69f873008ebb836d3e84afefa4 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sun, 12 Apr 2020 19:33:59 +0200 Subject: [PATCH] Fix bool LPE. Boolean LPE has a wrong way to transform operand, selecting it when transform. To fis it I call always to the existing function to inform all LPE when a transform is done. By default all LPE are marked to ignore if the LPE previously ignore it, except in bool LPE where we use it to transform operand. Fixed issue https://gitlab.com/inkscape/inkscape/-/issues/772. Fixed issue https://gitlab.com/inkscape/inkscape/-/issues/1076. Fixed issue https://gitlab.com/inkscape/inkscape/-/issues/1148. --- src/live_effects/lpe-bendpath.cpp | 4 +- src/live_effects/lpe-bool.cpp | 54 ++++--------------- src/live_effects/lpe-bool.h | 3 +- src/live_effects/lpe-envelope.cpp | 10 ++-- src/live_effects/lpe-interpolate.cpp | 4 +- src/live_effects/lpe-offset.cpp | 6 ++- src/live_effects/lpe-patternalongpath.cpp | 4 +- src/live_effects/lpe-perspective-envelope.cpp | 10 ++-- src/live_effects/lpe-transform_2pts.cpp | 6 ++- src/object/sp-ellipse.cpp | 1 - src/object/sp-item.cpp | 1 + src/object/sp-path.cpp | 2 - src/object/sp-rect.cpp | 1 - src/object/sp-spiral.cpp | 1 - src/object/sp-star.cpp | 2 - 15 files changed, 41 insertions(+), 68 deletions(-) diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index 8b9aab8466..afe1c59491 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -98,7 +98,9 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem) void LPEBendPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - bend_path.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + bend_path.param_transform_multiply(postmul, false); + } } Geom::Piecewise > diff --git a/src/live_effects/lpe-bool.cpp b/src/live_effects/lpe-bool.cpp index 96677291a3..52e4f447cf 100644 --- a/src/live_effects/lpe-bool.cpp +++ b/src/live_effects/lpe-bool.cpp @@ -21,9 +21,7 @@ #include "2geom/svg-path-parser.h" #include "display/curve.h" #include "object/sp-shape.h" -#include "seltrans.h" #include "svg/svg.h" -#include "ui/tools/select-tool.h" #include "helper/geom.h" @@ -96,16 +94,11 @@ LPEBool::LPEBool(LivePathEffectObject *lpeobject) registerParameter(&fill_type_operand); show_orig_path = true; operand = dynamic_cast(operand_path.getObject()); - contdown = 0; } LPEBool::~LPEBool() = default; -void LPEBool::resetDefaults(SPItem const * /*item*/) -{ -} - bool cmp_cut_position(const Path::cut_position &a, const Path::cut_position &b) { return a.piece == b.piece ? a.t < b.t : a.piece < b.piece; @@ -387,6 +380,9 @@ void LPEBool::doBeforeEffect(SPLPEItem const *lpeitem) } operand = current_operand; } + if (operand) { + operand->setHidden(hide_linked); + } if (operand && operand->parent && sp_lpe_item && sp_lpe_item->parent != operand->parent) { Inkscape::XML::Node *copy = operand->getRepr()->duplicate(xml_doc); operand = dynamic_cast(sp_lpe_item->parent->appendChildRepr(copy)); @@ -395,37 +391,12 @@ void LPEBool::doBeforeEffect(SPLPEItem const *lpeitem) Glib::ustring itemid = operand->getId(); operand_path.linkitem(itemid); } - // TODO: make 2 methods to globaly inform to a LPE item when is grabbed - // and when the transform is applyed both callers can be in Inkscape::SelTrans in grab and ungrab functions - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - if (desktop && operand) { - Inkscape::Selection *selection = desktop->getSelection(); - Inkscape::UI::Tools::SelectTool *selectool = - dynamic_cast(desktop->event_context); - gint cdown = 2; - if (selectool && selectool->_seltrans && selectool->_seltrans->isGrabbed()) { - cdown = 3; - } - if (!is_load && desktop && selection && operand && operand->isHidden() && hide_linked && contdown != 1) { - selection->add(operand); - contdown = cdown; - } - if (contdown == 1 && desktop && selection && operand && operand->isHidden() && hide_linked) { - selection->remove(operand); - } - if (contdown > 0) { - --contdown; - } - if (is_load) { - contdown = 1; - } - if (operand_path.linksToPath() && operand) { - SPItem *itemsel = selection->singleItem(); - if (operand->isHidden() && hide_linked && itemsel && itemsel == operand) { - hide_linked.param_setValue(false); - hide_linked.write_to_SVG(); - } - } +} + +void LPEBool::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +{ + if (operand) { + operand->transform *= sp_item_transform_repr(sp_lpe_item).inverse() * postmul; } } @@ -439,12 +410,7 @@ void LPEBool::doEffect(SPCurve *curve) } if (operand_path.linksToPath() && operand) { - if (!operand->isHidden() && hide_linked) { - operand->setHidden(true); - } - if (operand->isHidden() && !hide_linked) { - operand->setHidden(false); - } + bool_op_ex op = bool_operation.get_value(); bool swap = !(swap_operands.get_value()); diff --git a/src/live_effects/lpe-bool.h b/src/live_effects/lpe-bool.h index 4fd00180d5..c7c8ffbb59 100644 --- a/src/live_effects/lpe-bool.h +++ b/src/live_effects/lpe-bool.h @@ -27,7 +27,7 @@ public: void doEffect(SPCurve *curve) override; void doBeforeEffect(SPLPEItem const *lpeitem) override; - void resetDefaults(SPItem const *item) override; + void transform_multiply(Geom::Affine const &postmul, bool set) override; void doOnVisibilityToggled(SPLPEItem const * /*lpeitem*/) override; void doOnRemove(SPLPEItem const * /*lpeitem*/) override; @@ -61,7 +61,6 @@ private: BoolParam swap_operands; BoolParam rmv_inner; SPItem *operand; - size_t contdown; }; }; //namespace LivePathEffect diff --git a/src/live_effects/lpe-envelope.cpp b/src/live_effects/lpe-envelope.cpp index cac8d7b367..b0ff8a4956 100644 --- a/src/live_effects/lpe-envelope.cpp +++ b/src/live_effects/lpe-envelope.cpp @@ -37,10 +37,12 @@ LPEEnvelope::~LPEEnvelope() void LPEEnvelope::transform_multiply(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); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + 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); + } } void diff --git a/src/live_effects/lpe-interpolate.cpp b/src/live_effects/lpe-interpolate.cpp index 7012aa528c..1e2ce45e24 100644 --- a/src/live_effects/lpe-interpolate.cpp +++ b/src/live_effects/lpe-interpolate.cpp @@ -49,7 +49,9 @@ LPEInterpolate::~LPEInterpolate() = default; void LPEInterpolate::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - trajectory_path.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + trajectory_path.param_transform_multiply(postmul, false); + } } /* diff --git a/src/live_effects/lpe-offset.cpp b/src/live_effects/lpe-offset.cpp index e88b798150..8ab5d115bc 100644 --- a/src/live_effects/lpe-offset.cpp +++ b/src/live_effects/lpe-offset.cpp @@ -138,8 +138,10 @@ LPEOffset::get_nearest_point(Geom::PathVector pathv, Geom::Point point) const void LPEOffset::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - offset.param_transform_multiply(postmul, true); - offset_pt = Geom::Point(Geom::infinity(), Geom::infinity()); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + offset.param_transform_multiply(postmul, true); + offset_pt = Geom::Point(Geom::infinity(), Geom::infinity()); + } } Geom::Point diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp index 5fd2f37bf4..04312b4a34 100644 --- a/src/live_effects/lpe-patternalongpath.cpp +++ b/src/live_effects/lpe-patternalongpath.cpp @@ -116,7 +116,9 @@ LPEPatternAlongPath::~LPEPatternAlongPath() void LPEPatternAlongPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - pattern.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + pattern.param_transform_multiply(postmul, false); + } } void diff --git a/src/live_effects/lpe-perspective-envelope.cpp b/src/live_effects/lpe-perspective-envelope.cpp index 0d80b683c6..be6d5722d7 100644 --- a/src/live_effects/lpe-perspective-envelope.cpp +++ b/src/live_effects/lpe-perspective-envelope.cpp @@ -69,10 +69,12 @@ LPEPerspectiveEnvelope::~LPEPerspectiveEnvelope() void LPEPerspectiveEnvelope::transform_multiply(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); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + 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); + } } bool pointInTriangle(Geom::Point const &p, std::vector points) diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp index a426018625..1c59cf2dda 100644 --- a/src/live_effects/lpe-transform_2pts.cpp +++ b/src/live_effects/lpe-transform_2pts.cpp @@ -119,8 +119,10 @@ LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem) void LPETransform2Pts::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - start.param_transform_multiply(postmul, false); - end.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + start.param_transform_multiply(postmul, false); + end.param_transform_multiply(postmul, false); + } } void diff --git a/src/object/sp-ellipse.cpp b/src/object/sp-ellipse.cpp index 6b30516e12..cd97d536a1 100644 --- a/src/object/sp-ellipse.cpp +++ b/src/object/sp-ellipse.cpp @@ -500,7 +500,6 @@ void SPGenericEllipse::set_shape() Geom::Affine SPGenericEllipse::set_transform(Geom::Affine const &xform) { - notifyTransform(xform); if (pathEffectsEnabled() && !optimizeTransforms()) { return xform; } diff --git a/src/object/sp-item.cpp b/src/object/sp-item.cpp index 4c5d5721c3..77ef6a2e30 100644 --- a/src/object/sp-item.cpp +++ b/src/object/sp-item.cpp @@ -1531,6 +1531,7 @@ void SPItem::doWriteTransform(Geom::Affine const &transform, Geom::Affine const // If onSetTransform is not overridden, CItem::onSetTransform will return the transform it was given as a parameter. // onSetTransform cannot be pure due to the fact that not all visible Items are transformable. SPLPEItem * lpeitem = SP_LPE_ITEM(this); + lpeitem->notifyTransform(transform); if ( // run the object's set_transform (i.e. embed transform) only if: (dynamic_cast(this) && firstChild() && dynamic_cast(firstChild())) || (!preserve && // user did not chose to preserve all transforms diff --git a/src/object/sp-path.cpp b/src/object/sp-path.cpp index 54f5700129..59e7fd062f 100644 --- a/src/object/sp-path.cpp +++ b/src/object/sp-path.cpp @@ -343,7 +343,6 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { if (!_curve) { // 0 nodes, nothing to transform return Geom::identity(); } - if (pathEffectsEnabled() && !optimizeTransforms()) { return transform; } @@ -352,7 +351,6 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { } else { _curve->transform(transform); } - notifyTransform(transform); // Adjust stroke this->adjust_stroke(transform.descrim()); diff --git a/src/object/sp-rect.cpp b/src/object/sp-rect.cpp index fda6ee402f..a74bd03cfe 100644 --- a/src/object/sp-rect.cpp +++ b/src/object/sp-rect.cpp @@ -381,7 +381,6 @@ 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); diff --git a/src/object/sp-spiral.cpp b/src/object/sp-spiral.cpp index 69f85a555c..9d970a20c0 100644 --- a/src/object/sp-spiral.cpp +++ b/src/object/sp-spiral.cpp @@ -416,7 +416,6 @@ Geom::Affine SPSpiral::set_transform(Geom::Affine const &xform) if (!xform.withoutTranslation().isUniformScale()) { return xform; } - notifyTransform(xform); /* Calculate spiral start in parent coords. */ Geom::Point pos( Geom::Point(this->cx, this->cy) * xform ); diff --git a/src/object/sp-star.cpp b/src/object/sp-star.cpp index 11835dc829..e3e8bbe1a2 100644 --- a/src/object/sp-star.cpp +++ b/src/object/sp-star.cpp @@ -498,8 +498,6 @@ Geom::Affine SPStar::set_transform(Geom::Affine const &xform) if (!xform.withoutTranslation().isUniformScale()) { return xform; } - notifyTransform(xform); - /* Calculate star start in parent coords. */ Geom::Point pos( this->center * xform ); -- GitLab