From 761462bc771e916bc71dd9b116c9227b495fe7a9 Mon Sep 17 00:00:00 2001 From: Hugo Rodrigues Date: Sun, 20 Aug 2006 12:13:40 +0000 Subject: Object groups can be blurred. Blur slider updates when selection changes. Comments added/fixed. (bzr r1622) --- src/display/nr-arena-group.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- src/display/nr-arena-shape.cpp | 10 +++++++--- src/display/nr-filter.cpp | 3 ++- 3 files changed, 47 insertions(+), 6 deletions(-) (limited to 'src/display') diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp index b4cc3930b..8df045332 100644 --- a/src/display/nr-arena-group.cpp +++ b/src/display/nr-arena-group.cpp @@ -14,7 +14,11 @@ #include "display/nr-arena-group.h" #include "display/nr-filter.h" +#include "display/nr-filter-gaussian.h" +#include "display/nr-filter-types.h" #include "style.h" +#include "sp-filter.h" +#include "sp-gaussian-blur.h" static void nr_arena_group_class_init (NRArenaGroupClass *klass); static void nr_arena_group_init (NRArenaGroup *group); @@ -193,9 +197,41 @@ void nr_arena_group_set_style (NRArenaGroup *group, SPStyle *style) if (group->style) sp_style_unref(group->style); group->style = style; + //if there is a filter set for this group if (style && style->filter.set && style->filter.filter) { - group->filter = new NR::Filter(); - } + + group->filter = new NR::Filter(); + group->filter->set_x(style->filter.filter->x); + group->filter->set_y(style->filter.filter->y); + group->filter->set_width(style->filter.filter->width); + group->filter->set_height(style->filter.filter->height); + + //go through all SP filter primitives + for(int i=0; ifilter.filter->_primitive_count; i++) + { + SPFilterPrimitive *primitive = style->filter.filter->_primitives[i]; + //if primitive is gaussianblur +// if(SP_IS_GAUSSIANBLUR(primitive)) + { + NR::FilterGaussian * gaussian = (NR::FilterGaussian *) group->filter->add_primitive(NR::NR_FILTER_GAUSSIANBLUR); + SPGaussianBlur * spblur = SP_GAUSSIANBLUR(primitive); + float num = spblur->stdDeviation.getNumber(); + if( num>=0.0 ) + { + float optnum = spblur->stdDeviation.getOptNumber(); + if( optnum>=0.0 ) + gaussian->set_deviation((double) num, (double) optnum); + else + gaussian->set_deviation((double) num); + } + } + } + } + else + { + //no filter set for this group + group->filter = NULL; + } if (style && style->enable_background.set && style->enable_background.value == SP_CSS_BACKGROUND_NEW) { diff --git a/src/display/nr-arena-shape.cpp b/src/display/nr-arena-shape.cpp index f9c203187..2f278b3de 100644 --- a/src/display/nr-arena-shape.cpp +++ b/src/display/nr-arena-shape.cpp @@ -1089,9 +1089,8 @@ nr_arena_shape_set_style(NRArenaShape *shape, SPStyle *style) } shape->setMitreLimit(style->stroke_miterlimit.value); - /* TODO: after SPStyle handles filters, get the correct filter - * from there. */ - if (style->filter.set && style->filter.filter) + //if shape has a filter + if (style->filter.set && style->filter.filter) { shape->filter = new NR::Filter(); shape->filter->set_x(style->filter.filter->x); @@ -1120,6 +1119,11 @@ nr_arena_shape_set_style(NRArenaShape *shape, SPStyle *style) } } } + else + { + //no filter set for this shape + shape->filter = NULL; + } nr_arena_item_request_update(shape, NR_ARENA_ITEM_STATE_ALL, FALSE); } diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp index a96b02a62..35d8804e7 100644 --- a/src/display/nr-filter.cpp +++ b/src/display/nr-filter.cpp @@ -131,7 +131,8 @@ int Filter::render(NRArenaItem const *item, NRPixBlock *pb) in = NULL; // in is now handled by FilterSlot, we should not touch it // TODO: loop through the primitives and render them one at a time - _primitive[0]->render(slot, trans); + if(_primitive[0]) + _primitive[0]->render(slot, trans); NRPixBlock *out = slot.get(_output_slot); -- cgit v1.2.3