summaryrefslogtreecommitdiffstats
path: root/src/filters
diff options
context:
space:
mode:
authorNiko Kiirala <niko@kiirala.com>2009-05-16 22:40:13 +0000
committerkiirala <kiirala@users.sourceforge.net>2009-05-16 22:40:13 +0000
commitc5f36060b9385d4832e387657859e2e39930b17c (patch)
treee10bc95a4a43f2791449833d61fdf31b3c58dfc6 /src/filters
parentFixed dangling pointers and possible memory leaks with feImage (diff)
downloadinkscape-c5f36060b9385d4832e387657859e2e39930b17c.tar.gz
inkscape-c5f36060b9385d4832e387657859e2e39930b17c.zip
Fixed crashes in feImage when modifying source, one caused by previous fix
(bzr r7890)
Diffstat (limited to 'src/filters')
-rw-r--r--src/filters/image.cpp35
-rw-r--r--src/filters/image.h3
2 files changed, 30 insertions, 8 deletions
diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index a23ffeee4..1c92b772a 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.
*/
@@ -148,16 +164,20 @@ 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{
Inkscape::URI SVGElem_uri(feImage->href);
- delete feImage->SVGElemRef;
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 {
@@ -167,10 +187,11 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
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);
diff --git a/src/filters/image.h b/src/filters/image.h
index 8952aee6c..7207918e1 100644
--- a/src/filters/image.h
+++ b/src/filters/image.h
@@ -31,7 +31,8 @@ struct SPFeImage : public SPFilterPrimitive {
bool from_element;
SPItem* SVGElem;
Inkscape::URIReference* SVGElemRef;
- sigc::connection _modified_connection;
+ sigc::connection _image_modified_connection;
+ sigc::connection _href_modified_connection;
};
struct SPFeImageClass {