Code

Added test script I thought was already added.
[inkscape.git] / src / filters / image.cpp
index 32afe5db66fecf106d3f4797d4fd67bd5e1e384b..0002ef94c74a36b336aa2e40350a2027e5266fd3 100644 (file)
@@ -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,7 +156,6 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
 {
     SPFeImage *feImage = SP_FEIMAGE(object);
     (void)feImage;
-    Inkscape::URI *SVGElem_uri = NULL;
     switch(key) {
     /*DEAL WITH SETTING ATTRIBUTES HERE*/
         case SP_ATTR_XLINK_HREF:
@@ -149,25 +164,34 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
             }
             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());
-
-                delete 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);
@@ -217,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) {