Code

No more NRMatrix or NRPoint.
[inkscape.git] / src / display / nr-arena-group.cpp
index 0678eb37ecf3672668d353faae60e50ca56f1725..51f1c6b2f1821179135d9734003614b94fcdbb69 100644 (file)
 #include "display/nr-filter-types.h"
 #include "style.h"
 #include "sp-filter.h"
+#include "sp-filter-reference.h"
 #include "sp-gaussian-blur.h"
+#include "sp-feblend.h"
+#include "display/nr-filter-blend.h"
+#include "libnr/nr-matrix-fns.h"
+#include "libnr/nr-matrix-ops.h"
 
 static void nr_arena_group_class_init (NRArenaGroupClass *klass);
 static void nr_arena_group_init (NRArenaGroup *group);
@@ -39,271 +44,258 @@ static NRArenaItemClass *parent_class;
 NRType
 nr_arena_group_get_type (void)
 {
-       static NRType type = 0;
-       if (!type) {
-               type = nr_object_register_type (NR_TYPE_ARENA_ITEM,
-                                               "NRArenaGroup",
-                                               sizeof (NRArenaGroupClass),
-                                               sizeof (NRArenaGroup),
-                                               (void (*) (NRObjectClass *)) nr_arena_group_class_init,
-                                               (void (*) (NRObject *)) nr_arena_group_init);
-       }
-       return type;
+    static NRType type = 0;
+    if (!type) {
+        type = nr_object_register_type (NR_TYPE_ARENA_ITEM,
+                                        "NRArenaGroup",
+                                        sizeof (NRArenaGroupClass),
+                                        sizeof (NRArenaGroup),
+                                        (void (*) (NRObjectClass *)) nr_arena_group_class_init,
+                                        (void (*) (NRObject *)) nr_arena_group_init);
+    }
+    return type;
 }
 
 static void
 nr_arena_group_class_init (NRArenaGroupClass *klass)
 {
-       NRObjectClass *object_class;
-       NRArenaItemClass *item_class;
+    NRObjectClass *object_class;
+    NRArenaItemClass *item_class;
 
-       object_class = (NRObjectClass *) klass;
-       item_class = (NRArenaItemClass *) klass;
+    object_class = (NRObjectClass *) klass;
+    item_class = (NRArenaItemClass *) klass;
 
-       parent_class = (NRArenaItemClass *) ((NRObjectClass *) klass)->parent;
+    parent_class = (NRArenaItemClass *) ((NRObjectClass *) klass)->parent;
 
-       object_class->cpp_ctor = NRObject::invoke_ctor<NRArenaGroup>;
+    object_class->cpp_ctor = NRObject::invoke_ctor<NRArenaGroup>;
 
-       item_class->children = nr_arena_group_children;
-       item_class->last_child = nr_arena_group_last_child;
-       item_class->add_child = nr_arena_group_add_child;
-       item_class->set_child_position = nr_arena_group_set_child_position;
-       item_class->remove_child = nr_arena_group_remove_child;
-       item_class->update = nr_arena_group_update;
-       item_class->render = nr_arena_group_render;
-       item_class->clip = nr_arena_group_clip;
-       item_class->pick = nr_arena_group_pick;
+    item_class->children = nr_arena_group_children;
+    item_class->last_child = nr_arena_group_last_child;
+    item_class->add_child = nr_arena_group_add_child;
+    item_class->set_child_position = nr_arena_group_set_child_position;
+    item_class->remove_child = nr_arena_group_remove_child;
+    item_class->update = nr_arena_group_update;
+    item_class->render = nr_arena_group_render;
+    item_class->clip = nr_arena_group_clip;
+    item_class->pick = nr_arena_group_pick;
 }
 
 static void
 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);
+    group->transparent = FALSE;
+    group->children = NULL;
+    group->last = NULL;
+    group->style = NULL;
+    group->child_transform.set_identity();
 }
 
 static NRArenaItem *
 nr_arena_group_children (NRArenaItem *item)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       return group->children;
+    return group->children;
 }
 
 static NRArenaItem *
 nr_arena_group_last_child (NRArenaItem *item)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       return group->last;
