diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index 32afe5db66fecf106d3f4797d4fd67bd5e1e384b..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.
*/
{
SPFeImage *feImage = SP_FEIMAGE(object);
(void)feImage;
- Inkscape::URI *SVGElem_uri = NULL;
switch(key) {
/*DEAL WITH SETTING ATTRIBUTES HERE*/
case SP_ATTR_XLINK_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());
-
- 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);
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) {