diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index eda815d8d881f3d785e6ec72b05757dd54180e13..0002ef94c74a36b336aa2e40350a2027e5266fd3 100644 (file)
--- a/src/filters/image.cpp
+++ b/src/filters/image.cpp
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)
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.
*/
}
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{
Inkscape::URI SVGElem_uri(feImage->href);
feImage->SVGElemRef = new Inkscape::URIReference(feImage->document);
- feImage->from_element = true;
feImage->SVGElemRef->attach(SVGElem_uri);
+ feImage->from_element = true;
+ 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->_modified_connection = ((SPObject*) feImage->SVGElem)->connectModified(sigc::bind(sigc::ptr_fun(&sp_feImage_elem_modified), object));
+ 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 {
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);
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) {