diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-09-28 22:45:49 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-09-28 22:45:49 +0000 |
| commit | 6d3682c7c8daacee95364d5d80a4490786235a45 (patch) | |
| tree | b4149058bc1d69fbf8cd3f7b02cd21d4aa2e904e /src | |
| parent | fix 1789208 poppler 0.69 (diff) | |
| download | inkscape-6d3682c7c8daacee95364d5d80a4490786235a45.tar.gz inkscape-6d3682c7c8daacee95364d5d80a4490786235a45.zip | |
Fix bug #1791696: PowerClip: Using a group as a clip doesn't work as expected
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/lpe-powerclip.cpp | 16 | ||||
| -rw-r--r-- | src/live_effects/lpe-powerclip.h | 2 | ||||
| -rwxr-xr-x | src/selection-chemistry.cpp | 21 |
3 files changed, 23 insertions, 16 deletions
diff --git a/src/live_effects/lpe-powerclip.cpp b/src/live_effects/lpe-powerclip.cpp index 494c6d8a4..c27824938 100644 --- a/src/live_effects/lpe-powerclip.cpp +++ b/src/live_effects/lpe-powerclip.cpp @@ -109,7 +109,7 @@ LPEPowerClip::doBeforeEffect (SPLPEItem const* lpeitem){ gchar * is_inverse_str = is_inverse.param_getSVGValue(); if(!strcmp(is_inverse_str,"false") && inverse && isVisible()) { SPCurve * clipcurve = new SPCurve(); - addInverse(SP_ITEM(clip_data), clipcurve, true); + addInverse(SP_ITEM(clip_data), clipcurve, Geom::Affine::identity(), true); } else if((!strcmp(is_inverse_str,"true") && !inverse && isVisible()) || (inverse && !is_visible && is_inverse_str == (Glib::ustring)"true")) { @@ -133,7 +133,7 @@ LPEPowerClip::doAfterEffect (SPLPEItem const* lpeitem){ } void -LPEPowerClip::addInverse (SPItem * clip_data, SPCurve * clipcurve, bool root){ +LPEPowerClip::addInverse (SPItem * clip_data, SPCurve * clipcurve, Geom::Affine affine, bool root){ gchar * is_inverse_str = is_inverse.param_getSVGValue(); SPDocument * document = SP_ACTIVE_DOCUMENT; if (!document) { @@ -142,10 +142,7 @@ LPEPowerClip::addInverse (SPItem * clip_data, SPCurve * clipcurve, bool root){ SPObject *elemref = NULL; if(root) { Inkscape::XML::Document *xml_doc = document->getReprDoc(); - if (!SP_IS_SHAPE(clip_data)) { - return; - } - SP_SHAPE(clip_data)->removeAllPathEffects(true); + SP_LPE_ITEM(clip_data)->removeAllPathEffects(true); Inkscape::XML::Node *clip_path_node = xml_doc->createElement("svg:path"); Inkscape::XML::Node *parent = clip_data->getRepr()->parent(); parent->appendChild(clip_path_node); @@ -158,15 +155,16 @@ LPEPowerClip::addInverse (SPItem * clip_data, SPCurve * clipcurve, bool root){ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(clip_data)); for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();++iter) { SPItem *subitem = *iter; - addInverse(subitem, clipcurve, false); + Geom::Affine affine_group = SP_ITEM(clip_data)->transform; + addInverse(subitem, clipcurve, affine_group, false); if (root) { - Geom::Affine affine = SP_ITEM(clip_data)->transform; - clip_box *= affine; + clip_box *= affine_group; } } } else if (SP_IS_SHAPE(clip_data)) { SPCurve * c = nullptr; c = SP_SHAPE(clip_data)->getCurve(); + c->transform(affine); if (c) { Geom::PathVector c_pv = c->get_pathvector(); //TODO: this can be not correct but no better way diff --git a/src/live_effects/lpe-powerclip.h b/src/live_effects/lpe-powerclip.h index 6fc85cbab..c79932b84 100644 --- a/src/live_effects/lpe-powerclip.h +++ b/src/live_effects/lpe-powerclip.h @@ -24,7 +24,7 @@ public: void doOnRemove (SPLPEItem const* /*lpeitem*/) override; void doOnVisibilityToggled(SPLPEItem const* lpeitem) override; void doAfterEffect (SPLPEItem const* lpeitem) override; - void addInverse (SPItem * clip_data, SPCurve * clipcurve, bool root); + void addInverse (SPItem * clip_data, SPCurve * clipcurve, Geom::Affine affine, bool root); void updateInverse (SPItem * clip_data); void removeInverse (SPItem * clip_data); void flattenClip(SPItem * clip_data, Geom::PathVector &path_in); diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 30a1e8e19..6584244c2 100755 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -3947,19 +3947,29 @@ void ObjectSet::setClipGroup() doc->ensureUpToDate(); + // Coment this section because we dont need it I think. + // Also updated comment code to work correctly if finaly is needed + // To active again remove next line and uncoment the section std::vector<SPItem*> items_(items().begin(), items().end()); - - sort(items_.begin(),items_.end(),sp_object_compare_position_bool); + /* + std::vector<SPItem*> items_prerect_(items().begin(), items().end()); + std::vector<SPItem*> items_; // convert any rects to paths - for (std::vector<SPItem *>::const_iterator i = items_.begin(); i != items_.end(); ++i) { + for (std::vector<SPItem *>::const_iterator i = items_prerect_.begin(); i != items_prerect_.end(); ++i) { clear(); if (dynamic_cast<SPRect *>(*i)) { add(*i); toCurves(); + items_.push_back(*items().begin()); + } else { + items_.push_back(*i); } } - + clear(); + */ + sort(items_.begin(),items_.end(),sp_object_compare_position_bool); + // See lp bug #542004 clear(); @@ -4030,7 +4040,6 @@ void ObjectSet::setClipGroup() gchar const *attributeName = apply_clip_path ? "clip-path" : "mask"; for (std::vector<SPItem*>::const_reverse_iterator i = apply_to_items.rbegin(); i != apply_to_items.rend(); ++i) { SPItem *item = reinterpret_cast<SPItem *>(*i); - std::vector<Inkscape::XML::Node*> mask_items_dup; std::map<Inkscape::XML::Node*, Geom::Affine> dup_transf; for (auto it = mask_items.begin(); it != mask_items.end(); ++it) { @@ -4059,7 +4068,7 @@ void ObjectSet::setClipGroup() // Apply clip/mask to group instead apply_mask_to = group; - items_to_select.push_back(item = (SPItem*)(doc->getObjectByRepr(group))); + items_to_select.push_back((SPItem*)doc->getObjectByRepr(group)); Inkscape::GC::release(spnew); Inkscape::GC::release(group); } |
