X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-femorphology.cpp;h=22c6de038e48b0a1442060792fd6f941aa9b2d41;hb=e750fb8e7d6b8896903a14f2f45c54177f02bd2e;hp=78b7bbaf4acc934000cc294002b2fbd57207af08;hpb=1ed1764f573921b7f9d210a3fcca322234c36480;p=inkscape.git diff --git a/src/sp-femorphology.cpp b/src/sp-femorphology.cpp index 78b7bbaf4..22c6de038 100644 --- a/src/sp-femorphology.cpp +++ b/src/sp-femorphology.cpp @@ -6,7 +6,8 @@ */ /* * Authors: - * hugo Rodrigues + * Felipe Sanches + * Hugo Rodrigues * * Copyright (C) 2006 Hugo Rodrigues * @@ -21,7 +22,7 @@ #include "svg/svg.h" #include "sp-femorphology.h" #include "xml/repr.h" - +#include "display/nr-filter-morphology.h" /* FeMorphology base class */ @@ -33,6 +34,7 @@ static void sp_feMorphology_release(SPObject *object); static void sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value); static void sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags); static Inkscape::XML::Node *sp_feMorphology_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); static SPFilterPrimitiveClass *feMorphology_parent_class; @@ -61,7 +63,8 @@ static void sp_feMorphology_class_init(SPFeMorphologyClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; - + SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass; + feMorphology_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); sp_object_class->build = sp_feMorphology_build; @@ -69,11 +72,14 @@ sp_feMorphology_class_init(SPFeMorphologyClass *klass) sp_object_class->write = sp_feMorphology_write; sp_object_class->set = sp_feMorphology_set; sp_object_class->update = sp_feMorphology_update; + sp_primitive_class->build_renderer = sp_feMorphology_build_renderer; } static void sp_feMorphology_init(SPFeMorphology *feMorphology) { + //Setting default values: + feMorphology->radius.set("0"); } /** @@ -89,6 +95,8 @@ sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod } /*LOAD ATTRIBUTES FROM REPR HERE*/ + sp_object_read_attr(object, "operator"); + sp_object_read_attr(object, "radius"); } /** @@ -101,6 +109,19 @@ sp_feMorphology_release(SPObject *object) ((SPObjectClass *) feMorphology_parent_class)->release(object); } +static NR::FilterMorphologyOperator sp_feMorphology_read_operator(gchar const *value){ + if (!value) return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default + switch(value[0]){ + case 'e': + if (strncmp(value, "erode", 5) == 0) return NR::MORPHOLOGY_OPERATOR_ERODE; + break; + case 'd': + if (strncmp(value, "dilate", 6) == 0) return NR::MORPHOLOGY_OPERATOR_DILATE; + break; + } + return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default +} + /** * Sets a specific value in the SPFeMorphology. */ @@ -109,9 +130,24 @@ sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value) { SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object); (void)feMorphology; - + + NR::FilterMorphologyOperator read_operator; switch(key) { - /*DEAL WITH SETTING ATTRIBUTES HERE*/ + /*DEAL WITH SETTING ATTRIBUTES HERE*/ + case SP_ATTR_OPERATOR: + read_operator = sp_feMorphology_read_operator(value); + if (read_operator != feMorphology->Operator){ + feMorphology->Operator = read_operator; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_RADIUS: + feMorphology->radius.set(value); + //From SVG spec: If is not provided, it defaults to . + if (feMorphology->radius.optNumIsSet() == false) + feMorphology->radius.setOptNumber(feMorphology->radius.getNumber()); + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; default: if (((SPObjectClass *) feMorphology_parent_class)->set) ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value); @@ -161,6 +197,23 @@ sp_feMorphology_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) return repr; } +static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + g_assert(primitive != NULL); + g_assert(filter != NULL); + + SPFeMorphology *sp_morphology = SP_FEMORPHOLOGY(primitive); + + int primitive_n = filter->add_primitive(NR::NR_FILTER_MORPHOLOGY); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n); + NR::FilterMorphology *nr_morphology = dynamic_cast(nr_primitive); + g_assert(nr_morphology != NULL); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + nr_morphology->set_operator(sp_morphology->Operator); + nr_morphology->set_xradius( (int)sp_morphology->radius.getNumber() ); + nr_morphology->set_yradius( (int)sp_morphology->radius.getOptNumber() ); +} /* Local Variables: