summaryrefslogtreecommitdiffstats
path: root/src/display/nr-arena.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.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/display/nr-arena.cpp')
-rw-r--r--src/display/nr-arena.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp
new file mode 100644
index 000000000..f54bfbb90
--- /dev/null
+++ b/src/display/nr-arena.cpp
@@ -0,0 +1,131 @@
+#define __NR_ARENA_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-item.h"
+#include "nr-arena.h"
+#include <libnr/nr-blit.h>
+
+static void nr_arena_class_init (NRArenaClass *klass);
+static void nr_arena_init (NRArena *arena);
+static void nr_arena_finalize (NRObject *object);
+
+static NRActiveObjectClass *parent_class;
+
+NRType
+nr_arena_get_type (void)
+{
+ static NRType type = 0;
+ if (!type) {
+ type = nr_object_register_type (NR_TYPE_ACTIVE_OBJECT,
+ "NRArena",
+ sizeof (NRArenaClass),
+ sizeof (NRArena),
+ (void (*) (NRObjectClass *)) nr_arena_class_init,
+ (void (*) (NRObject *)) nr_arena_init);
+ }
+ return type;
+}
+
+static void
+nr_arena_class_init (NRArenaClass *klass)
+{
+ NRObjectClass *object_class = (NRObjectClass *) klass;
+
+ parent_class = (NRActiveObjectClass *) (((NRObjectClass *) klass)->parent);
+
+ object_class->finalize = nr_arena_finalize;
+ object_class->cpp_ctor = NRObject::invoke_ctor<NRArena>;
+}
+
+static void
+nr_arena_init (NRArena *arena)
+{
+ arena->delta = 0; // to be set by desktop from prefs
+ arena->rendermode = RENDERMODE_NORMAL; // default is normal render
+ arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
+}
+
+static void
+nr_arena_finalize (NRObject *object)
+{
+ ((NRObjectClass *) (parent_class))->finalize (object);
+}
+
+void
+nr_arena_request_update (NRArena *arena, NRArenaItem *item)
+{
+ NRActiveObject *aobject = (NRActiveObject *) arena;
+
+ nr_return_if_fail (arena != NULL);
+ nr_return_if_fail (NR_IS_ARENA (arena));
+ nr_return_if_fail (item != NULL);
+ nr_return_if_fail (NR_IS_ARENA_ITEM (item));
+
+ if (aobject->callbacks) {
+ for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
+ NRObjectListener *listener = aobject->callbacks->listeners + i;
+ NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
+ if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_update) {
+ avector->request_update (arena, item, listener->data);
+ }
+ }
+ }
+}
+
+void
+nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
+{
+ NRActiveObject *aobject = (NRActiveObject *) arena;
+
+ nr_return_if_fail (arena != NULL);
+ nr_return_if_fail (NR_IS_ARENA (arena));
+ nr_return_if_fail (area != NULL);
+
+ if (aobject->callbacks && area && !nr_rect_l_test_empty (area)) {
+ for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
+ NRObjectListener *listener = aobject->callbacks->listeners + i;
+ NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
+ if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_render) {
+ avector->request_render (arena, area, listener->data);
+ }
+ }
+ }
+}
+
+void
+nr_arena_render_paintserver_fill (NRPixBlock *pb, NRRectL *area, SPPainter *painter, float opacity, NRPixBlock *mask)
+{
+ NRPixBlock cb, cb_opa;
+ nr_pixblock_setup_fast (&cb, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
+ nr_pixblock_setup_fast (&cb_opa, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
+
+ /* Need separate gradient buffer (lauris)*/
+ // do the filling
+ painter->fill (painter, &cb);
+ cb.empty = FALSE;
+
+ // do the fill-opacity and mask composite
+ if (opacity < 1.0) {
+ nr_blit_pixblock_pixblock_alpha (&cb_opa, &cb, (int) floor (255 * opacity));
+ cb_opa.empty = FALSE;
+ nr_blit_pixblock_pixblock_mask (pb, &cb_opa, mask);
+ } else {
+ nr_blit_pixblock_pixblock_mask (pb, &cb, mask);
+ }
+
+ pb->empty = FALSE;
+
+ nr_pixblock_release (&cb);
+ nr_pixblock_release (&cb_opa);
+}