X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-gaussian-blur.cpp;h=94efc5727d447e0709390e31e8dcb7cfb1b906ea;hb=ae5f81d1dccb2f382e3a548b95c1220485c667ec;hp=63680a10bf5ad238cd9fab01de0b38e6e1c26a99;hpb=adede4a068292ac19e27e02785e25fbe89577543;p=inkscape.git diff --git a/src/sp-gaussian-blur.cpp b/src/sp-gaussian-blur.cpp index 63680a10b..94efc5727 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, NR::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,7 +155,7 @@ 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: @@ -157,12 +164,12 @@ sp_gaussianBlur_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) // is this sane? // repr->mergeFrom(SP_OBJECT_REPR(object), "id"); } else { - repr = SP_OBJECT_REPR(object)->duplicate(); + repr = SP_OBJECT_REPR(object)->duplicate(doc); // FIXME } } 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 +186,24 @@ void sp_gaussianBlur_setDeviation(SPGaussianBlur *blur, float num, float optnum blur->stdDeviation.setOptNumber(optnum); } +static void sp_gaussianBlur_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) { + SPGaussianBlur *sp_blur = SP_GAUSSIANBLUR(primitive); + + int handle = filter->add_primitive(NR::NR_FILTER_GAUSSIANBLUR); + NR::FilterPrimitive *nr_primitive = filter->get_primitive(handle); + NR::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: