From: jucablues Date: Mon, 25 Feb 2008 16:50:06 +0000 (+0000) Subject: fix for bug #195314: feImage filter not updating filtered region when X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=03f0cae6e38fff2327b8d5ead5cdba8b6786ec52;p=inkscape.git fix for bug #195314: feImage filter not updating filtered region when referenced object changes --- 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 {