X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsp-feturbulence.cpp;h=fcaf6c56f3937ad46a59857cf8ea8ca5bcdf7525;hb=80d34fe4a953d704430b44c6201a4fcbf455dfc6;hp=ab46433d12a093dfc40171db9ca8e059688d6d7c;hpb=7333a6d3d0e1b6b738726a859e5875d5d97b27d9;p=inkscape.git diff --git a/src/sp-feturbulence.cpp b/src/sp-feturbulence.cpp index ab46433d1..fcaf6c56f 100644 --- a/src/sp-feturbulence.cpp +++ b/src/sp-feturbulence.cpp @@ -6,8 +6,10 @@ */ /* * Authors: + * Felipe Corrêa da Silva Sanches * hugo Rodrigues * + * Copyright (C) 2007 Felipe Sanches * Copyright (C) 2006 Hugo Rodrigues * * Released under GNU GPL, read the file 'COPYING' for more information @@ -20,8 +22,12 @@ #include "attributes.h" #include "svg/svg.h" #include "sp-feturbulence.h" +#include "helper-fns.h" #include "xml/repr.h" +#include +#include "display/nr-filter.h" +#include "display/nr-filter-turbulence.h" /* FeTurbulence base class */ @@ -32,7 +38,8 @@ static void sp_feTurbulence_build(SPObject *object, SPDocument *document, Inksca static void sp_feTurbulence_release(SPObject *object); static void sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value); static void sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags); -static Inkscape::XML::Node *sp_feTurbulence_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static Inkscape::XML::Node *sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); +static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); static SPFilterPrimitiveClass *feTurbulence_parent_class; @@ -61,6 +68,7 @@ static void sp_feTurbulence_class_init(SPFeTurbulenceClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass; feTurbulence_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); @@ -69,11 +77,14 @@ sp_feTurbulence_class_init(SPFeTurbulenceClass *klass) sp_object_class->write = sp_feTurbulence_write; sp_object_class->set = sp_feTurbulence_set; sp_object_class->update = sp_feTurbulence_update; + + sp_primitive_class->build_renderer = sp_feTurbulence_build_renderer; } static void sp_feTurbulence_init(SPFeTurbulence *feTurbulence) { + feTurbulence->updated=false; } /** @@ -89,6 +100,11 @@ sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Nod } /*LOAD ATTRIBUTES FROM REPR HERE*/ + sp_object_read_attr(object, "baseFrequency"); + sp_object_read_attr(object, "numOctaves"); + sp_object_read_attr(object, "seed"); + sp_object_read_attr(object, "stitchTiles"); + sp_object_read_attr(object, "type"); } /** @@ -101,6 +117,32 @@ sp_feTurbulence_release(SPObject *object) ((SPObjectClass *) feTurbulence_parent_class)->release(object); } +static bool sp_feTurbulence_read_stitchTiles(gchar const *value){ + if (!value) return false; // 'noStitch' is default + switch(value[0]){ + case 's': + if (strncmp(value, "stitch", 6) == 0) return true; + break; + case 'n': + if (strncmp(value, "noStitch", 8) == 0) return false; + break; + } + return false; // 'noStitch' is default +} + +static NR::FilterTurbulenceType sp_feTurbulence_read_type(gchar const *value){ + if (!value) return NR::TURBULENCE_TURBULENCE; // 'turbulence' is default + switch(value[0]){ + case 'f': + if (strncmp(value, "fractalNoise", 12) == 0) return NR::TURBULENCE_FRACTALNOISE; + break; + case 't': + if (strncmp(value, "turbulence", 10) == 0) return NR::TURBULENCE_TURBULENCE; + break; + } + return NR::TURBULENCE_TURBULENCE; // 'turbulence' is default +} + /** * Sets a specific value in the SPFeTurbulence. */ @@ -110,8 +152,54 @@ sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value) SPFeTurbulence *feTurbulence = SP_FETURBULENCE(object); (void)feTurbulence; + int read_int; + double read_num; + bool read_bool; + NR::FilterTurbulenceType read_type; + switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ + + case SP_ATTR_BASEFREQUENCY: + feTurbulence->baseFrequency.set(value); + //From SVG spec: If two s are provided, the first number represents a base frequency in the X direction and the second value represents a base frequency in the Y direction. If one number is provided, then that value is used for both X and Y. + if (feTurbulence->baseFrequency.optNumIsSet() == false) + feTurbulence->baseFrequency.setOptNumber(feTurbulence->baseFrequency.getNumber()); + feTurbulence->updated = false; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_NUMOCTAVES: + read_int = (int) helperfns_read_number(value); + if (read_int != feTurbulence->numOctaves){ + feTurbulence->numOctaves = read_int; + feTurbulence->updated = false; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_SEED: + read_num = helperfns_read_number(value); + if (read_num != feTurbulence->seed){ + feTurbulence->seed = read_num; + feTurbulence->updated = false; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_STITCHTILES: + read_bool = sp_feTurbulence_read_stitchTiles(value); + if (read_bool != feTurbulence->stitchTiles){ + feTurbulence->stitchTiles = read_bool; + feTurbulence->updated = false; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_TYPE: + read_type = sp_feTurbulence_read_type(value); + if (read_type != feTurbulence->type){ + feTurbulence->type = read_type; + feTurbulence->updated = false; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; default: if (((SPObjectClass *) feTurbulence_parent_class)->set) ((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value); @@ -142,25 +230,46 @@ sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags) * Writes its settings to an incoming repr object, if any. */ static Inkscape::XML::Node * -sp_feTurbulence_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { // Inkscape-only object, not copied during an "plain SVG" dump: 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(doc); } } if (((SPObjectClass *) feTurbulence_parent_class)->write) { - ((SPObjectClass *) feTurbulence_parent_class)->write(object, repr, flags); + ((SPObjectClass *) feTurbulence_parent_class)->write(object, doc, repr, flags); } return repr; } +static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + g_assert(primitive != NULL); + g_assert(filter != NULL); + + SPFeTurbulence *sp_turbulence = SP_FETURBULENCE(primitive); + + int primitive_n = filter->add_primitive(NR::NR_FILTER_TURBULENCE); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n); + NR::FilterTurbulence *nr_turbulence = dynamic_cast(nr_primitive); + g_assert(nr_turbulence != NULL); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + nr_turbulence->set_baseFrequency(0, sp_turbulence->baseFrequency.getNumber()); + nr_turbulence->set_baseFrequency(1, sp_turbulence->baseFrequency.getOptNumber()); + nr_turbulence->set_numOctaves(sp_turbulence->numOctaves); + nr_turbulence->set_seed(sp_turbulence->seed); + nr_turbulence->set_stitchTiles(sp_turbulence->stitchTiles); + nr_turbulence->set_type(sp_turbulence->type); + nr_turbulence->set_updated(sp_turbulence->updated); +} /* Local Variables: