diff options
| author | Niko Kiirala <niko@kiirala.com> | 2009-05-17 21:43:43 +0000 |
|---|---|---|
| committer | kiirala <kiirala@users.sourceforge.net> | 2009-05-17 21:43:43 +0000 |
| commit | 1eef4b5f624c435a742924d68258bcf20d2915ad (patch) | |
| tree | f54ba225ea903958e16c3bbe37e1ae6902802747 /src/sp-filter.cpp | |
| parent | Fix bug 215906 (diff) | |
| download | inkscape-1eef4b5f624c435a742924d68258bcf20d2915ad.tar.gz inkscape-1eef4b5f624c435a742924d68258bcf20d2915ad.zip | |
Fixed several cases of bad SVG being written from filters
(bzr r7900)
Diffstat (limited to 'src/sp-filter.cpp')
| -rw-r--r-- | src/sp-filter.cpp | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp index db27e1826..7197c1ec9 100644 --- a/src/sp-filter.cpp +++ b/src/sp-filter.cpp @@ -284,9 +284,29 @@ static Inkscape::XML::Node * sp_filter_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { SPFilter *filter = SP_FILTER(object); - - if (!repr) { - repr = SP_OBJECT_REPR(object)->duplicate(doc); + SPObject *child; + Inkscape::XML::Node *crepr; + + /* Original from sp-item-group.cpp */ + if (flags & SP_OBJECT_WRITE_BUILD) { + GSList *l; + if (!repr) { + repr = doc->createElement("svg:filter"); + } + l = NULL; + for (child = sp_object_first_child(object); child != NULL; child = SP_OBJECT_NEXT(child) ) { + crepr = child->updateRepr(doc, NULL, flags); + if (crepr) l = g_slist_prepend (l, crepr); + } + while (l) { + repr->addChild((Inkscape::XML::Node *) l->data, NULL); + Inkscape::GC::release((Inkscape::XML::Node *) l->data); + l = g_slist_remove (l, l->data); + } + } else { + for (child = sp_object_first_child(object) ; child != NULL; child = SP_OBJECT_NEXT(child) ) { + child->updateRepr(flags); + } } if ((flags & SP_OBJECT_WRITE_ALL) || filter->filterUnits_set) { @@ -488,6 +508,42 @@ int sp_filter_set_image_name(SPFilter *filter, gchar const *name) { return value; } +gchar const *sp_filter_name_for_image(SPFilter const *filter, int const image) { + switch (image) { + case Inkscape::Filters::NR_FILTER_SOURCEGRAPHIC: + return "SourceGraphic"; + break; + case Inkscape::Filters::NR_FILTER_SOURCEALPHA: + return "SourceAlpha"; + break; + case Inkscape::Filters::NR_FILTER_BACKGROUNDIMAGE: + return "BackgroundImage"; + break; + case Inkscape::Filters::NR_FILTER_BACKGROUNDALPHA: + return "BackgroundAlpha"; + break; + case Inkscape::Filters::NR_FILTER_STROKEPAINT: + return "StrokePaint"; + break; + case Inkscape::Filters::NR_FILTER_FILLPAINT: + return "FillPaint"; + break; + case Inkscape::Filters::NR_FILTER_SLOT_NOT_SET: + case Inkscape::Filters::NR_FILTER_UNNAMED_SLOT: + return 0; + break; + default: + for (map<gchar *, int, ltstr>::const_iterator i + = filter->_image_name->begin() ; + i != filter->_image_name->end() ; i++) { + if (i->second == image) { + return i->first; + } + } + } + return 0; +} + Glib::ustring sp_filter_get_new_result_name(SPFilter *filter) { g_assert(filter != NULL); int largest = 0; |
