summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2017-06-07 19:34:53 +0000
committerjabiertxof <info@marker.es>2017-06-07 19:34:53 +0000
commitef4db6f8483312a558b512e8a1ad11fc95872886 (patch)
treea8a146800a323f3878e5fe45dcb5e14d0a60ac0f /src
parentUpdate to trunk (diff)
downloadinkscape-ef4db6f8483312a558b512e8a1ad11fc95872886.tar.gz
inkscape-ef4db6f8483312a558b512e8a1ad11fc95872886.zip
Working on powermask LPE
(bzr r15722)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/effect-enum.h2
-rw-r--r--src/live_effects/effect.cpp2
-rw-r--r--src/live_effects/lpe-powerclip.cpp3
-rw-r--r--src/live_effects/lpe-powerclip.h1
-rw-r--r--src/live_effects/lpe-powermask.cpp181
-rw-r--r--src/live_effects/lpe-powermask.h13
-rw-r--r--src/sp-clippath.h1
-rw-r--r--src/sp-mask.cpp3
8 files changed, 136 insertions, 70 deletions
diff --git a/src/live_effects/effect-enum.h b/src/live_effects/effect-enum.h
index 7c2965d14..7114004a0 100644
--- a/src/live_effects/effect-enum.h
+++ b/src/live_effects/effect-enum.h
@@ -49,8 +49,6 @@ enum EffectType {
BOUNDING_BOX,
MEASURE_LINE,
FILLET_CHAMFER,
- POWERCLIP,
- POWERMASK,
BOOL_OP,
POWERCLIP,
POWERMASK,
diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp
index 256530a38..c4a437ff6 100644
--- a/src/live_effects/effect.cpp
+++ b/src/live_effects/effect.cpp
@@ -315,7 +315,7 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
neweffect = static_cast<Effect*> ( new LPEPowerClip(lpeobj) );
break;
case POWERMASK:
- neweffect = static_cast<Effect*> ( new LPEPowerClip(lpeobj) );
+ neweffect = static_cast<Effect*> ( new LPEPowerMask(lpeobj) );
break;
case ROUGHEN:
neweffect = static_cast<Effect*> ( new LPERoughen(lpeobj) );
diff --git a/src/live_effects/lpe-powerclip.cpp b/src/live_effects/lpe-powerclip.cpp
index 75e4c24de..ee1603855 100644
--- a/src/live_effects/lpe-powerclip.cpp
+++ b/src/live_effects/lpe-powerclip.cpp
@@ -247,9 +247,6 @@ LPEPowerClip::newWidget()
if ((*it)->widget_is_visible) {
Parameter * param = *it;
Gtk::Widget * widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
- if(param->param_key == "grid") {
- widg = NULL;
- }
Glib::ustring * tip = param->param_getTooltip();
if (widg) {
vbox->pack_start(*widg, true, true, 2);
diff --git a/src/live_effects/lpe-powerclip.h b/src/live_effects/lpe-powerclip.h
index 88d425f01..e70ec2c9c 100644
--- a/src/live_effects/lpe-powerclip.h
+++ b/src/live_effects/lpe-powerclip.h
@@ -9,7 +9,6 @@
#include "live_effects/effect.h"
#include "live_effects/parameter/hidden.h"
-#include "live_effects/parameter/path.h"
#include "live_effects/lpegroupbbox.h"
namespace Inkscape {
diff --git a/src/live_effects/lpe-powermask.cpp b/src/live_effects/lpe-powermask.cpp
index bbe0dff40..a49d4c493 100644
--- a/src/live_effects/lpe-powermask.cpp
+++ b/src/live_effects/lpe-powermask.cpp
@@ -11,6 +11,7 @@
#include "sp-path.h"
#include "sp-shape.h"
#include "sp-defs.h"
+#include "style.h"
#include "sp-item-group.h"
#include "svg/svg.h"
#include "ui/tools-switch.h"
@@ -24,10 +25,21 @@ namespace LivePathEffect {
LPEPowerMask::LPEPowerMask(LivePathEffectObject *lpeobject)
: Effect(lpeobject),
- inverse(_("Inverse mask"), _("Inverse mask"), "inverse", &wr, this, false)
+ invert(_("Invert mask"), _("Invert mask"), "invert", &wr, this, false),
+ wrap(_("Wrap filtered clip data"), _("Wrap filtered clip data"), "wrap", &wr, this, false),
+ background(_("Add background to mask"), _("Add background to mask"), "background", &wr, this, false),
+ background_style(_("Background Style"), _("CSS to background"), "background_style", &wr, this,"fill:#ffffff;opacity:0.7;")
+
{
- registerParameter(&inverse);
+ registerParameter(&invert);
+ registerParameter(&wrap);
+ registerParameter(&background);
+ registerParameter(&background_style);
+ background_style.param_hide_canvas_text();
hide_mask = false;
+ previous_invert = !invert;
+ previous_wrap = !wrap;
+ previous_background_style = "";
}
LPEPowerMask::~LPEPowerMask() {}
@@ -35,7 +47,7 @@ LPEPowerMask::~LPEPowerMask() {}
void
LPEPowerMask::doBeforeEffect (SPLPEItem const* lpeitem){
original_bbox(lpeitem);
- const Glib::ustring uri = (Glib::ustring)sp_lpe_item->getRepr()->attribute("mask-path");
+ const Glib::ustring uri = (Glib::ustring)sp_lpe_item->getRepr()->attribute("mask");
SPMask *mask = SP_ITEM(lpeitem)->mask_ref->getObject();
Geom::Point topleft = Geom::Point(boundingbox_X.min() - 5,boundingbox_Y.max() + 5);
Geom::Point topright = Geom::Point(boundingbox_X.max() + 5,boundingbox_Y.max() + 5);
@@ -49,12 +61,12 @@ LPEPowerMask::doBeforeEffect (SPLPEItem const* lpeitem){
mask_box.close();
//mask *= sp_lpe_item->i2dt_affine();
if(mask) {
- setInverse();
+ setMask();
}
}
void
-LPEPowerMask::setInverse(){
+LPEPowerMask::setMask(){
SPMask *mask = SP_ITEM(sp_lpe_item)->mask_ref->getObject();
SPObject *elemref = NULL;
SPDocument * document = SP_ACTIVE_DOCUMENT;
@@ -65,55 +77,111 @@ LPEPowerMask::setInverse(){
Inkscape::XML::Node *box = NULL;
Inkscape::XML::Node *filter = NULL;
SPDefs * defs = document->getDefs();
- if (inverse) {
-// if (!(elemref = document->getObjectById((Glib::ustring)mask->getId() + (Glib::ustring)"_transparentbox"))) {
-// std::vector<SPObject*> mask_list = mask->childList(true);
-// box = xml_doc->createElement("svg:path");
-// box->setAttribute("id", (Glib::ustring)mask->getId() + (Glib::ustring)"_transparentbox");
-// box->setAttribute("style", "fill:#000");
-// gchar * box_str = sp_svg_write_path( mask_box );
-// box->setAttribute("d" , box_str);
-// g_free(box_str);
-// elemref = mask->appendChildRepr(box);
-// box->setPosition(mask_list.size());
-// Inkscape::GC::release(box);
-// mask_list.clear();
-// }
-// if (!(elemref = document->getObjectById((Glib::ustring)mask->getId() + (Glib::ustring)"_inverse"))) {
-// filter = xml_doc->createElement("svg:filter");
-// filter->setAttribute("id", (Glib::ustring)mask->getId() + (Glib::ustring)"_inverse");
-// filter->setAttribute("color-interpolation-filters", "sRGB");
-// filter->setAttribute("height", "100");
-// filter->setAttribute("width", "100");
-// filter->setAttribute("x", "-50");
-// filter->setAttribute("y", "-50");
-// Inkscape::XML::Node *primitive1 = xml_doc->createElement("svg:feColorMatrix");
-// primitive1->setAttribute("id", (Glib::ustring)mask->getId() + (Glib::ustring)"_primitive1");
-// primitive1->setAttribute("values", "1");
-// primitive1->setAttribute("type", "saturate");
-// primitive1->setAttribute("result", "fbSourceGraphic");
-// Inkscape::XML::Node *primitive2 = xml_doc->createElement("svg:feColorMatrix");
-// primitive2->setAttribute("id", (Glib::ustring)mask->getId() + (Glib::ustring)"_primitive2");
-// primitive2->setAttribute("values", "-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0 ");
-// primitive2->setAttribute("in", "fbSourceGraphic");
-// elemref = defs->appendChildRepr(filter);
-// filter->appendChild(primitive1);
-// filter->appendChild(primitive2);
-// Inkscape::GC::release(filter);
-// Inkscape::GC::release(primitive1);
-// Inkscape::GC::release(primitive2);
-// }
-// mask->getRepr()->setAttribute("css", (Glib::ustring)"filter:#" + (Glib::ustring)mask->getId() + (Glib::ustring)"_inverse");
+ Glib::ustring mask_id = (Glib::ustring)mask->getId();
+ Glib::ustring box_id = mask_id + (Glib::ustring)"_transparentbox";
+ Glib::ustring filter_id = mask_id + (Glib::ustring)"_inverse";
+ Glib::ustring filter_uri = (Glib::ustring)"url(#" + mask_id + (Glib::ustring)"_inverse)";
+ if (previous_invert != invert || previous_wrap != wrap) {
+ if (invert) {
+ if (!(elemref = document->getObjectById(filter_id))) {
+ filter = xml_doc->createElement("svg:filter");
+ filter->setAttribute("id", filter_id.c_str());
+ filter->setAttribute("color-interpolation-filters", "sRGB");
+ filter->setAttribute("height", "100");
+ filter->setAttribute("width", "100");
+ filter->setAttribute("x", "-50");
+ filter->setAttribute("y", "-50");
+ Inkscape::XML::Node *primitive1 = xml_doc->createElement("svg:feColorMatrix");
+ Glib::ustring primitive1_id = (mask_id + (Glib::ustring)"_primitive1").c_str();
+ primitive1->setAttribute("id", primitive1_id.c_str());
+ primitive1->setAttribute("values", "1");
+ primitive1->setAttribute("type", "saturate");
+ primitive1->setAttribute("result", "fbSourceGraphic");
+ Inkscape::XML::Node *primitive2 = xml_doc->createElement("svg:feColorMatrix");
+ Glib::ustring primitive2_id = (mask_id + (Glib::ustring)"_primitive2").c_str();
+ primitive2->setAttribute("id", primitive2_id.c_str());
+ primitive2->setAttribute("values", "-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0 ");
+ primitive2->setAttribute("in", "fbSourceGraphic");
+ elemref = defs->appendChildRepr(filter);
+ filter->appendChild(primitive1);
+ filter->appendChild(primitive2);
+ Inkscape::GC::release(filter);
+ Inkscape::GC::release(primitive1);
+ Inkscape::GC::release(primitive2);
+ }
+ } else {
+ if ((elemref = document->getObjectById(filter_id))) {
+ elemref->deleteObject(true);
+ }
+ filter_uri = "";
+ }
+ std::vector<SPObject*> mask_list = mask->childList(true);
+ for ( std::vector<SPObject*>::const_iterator iter=mask_list.begin();iter!=mask_list.end();++iter) {
+ SPItem * mask_data = SP_ITEM(*iter);
+ if (! strcmp(mask_data->getId(), box_id.c_str())){
+ continue;
+ }
+ Glib::ustring mask_data_id = (Glib::ustring)mask_data->getId();
+ SPCSSAttr *css = sp_repr_css_attr_new();
+ if(mask_data->getRepr()->attribute("style")) {
+ sp_repr_css_attr_add_from_string(css, mask_data->getRepr()->attribute("style"));
+ }
+ char const* filter = sp_repr_css_property (css, "filter", "");
+ if(!filter ||! strcmp(filter, filter_uri.c_str())) {
+ if (filter_uri.empty()) {
+ sp_repr_css_set_property (css, "filter", NULL);
+ } else {
+ sp_repr_css_set_property (css, "filter", filter_uri.c_str());
+ }
+ Glib::ustring css_str;
+ sp_repr_css_write_string(css, css_str);
+ mask_data->getRepr()->setAttribute("style", css_str.c_str());
+ } else if(wrap){
+ Glib::ustring g_data_id = mask_data_id + (Glib::ustring)"_container";
+ Inkscape::XML::Node * container = xml_doc->createElement("svg:g");
+ container->setAttribute("id", g_data_id.c_str());
+ mask->appendChildRepr(container);
+ container->setPosition(mask_data->getPosition());
+ container->appendChild(mask_data->getRepr());
+ Inkscape::GC::release(container);
+ SPCSSAttr *css = sp_repr_css_attr_new();
+ if (filter_uri.empty()) {
+ sp_repr_css_set_property (css, "filter", NULL);
+ } else {
+ sp_repr_css_set_property (css, "filter", filter_uri.c_str());
+ }
+ Glib::ustring css_str;
+ sp_repr_css_write_string(css, css_str);
+ container->setAttribute("style", css_str.c_str());
+ }
+ }
+ }
+ if (background) {
+ if ((elemref = document->getObjectById(box_id))) {
+ if (strcmp(previous_background_style, background_style.param_getSVGValue())) {
+ elemref->getRepr()->setAttribute("style", background_style.param_getSVGValue());
+ }
+ } else {
+ std::vector<SPObject*> mask_list = mask->childList(true);
+ box = xml_doc->createElement("svg:path");
+ box->setAttribute("id", box_id.c_str());
+ box->setAttribute("style", background_style.param_getSVGValue());
+ gchar * box_str = sp_svg_write_path( mask_box );
+ box->setAttribute("d" , box_str);
+ g_free(box_str);
+ elemref = mask->appendChildRepr(box);
+ box->setPosition(mask_list.size());
+ Inkscape::GC::release(box);
+ mask_list.clear();
+ }
} else {
-// if ((elemref = document->getObjectById((Glib::ustring)mask->getId() + (Glib::ustring)"_transparentbox"))) {
-// elemref->deleteObject(true);
-// }
-
-// if ((elemref = document->getObjectById((Glib::ustring)mask->getId() + (Glib::ustring)"_inverse"))) {
-// elemref->deleteObject(true);
-// }
- //mask->getRepr()->setAttribute("css", NULL);
+ if ((elemref = document->getObjectById(box_id))) {
+ elemref->deleteObject(true);
+ }
}
+ previous_invert = invert;
+ previous_wrap = wrap;
+ previous_background_style = background_style.param_getSVGValue();
}
void
@@ -161,9 +229,6 @@ LPEPowerMask::newWidget()
if ((*it)->widget_is_visible) {
Parameter * param = *it;
Gtk::Widget * widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
- if(param->param_key == "grid") {
- widg = NULL;
- }
Glib::ustring * tip = param->param_getTooltip();
if (widg) {
vbox->pack_start(*widg, true, true, 2);
@@ -193,8 +258,10 @@ LPEPowerMask::doOnRemove (SPLPEItem const* /*lpeitem*/)
SPMask *mask = SP_ITEM(sp_lpe_item)->mask_ref->getObject();
if(!keep_paths) {
if(mask) {
- inverse.param_setValue(false);
- setInverse();
+ invert.param_setValue(false);
+ wrap.param_setValue(false);
+ background.param_setValue(false);
+ setMask();
}
}
}
diff --git a/src/live_effects/lpe-powermask.h b/src/live_effects/lpe-powermask.h
index 4038f207e..4869fbc53 100644
--- a/src/live_effects/lpe-powermask.h
+++ b/src/live_effects/lpe-powermask.h
@@ -8,8 +8,7 @@
*/
#include "live_effects/effect.h"
-#include "live_effects/parameter/hidden.h"
-#include "live_effects/parameter/path.h"
+#include "live_effects/parameter/text.h"
#include "live_effects/lpegroupbbox.h"
namespace Inkscape {
@@ -23,11 +22,17 @@ public:
virtual void doOnRemove (SPLPEItem const* /*lpeitem*/);
virtual Gtk::Widget * newWidget();
void toggleMask();
- void setInverse();
+ void setMask();
private:
- BoolParam inverse;
+ BoolParam invert;
+ BoolParam wrap;
+ BoolParam background;
+ TextParam background_style;
Geom::Path mask_box;
bool hide_mask;
+ bool previous_invert;
+ bool previous_wrap;
+ const gchar * previous_background_style;
};
} //namespace LivePathEffect
diff --git a/src/sp-clippath.h b/src/sp-clippath.h
index 7b1c83356..129f3b7f3 100644
--- a/src/sp-clippath.h
+++ b/src/sp-clippath.h
@@ -21,7 +21,6 @@
struct SPClipPathView;
#include <cstdio>
-
#include "sp-object-group.h"
#include "uri-references.h"
#include "xml/node.h"
diff --git a/src/sp-mask.cpp b/src/sp-mask.cpp
index 4690ffda2..a47fab35e 100644
--- a/src/sp-mask.cpp
+++ b/src/sp-mask.cpp
@@ -23,7 +23,8 @@
#include "attributes.h"
#include "document.h"
#include "document-private.h"
-
+#include "style.h"
+#include "attributes.h"
#include "sp-mask.h"
struct SPMaskView {