diff options
| author | Felipe Corr??a da Silva Sanches <juca@members.fsf.org> | 2008-02-25 05:09:02 +0000 |
|---|---|---|
| committer | jucablues <jucablues@users.sourceforge.net> | 2008-02-25 05:09:02 +0000 |
| commit | b9b73b9df4d0d728b5f95b18b35eb998c97ee284 (patch) | |
| tree | 05cba866bbe8c5976b5cca5a11c2cd938e1feeb5 /src/sp-feimage.cpp | |
| parent | Whitespace cleanup (diff) | |
| download | inkscape-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.cpp | 34 |
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); |
