X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-fedisplacementmap.cpp;h=b53238093f91e216c49977d733a716f90f086cd3;hb=f2c65c84b2e5016ef16907bf15d51ded9c25411e;hp=138ae6e0ed5452a990af4ed539e95ad9befc55a6;hpb=7333a6d3d0e1b6b738726a859e5875d5d97b27d9;p=inkscape.git diff --git a/src/sp-fedisplacementmap.cpp b/src/sp-fedisplacementmap.cpp index 138ae6e0e..b53238093 100644 --- a/src/sp-fedisplacementmap.cpp +++ b/src/sp-fedisplacementmap.cpp @@ -21,7 +21,8 @@ #include "svg/svg.h" #include "sp-fedisplacementmap.h" #include "xml/repr.h" - +#include "display/nr-filter-displacement-map.h" +#include "helper-fns.h" /* FeDisplacementMap base class */ @@ -32,6 +33,7 @@ static void sp_feDisplacementMap_build(SPObject *object, SPDocument *document, I static void sp_feDisplacementMap_release(SPObject *object); static void sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value); static void sp_feDisplacementMap_update(SPObject *object, SPCtx *ctx, guint flags); +static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); static Inkscape::XML::Node *sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); static SPFilterPrimitiveClass *feDisplacementMap_parent_class; @@ -61,6 +63,7 @@ static void sp_feDisplacementMap_class_init(SPFeDisplacementMapClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass; feDisplacementMap_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); @@ -69,11 +72,16 @@ sp_feDisplacementMap_class_init(SPFeDisplacementMapClass *klass) sp_object_class->write = sp_feDisplacementMap_write; sp_object_class->set = sp_feDisplacementMap_set; sp_object_class->update = sp_feDisplacementMap_update; + sp_primitive_class->build_renderer = sp_feDisplacementMap_build_renderer; } static void sp_feDisplacementMap_init(SPFeDisplacementMap *feDisplacementMap) { + feDisplacementMap->scale=0; + feDisplacementMap->xChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA; + feDisplacementMap->yChannelSelector = DISPLACEMENTMAP_CHANNEL_ALPHA; + feDisplacementMap->in2 = NR::NR_FILTER_SLOT_NOT_SET; } /** @@ -89,6 +97,10 @@ sp_feDisplacementMap_build(SPObject *object, SPDocument *document, Inkscape::XML } /*LOAD ATTRIBUTES FROM REPR HERE*/ + sp_object_read_attr(object, "scale"); + sp_object_read_attr(object, "in2"); + sp_object_read_attr(object, "xChannelSelector"); + sp_object_read_attr(object, "yChannelSelector"); } /** @@ -101,6 +113,30 @@ sp_feDisplacementMap_release(SPObject *object) ((SPObjectClass *) feDisplacementMap_parent_class)->release(object); } +static FilterDisplacementMapChannelSelector sp_feDisplacementMap_readChannelSelector(gchar const *value) +{ + if (!value) return DISPLACEMENTMAP_CHANNEL_ALPHA; + switch (value[0]) { + case 'R': + return DISPLACEMENTMAP_CHANNEL_RED; + break; + case 'G': + return DISPLACEMENTMAP_CHANNEL_GREEN; + break; + case 'B': + return DISPLACEMENTMAP_CHANNEL_BLUE; + break; + case 'A': + return DISPLACEMENTMAP_CHANNEL_ALPHA; + break; + default: + // error + g_warning("Invalid attribute for Channel Selector. Valid modes are 'R', 'G', 'B' or 'A'"); + break; + } + return DISPLACEMENTMAP_CHANNEL_ALPHA; //default is Alpha Channel +} + /** * Sets a specific value in the SPFeDisplacementMap. */ @@ -109,9 +145,39 @@ sp_feDisplacementMap_set(SPObject *object, unsigned int key, gchar const *value) { SPFeDisplacementMap *feDisplacementMap = SP_FEDISPLACEMENTMAP(object); (void)feDisplacementMap; - + int input; + double read_num; + FilterDisplacementMapChannelSelector read_selector; switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ + case SP_ATTR_XCHANNELSELECTOR: + read_selector = sp_feDisplacementMap_readChannelSelector(value); + if (read_selector != feDisplacementMap->xChannelSelector){ + feDisplacementMap->xChannelSelector = read_selector; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_YCHANNELSELECTOR: + read_selector = sp_feDisplacementMap_readChannelSelector(value); + if (read_selector != feDisplacementMap->yChannelSelector){ + feDisplacementMap->yChannelSelector = read_selector; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_SCALE: + read_num = helperfns_read_number(value); + if (read_num != feDisplacementMap->scale) { + feDisplacementMap->scale = read_num; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_IN2: + input = sp_filter_primitive_read_in(feDisplacementMap, value); + if (input != feDisplacementMap->in2) { + feDisplacementMap->in2 = input; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; default: if (((SPObjectClass *) feDisplacementMap_parent_class)->set) ((SPObjectClass *) feDisplacementMap_parent_class)->set(object, key, value); @@ -148,9 +214,9 @@ sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Node *repr, guint fl 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 +227,25 @@ sp_feDisplacementMap_write(SPObject *object, Inkscape::XML::Node *repr, guint fl return repr; } +static void sp_feDisplacementMap_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + g_assert(primitive != NULL); + g_assert(filter != NULL); + + SPFeDisplacementMap *sp_displacement_map = SP_FEDISPLACEMENTMAP(primitive); + + int primitive_n = filter->add_primitive(NR::NR_FILTER_DISPLACEMENTMAP); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n); + NR::FilterDisplacementMap *nr_displacement_map = dynamic_cast(nr_primitive); + g_assert(nr_displacement_map != NULL); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + nr_displacement_map->set_input(1, sp_displacement_map->in2); + nr_displacement_map->set_scale(sp_displacement_map->scale); + nr_displacement_map->set_channel_selector(0, sp_displacement_map->xChannelSelector); + nr_displacement_map->set_channel_selector(1, sp_displacement_map->yChannelSelector); +} + /* Local Variables: