X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-filter.cpp;h=2b1b94b1fa9c32782fe0b978c2501cb3ea39be29;hb=724821145d62dee9f97465c706952582da6e432d;hp=c60ffb44f7c60cf30822804cfe52f294c45f841b;hpb=2a67507e7a675c7c516ab207418d3a5c7bfe5989;p=inkscape.git diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp index c60ffb44f..2b1b94b1f 100644 --- a/src/sp-filter.cpp +++ b/src/sp-filter.cpp @@ -6,8 +6,9 @@ /* * Authors: * Hugo Rodrigues + * Niko Kiirala * - * Copyright (C) 2006 Hugo Rodrigues + * Copyright (C) 2006,2007 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -16,6 +17,11 @@ # include "config.h" #endif +#include +#include +using std::map; +using std::pair; + #include "attributes.h" #include "document.h" #include "sp-filter.h" @@ -26,6 +32,7 @@ #define SP_MACROS_SILENT #include "macros.h" +#include "display/nr-filter.cpp" /* Filter base class */ @@ -36,9 +43,9 @@ static void sp_filter_build(SPObject *object, SPDocument *document, Inkscape::XM static void sp_filter_release(SPObject *object); static void sp_filter_set(SPObject *object, unsigned int key, gchar const *value); static void sp_filter_update(SPObject *object, SPCtx *ctx, guint flags); -static void sp_filter_child_added(SPObject *object, - Inkscape::XML::Node *child, - Inkscape::XML::Node *ref); +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); @@ -81,7 +88,7 @@ sp_filter_class_init(SPFilterClass *klass) sp_object_class->write = sp_filter_write; sp_object_class->set = sp_filter_set; sp_object_class->update = sp_filter_update; - sp_object_class->child_added = sp_filter_child_added; + sp_object_class->child_added = sp_filter_child_added; sp_object_class->remove_child = sp_filter_remove_child; } @@ -106,6 +113,9 @@ sp_filter_init(SPFilter *filter) filter->_primitives = new SPFilterPrimitive*[1]; filter->_primitives[0] = NULL; + filter->_renderer = NULL; + + filter->_image_name = map(); } /** @@ -269,7 +279,7 @@ sp_filter_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) SPFilter *filter = SP_FILTER(object); if (!repr) { - repr = SP_OBJECT_REPR(object)->duplicate(); + repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME } if ((flags & SP_OBJECT_WRITE_ALL) || filter->filterUnits_set) { @@ -422,6 +432,59 @@ sp_filter_remove_child(SPObject *object, Inkscape::XML::Node *child) */ } +void sp_filter_build_renderer(SPFilter *sp_filter, NR::Filter *nr_filter) +{ + g_assert(sp_filter != NULL); + g_assert(nr_filter != NULL); + + sp_filter->_renderer = nr_filter; + + nr_filter->set_x(sp_filter->x); + nr_filter->set_y(sp_filter->y); + nr_filter->set_width(sp_filter->width); + nr_filter->set_height(sp_filter->height); + + nr_filter->clear_primitives(); + for (int i = 0 ; i < sp_filter->_primitive_count ; i++) { + SPFilterPrimitive *primitive = sp_filter->_primitives[i]; + g_assert(primitive != NULL); + if (((SPFilterPrimitiveClass*) G_OBJECT_GET_CLASS(primitive))->build_renderer) { + ((SPFilterPrimitiveClass *) G_OBJECT_GET_CLASS(primitive))->build_renderer(primitive, nr_filter); + } else { + g_warning("Cannot build filter renderer: missing builder"); + } + } +} + +int sp_filter_primitive_count(SPFilter *filter) { + g_assert(filter != NULL); + return filter->_primitive_count; +} + +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); + free(name_copy); + if (result == filter->_image_name.end()) return -1; + else return (*result).second; +} + +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)); + if (ret.second == false) { + return (*ret.first).second; + } + return value; +} + +bool ltstr::operator()(const char* s1, const char* s2) const +{ + return strcmp(s1, s2) < 0; +} + /* Local Variables: