X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-femerge.cpp;h=3cf5ea31225bf24a2a1126ed0f53dd7da9f6063a;hb=4f79c421fc7c86689cdb502c0651c2e0fc840750;hp=4436c7d1e8b849eee21fc50d346439cc8c2a3324;hpb=7333a6d3d0e1b6b738726a859e5875d5d97b27d9;p=inkscape.git diff --git a/src/sp-femerge.cpp b/src/sp-femerge.cpp index 4436c7d1e..3cf5ea312 100644 --- a/src/sp-femerge.cpp +++ b/src/sp-femerge.cpp @@ -19,9 +19,11 @@ #include "attributes.h" #include "svg/svg.h" -#include "sp-femerge.h" #include "xml/repr.h" +#include "sp-femerge.h" +#include "sp-femergenode.h" +#include "display/nr-filter-merge.h" /* FeMerge base class */ @@ -33,6 +35,7 @@ static void sp_feMerge_release(SPObject *object); static void sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value); static void sp_feMerge_update(SPObject *object, SPCtx *ctx, guint flags); static Inkscape::XML::Node *sp_feMerge_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static void sp_feMerge_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); static SPFilterPrimitiveClass *feMerge_parent_class; @@ -61,6 +64,7 @@ static void sp_feMerge_class_init(SPFeMergeClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass; feMerge_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); @@ -69,10 +73,12 @@ sp_feMerge_class_init(SPFeMergeClass *klass) sp_object_class->write = sp_feMerge_write; sp_object_class->set = sp_feMerge_set; sp_object_class->update = sp_feMerge_update; + + sp_primitive_class->build_renderer = sp_feMerge_build_renderer; } static void -sp_feMerge_init(SPFeMerge *feMerge) +sp_feMerge_init(SPFeMerge */*feMerge*/) { } @@ -126,11 +132,8 @@ sp_feMerge_set(SPObject *object, unsigned int key, gchar const *value) static void sp_feMerge_update(SPObject *object, SPCtx *ctx, guint flags) { - if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG | - SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) { - - /* do something to trigger redisplay, updates? */ - + if (flags & SP_OBJECT_MODIFIED_FLAG) { + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); } if (((SPObjectClass *) feMerge_parent_class)->update) { @@ -148,9 +151,9 @@ sp_feMerge_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) if (flags & SP_OBJECT_WRITE_EXT) { if (repr) { // is this sane? - repr->mergeFrom(SP_OBJECT_REPR(object), "id"); + //repr->mergeFrom(SP_OBJECT_REPR(object), "id"); } else { - repr = SP_OBJECT_REPR(object)->duplicate(repr->document()); + repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME } } @@ -161,6 +164,32 @@ sp_feMerge_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) return repr; } +static void sp_feMerge_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + g_assert(primitive != NULL); + g_assert(filter != NULL); + + SPFeMerge *sp_merge = SP_FEMERGE(primitive); + (void)sp_merge; + + int primitive_n = filter->add_primitive(NR::NR_FILTER_MERGE); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n); + NR::FilterMerge *nr_merge = dynamic_cast(nr_primitive); + g_assert(nr_merge != NULL); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + SPObject *input = primitive->children; + int in_nr = 0; + while (input) { + if (SP_IS_FEMERGENODE(input)) { + SPFeMergeNode *node = SP_FEMERGENODE(input); + nr_merge->set_input(in_nr, node->input); + in_nr++; + } + input = input->next; + } +} + /* Local Variables: