diff options
| author | Felipe Corr??a da Silva Sanches <juca@members.fsf.org> | 2007-07-26 08:02:07 +0000 |
|---|---|---|
| committer | jucablues <jucablues@users.sourceforge.net> | 2007-07-26 08:02:07 +0000 |
| commit | 2bfd492fe4020ac67daa342e8c0e715db42ae1f1 (patch) | |
| tree | 3339917f51456b04c7f047f153f42473056a10d2 /src/sp-feturbulence.cpp | |
| parent | Filter effects dialog: (diff) | |
| download | inkscape-2bfd492fe4020ac67daa342e8c0e715db42ae1f1.tar.gz inkscape-2bfd492fe4020ac67daa342e8c0e715db42ae1f1.zip | |
boiler plate code for feTurbulence:
*reading attributes and setting default values
same for some more attributes on convolve matrix filter
alphabetical ordering on Makefile_insert and on nr-filter.cpp #includes
(bzr r3305)
Diffstat (limited to 'src/sp-feturbulence.cpp')
| -rw-r--r-- | src/sp-feturbulence.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/sp-feturbulence.cpp b/src/sp-feturbulence.cpp index f1f99a613..138778984 100644 --- a/src/sp-feturbulence.cpp +++ b/src/sp-feturbulence.cpp @@ -6,8 +6,10 @@ */ /* * Authors: + * Felipe CorrĂȘa da Silva Sanches <felipe.sanches@gmail.com> * hugo Rodrigues <haa.rodrigues@gmail.com> * + * Copyright (C) 2007 Felipe Sanches * Copyright (C) 2006 Hugo Rodrigues * * Released under GNU GPL, read the file 'COPYING' for more information @@ -21,7 +23,10 @@ #include "svg/svg.h" #include "sp-feturbulence.h" #include "xml/repr.h" +#include <string.h> +#include "display/nr-filter.h" +#include "display/nr-filter-turbulence.h" /* FeTurbulence base class */ @@ -33,6 +38,7 @@ 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 void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter); static SPFilterPrimitiveClass *feTurbulence_parent_class; @@ -61,6 +67,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,6 +76,8 @@ 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 @@ -89,6 +98,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 +115,46 @@ sp_feTurbulence_release(SPObject *object) ((SPObjectClass *) feTurbulence_parent_class)->release(object); } +static double +sp_feTurbulence_read_number(gchar const *value) { + if (!value) return 0; + char *end; + double ret = g_ascii_strtod(value, &end); + if (*end) { + g_warning("Unable to convert \"%s\" to number", value); + // We could leave this out, too. If strtod can't convert + // anything, it will return zero. + ret = 0; + } + return ret; +} + +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 int sp_feTurbulence_read_type(gchar const *value){ + if (!value) return 1; // 'turbulence' is default + switch(value[0]){ + case 'f': + if (strncmp(value, "fractalNoise", 12) == 0) return 0; + break; + case 't': + if (strncmp(value, "turbulence", 10) == 0) return 1; + break; + } + return 1; // 'turbulence' is default +} + /** * Sets a specific value in the SPFeTurbulence. */ @@ -110,8 +164,48 @@ 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; + switch(key) { /*DEAL WITH SETTING ATTRIBUTES HERE*/ + + case SP_ATTR_BASEFREQUENCY: + feTurbulence->baseFrequency.set(value); + //From SVG spec: If two <number>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.getOptNumber() == -1) // -1 means "not set" + feTurbulence->baseFrequency.setOptNumber(feTurbulence->baseFrequency.getNumber()); + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; + case SP_ATTR_NUMOCTAVES: + read_int = (int) sp_feTurbulence_read_number(value); + if (read_int != feTurbulence->numOctaves){ + feTurbulence->numOctaves = read_int; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_SEED: + read_num = sp_feTurbulence_read_number(value); + if (read_num != feTurbulence->seed){ + feTurbulence->seed = read_num; + 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; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; + case SP_ATTR_TYPE: + read_int = sp_feTurbulence_read_type(value); + if (read_int != feTurbulence->type){ + feTurbulence->type = read_int; + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); + } + break; default: if (((SPObjectClass *) feTurbulence_parent_class)->set) ((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value); @@ -161,6 +255,26 @@ sp_feTurbulence_write(SPObject *object, Inkscape::XML::Node *repr, guint 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::FilterTurbulence*>(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); +} /* Local Variables: |
