diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-09-27 19:24:00 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-09-27 19:24:00 +0000 |
| commit | f618dd7f5e1ecd71037009b82a2a3ca6f7c41886 (patch) | |
| tree | a997de66424d3b00adf00e90885a662df2863945 /src | |
| parent | Extensions: Fix filename encoding issues in error logging (diff) | |
| download | inkscape-f618dd7f5e1ecd71037009b82a2a3ca6f7c41886.tar.gz inkscape-f618dd7f5e1ecd71037009b82a2a3ca6f7c41886.zip | |
fixes https://gitlab.com/inkscape/inbox/issues/847 Crash on Inverse Clipping an object with its clone and https://gitlab.com/inkscape/inkscape/issues/414 Object > Mask/Clip >Set Inverse (LPE) without clip path crashes Inkscape
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/lpe-powerclip.cpp | 26 | ||||
| -rw-r--r-- | src/live_effects/lpe-powermask.cpp | 17 |
2 files changed, 29 insertions, 14 deletions
diff --git a/src/live_effects/lpe-powerclip.cpp b/src/live_effects/lpe-powerclip.cpp index 6a2abeb89..d96e2caae 100644 --- a/src/live_effects/lpe-powerclip.cpp +++ b/src/live_effects/lpe-powerclip.cpp @@ -18,6 +18,7 @@ #include "object/sp-shape.h" #include "object/sp-item.h" #include "object/sp-item-group.h" +#include "object/sp-use.h" #include "object/uri.h" // TODO due to internal breakage in glibmm headers, this must be last: @@ -362,13 +363,24 @@ void sp_inverse_powerclip(Inkscape::Selection *sel) { for(auto i = boost::rbegin(selList); i != boost::rend(selList); ++i) { SPLPEItem* lpeitem = dynamic_cast<SPLPEItem*>(*i); if (lpeitem) { - Effect::createAndApply(POWERCLIP, SP_ACTIVE_DOCUMENT, lpeitem); - Effect* lpe = lpeitem->getCurrentLPE(); - lpe->getRepr()->setAttribute("is_inverse", "false"); - lpe->getRepr()->setAttribute("is_visible", "true"); - lpe->getRepr()->setAttribute("inverse", "true"); - lpe->getRepr()->setAttribute("flatten", "false"); - lpe->getRepr()->setAttribute("hide_clip", "false"); + SPClipPath *clip_path = SP_ITEM(lpeitem)->clip_ref->getObject(); + if(clip_path) { + std::vector<SPObject*> clip_path_list = clip_path->childList(true); + for (std::vector<SPObject*>::const_iterator iter=clip_path_list.begin();iter!=clip_path_list.end();++iter) { + SPUse *use = dynamic_cast<SPUse*>(*iter); + if (use) { + g_warning("We can`t add inverse clip on clones"); + return; + } + } + Effect::createAndApply(POWERCLIP, SP_ACTIVE_DOCUMENT, lpeitem); + Effect* lpe = lpeitem->getCurrentLPE(); + lpe->getRepr()->setAttribute("is_inverse", "false"); + lpe->getRepr()->setAttribute("is_visible", "true"); + lpe->getRepr()->setAttribute("inverse", "true"); + lpe->getRepr()->setAttribute("flatten", "false"); + lpe->getRepr()->setAttribute("hide_clip", "false"); + } } } } diff --git a/src/live_effects/lpe-powermask.cpp b/src/live_effects/lpe-powermask.cpp index d35148425..c4579eea2 100644 --- a/src/live_effects/lpe-powermask.cpp +++ b/src/live_effects/lpe-powermask.cpp @@ -330,13 +330,16 @@ void sp_inverse_powermask(Inkscape::Selection *sel) { for(auto i = boost::rbegin(selList); i != boost::rend(selList); ++i) { SPLPEItem* lpeitem = dynamic_cast<SPLPEItem*>(*i); if (lpeitem) { - Effect::createAndApply(POWERMASK, SP_ACTIVE_DOCUMENT, lpeitem); - Effect* lpe = lpeitem->getCurrentLPE(); - lpe->getRepr()->setAttribute("invert", "false"); - lpe->getRepr()->setAttribute("is_visible", "true"); - lpe->getRepr()->setAttribute("hide_mask", "false"); - lpe->getRepr()->setAttribute("background", "true"); - lpe->getRepr()->setAttribute("background_color", "#ffffffff"); + SPMask *mask = lpeitem->mask_ref->getObject(); + if (mask) { + Effect::createAndApply(POWERMASK, SP_ACTIVE_DOCUMENT, lpeitem); + Effect* lpe = lpeitem->getCurrentLPE(); + lpe->getRepr()->setAttribute("invert", "false"); + lpe->getRepr()->setAttribute("is_visible", "true"); + lpe->getRepr()->setAttribute("hide_mask", "false"); + lpe->getRepr()->setAttribute("background", "true"); + lpe->getRepr()->setAttribute("background_color", "#ffffffff"); + } } } } |
