summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFelipe Corr??a da Silva Sanches <juca@members.fsf.org>2008-02-25 16:50:06 +0000
committerjucablues <jucablues@users.sourceforge.net>2008-02-25 16:50:06 +0000
commit86af613c3292dbc7fc513b3d311b418c8a179253 (patch)
tree34cec1a22f0e86d6fc93e314ca2f7c67a2f78561 /src
parentfix converting 3d boxes to path and ungrouping - do not lose selection, prese... (diff)
downloadinkscape-86af613c3292dbc7fc513b3d311b418c8a179253.tar.gz
inkscape-86af613c3292dbc7fc513b3d311b418c8a179253.zip
fix for bug #195314: feImage filter not updating filtered region when
referenced object changes (bzr r4850)
Diffstat (limited to 'src')
-rw-r--r--src/sp-feimage.cpp20
-rw-r--r--src/sp-feimage.h3
2 files changed, 16 insertions, 7 deletions
diff --git a/src/sp-feimage.cpp b/src/sp-feimage.cpp
index d72435f2c..2628d397c 100644
--- a/src/sp-feimage.cpp
+++ b/src/sp-feimage.cpp
@@ -118,11 +118,20 @@ sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re
static void
sp_feImage_release(SPObject *object)
{
+ SPFeImage *feImage = SP_FEIMAGE(object);
+ feImage->_modified_connection.disconnect();
+ if (feImage->SVGElemRef) delete feImage->SVGElemRef;
if (((SPObjectClass *) feImage_parent_class)->release)
((SPObjectClass *) feImage_parent_class)->release(object);
}
+static void
+sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj)
+{
+ obj->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+}
+
/**
* Sets a specific value in the SPFeImage.
*/
@@ -132,7 +141,6 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
SPFeImage *feImage = SP_FEIMAGE(object);
(void)feImage;
Inkscape::URI* SVGElem_uri;
- Inkscape::URIReference* SVGElemRef;
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_XLINK_HREF:
@@ -141,15 +149,13 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
if (!feImage->href) return;
try{
SVGElem_uri = new Inkscape::URI(feImage->href);
- SVGElemRef = new Inkscape::URIReference(feImage->document);
+ feImage->SVGElemRef = new Inkscape::URIReference(feImage->document);
feImage->from_element = true;
- SVGElemRef->attach(*SVGElem_uri);
- feImage->SVGElem = SP_ITEM(SVGElemRef->getObject());
+ feImage->SVGElemRef->attach(*SVGElem_uri);
+ feImage->SVGElem = SP_ITEM(feImage->SVGElemRef->getObject());
g_free(SVGElem_uri);
- g_free(SVGElemRef);
- //TODO: maybe keeping SVGElemRef we can observe changes to the
- // referenced object and trigger updates of the filtered object
+ feImage->_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object));
object->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
}
diff --git a/src/sp-feimage.h b/src/sp-feimage.h
index d66a4fb77..dc432a672 100644
--- a/src/sp-feimage.h
+++ b/src/sp-feimage.h
@@ -18,6 +18,7 @@
#include "sp-feimage-fns.h"
#include "svg/svg-length.h"
#include "sp-item.h"
+#include "uri-references.h"
/* FeImage base class */
class SPFeImageClass;
@@ -29,6 +30,8 @@ struct SPFeImage : public SPFilterPrimitive {
SPDocument *document;
bool from_element;
SPItem* SVGElem;
+ Inkscape::URIReference* SVGElemRef;
+ sigc::connection _modified_connection;
};
struct SPFeImageClass {