From e973e1fc03c1b10c52a21af5f354f63b0f6624bd Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sat, 10 Dec 2016 17:15:17 +0100 Subject: Fix headers on LPE's (bzr r15318) --- src/live_effects/lpe-clone-original.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 7541c0be2..10418a02d 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -4,11 +4,10 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include - #include "live_effects/lpe-clone-original.h" - #include "display/curve.h" +// TODO due to internal breakage in glibmm headers, this must be last: +#include namespace Inkscape { namespace LivePathEffect { -- cgit v1.2.3 From 50714133d92da517b5185385ea4c553408c80e54 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Wed, 28 Dec 2016 09:42:19 +0100 Subject: First attemp working (bzr r15356.1.1) --- src/live_effects/lpe-clone-original.cpp | 169 ++++++++++++++++++++++++++++++-- 1 file changed, 161 insertions(+), 8 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 10418a02d..be8bc9e0d 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -6,6 +6,11 @@ #include "live_effects/lpe-clone-original.h" #include "display/curve.h" +#include "svg/path-string.h" +#include "svg/svg.h" +#include +#include "xml/sp-css-attr.h" + // TODO due to internal breakage in glibmm headers, this must be last: #include @@ -14,9 +19,148 @@ namespace LivePathEffect { LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : Effect(lpeobject), - linked_path(_("Linked path:"), _("Path from which to take the original path data"), "linkedpath", &wr, this) + linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), + preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), + attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), + style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"") { - registerParameter( dynamic_cast(&linked_path) ); + registerParameter(&linked_item); + registerParameter(&attributes); + registerParameter(&style_attributes); + registerParameter(&preserve_position); + attributes.param_hide_canvas_text(); + style_attributes.param_hide_canvas_text(); + apply_to_clippath_and_mask = true; +} + +void +LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * first_attribute, ...) +{ + va_list args; + va_start(args, first_attribute); + SPDocument * document = SP_ACTIVE_DOCUMENT; + if ( SP_IS_GROUP(origin) && SP_IS_GROUP(dest) && SP_GROUP(origin)->getItemCount() == SP_GROUP(dest)->getItemCount() ) { + std::vector< SPObject * > childs = origin->childList(true); + size_t index = 0; + for (std::vector::iterator obj_it = childs.begin(); + obj_it != childs.end(); ++obj_it) { + SPObject *dest_child = dest->nthChild(index); + cloneAttrbutes(*obj_it, dest_child, live, first_attribute, args); + index++; + } + } + SPShape * shape_origin = SP_SHAPE(origin); + SPShape * shape_dest = SP_SHAPE(dest); + for (const char* att = first_attribute; att != NULL; att = va_arg(args, const char*)) { + std::vector elems; + boost::split(elems, att, boost::is_any_of(",")); + for (std::vector::const_iterator atts = elems.begin(); + atts != elems.end(); ++atts) { + const char* attribute = (*atts).c_str(); + if ( std::strcmp(attribute, "transform") == 0 ) { + Geom::Affine affine_dest = Geom::identity(); + sp_svg_transform_read(SP_ITEM(dest)->getAttribute("transform"), &affine_dest); + dest->getRepr()->setAttribute(attribute, origin->getRepr()->attribute(attribute)); + if (preserve_position) { + Geom::Affine affine_origin = Geom::identity(); + sp_svg_transform_read(SP_ITEM(origin)->getAttribute("transform"), &affine_origin); + SP_ITEM(dest)->transform = Geom::Translate(affine_dest.translation()) * Geom::Translate(affine_origin.translation()).inverse() * affine_origin; + } + } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0 || std::strcmp(attribute, "inkscape:original-d") == 0)) { + SPCurve *c = NULL; + if (std::strcmp(attribute, "d") == 0) { + c = shape_origin->getCurve(); + } else { + c = shape_origin->getCurveBeforeLPE(); + } + if (c) { + Geom::PathVector c_pv = c->get_pathvector(); + if (preserve_position) { + Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); + if (orig_bbox) { + c_pv *= Geom::Translate(Geom::Point(boundingbox_X.min(), boundingbox_Y.min()) - (*orig_bbox).corner(0)); + } + } + c->set_pathvector(c_pv); + shape_dest->setCurveInsync(c, TRUE); + dest->getRepr()->setAttribute(attribute, sp_svg_write_path(c_pv)); + c->unref(); + } else { + dest->getRepr()->setAttribute(attribute, NULL); + } + } else { + dest->getRepr()->setAttribute(attribute, origin->getRepr()->attribute(attribute)); + } + } + } + va_end(args); +} + +void +LPECloneOriginal::cloneStyleAttrbutes(SPObject *origin, SPObject *dest, const char * first_attribute, ...) +{ + va_list args; + va_start(args, first_attribute); + + if ( SP_IS_GROUP(origin) && SP_IS_GROUP(dest) && SP_GROUP(origin)->getItemCount() == SP_GROUP(dest)->getItemCount() ) { + std::vector< SPObject * > childs = origin->childList(true); + size_t index = 0; + for (std::vector::iterator obj_it = childs.begin(); + obj_it != childs.end(); ++obj_it) { + SPObject *dest_child = dest->nthChild(index); + cloneStyleAttrbutes(*obj_it, dest_child, first_attribute, args); + index++; + } + } + SPCSSAttr *css_origin = sp_repr_css_attr_new(); + sp_repr_css_attr_add_from_string(css_origin, origin->getRepr()->attribute("style")); + SPCSSAttr *css_dest = sp_repr_css_attr_new(); + sp_repr_css_attr_add_from_string(css_dest, dest->getRepr()->attribute("style")); + for (const char* att = first_attribute; att != NULL; att = va_arg(args, const char*)) { + std::vector elems; + boost::split(elems, att, boost::is_any_of(",")); + for (std::vector::const_iterator atts = elems.begin(); + atts != elems.end(); ++atts) { + const char* attribute = (*atts).c_str(); + const char* origin_attribute = sp_repr_css_property(css_origin, attribute, ""); + if (origin_attribute == "") { + sp_repr_css_set_property (css_dest, attribute, NULL); + } else { + sp_repr_css_set_property (css_dest, attribute, origin_attribute); + } + } + Glib::ustring css_str; + sp_repr_css_write_string(css_dest,css_str); + dest->getRepr()->setAttribute("style", css_str.c_str()); + } + va_end(args); +} + +void +LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ + original_bbox(lpeitem); + if (linked_item.linksToItem() && sp_lpe_item) { + cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), NULL); //NULL required + cloneStyleAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), style_attributes.param_getSVGValue(), NULL); //NULL required + SPShape * shape = dynamic_cast(sp_lpe_item); + if(shape){ + this->setSPCurve(shape->getCurve()); + } + } +} + +void +LPECloneOriginal::doOnApply(SPLPEItem const* lpeitem){ + Glib::ustring attributes_value("d,transform"); + attributes.param_setValue(attributes_value); + attributes.write_to_SVG(); + Glib::ustring style_attributes_value("opacity,border-width"); + style_attributes.param_setValue(style_attributes_value); + style_attributes.write_to_SVG(); +} + +void +LPECloneOriginal::doAfterEffect (SPLPEItem const* lpeitem){ } LPECloneOriginal::~LPECloneOriginal() @@ -26,12 +170,21 @@ LPECloneOriginal::~LPECloneOriginal() void LPECloneOriginal::doEffect (SPCurve * curve) { - if ( linked_path.linksToPath() ) { - Geom::PathVector linked_pathv = linked_path.get_pathvector(); - if ( !linked_pathv.empty() ) { - curve->set_pathvector(linked_pathv); - } - } +// std::vector elems; +// const char * attrs = attributes.param_getSVGValue(); +// boost::split(elems, attrs, boost::is_any_of(",")); +// bool has_d = false; +// for (std::vector::const_iterator atts = elems.begin(); +// atts != elems.end(); ++atts) { +// const char* attribute = (*atts).c_str(); +// if (std::strcmp(attribute, "d") == 0) { +// has_d = true; +// } +// } +// if (linked_item.linksToItem() && has_d) { +// curve->reset(); +// } + curve->set_pathvector(pathvector_before_effect); } } // namespace LivePathEffect -- cgit v1.2.3 From dade3a4aa7da7579145341ee8e63149de053d99a Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 28 Dec 2016 17:39:41 +0100 Subject: Fixing transforms and adding scale (bzr r15356.2.1) --- src/live_effects/lpe-clone-original.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index be8bc9e0d..d702e98d5 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -20,14 +20,19 @@ namespace LivePathEffect { LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : Effect(lpeobject), linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), + scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0), preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"") { registerParameter(&linked_item); + registerParameter(&scale); registerParameter(&attributes); registerParameter(&style_attributes); registerParameter(&preserve_position); + scale.param_set_range(0.01, 999999.0); + scale.param_set_increments(1, 1); + scale.param_set_digits(2); attributes.param_hide_canvas_text(); style_attributes.param_hide_canvas_text(); apply_to_clippath_and_mask = true; @@ -58,13 +63,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co atts != elems.end(); ++atts) { const char* attribute = (*atts).c_str(); if ( std::strcmp(attribute, "transform") == 0 ) { - Geom::Affine affine_dest = Geom::identity(); - sp_svg_transform_read(SP_ITEM(dest)->getAttribute("transform"), &affine_dest); + Geom::Affine affine_dest = SP_ITEM(dest)->transform; dest->getRepr()->setAttribute(attribute, origin->getRepr()->attribute(attribute)); + Geom::Affine affine_origin = Geom::identity(); + sp_svg_transform_read(SP_ITEM(origin)->getAttribute("transform"), &affine_origin); if (preserve_position) { - Geom::Affine affine_origin = Geom::identity(); - sp_svg_transform_read(SP_ITEM(origin)->getAttribute("transform"), &affine_origin); - SP_ITEM(dest)->transform = Geom::Translate(affine_dest.translation()) * Geom::Translate(affine_origin.translation()).inverse() * affine_origin; + SP_ITEM(dest)->transform = Geom::Translate(affine_dest.translation()) * Geom::Translate(affine_origin.translation()).inverse() * affine_origin ; } } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0 || std::strcmp(attribute, "inkscape:original-d") == 0)) { SPCurve *c = NULL; @@ -75,11 +79,16 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co } if (c) { Geom::PathVector c_pv = c->get_pathvector(); - if (preserve_position) { - Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); - if (orig_bbox) { + Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); + if (orig_bbox) { + if (preserve_position) { c_pv *= Geom::Translate(Geom::Point(boundingbox_X.min(), boundingbox_Y.min()) - (*orig_bbox).corner(0)); } + if (scale != 100.0) { + double scale_affine = scale/100.0; + Geom::Affine scale = Geom::Affine(Geom::Scale(scale_affine)); + c_pv *= Geom::Translate((*orig_bbox).corner(0)) * scale * Geom::Translate((*orig_bbox).corner(0)).inverse(); + } } c->set_pathvector(c_pv); shape_dest->setCurveInsync(c, TRUE); -- cgit v1.2.3 From fd45bf5cbe22dddb7b016a3025f3553dbb0f1e27 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 28 Dec 2016 17:42:27 +0100 Subject: Fixing scale (bzr r15356.2.2) --- src/live_effects/lpe-clone-original.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index d702e98d5..04afe00e2 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -87,7 +87,7 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co if (scale != 100.0) { double scale_affine = scale/100.0; Geom::Affine scale = Geom::Affine(Geom::Scale(scale_affine)); - c_pv *= Geom::Translate((*orig_bbox).corner(0)) * scale * Geom::Translate((*orig_bbox).corner(0)).inverse(); + c_pv *= Geom::Translate((*orig_bbox).corner(0)).inverse() * scale * Geom::Translate((*orig_bbox).corner(0)); } } c->set_pathvector(c_pv); -- cgit v1.2.3 From 50fca17129701b09a9049e4469ca39d0c06c15a7 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 28 Dec 2016 17:46:37 +0100 Subject: Fixing scale (bzr r15356.2.3) --- src/live_effects/lpe-clone-original.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 04afe00e2..4ba752b85 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -87,7 +87,11 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co if (scale != 100.0) { double scale_affine = scale/100.0; Geom::Affine scale = Geom::Affine(Geom::Scale(scale_affine)); - c_pv *= Geom::Translate((*orig_bbox).corner(0)).inverse() * scale * Geom::Translate((*orig_bbox).corner(0)); + if (preserve_position) { + c_pv *= Geom::Translate(Geom::Point(boundingbox_X.min(), boundingbox_Y.min()) - (*orig_bbox).corner(0)).inverse() * scale * Geom::Translate(Geom::Point(boundingbox_X.min(), boundingbox_Y.min()) - (*orig_bbox).corner(0)); + } else { + c_pv *= Geom::Translate((*orig_bbox).corner(0)).inverse() * scale * Geom::Translate((*orig_bbox).corner(0)); + } } } c->set_pathvector(c_pv); -- cgit v1.2.3 From f69e17d45c7311cb8430caa03f4f41be63ac9279 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Thu, 29 Dec 2016 21:32:45 +0100 Subject: Add sp_shape to LPE chain and fixing transforms (bzr r15356.1.4) --- src/live_effects/lpe-clone-original.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 7072ad161..8176f3811 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -37,10 +37,12 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : attributes.param_hide_canvas_text(); style_attributes.param_hide_canvas_text(); apply_to_clippath_and_mask = true; + preserve_position_changed = !preserve_position; + preserve_affine = Geom::identity(); } void -LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * attributes, const char * style_attributes) +LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * attributes, const char * style_attributes, bool root) { SPDocument * document = SP_ACTIVE_DOCUMENT; if ( SP_IS_GROUP(origin) && SP_IS_GROUP(dest) && SP_GROUP(origin)->getItemCount() == SP_GROUP(dest)->getItemCount() ) { @@ -49,7 +51,7 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co for (std::vector::iterator obj_it = childs.begin(); obj_it != childs.end(); ++obj_it) { SPObject *dest_child = dest->nthChild(index); - cloneAttrbutes(*obj_it, dest_child, live, attributes, style_attributes); + cloneAttrbutes(*obj_it, dest_child, live, attributes, style_attributes, false); index++; } } @@ -65,7 +67,15 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co Geom::Affine affine_origin = SP_ITEM(origin)->transform; //dest->getRepr()->setAttribute(attribute, origin->getRepr()->attribute(attribute)); if (preserve_position) { - SP_ITEM(dest)->transform = Geom::Translate(affine_dest.translation()) * Geom::Translate(affine_origin.translation()).inverse() * affine_origin ; + Geom::Affine dest_affine = Geom::identity(); + if (root) { + dest_affine *= Geom::Translate(preserve_affine.translation()); + preserve_affine = Geom::identity(); + } + dest_affine *= Geom::Translate(affine_dest.translation()); + dest_affine *= Geom::Translate(affine_origin.translation()).inverse(); + dest_affine *= affine_origin; + SP_ITEM(dest)->transform = dest_affine; } else { SP_ITEM(dest)->transform = affine_origin ; } @@ -131,6 +141,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co void LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ original_bbox(lpeitem); + if ( preserve_position_changed != preserve_position ) { + if (!preserve_position) { + preserve_affine = SP_ITEM(sp_lpe_item)->transform; + } + preserve_position_changed = preserve_position; + } if (linked_path.linksToPath()) { //Legacy staff Glib::ustring attributes_value("d"); attributes.param_setValue(attributes_value); @@ -142,11 +158,7 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ linked_path.param_readSVGValue(""); } if (linked_item.linksToItem()) { - cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue()); - SPShape * shape = dynamic_cast(sp_lpe_item); - if(shape){ - this->setSPCurve(shape->getCurve()); - } + cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); } } @@ -205,7 +217,10 @@ LPECloneOriginal::~LPECloneOriginal() void LPECloneOriginal::doEffect (SPCurve * curve) { - curve->set_pathvector(pathvector_before_effect); + SPShape * shape = getCurrentShape(); + if(shape){ + curve->set_pathvector(shape->getCurve()->get_pathvector()); + } } } // namespace LivePathEffect -- cgit v1.2.3 From 3c16d15761bac73cba9b81b49efe8e71306a5766 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Fri, 30 Dec 2016 19:14:55 +0100 Subject: Fixing clips and masks (bzr r15356.1.6) --- src/live_effects/lpe-clone-original.cpp | 36 +++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 8176f3811..81e6809f1 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -8,6 +8,8 @@ #include "display/curve.h" #include "svg/path-string.h" #include "svg/svg.h" +#include "sp-clippath.h" +#include "sp-mask.h" #include "xml/sp-css-attr.h" // TODO due to internal breakage in glibmm headers, this must be last: @@ -36,9 +38,9 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : scale.param_set_digits(2); attributes.param_hide_canvas_text(); style_attributes.param_hide_canvas_text(); - apply_to_clippath_and_mask = true; preserve_position_changed = !preserve_position; preserve_affine = Geom::identity(); + apply_to_clippath_and_mask = true; } void @@ -60,6 +62,13 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co SPShape * shape_dest = SP_SHAPE(dest); gchar ** attarray = g_strsplit(attributes, ",", 0); gchar ** iter = attarray; +// if (SP_IS_CLIPPATH(SP_ITEM(origin)->parent) || SP_IS_MASK(SP_ITEM(origin)->parent)) { +// Geom::Affine dest_affine = Geom::identity(); +// if (root && preserve_position) { +// dest_affine *= Geom::Translate(preserve_affine.translation()); +// } +// SP_ITEM(SP_ITEM(dest)->parent)->transform = dest_affine; +// } while (*iter != NULL) { const char* attribute = (*iter); if ( std::strcmp(attribute, "transform") == 0 ) { @@ -69,11 +78,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co if (preserve_position) { Geom::Affine dest_affine = Geom::identity(); if (root) { + std::cout << "root" << preserve_affine.translation() << "\n"; dest_affine *= Geom::Translate(preserve_affine.translation()); - preserve_affine = Geom::identity(); + //preserve_affine = Geom::identity(); + dest_affine *= Geom::Translate(affine_dest.translation()); + dest_affine *= Geom::Translate(affine_origin.translation()).inverse(); } - dest_affine *= Geom::Translate(affine_dest.translation()); - dest_affine *= Geom::Translate(affine_origin.translation()).inverse(); dest_affine *= affine_origin; SP_ITEM(dest)->transform = dest_affine; } else { @@ -89,7 +99,7 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co if (c) { Geom::PathVector c_pv = c->get_pathvector(); Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); - if (orig_bbox) { + if (orig_bbox && root) { if (scale != 100.0) { double scale_affine = scale/100.0; Geom::Scale scale = Geom::Scale(scale_affine); @@ -141,12 +151,6 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co void LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ original_bbox(lpeitem); - if ( preserve_position_changed != preserve_position ) { - if (!preserve_position) { - preserve_affine = SP_ITEM(sp_lpe_item)->transform; - } - preserve_position_changed = preserve_position; - } if (linked_path.linksToPath()) { //Legacy staff Glib::ustring attributes_value("d"); attributes.param_setValue(attributes_value); @@ -158,6 +162,16 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ linked_path.param_readSVGValue(""); } if (linked_item.linksToItem()) { + if (preserve_position) { + preserve_affine = SP_ITEM(sp_lpe_item)->transform; + } +// if ( preserve_position_changed != preserve_position ) { +// if (!preserve_position) { +// preserve_affine = SP_ITEM(sp_lpe_item)->transform; +// preserve_affine *= Geom::Translate(SP_ITEM(linked_item.getObject())->transform.translation()).inverse(); +// } +// preserve_position_changed = preserve_position; +// } cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); } } -- cgit v1.2.3 From 088070b65c83f9a6a7d1d268e8a794776cc648a8 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sun, 1 Jan 2017 03:21:07 +0100 Subject: Fixing transforms,clips... (bzr r15356.1.8) --- src/live_effects/lpe-clone-original.cpp | 150 ++++++++++++++++++++++---------- 1 file changed, 106 insertions(+), 44 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 81e6809f1..76cc56b8f 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -24,6 +24,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0), preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), + use_center(_("Relative center of element"), _("Relative center of element"), "use_center", &wr, this, true), attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"") { @@ -33,14 +34,28 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : registerParameter(&attributes); registerParameter(&style_attributes); registerParameter(&preserve_position); + registerParameter(&use_center); scale.param_set_range(0.01, 999999.0); scale.param_set_increments(1, 1); scale.param_set_digits(2); attributes.param_hide_canvas_text(); style_attributes.param_hide_canvas_text(); - preserve_position_changed = !preserve_position; + preserve_position_changed = preserve_position; preserve_affine = Geom::identity(); - apply_to_clippath_and_mask = true; +} + +bool hasLinkedTransform( const char * attributes) { + gchar ** attarray = g_strsplit(attributes, ",", 0); + gchar ** iter = attarray; + bool has_linked_transform = false; + while (*iter != NULL) { + const char* attribute = (*iter); + if ( std::strcmp(attribute, "transform") == 0 ) { + has_linked_transform = true; + } + iter++; + } + return has_linked_transform; } void @@ -53,41 +68,69 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co for (std::vector::iterator obj_it = childs.begin(); obj_it != childs.end(); ++obj_it) { SPObject *dest_child = dest->nthChild(index); - cloneAttrbutes(*obj_it, dest_child, live, attributes, style_attributes, false); + cloneAttrbutes((*obj_it), dest_child, live, attributes, style_attributes, false); index++; } } //Attributes SPShape * shape_origin = SP_SHAPE(origin); + SPPath * path_origin = SP_PATH(origin); SPShape * shape_dest = SP_SHAPE(dest); + SPMask *mask_origin = SP_ITEM(origin)->mask_ref->getObject(); + SPMask *mask_dest = SP_ITEM(dest)->mask_ref->getObject(); + if(mask_origin && mask_dest) { + std::vector mask_list = mask_origin->childList(true); + std::vector mask_list_dest = mask_dest->childList(true); + if (mask_list.size() == mask_list_dest.size()) { + size_t i = 0; + for ( std::vector::const_iterator iter=mask_list.begin();iter!=mask_list.end();++iter) { + SPObject * mask_data = *iter; + SPObject * mask_dest_data = mask_list_dest[i]; + cloneAttrbutes(mask_data, mask_dest_data, live, attributes, style_attributes, false); + i++; + } + } + } + SPClipPath *clippath_origin = SP_ITEM(origin)->clip_ref->getObject(); + SPClipPath *clippath_dest = SP_ITEM(dest)->clip_ref->getObject(); + if(clippath_origin && clippath_dest) { + std::vector clippath_list = clippath_origin->childList(true); + std::vector clippath_list_dest = clippath_dest->childList(true); + if (clippath_list.size() == clippath_list_dest.size()) { + size_t i = 0; + for ( std::vector::const_iterator iter=clippath_list.begin();iter!=clippath_list.end();++iter) { + SPObject * clippath_data = *iter; + SPObject * clippath_dest_data = clippath_list_dest[i]; + cloneAttrbutes(clippath_data, clippath_dest_data, live, attributes, style_attributes, false); + i++; + } + } + } gchar ** attarray = g_strsplit(attributes, ",", 0); gchar ** iter = attarray; -// if (SP_IS_CLIPPATH(SP_ITEM(origin)->parent) || SP_IS_MASK(SP_ITEM(origin)->parent)) { -// Geom::Affine dest_affine = Geom::identity(); -// if (root && preserve_position) { -// dest_affine *= Geom::Translate(preserve_affine.translation()); -// } -// SP_ITEM(SP_ITEM(dest)->parent)->transform = dest_affine; -// } + Geom::Affine affine_dest = Geom::identity(); + Geom::Affine affine_origin = Geom::identity(); + Geom::Affine affine_previous = Geom::identity(); + sp_svg_transform_read(SP_ITEM(dest)->getAttribute("transform"), &affine_dest); + sp_svg_transform_read(SP_ITEM(origin)->getAttribute("transform"), &affine_origin); while (*iter != NULL) { const char* attribute = (*iter); if ( std::strcmp(attribute, "transform") == 0 ) { - Geom::Affine affine_dest = SP_ITEM(dest)->transform; - Geom::Affine affine_origin = SP_ITEM(origin)->transform; - //dest->getRepr()->setAttribute(attribute, origin->getRepr()->attribute(attribute)); if (preserve_position) { Geom::Affine dest_affine = Geom::identity(); if (root) { - std::cout << "root" << preserve_affine.translation() << "\n"; - dest_affine *= Geom::Translate(preserve_affine.translation()); - //preserve_affine = Geom::identity(); - dest_affine *= Geom::Translate(affine_dest.translation()); + dest_affine *= affine_origin; + if (preserve_affine == Geom::identity()) { + dest_affine *= Geom::Translate(affine_dest.translation()); + } dest_affine *= Geom::Translate(affine_origin.translation()).inverse(); - } - dest_affine *= affine_origin; - SP_ITEM(dest)->transform = dest_affine; + dest_affine *= Geom::Translate(preserve_affine.translation()); + affine_previous = preserve_affine; + preserve_affine = Geom::identity(); + SP_ITEM(dest)->getRepr()->setAttribute("transform",sp_svg_transform_write(dest_affine)); + } } else { - SP_ITEM(dest)->transform = affine_origin ; + SP_ITEM(dest)->getRepr()->setAttribute("transform",sp_svg_transform_write(affine_origin)); } } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0 || std::strcmp(attribute, "inkscape:original-d") == 0)) { SPCurve *c = NULL; @@ -99,21 +142,33 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co if (c) { Geom::PathVector c_pv = c->get_pathvector(); Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); - if (orig_bbox && root) { + Geom::OptRect dest_bbox = SP_ITEM(dest)->geometricBounds(); + if (dest_bbox && orig_bbox && root) { + Geom::Point orig_point = (*orig_bbox).corner(0); + Geom::Point dest_point = (*dest_bbox).corner(0); + if (use_center) { + orig_point = (*orig_bbox).midpoint(); + dest_point = (*dest_bbox).midpoint(); + } if (scale != 100.0) { double scale_affine = scale/100.0; Geom::Scale scale = Geom::Scale(scale_affine); - c_pv *= Geom::Translate((*orig_bbox).midpoint()).inverse(); + c_pv *= Geom::Translate(orig_point).inverse(); c_pv *= scale; - c_pv *= Geom::Translate((*orig_bbox).midpoint()); + c_pv *= Geom::Translate(orig_point); } - if (preserve_position) { - c_pv *= Geom::Translate(Geom::Point(boundingbox_X.middle(), boundingbox_Y.middle()) - (*orig_bbox).midpoint()); + if (preserve_position && hasLinkedTransform(attributes)) { + c_pv *= Geom::Translate(dest_point - orig_point); } } + c_pv *= i2anc_affine(dest, sp_lpe_item); c->set_pathvector(c_pv); - shape_dest->setCurveInsync(c, TRUE); - dest->getRepr()->setAttribute(attribute, sp_svg_write_path(c_pv)); + if (!path_origin) { + shape_dest->setCurveInsync(c, TRUE); + dest->getRepr()->setAttribute(attribute, sp_svg_write_path(c_pv)); + } else { + shape_dest->setCurve(c, TRUE); + } c->unref(); } else { dest->getRepr()->setAttribute(attribute, NULL); @@ -124,8 +179,6 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co iter++; } g_strfreev (attarray); - - //Style Attributes SPCSSAttr *css_origin = sp_repr_css_attr_new(); sp_repr_css_attr_add_from_string(css_origin, origin->getRepr()->attribute("style")); SPCSSAttr *css_dest = sp_repr_css_attr_new(); @@ -161,17 +214,14 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ linked_item.param_readSVGValue(linked_path.param_getSVGValue()); linked_path.param_readSVGValue(""); } + if (linked_item.linksToItem()) { - if (preserve_position) { - preserve_affine = SP_ITEM(sp_lpe_item)->transform; + if ( preserve_position_changed != preserve_position ) { + if (!preserve_position) { + sp_svg_transform_read(SP_ITEM(sp_lpe_item)->getAttribute("transform"), &preserve_affine); + } + preserve_position_changed = preserve_position; } -// if ( preserve_position_changed != preserve_position ) { -// if (!preserve_position) { -// preserve_affine = SP_ITEM(sp_lpe_item)->transform; -// preserve_affine *= Geom::Translate(SP_ITEM(linked_item.getObject())->transform.translation()).inverse(); -// } -// preserve_position_changed = preserve_position; -// } cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); } } @@ -219,7 +269,7 @@ LPECloneOriginal::doOnApply(SPLPEItem const* lpeitem){ Glib::ustring attributes_value("d,transform"); attributes.param_setValue(attributes_value); attributes.write_to_SVG(); - Glib::ustring style_attributes_value("opacity,border-width"); + Glib::ustring style_attributes_value("opacity,stroke-width"); style_attributes.param_setValue(style_attributes_value); style_attributes.write_to_SVG(); } @@ -229,11 +279,23 @@ LPECloneOriginal::~LPECloneOriginal() } -void LPECloneOriginal::doEffect (SPCurve * curve) +void +LPECloneOriginal::transform_multiply(Geom::Affine const& postmul, bool set) +{ + if (linked_item.linksToItem()) { + bool changed = false; + linked_item.getObject()->requestModified(SP_OBJECT_MODIFIED_FLAG); + } +} + +void +LPECloneOriginal::doEffect (SPCurve * curve) { - SPShape * shape = getCurrentShape(); - if(shape){ - curve->set_pathvector(shape->getCurve()->get_pathvector()); + if (linked_item.linksToItem()) { + SPShape * shape = getCurrentShape(); + if(shape){ + curve->set_pathvector(shape->getCurve()->get_pathvector()); + } } } -- cgit v1.2.3 From ba0a43458620f76e235fc9d61539582d7887311f Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Mon, 2 Jan 2017 00:30:14 +0100 Subject: attemt to mirror (bzr r15356.1.11) --- src/live_effects/lpe-clone-original.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 76cc56b8f..4fc74b275 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -24,6 +24,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0), preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), + inverse(_("Inverse clone"), _("Use LPE item as origin. Destructive"), "inverse", &wr, this, false), use_center(_("Relative center of element"), _("Relative center of element"), "use_center", &wr, this, true), attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"") @@ -34,6 +35,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : registerParameter(&attributes); registerParameter(&style_attributes); registerParameter(&preserve_position); + registerParameter(&inverse); registerParameter(&use_center); scale.param_set_range(0.01, 999999.0); scale.param_set_increments(1, 1); @@ -132,13 +134,9 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co } else { SP_ITEM(dest)->getRepr()->setAttribute("transform",sp_svg_transform_write(affine_origin)); } - } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0 || std::strcmp(attribute, "inkscape:original-d") == 0)) { + } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0)) { SPCurve *c = NULL; - if (std::strcmp(attribute, "d") == 0) { - c = shape_origin->getCurve(); - } else { - c = shape_origin->getCurveBeforeLPE(); - } + c = shape_origin->getCurve(); if (c) { Geom::PathVector c_pv = c->get_pathvector(); Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); @@ -161,7 +159,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co c_pv *= Geom::Translate(dest_point - orig_point); } } - c_pv *= i2anc_affine(dest, sp_lpe_item); + if (inverse) { + c_pv *= i2anc_affine(origin, sp_lpe_item); + origin->getRepr()->setAttribute("inkscape:original-d", sp_svg_write_path(c_pv)); + } else { + c_pv *= i2anc_affine(dest, sp_lpe_item); + } c->set_pathvector(c_pv); if (!path_origin) { shape_dest->setCurveInsync(c, TRUE); @@ -203,7 +206,6 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co void LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ - original_bbox(lpeitem); if (linked_path.linksToPath()) { //Legacy staff Glib::ustring attributes_value("d"); attributes.param_setValue(attributes_value); @@ -222,7 +224,13 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ } preserve_position_changed = preserve_position; } - cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); + if (inverse) { + linked_item.param_quit_listening(); + cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); + } else { + linked_item.param_start_listening(linked_item.getObject()); + cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); + } } } -- cgit v1.2.3 From 0a19b6fbad1ada089488541e60f195a0943c01a8 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Mon, 2 Jan 2017 13:14:36 +0100 Subject: Fix inverse clone (bzr r15356.1.12) --- src/live_effects/lpe-clone-original.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 4fc74b275..33abd685a 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -24,7 +24,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0), preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), - inverse(_("Inverse clone"), _("Use LPE item as origin. Destructive"), "inverse", &wr, this, false), + inverse(_("Inverse clone"), _("Use LPE item as origin"), "inverse", &wr, this, false), use_center(_("Relative center of element"), _("Relative center of element"), "use_center", &wr, this, true), attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"") @@ -136,7 +136,11 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co } } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0)) { SPCurve *c = NULL; - c = shape_origin->getCurve(); + if (inverse) { + c = shape_origin->getCurveBeforeLPE(); + } else { + c = shape_origin->getCurve(); + } if (c) { Geom::PathVector c_pv = c->get_pathvector(); Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds(); @@ -155,13 +159,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co c_pv *= scale; c_pv *= Geom::Translate(orig_point); } - if (preserve_position && hasLinkedTransform(attributes)) { + if (preserve_position) { c_pv *= Geom::Translate(dest_point - orig_point); } } if (inverse) { c_pv *= i2anc_affine(origin, sp_lpe_item); - origin->getRepr()->setAttribute("inkscape:original-d", sp_svg_write_path(c_pv)); } else { c_pv *= i2anc_affine(dest, sp_lpe_item); } @@ -218,17 +221,16 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ } if (linked_item.linksToItem()) { - if ( preserve_position_changed != preserve_position ) { + linked_item.setInverse(inverse); + if ( preserve_position_changed != preserve_position ) { if (!preserve_position) { sp_svg_transform_read(SP_ITEM(sp_lpe_item)->getAttribute("transform"), &preserve_affine); } preserve_position_changed = preserve_position; } if (inverse) { - linked_item.param_quit_listening(); cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); } else { - linked_item.param_start_listening(linked_item.getObject()); cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true); } } @@ -299,7 +301,7 @@ LPECloneOriginal::transform_multiply(Geom::Affine const& postmul, bool set) void LPECloneOriginal::doEffect (SPCurve * curve) { - if (linked_item.linksToItem()) { + if (linked_item.linksToItem() && !inverse) { SPShape * shape = getCurrentShape(); if(shape){ curve->set_pathvector(shape->getCurve()->get_pathvector()); -- cgit v1.2.3 From 2a398a6073bf3fb0497a774760a4cebb54bb7e2c Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sun, 22 Jan 2017 03:06:22 +0100 Subject: Add multiwidget fixes (bzr r15356.1.15) --- src/live_effects/lpe-clone-original.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index da93a5093..db697552a 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -32,8 +32,8 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : paintorder(_("Clone paint order"), _("Clone paint order"), "paintorder", &wr, this, false), opacity(_("Clone opacity"), _("Clone opacity"), "opacity", &wr, this, false), filter(_("Clone filter"), _("Clone filter"), "filter", &wr, this, false), - attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""), - style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,""), + attributes("Attributes linked", "Attributes linked, comma separated atributes", "attributes", &wr, this,""), + style_attributes("Style attributes linked", "Style attributes linked, comma separated atributes", "style_attributes", &wr, this,""), expanded(false) { registerParameter(&linked_path); @@ -237,14 +237,14 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ } preserve_position_changed = preserve_position; } - Glib::ustring attr = Glib::ustring(attributes.param_getSVGValue()); + Glib::ustring attr = Glib::ustring(attributes.param_getSVGValue()).append(","); if (d) { attr.append("d,"); } if (transform) { attr.append("transform,"); } - Glib::ustring style_attr = Glib::ustring(style_attributes.param_getSVGValue()); + Glib::ustring style_attr = Glib::ustring(style_attributes.param_getSVGValue()).append(","); if (fill) { style_attr.append("fill,").append("fill-rule,"); } @@ -315,12 +315,23 @@ LPECloneOriginal::newWidget() expander = Gtk::manage(new Gtk::Expander(Glib::ustring(_("Show attributes override")))); expander->add(*vbox_expander); expander->set_expanded(expanded); - expander->property_expanded().signal_changed().connect(sigc::mem_fun(*this, &LPEMeasureLine::onExpanderChanged) ); + expander->property_expanded().signal_changed().connect(sigc::mem_fun(*this, &LPECloneOriginal::onExpanderChanged) ); vbox->pack_start(*expander, true, true, 2); this->upd_params = false; return dynamic_cast(vbox); } +void +LPECloneOriginal::onExpanderChanged() +{ + expanded = expander->get_expanded(); + if(expanded) { + expander->set_label (Glib::ustring(_("Hide attributes override"))); + } else { + expander->set_label (Glib::ustring(_("Show attributes override"))); + } +} + LPECloneOriginal::~LPECloneOriginal() { -- cgit v1.2.3 From 7b1f640dd11a7580f04ae50d2c0d7d62e301d9d7 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 24 Jan 2017 12:00:13 +0100 Subject: Fix for bug on clone original LPE (bzr r15442) --- src/live_effects/lpe-clone-original.cpp | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index db697552a..31d5bab65 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -26,7 +26,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), inverse(_("Inverse clone"), _("Use LPE item as origin"), "inverse", &wr, this, false), d(_("Clone shape -d-"), _("Clone shape -d-"), "d", &wr, this, true), - transform(_("Clone transforms"), _("Clone transforms"), "d", &wr, this, true), + transform(_("Clone transforms"), _("Clone transforms"), "transform", &wr, this, true), fill(_("Clone fill"), _("Clone fill"), "fill", &wr, this, false), stroke(_("Clone stroke"), _("Clone stroke"), "stroke", &wr, this, false), paintorder(_("Clone paint order"), _("Clone paint order"), "paintorder", &wr, this, false), @@ -59,20 +59,6 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : preserve_affine = Geom::identity(); } -bool hasLinkedTransform( const char * attributes) { - gchar ** attarray = g_strsplit(attributes, ",", 0); - gchar ** iter = attarray; - bool has_linked_transform = false; - while (*iter != NULL) { - const char* attribute = (*iter); - if ( std::strcmp(attribute, "transform") == 0 ) { - has_linked_transform = true; - } - iter++; - } - return has_linked_transform; -} - void LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * attributes, const char * style_attributes, bool root) { @@ -237,14 +223,18 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ } preserve_position_changed = preserve_position; } - Glib::ustring attr = Glib::ustring(attributes.param_getSVGValue()).append(","); + Glib::ustring attr = ""; if (d) { attr.append("d,"); } if (transform) { attr.append("transform,"); } - Glib::ustring style_attr = Glib::ustring(style_attributes.param_getSVGValue()).append(","); + attr.append(Glib::ustring(attributes.param_getSVGValue()).append(",")); + if (attr.size() && !Glib::ustring(attributes.param_getSVGValue()).size()) { + attr.erase (attr.size()-1, 1); + } + Glib::ustring style_attr = ""; if (fill) { style_attr.append("fill,").append("fill-rule,"); } @@ -263,6 +253,10 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ if (opacity) { style_attr.append("opacity,"); } + if (style_attr.size() && !Glib::ustring(style_attributes.param_getSVGValue()).size()) { + style_attr.erase (style_attr.size()-1, 1); + } + style_attr.append(Glib::ustring(style_attributes.param_getSVGValue()).append(",")); if (inverse) { cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); } else { -- cgit v1.2.3 From 66d65a21fddda6f20cc992e1edb4b4a8a5eb6368 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 25 Jan 2017 12:32:06 +0100 Subject: Retain clone position in clone Original LPE (bzr r15447) --- src/live_effects/lpe-clone-original.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 31d5bab65..e70575986 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -34,7 +34,8 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : filter(_("Clone filter"), _("Clone filter"), "filter", &wr, this, false), attributes("Attributes linked", "Attributes linked, comma separated atributes", "attributes", &wr, this,""), style_attributes("Style attributes linked", "Style attributes linked, comma separated atributes", "style_attributes", &wr, this,""), - expanded(false) + expanded(false), + origin(Geom::Point(0,0)) { registerParameter(&linked_path); registerParameter(&linked_item); @@ -259,8 +260,26 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ style_attr.append(Glib::ustring(style_attributes.param_getSVGValue()).append(",")); if (inverse) { cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); + Geom::OptRect bbox = SP_ITEM(sp_lpe_item)->geometricBounds(); + if (bbox && preserve_position && origin != Geom::Point(0,0)) { + origin = (*bbox).corner(0) - origin; + SP_ITEM(linked_item.getObject())->transform *= Geom::Translate(origin); + } + bbox = SP_ITEM(sp_lpe_item)->geometricBounds(); + if (bbox && preserve_position) { + origin = (*bbox).corner(0); + } } else { cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); + Geom::OptRect bbox = SP_ITEM(linked_item.getObject())->geometricBounds(); + if (bbox && preserve_position && origin != Geom::Point(0,0)) { + origin = (*bbox).corner(0) - origin; + SP_ITEM(sp_lpe_item)->transform *= Geom::Translate(origin); + } + bbox = SP_ITEM(linked_item.getObject())->geometricBounds(); + if (bbox && preserve_position) { + origin = (*bbox).corner(0); + } } } } -- cgit v1.2.3 From 3400a57bdeae2cdbfaa47acc19978507f18574ae Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 25 Jan 2017 15:36:46 +0100 Subject: A bit refactor of clone object LPE (bzr r15448) --- src/live_effects/lpe-clone-original.cpp | 34 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 22 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index e70575986..04db6171e 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -258,28 +258,18 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ style_attr.erase (style_attr.size()-1, 1); } style_attr.append(Glib::ustring(style_attributes.param_getSVGValue()).append(",")); - if (inverse) { - cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); - Geom::OptRect bbox = SP_ITEM(sp_lpe_item)->geometricBounds(); - if (bbox && preserve_position && origin != Geom::Point(0,0)) { - origin = (*bbox).corner(0) - origin; - SP_ITEM(linked_item.getObject())->transform *= Geom::Translate(origin); - } - bbox = SP_ITEM(sp_lpe_item)->geometricBounds(); - if (bbox && preserve_position) { - origin = (*bbox).corner(0); - } - } else { - cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); - Geom::OptRect bbox = SP_ITEM(linked_item.getObject())->geometricBounds(); - if (bbox && preserve_position && origin != Geom::Point(0,0)) { - origin = (*bbox).corner(0) - origin; - SP_ITEM(sp_lpe_item)->transform *= Geom::Translate(origin); - } - bbox = SP_ITEM(linked_item.getObject())->geometricBounds(); - if (bbox && preserve_position) { - origin = (*bbox).corner(0); - } + + SPItem * from = inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linked_item.getObject()); + SPItem * to = !inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linked_item.getObject()); + cloneAttrbutes(from, to, true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); + Geom::OptRect bbox = from->geometricBounds(); + if (bbox && preserve_position && origin != Geom::Point(0,0)) { + origin = (*bbox).corner(0) - origin; + to->transform *= Geom::Translate(origin); + } + bbox = from->geometricBounds(); + if (bbox && preserve_position) { + origin = (*bbox).corner(0); } } } -- cgit v1.2.3 From 50cff32bb7ab2fb2ab618ee5b3f4e31852e5802c Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sat, 18 Feb 2017 13:10:14 +0100 Subject: Fix bug 1665595 and prevent other LPE the same bug when using ACTIVE_DOCUMENT Fixed bugs: - https://launchpad.net/bugs/1665595 (bzr r15530) --- src/live_effects/lpe-clone-original.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 04db6171e..b1cd6b0e5 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -64,6 +64,9 @@ void LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * attributes, const char * style_attributes, bool root) { SPDocument * document = SP_ACTIVE_DOCUMENT; + if (!document) { + return; + } if ( SP_IS_GROUP(origin) && SP_IS_GROUP(dest) && SP_GROUP(origin)->getItemCount() == SP_GROUP(dest)->getItemCount() ) { std::vector< SPObject * > childs = origin->childList(true); size_t index = 0; -- cgit v1.2.3 From 960d9ec3486bc6c7a106ce78a25de4b3cac823bf Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 21 Feb 2017 15:16:20 +0100 Subject: Improvements to fill between strokes and fill between many LPE's (bzr r15537) --- src/live_effects/lpe-clone-original.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index b1cd6b0e5..440af6f9c 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -347,7 +347,6 @@ void LPECloneOriginal::transform_multiply(Geom::Affine const& postmul, bool set) { if (linked_item.linksToItem()) { - bool changed = false; linked_item.getObject()->requestModified(SP_OBJECT_MODIFIED_FLAG); } } -- cgit v1.2.3 From fdd8ce77fa742072a1cea8136acaeed1dae079b5 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Thu, 16 Mar 2017 23:29:49 +0100 Subject: Remove some compiling warns (bzr r15599) --- src/live_effects/lpe-clone-original.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 440af6f9c..c41b1ef95 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -193,7 +193,7 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co while (*styleiter != NULL) { const char* attribute = (*styleiter); const char* origin_attribute = sp_repr_css_property(css_origin, attribute, ""); - if (origin_attribute == "") { + if (!strlen(origin_attribute)) { //==0 sp_repr_css_set_property (css_dest, attribute, NULL); } else { sp_repr_css_set_property (css_dest, attribute, origin_attribute); -- cgit v1.2.3 From 4420145b9b14f7f752f704b450b9a162dc8a640a Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Wed, 26 Apr 2017 00:52:24 +0200 Subject: Improve 0.92 support for Clone Original LPE (bzr r15645) --- src/live_effects/lpe-clone-original.cpp | 39 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 22 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index c41b1ef95..47fb6a04e 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -20,8 +20,7 @@ namespace LivePathEffect { LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : Effect(lpeobject), - linked_path("LEGACY FALLBACK", "LEGACY FALLBACK", "linkedpath", &wr, this), - linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this), + linkeditem(_("Linked Item:"), _("Item from which to take the original data"), "linkeditem", &wr, this), scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0), preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false), inverse(_("Inverse clone"), _("Use LPE item as origin"), "inverse", &wr, this, false), @@ -37,8 +36,15 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) : expanded(false), origin(Geom::Point(0,0)) { - registerParameter(&linked_path); - registerParameter(&linked_item); + //0.92 compatibility + const gchar * linkedpath = this->getRepr()->attribute("linkedpath"); + if (linkedpath && strcmp(linkedpath, "") != 0){ + this->getRepr()->setAttribute("linkeditem", linkedpath); + this->getRepr()->setAttribute("linkedpath", NULL); + this->getRepr()->setAttribute("transform", "false"); + }; + + registerParameter(&linkeditem); registerParameter(&scale); registerParameter(&attributes); registerParameter(&style_attributes); @@ -208,19 +214,8 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co void LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ - if (linked_path.linksToPath()) { //Legacy staff - Glib::ustring attributes_value("d"); - attributes.param_setValue(attributes_value); - attributes.write_to_SVG(); - Glib::ustring style_attributes_value(""); - style_attributes.param_setValue(style_attributes_value); - style_attributes.write_to_SVG(); - linked_item.param_readSVGValue(linked_path.param_getSVGValue()); - linked_path.param_readSVGValue(""); - } - - if (linked_item.linksToItem()) { - linked_item.setInverse(inverse); + if (linkeditem.linksToItem()) { + linkeditem.setInverse(inverse); if ( preserve_position_changed != preserve_position ) { if (!preserve_position) { sp_svg_transform_read(SP_ITEM(sp_lpe_item)->getAttribute("transform"), &preserve_affine); @@ -262,8 +257,8 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){ } style_attr.append(Glib::ustring(style_attributes.param_getSVGValue()).append(",")); - SPItem * from = inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linked_item.getObject()); - SPItem * to = !inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linked_item.getObject()); + SPItem * from = inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linkeditem.getObject()); + SPItem * to = !inverse ? SP_ITEM(sp_lpe_item) : SP_ITEM(linkeditem.getObject()); cloneAttrbutes(from, to, true, g_strdup(attr.c_str()), g_strdup(style_attr.c_str()), true); Geom::OptRect bbox = from->geometricBounds(); if (bbox && preserve_position && origin != Geom::Point(0,0)) { @@ -346,15 +341,15 @@ LPECloneOriginal::~LPECloneOriginal() void LPECloneOriginal::transform_multiply(Geom::Affine const& postmul, bool set) { - if (linked_item.linksToItem()) { - linked_item.getObject()->requestModified(SP_OBJECT_MODIFIED_FLAG); + if (linkeditem.linksToItem()) { + linkeditem.getObject()->requestModified(SP_OBJECT_MODIFIED_FLAG); } } void LPECloneOriginal::doEffect (SPCurve * curve) { - if (linked_item.linksToItem() && !inverse) { + if (linkeditem.linksToItem() && !inverse) { SPShape * shape = getCurrentShape(); if(shape){ curve->set_pathvector(shape->getCurve()->get_pathvector()); -- cgit v1.2.3 From a3d1689c18ebf132acb7ae0501ec419a71e48a85 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Mon, 1 May 2017 03:15:26 +0200 Subject: Fix erase lpe in multi LPE mode Improve rendering widgets, simplify the code, redraw widgets each time not only on odd iterations (bzr r15655) --- src/live_effects/lpe-clone-original.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index 47fb6a04e..d97a990af 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -318,7 +318,6 @@ LPECloneOriginal::newWidget() expander->set_expanded(expanded); expander->property_expanded().signal_changed().connect(sigc::mem_fun(*this, &LPECloneOriginal::onExpanderChanged) ); vbox->pack_start(*expander, true, true, 2); - this->upd_params = false; return dynamic_cast(vbox); } -- cgit v1.2.3 From 71f7e26f4a6714fe1d3b6a72f61c481c3e1f52a0 Mon Sep 17 00:00:00 2001 From: chr Date: Tue, 23 May 2017 21:48:27 +0200 Subject: fix a brunch of memory leaks pt.2 I'd like to see the crappy API fixed, to avoid this stupid mistakes. (bzr r15698.1.12) --- src/live_effects/lpe-clone-original.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/live_effects/lpe-clone-original.cpp') diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp index d97a990af..31bf0e270 100644 --- a/src/live_effects/lpe-clone-original.cpp +++ b/src/live_effects/lpe-clone-original.cpp @@ -138,10 +138,14 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co dest_affine *= Geom::Translate(preserve_affine.translation()); affine_previous = preserve_affine; preserve_affine = Geom::identity(); - SP_ITEM(dest)->getRepr()->setAttribute("transform",sp_svg_transform_write(dest_affine)); + gchar * str = sp_svg_transform_write(dest_affine); + SP_ITEM(dest)->getRepr()->setAttribute("transform", str); + g_free(str); } } else { - SP_ITEM(dest)->getRepr()->setAttribute("transform",sp_svg_transform_write(affine_origin)); + gchar * str = sp_svg_transform_write(affine_origin); + SP_ITEM(dest)->getRepr()->setAttribute("transform", str); + g_free(str); } } else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0)) { SPCurve *c = NULL; @@ -176,7 +180,9 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co c->set_pathvector(c_pv); if (!path_origin) { shape_dest->setCurveInsync(c, TRUE); - dest->getRepr()->setAttribute(attribute, sp_svg_write_path(c_pv)); + gchar *str = sp_svg_write_path(c_pv); + dest->getRepr()->setAttribute(attribute, str); + g_free(str); } else { shape_dest->setCurve(c, TRUE); } -- cgit v1.2.3