summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-09-27 19:24:00 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-09-27 19:24:00 +0000
commitf618dd7f5e1ecd71037009b82a2a3ca6f7c41886 (patch)
treea997de66424d3b00adf00e90885a662df2863945 /src
parentExtensions: Fix filename encoding issues in error logging (diff)
downloadinkscape-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.cpp26
-rw-r--r--src/live_effects/lpe-powermask.cpp17
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");
+ }
}
}
}