X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdisplay%2Fnr-arena-group.cpp;h=0678eb37ecf3672668d353faae60e50ca56f1725;hb=02c3f3ebde37bbc650b2e8eb951e7037ed714360;hp=b4cc3930b1a5ad4807ee79bf040065c976801a35;hpb=4d2641578cb5103e09504a763f4016f136bf1386;p=inkscape.git diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp index b4cc3930b..0678eb37e 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); @@ -26,7 +30,7 @@ static void nr_arena_group_remove_child (NRArenaItem *item, NRArenaItem *child); static void nr_arena_group_set_child_position (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref); static unsigned int nr_arena_group_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset); -static unsigned int nr_arena_group_render (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags); +static unsigned int nr_arena_group_render (cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags); static unsigned int nr_arena_group_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb); static NRArenaItem *nr_arena_group_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky); @@ -79,11 +83,6 @@ nr_arena_group_init (NRArenaGroup *group) group->last = NULL; group->style = NULL; nr_matrix_set_identity (&group->child_transform); - -#ifdef arena_item_tile_cache - group->skipCaching=true; -#endif - } static NRArenaItem * @@ -193,9 +192,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) { @@ -204,7 +235,7 @@ void nr_arena_group_set_style (NRArenaGroup *group, SPStyle *style) } static unsigned int -nr_arena_group_render (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags) +nr_arena_group_render (cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags) { NRArenaGroup *group = NR_ARENA_GROUP (item); @@ -212,7 +243,7 @@ nr_arena_group_render (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigne /* Just compose children into parent buffer */ for (NRArenaItem *child = group->children; child != NULL; child = child->next) { - ret = nr_arena_item_invoke_render (child, area, pb, flags); + ret = nr_arena_item_invoke_render (ct, child, area, pb, flags); if (ret & NR_ARENA_ITEM_STATE_INVALID) break; }