+    return group->last;
 }
 
 static void
 nr_arena_group_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       if (!ref) {
-               group->children = nr_arena_item_attach (item, child, NULL, group->children);
-       } else {
-               ref->next = nr_arena_item_attach (item, child, ref, ref->next);
-       }
+    if (!ref) {
+        group->children = nr_arena_item_attach (item, child, NULL, group->children);
+    } else {
+        ref->next = nr_arena_item_attach (item, child, ref, ref->next);
+    }
 
-       if (ref == group->last) group->last = child;
+    if (ref == group->last) group->last = child;
 
-       nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, FALSE);
+    nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, FALSE);
 }
 
 static void
 nr_arena_group_remove_child (NRArenaItem *item, NRArenaItem *child)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       if (child == group->last) group->last = child->prev;
+    if (child == group->last) group->last = child->prev;
 
-       if (child->prev) {
-               nr_arena_item_detach (item, child);
-       } else {
-               group->children = nr_arena_item_detach (item, child);
-       }
+    if (child->prev) {
+        nr_arena_item_detach (item, child);
+    } else {
+        group->children = nr_arena_item_detach (item, child);
+    }
 
-       nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, FALSE);
+    nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, FALSE);
 }
 
 static void
 nr_arena_group_set_child_position (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       if (child == group->last) group->last = child->prev;
+    if (child == group->last) group->last = child->prev;
 
-       if (child->prev) {
-               nr_arena_item_detach (item, child);
-       } else {
-               group->children = nr_arena_item_detach (item, child);
-       }
+    if (child->prev) {
+        nr_arena_item_detach (item, child);
+    } else {
+        group->children = nr_arena_item_detach (item, child);
+    }
 
-       if (!ref) {
-               group->children = nr_arena_item_attach (item, child, NULL, group->children);
-       } else {
-               ref->next = nr_arena_item_attach (item, child, ref, ref->next);
-       }
+    if (!ref) {
+        group->children = nr_arena_item_attach (item, child, NULL, group->children);
+    } else {
+        ref->next = nr_arena_item_attach (item, child, ref, ref->next);
+    }
 
-       if (ref == group->last) group->last = child;
+    if (ref == group->last) group->last = child;
 
-       nr_arena_item_request_render (child);
+    nr_arena_item_request_render (child);
 }
 
 static unsigned int
 nr_arena_group_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset)
 {
-       unsigned int newstate;
+    unsigned int newstate;
 
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       unsigned int beststate = NR_ARENA_ITEM_STATE_ALL;
+    unsigned int beststate = NR_ARENA_ITEM_STATE_ALL;
 
-       for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
-               NRGC cgc(gc);
-               nr_matrix_multiply (&cgc.transform, &group->child_transform, &gc->transform);
-               newstate = nr_arena_item_invoke_update (child, area, &cgc, state, reset);
-               beststate = beststate & newstate;
-       }
+    for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
+        NRGC cgc(gc);
+        cgc.transform = group->child_transform * gc->transform;
+        newstate = nr_arena_item_invoke_update (child, area, &cgc, state, reset);
+        beststate = beststate & newstate;
+    }
 
-       if (beststate & NR_ARENA_ITEM_STATE_BBOX) {
-               nr_rect_l_set_empty (&item->bbox);
-               for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
-                       nr_rect_l_union (&item->bbox, &item->bbox, &child->bbox);
-               }
-       }
+    if (beststate & NR_ARENA_ITEM_STATE_BBOX) {
+        nr_rect_l_set_empty (&item->bbox);
+        for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
+            nr_rect_l_union (&item->bbox, &item->bbox, &child->bbox);
+        }
+    }
 
-       return beststate;
+    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);
-                }
-            }
+    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 group has a filter
+    if (style->filter.set && style->getFilter()) {
+        if (!group->filter) {
+            int primitives = sp_filter_primitive_count(SP_FILTER(style->getFilter()));
+            group->filter = new NR::Filter(primitives);
         }
-    }
-    else
-    {
+        sp_filter_build_renderer(SP_FILTER(style->getFilter()), group->filter);
+    } else {
         //no filter set for this group
+        delete group->filter;
         group->filter = NULL;
     }
 
