X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdisplay%2Fnr-arena-group.cpp;h=9c790eb97d4d6b332795983e807b68896c5df75f;hb=db1ea68b1534424e75ea5d9cfc4246e4a134dc67;hp=64274202f4022c9a2ffa824dd5fd814ca1228933;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp index 64274202f..9c790eb97 100644 --- a/src/display/nr-arena-group.cpp +++ b/src/display/nr-arena-group.cpp @@ -12,7 +12,13 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "nr-arena-group.h" +#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); @@ -24,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); @@ -75,12 +81,8 @@ nr_arena_group_init (NRArenaGroup *group) group->transparent = FALSE; group->children = NULL; group->last = NULL; + group->style = NULL; nr_matrix_set_identity (&group->child_transform); - -#ifdef arena_item_tile_cache - group->skipCaching=true; -#endif - } static NRArenaItem * @@ -105,9 +107,9 @@ nr_arena_group_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *re NRArenaGroup *group = NR_ARENA_GROUP (item); if (!ref) { - group->children = nr_arena_item_attach_ref (item, child, NULL, group->children); + group->children = nr_arena_item_attach (item, child, NULL, group->children); } else { - ref->next = nr_arena_item_attach_ref (item, child, ref, ref->next); + ref->next = nr_arena_item_attach (item, child, ref, ref->next); } if (ref == group->last) group->last = child; @@ -123,9 +125,9 @@ nr_arena_group_remove_child (NRArenaItem *item, NRArenaItem *child) if (child == group->last) group->last = child->prev; if (child->prev) { - nr_arena_item_detach_unref (item, child); + nr_arena_item_detach (item, child); } else { - group->children = nr_arena_item_detach_unref (item, child); + group->children = nr_arena_item_detach (item, child); } nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, FALSE); @@ -139,15 +141,15 @@ nr_arena_group_set_child_position (NRArenaItem *item, NRArenaItem *child, NRAren if (child == group->last) group->last = child->prev; if (child->prev) { - nr_arena_item_detach_unref (item, child); + nr_arena_item_detach (item, child); } else { - group->children = nr_arena_item_detach_unref (item, child); + group->children = nr_arena_item_detach (item, child); } if (!ref) { - group->children = nr_arena_item_attach_ref (item, child, NULL, group->children); + group->children = nr_arena_item_attach (item, child, NULL, group->children); } else { - ref->next = nr_arena_item_attach_ref (item, child, ref, ref->next); + ref->next = nr_arena_item_attach (item, child, ref, ref->next); } if (ref == group->last) group->last = child; @@ -181,8 +183,59 @@ nr_arena_group_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int return beststate; } +void nr_arena_group_set_style (NRArenaGroup *group, SPStyle *style) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(NR_IS_ARENA_GROUP(group)); + + if (style) sp_style_ref(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->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) { + group->background_new = true; + } +} + 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); @@ -190,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; }