index 64274202f4022c9a2ffa824dd5fd814ca1228933..9c790eb97d4d6b332795983e807b68896c5df75f 100644 (file)
* 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);
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);
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;
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; i<style->filter.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;
}