-  if (style && style->enable_background.set
-      && style->enable_background.value == SP_CSS_BACKGROUND_NEW) {
-    group->background_new = true;
-  }
+    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 (cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       unsigned int ret = item->state;
+    unsigned int ret = item->state;
 
-       /* Just compose children into parent buffer */
-       for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
-               ret = nr_arena_item_invoke_render (ct, child, area, pb, flags);
-               if (ret & NR_ARENA_ITEM_STATE_INVALID) break;
-       }
+    /* Just compose children into parent buffer */
+    for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
+        ret = nr_arena_item_invoke_render (ct, child, area, pb, flags);
+        if (ret & NR_ARENA_ITEM_STATE_INVALID) break;
+    }
 
-       return ret;
+    return ret;
 }
 
 static unsigned int
 nr_arena_group_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       unsigned int ret = item->state;
+    unsigned int ret = item->state;
 
-       /* Just compose children into parent buffer */
-       for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
-               ret = nr_arena_item_invoke_clip (child, area, pb);
-               if (ret & NR_ARENA_ITEM_STATE_INVALID) break;
-       }
+    /* Just compose children into parent buffer */
+    for (NRArenaItem *child = group->children; child != NULL; child = child->next) {
+        ret = nr_arena_item_invoke_clip (child, area, pb);
+        if (ret & NR_ARENA_ITEM_STATE_INVALID) break;
+    }
 
-       return ret;
+    return ret;
 }
 
 static NRArenaItem *
 nr_arena_group_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky)
 {
-       NRArenaGroup *group = NR_ARENA_GROUP (item);
+    NRArenaGroup *group = NR_ARENA_GROUP (item);
 
-       for (NRArenaItem *child = group->last; child != NULL; child = child->prev) {
-               NRArenaItem *picked = nr_arena_item_invoke_pick (child, p, delta, sticky);
-               if (picked)
-                       return (group->transparent) ? picked : item;
-       }
+    for (NRArenaItem *child = group->last; child != NULL; child = child->prev) {
+        NRArenaItem *picked = nr_arena_item_invoke_pick (child, p, delta, sticky);
+        if (picked)
+            return (group->transparent) ? picked : item;
+    }
 
-       return NULL;
+    return NULL;
 }
 
 void
 nr_arena_group_set_transparent (NRArenaGroup *group, unsigned int transparent)
 {
-       nr_return_if_fail (group != NULL);
-       nr_return_if_fail (NR_IS_ARENA_GROUP (group));
+    nr_return_if_fail (group != NULL);
+    nr_return_if_fail (NR_IS_ARENA_GROUP (group));
 
-       group->transparent = transparent;
+    group->transparent = transparent;
 }
 
 void nr_arena_group_set_child_transform(NRArenaGroup *group, NR::Matrix const &t)
 {
-       NRMatrix nt(t);
-       nr_arena_group_set_child_transform(group, &nt);
+    NR::Matrix nt(t);
+    nr_arena_group_set_child_transform(group, &nt);
 }
 
-void nr_arena_group_set_child_transform(NRArenaGroup *group, NRMatrix const *t)
+void nr_arena_group_set_child_transform(NRArenaGroup *group, NR::Matrix const *t)
 {
-       if (!t) t = &NR_MATRIX_IDENTITY;
+    if (!t) t = &NR_MATRIX_IDENTITY;
 
-       if (!NR_MATRIX_DF_TEST_CLOSE (t, &group->child_transform, NR_EPSILON)) {
-               nr_arena_item_request_render (NR_ARENA_ITEM (group));
-               group->child_transform = *t;
-               nr_arena_item_request_update (NR_ARENA_ITEM (group), NR_ARENA_ITEM_STATE_ALL, TRUE);
-       }
+    if (!NR::matrix_equalp(*t, group->child_transform, NR_EPSILON)) {
+        nr_arena_item_request_render (NR_ARENA_ITEM (group));
+        group->child_transform = *t;
+        nr_arena_item_request_update (NR_ARENA_ITEM (group), NR_ARENA_ITEM_STATE_ALL, TRUE);
+    }
 }
 
 
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :