Code

Warning cleanup
[inkscape.git] / src / filters / image.cpp
index f4764577a9f6ee9a066177bc24f33b0610e4cecb..eb6dfc22a906aed44076d2a96c264437b613d959 100644 (file)
@@ -6,7 +6,7 @@
  */
 /*
  * Authors:
- *   Felipe CorrĂȘa da Silva Sanches <felipe.sanches@gmail.com>
+ *   Felipe CorrĂȘa da Silva Sanches <juca@members.fsf.org>
  *   hugo Rodrigues <haa.rodrigues@gmail.com>
  *
  * Copyright (C) 2007 Felipe Sanches
@@ -43,8 +43,7 @@ static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, Inkscape::Fi
 
 static SPFilterPrimitiveClass *feImage_parent_class;
 
-GType
-sp_feImage_get_type()
+GType sp_feImage_get_type()
 {
     static GType feImage_type = 0;
 
@@ -64,8 +63,7 @@ sp_feImage_get_type()
     return feImage_type;
 }
 
-static void
-sp_feImage_class_init(SPFeImageClass *klass)
+static void sp_feImage_class_init(SPFeImageClass *klass)
 {
     SPObjectClass *sp_object_class = (SPObjectClass *)klass;
     SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass;
@@ -81,8 +79,7 @@ sp_feImage_class_init(SPFeImageClass *klass)
     sp_primitive_class->build_renderer = sp_feImage_build_renderer;
 }
 
-static void
-sp_feImage_init(SPFeImage */*feImage*/)
+static void sp_feImage_init(SPFeImage */*feImage*/)
 {
 }
 
@@ -91,8 +88,7 @@ sp_feImage_init(SPFeImage */*feImage*/)
  * our name must be associated with a repr via "sp_object_type_register".  Best done through
  * sp-object-repr.cpp's repr_name_entries array.
  */
-static void
-sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
+static void sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
 {
     // Save document reference so we can load images with relative paths.
     SPFeImage *feImage = SP_FEIMAGE(object);
@@ -115,57 +111,80 @@ sp_feImage_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re
 /**
  * Drops any allocated memory.
  */
-static void
-sp_feImage_release(SPObject *object)
+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)
         ((SPObjectClass *) feImage_parent_class)->release(object);
 }
 
-static void
-sp_feImage_elem_modified(SPObject* /*href*/, guint /*flags*/, SPObject* obj)
+static void 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.
  */
-static void
-sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
+static void 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)
+            // catches either MalformedURIException or UnsupportedURIException
+            catch(const Inkscape::BadURIException & 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::BadURIException in sp_feImage_set");
                 break;
             }
-
+            break;
 
         case SP_ATTR_X:
             feImage->x.readOrUnset(value);
@@ -194,8 +213,7 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
 /**
  * Receives update notifications.
  */
-static void
-sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags)
+static void sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags)
 {
 
     if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
@@ -212,17 +230,12 @@ sp_feImage_update(SPObject *object, SPCtx *ctx, guint flags)
 /**
  * Writes its settings to an incoming repr object, if any.
  */
-static Inkscape::XML::Node *
-sp_feImage_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, 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) {