Code

New grids are almost ready to fly!
[inkscape.git] / src / display / nr-arena-group.cpp
index b4cc3930b1a5ad4807ee79bf040065c976801a35..0678eb37ecf3672668d353faae60e50ca56f1725 100644 (file)
 
 #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; 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) {
@@ -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;
        }