]> git.tokkee.org Git - inkscape.git/commitdiff

Code

fix for bug #195314: feImage filter not updating filtered region when
authorjucablues <jucablues@users.sourceforge.net>
Mon, 25 Feb 2008 16:50:06 +0000 (16:50 +0000)
committerjucablues <jucablues@users.sourceforge.net>
Mon, 25 Feb 2008 16:50:06 +0000 (16:50 +0000)
referenced object changes

src/sp-feimage.cpp
src/sp-feimage.h

index d72435f2c5415cc77b1895fabcd2384504cd73da..2628d397c61e8a2c405c9aaaa8f7235d8d5c5d4b 100644 (file)
@@ -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;
             }
index d66a4fb770594608fc6241213512df86a077fd42..dc432a6720857eabe140f526286198af27a325a1 100644 (file)
@@ -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 {