summaryrefslogtreecommitdiffstats
path: root/src/display/nr-arena-group.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/display/nr-arena-group.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/display/nr-arena-group.cpp')
-rw-r--r--src/display/nr-arena-group.cpp256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp
new file mode 100644
index 000000000..64274202f
--- /dev/null
+++ b/src/display/nr-arena-group.cpp
@@ -0,0 +1,256 @@
+#define __NR_ARENA_GROUP_C__
+
+/*
+ * RGBA display list system for inkscape
+ *
+ * Author:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ *
+ * Copyright (C) 2001-2002 Lauris Kaplinski
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "nr-arena-group.h"
+
+static void nr_arena_group_class_init (NRArenaGroupClass *klass);
+static void nr_arena_group_init (NRArenaGroup *group);
+
+static NRArenaItem *nr_arena_group_children (NRArenaItem *item);
+static NRArenaItem *nr_arena_group_last_child (NRArenaItem *item);
+static void nr_arena_group_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
+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_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
+static NRArenaItem *nr_arena_group_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky);
+
+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 void
+nr_arena_group_class_init (NRArenaGroupClass *klass)
+{
+ NRObjectClass *object_class;
+ NRArenaItemClass *item_class;
+
+ object_class = (NRObjectClass *) klass;
+ item_class = (NRArenaItemClass *) klass;
+
+ parent_class = (NRArenaItemClass *) ((NRObjectClass *) klass)->parent;
+
+ 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;
+}
+
+static void
+nr_arena_group_init (NRArenaGroup *group)
+{
+ group->transparent = FALSE;
+ group->children = NULL;
+ group->last = NULL;
+ nr_matrix_set_identity (&group->child_transform);
+
+#ifdef arena_item_tile_cache
+ group->skipCaching=true;
+#endif
+
+}
+
+static NRArenaItem *
+nr_arena_group_children (NRArenaItem *item)
+{
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ return group->children;
+}
+
+static NRArenaItem *
+nr_arena_group_last_child (NRArenaItem *item)
+{
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ return group->last;
+}
+
+static void
+nr_arena_group_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref)
+{
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ if (!ref) {
+ group->children = nr_arena_item_attach_ref (item, child, NULL, group->children);
+ } else {
+ ref->next = nr_arena_item_attach_ref (item, child, ref, ref->next);
+ }
+
+ if (ref == group->last) group->last = child;
+
+ 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);
+
+ if (child == group->last) group->last = child->prev;
+
+ if (child->prev) {
+ nr_arena_item_detach_unref (item, child);
+ } else {
+ group->children = nr_arena_item_detach_unref (item, child);
+ }
+
+ 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);
+
+ if (child == group->last) group->last = child->prev;
+
+ if (child->prev) {
+ nr_arena_item_detach_unref (item, child);
+ } else {
+ group->children = nr_arena_item_detach_unref (item, child);
+ }
+
+ if (!ref) {
+ group->children = nr_arena_item_attach_ref (item, child, NULL, group->children);
+ } else {
+ ref->next = nr_arena_item_attach_ref (item, child, ref, ref->next);
+ }
+
+ if (ref == group->last) group->last = 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;
+
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ 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;
+ }
+
+ 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;
+}
+
+static unsigned int
+nr_arena_group_render (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags)
+{
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ 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 (child, area, pb, flags);
+ if (ret & NR_ARENA_ITEM_STATE_INVALID) break;
+ }
+
+ return ret;
+}
+
+static unsigned int
+nr_arena_group_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb)
+{
+ NRArenaGroup *group = NR_ARENA_GROUP (item);
+
+ 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;
+ }
+
+ return ret;
+}
+
+static NRArenaItem *
+nr_arena_group_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky)
+{
+ 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;
+ }
+
+ 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));
+
+ 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);
+}
+
+void nr_arena_group_set_child_transform(NRArenaGroup *group, NRMatrix const *t)
+{
+ 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);
+ }
+}
+
+