X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffilters%2Fimage.cpp;h=0002ef94c74a36b336aa2e40350a2027e5266fd3;hb=43be2ed2178db96177d31205e4b9692535612136;hp=f4764577a9f6ee9a066177bc24f33b0610e4cecb;hpb=d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5;p=inkscape.git diff --git a/src/filters/image.cpp b/src/filters/image.cpp index f4764577a..0002ef94c 100644 --- a/src/filters/image.cpp +++ b/src/filters/image.cpp @@ -119,7 +119,8 @@ static void sp_feImage_release(SPObject *object) { SPFeImage *feImage = SP_FEIMAGE(object); - feImage->_modified_connection.disconnect(); + feImage->_image_modified_connection.disconnect(); + feImage->_href_modified_connection.disconnect(); if (feImage->SVGElemRef) delete feImage->SVGElemRef; if (((SPObjectClass *) feImage_parent_class)->release) @@ -132,6 +133,21 @@ sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj) obj->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } +static void +sp_feImage_href_modified(SPObject* old_elem, SPObject* new_elem, SPObject* obj) +{ + SPFeImage *feImage = SP_FEIMAGE(obj); + feImage->_image_modified_connection.disconnect(); + if (new_elem) { + feImage->SVGElem = SP_ITEM(new_elem); + feImage->_image_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), obj)); + } else { + feImage->SVGElem = 0; + } + + obj->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); +} + /** * Sets a specific value in the SPFeImage. */ @@ -140,32 +156,42 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value) { SPFeImage *feImage = SP_FEIMAGE(object); (void)feImage; - Inkscape::URI* SVGElem_uri; switch(key) { - /*DEAL WITH SETTING ATTRIBUTES HERE*/ - case SP_ATTR_XLINK_HREF: - if (feImage->href) g_free(feImage->href); - feImage->href = (value) ? g_strdup (value) : NULL; + /*DEAL WITH SETTING ATTRIBUTES HERE*/ + case SP_ATTR_XLINK_HREF: + if (feImage->href) { + g_free(feImage->href); + } + feImage->href = (value) ? g_strdup (value) : NULL; if (!feImage->href) return; + delete feImage->SVGElemRef; + feImage->SVGElemRef = 0; + feImage->SVGElem = 0; + feImage->_image_modified_connection.disconnect(); + feImage->_href_modified_connection.disconnect(); try{ - SVGElem_uri = new Inkscape::URI(feImage->href); + Inkscape::URI SVGElem_uri(feImage->href); feImage->SVGElemRef = new Inkscape::URIReference(feImage->document); + feImage->SVGElemRef->attach(SVGElem_uri); feImage->from_element = true; - feImage->SVGElemRef->attach(*SVGElem_uri); - feImage->SVGElem = SP_ITEM(feImage->SVGElemRef->getObject()); - - g_free(SVGElem_uri); - feImage->_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object)); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + feImage->_href_modified_connection = feImage->SVGElemRef->changedSignal().connect(sigc::bind(sigc::ptr_fun(&sp_feImage_href_modified), object)); + if (SPObject *elemref = feImage->SVGElemRef->getObject()) { + feImage->SVGElem = SP_ITEM(elemref); + feImage->_image_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object)); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + } else { + g_warning("SVG element URI was not found in the document while loading feImage"); + } } catch(const Inkscape::UnsupportedURIException & e) { feImage->from_element = false; - g_warning("caught Inkscape::UnsupportedURIException in sp_feImage_set"); + /* This occurs when using external image as the source */ + //g_warning("caught Inkscape::UnsupportedURIException in sp_feImage_set"); break; } - + break; case SP_ATTR_X: feImage->x.readOrUnset(value); @@ -215,14 +241,10 @@ sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags) static Inkscape::XML::Node * sp_feImage_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { - // Inkscape-only object, not copied during an "plain SVG" dump: - if (flags & SP_OBJECT_WRITE_EXT) { - if (repr) { - // is this sane? - //repr->mergeFrom(SP_OBJECT_REPR(object), "id"); - } else { - repr = SP_OBJECT_REPR(object)->duplicate(doc); - } + /* TODO: Don't just clone, but create a new repr node and write all + * relevant values into it */ + if (!repr) { + repr = SP_OBJECT_REPR(object)->duplicate(doc); } if (((SPObjectClass *) feImage_parent_class)->write) {