summaryrefslogtreecommitdiffstats
path: root/src/sp-feimage.cpp
diff options
context:
space:
mode:
authorFelipe Corr??a da Silva Sanches <juca@members.fsf.org>2008-02-25 05:09:02 +0000
committerjucablues <jucablues@users.sourceforge.net>2008-02-25 05:09:02 +0000
commitb9b73b9df4d0d728b5f95b18b35eb998c97ee284 (patch)
tree05cba866bbe8c5976b5cca5a11c2cd938e1feeb5 /src/sp-feimage.cpp
parentWhitespace cleanup (diff)
downloadinkscape-b9b73b9df4d0d728b5f95b18b35eb998c97ee284.tar.gz
inkscape-b9b73b9df4d0d728b5f95b18b35eb998c97ee284.zip
svg element referenced by id part of feImage filter rendering.
This commit introduces some known bugs. I will fill a bug report about it, so that we don't forget it. Nominally they are: * seems to leak memory. I haven't found out how. Needs review. * it works when you create and use the filter, but it crashes when trying to open a file that already contains a filter using feImage referencing an svgelement. (bzr r4844)
Diffstat (limited to 'src/sp-feimage.cpp')
-rw-r--r--src/sp-feimage.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/sp-feimage.cpp b/src/sp-feimage.cpp
index 271baa591..d72435f2c 100644
--- a/src/sp-feimage.cpp
+++ b/src/sp-feimage.cpp
@@ -18,7 +18,8 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-
+#include "uri.h"
+#include "uri-references.h"
#include "attributes.h"
#include "svg/svg.h"
#include "sp-feimage.h"
@@ -130,14 +131,36 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
{
SPFeImage *feImage = SP_FEIMAGE(object);
(void)feImage;
-
+ Inkscape::URI* SVGElem_uri;
+ Inkscape::URIReference* SVGElemRef;
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;
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);
- break;
+ if (!feImage->href) return;
+ try{
+ SVGElem_uri = new Inkscape::URI(feImage->href);
+ SVGElemRef = new Inkscape::URIReference(feImage->document);
+ feImage->from_element = true;
+ SVGElemRef->attach(*SVGElem_uri);
+ feImage->SVGElem = SP_ITEM(SVGElemRef->getObject());
+
+ g_free(SVGElem_uri);
+ g_free(SVGElemRef);
+ //TODO: maybe keeping SVGElemRef we can observe changes to the
+ // referenced object and trigger updates of the filtered object
+ object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ break;
+ }
+ catch(const Inkscape::UnsupportedURIException & e)
+ {
+ feImage->from_element = false;
+ g_warning("caught Inkscape::UnsupportedURIException in sp_feImage_set");
+ break;
+ }
+
+
case SP_ATTR_X:
feImage->x.readOrUnset(value);
object->requestModified(SP_OBJECT_MODIFIED_FLAG);
@@ -215,6 +238,9 @@ static void sp_feImage_build_renderer(SPFilterPrimitive *primitive, NR::Filter *
g_assert(nr_image != NULL);
sp_filter_primitive_renderer_common(primitive, nr_primitive);
+
+ nr_image->from_element = sp_image->from_element;
+ nr_image->SVGElem = sp_image->SVGElem;
nr_image->set_region(sp_image->x, sp_image->y, sp_image->width, sp_image->height);
nr_image->set_href(sp_image->href);
nr_image->set_document(sp_image->document);