X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-gaussian-blur.cpp;h=e6eab5032264c454b762b7029d827e2c2bf4b719;hb=c573cf21fec48b8494843de05a2c980241579639;hp=0fcc6d77916328f4a52dbc759806a4f24d8dfb1d;hpb=7333a6d3d0e1b6b738726a859e5875d5d97b27d9;p=inkscape.git diff --git a/src/sp-gaussian-blur.cpp b/src/sp-gaussian-blur.cpp index 0fcc6d779..e6eab5032 100644 --- a/src/sp-gaussian-blur.cpp +++ b/src/sp-gaussian-blur.cpp @@ -6,9 +6,10 @@ */ /* * Authors: - * hugo Rodrigues + * Hugo Rodrigues + * Niko Kiirala * - * Copyright (C) 2006 Hugo Rodrigues + * Copyright (C) 2006,2007 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -22,6 +23,11 @@ #include "sp-gaussian-blur.h" #include "xml/repr.h" +#include "display/nr-filter.h" +#include "display/nr-filter-primitive.h" +#include "display/nr-filter-gaussian.h" +#include "display/nr-filter-types.h" + //#define SP_MACROS_SILENT //#include "macros.h" @@ -34,7 +40,8 @@ static void sp_gaussianBlur_build(SPObject *object, SPDocument *document, Inksca static void sp_gaussianBlur_release(SPObject *object); static void sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value); static void sp_gaussianBlur_update(SPObject *object, SPCtx *ctx, guint flags); -static Inkscape::XML::Node *sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static Inkscape::XML::Node *sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); +static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter); static SPFilterPrimitiveClass *gaussianBlur_parent_class; @@ -63,6 +70,7 @@ static void sp_gaussianBlur_class_init(SPGaussianBlurClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; + SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass; gaussianBlur_parent_class = (SPFilterPrimitiveClass *)g_type_class_peek_parent(klass); @@ -71,10 +79,12 @@ sp_gaussianBlur_class_init(SPGaussianBlurClass *klass) sp_object_class->write = sp_gaussianBlur_write; sp_object_class->set = sp_gaussianBlur_set; sp_object_class->update = sp_gaussianBlur_update; + + sp_primitive_class->build_renderer = sp_gaussianBlur_build_renderer; } static void -sp_gaussianBlur_init(SPGaussianBlur *gaussianBlur) +sp_gaussianBlur_init(SPGaussianBlur */*gaussianBlur*/) { } @@ -114,8 +124,9 @@ sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value) SPGaussianBlur *gaussianBlur = SP_GAUSSIANBLUR(object); switch(key) { - case SP_ATTR_STDDEVIATION: - gaussianBlur->stdDeviation.set(value); + case SP_ATTR_STDDEVIATION: + gaussianBlur->stdDeviation.set(value); + object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG); break; default: if (((SPObjectClass *) gaussianBlur_parent_class)->set) @@ -131,12 +142,8 @@ sp_gaussianBlur_set(SPObject *object, unsigned int key, gchar const *value) static void sp_gaussianBlur_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) { + sp_object_read_attr(object, "stdDeviation"); } if (((SPObjectClass *) gaussianBlur_parent_class)->update) { @@ -148,21 +155,16 @@ sp_gaussianBlur_update(SPObject *object, SPCtx *ctx, guint flags) * Writes its settings to an incoming repr object, if any. */ static Inkscape::XML::Node * -sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +sp_gaussianBlur_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"); - } else { - repr = SP_OBJECT_REPR(object)->duplicate(repr->document()); - } + /* TODO: Don't just clone, but create a new repr node and write all + * relevant values into it */ + if (!repr) { + repr = SP_OBJECT_REPR(object)->duplicate(doc); } if (((SPObjectClass *) gaussianBlur_parent_class)->write) { - ((SPObjectClass *) gaussianBlur_parent_class)->write(object, repr, flags); + ((SPObjectClass *) gaussianBlur_parent_class)->write(object, doc, repr, flags); } return repr; @@ -179,6 +181,24 @@ void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num, float optnum blur->stdDeviation.setOptNumber(optnum); } +static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter) { + SPGaussianBlur *sp_blur = SP_GAUSSIANBLUR(primitive); + + int handle = filter->add_primitive(Inkscape::Filters::NR_FILTER_GAUSSIANBLUR); + Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(handle); + Inkscape::Filters::FilterGaussian *nr_blur = dynamic_cast(nr_primitive); + + sp_filter_primitive_renderer_common(primitive, nr_primitive); + + gfloat num = sp_blur->stdDeviation.getNumber(); + if (num >= 0.0) { + gfloat optnum = sp_blur->stdDeviation.getOptNumber(); + if(optnum >= 0.0) + nr_blur->set_deviation((double) num, (double) optnum); + else + nr_blur->set_deviation((double) num); + } +} /* Local Variables: