X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-filter.cpp;h=e075087d3af3d6bd84899348e6181678e8ea90aa;hb=b632ab726ddcf5acea122f867fef25decfb6dbe9;hp=c74a9ffdb974da0dca92348bb7c4f8dbe5c6761d;hpb=66632b492f9cd54e5667fd4e1fca8e457f59b282;p=inkscape.git diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp index c74a9ffdb..e075087d3 100644 --- a/src/sp-filter.cpp +++ b/src/sp-filter.cpp @@ -22,6 +22,8 @@ using std::map; using std::pair; +#include + #include "attributes.h" #include "document.h" #include "sp-filter.h" @@ -34,7 +36,7 @@ using std::pair; #define SP_MACROS_SILENT #include "macros.h" -#include "display/nr-filter.cpp" +#include "display/nr-filter.h" /* Filter base class */ @@ -49,7 +51,7 @@ static void sp_filter_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); static void sp_filter_remove_child(SPObject *object, Inkscape::XML::Node *child); -static Inkscape::XML::Node *sp_filter_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static Inkscape::XML::Node *sp_filter_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); static void filter_ref_changed(SPObject *old_ref, SPObject *ref, SPFilter *filter); static void filter_ref_modified(SPObject *href, guint flags, SPFilter *filter); @@ -112,7 +114,9 @@ sp_filter_init(SPFilter *filter) filter->_renderer = NULL; - filter->_image_name = map(); + filter->_image_name = new std::map; + filter->_image_name->clear(); + filter->_image_number_next = 0; filter->filterRes = NumberOptNumber(); @@ -169,6 +173,7 @@ sp_filter_release(SPObject *object) } filter->modified_connection.~connection(); + delete filter->_image_name; if (((SPObjectClass *) filter_parent_class)->release) ((SPObjectClass *) filter_parent_class)->release(object); @@ -276,12 +281,12 @@ sp_filter_update(SPObject *object, SPCtx *ctx, guint flags) * Writes its settings to an incoming repr object, if any. */ static Inkscape::XML::Node * -sp_filter_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +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(NULL); // FIXME + repr = SP_OBJECT_REPR(object)->duplicate(doc); } if ((flags & SP_OBJECT_WRITE_ALL) || filter->filterUnits_set) { @@ -345,7 +350,7 @@ sp_filter_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) } if (((SPObjectClass *) filter_parent_class)->write) { - ((SPObjectClass *) filter_parent_class)->write(object, repr, flags); + ((SPObjectClass *) filter_parent_class)->write(object, doc, repr, flags); } return repr; @@ -456,9 +461,9 @@ int sp_filter_primitive_count(SPFilter *filter) { int sp_filter_get_image_name(SPFilter *filter, gchar const *name) { gchar *name_copy = strdup(name); - map::iterator result = filter->_image_name.find(name_copy); + map::iterator result = filter->_image_name->find(name_copy); free(name_copy); - if (result == filter->_image_name.end()) return -1; + if (result == filter->_image_name->end()) return -1; else return (*result).second; } @@ -466,13 +471,36 @@ int sp_filter_set_image_name(SPFilter *filter, gchar const *name) { int value = filter->_image_number_next; filter->_image_number_next++; gchar *name_copy = strdup(name); - pair::iterator,bool> ret = filter->_image_name.insert(pair(name_copy, value)); + pair new_pair(name_copy, value); + pair::iterator,bool> ret = filter->_image_name->insert(new_pair); if (ret.second == false) { return (*ret.first).second; } return value; } +Glib::ustring sp_filter_get_new_result_name(SPFilter *filter) { + g_assert(filter != NULL); + int largest = 0; + + SPObject *primitive_obj = filter->children; + while (primitive_obj) { + if (SP_IS_FILTER_PRIMITIVE(primitive_obj)) { + Inkscape::XML::Node *repr = SP_OBJECT_REPR(primitive_obj); + char const *result = repr->attribute("result"); + int index; + if (result && sscanf(result, "result%d", &index) == 1) { + if (index > largest) { + largest = index; + } + } + } + primitive_obj = primitive_obj->next; + } + + return "result" + Glib::Ascii::dtostr(largest + 1); +} + bool ltstr::operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0;