1 #define __NR_ARENA_C__
3 /*
4 * RGBA display list system for inkscape
5 *
6 * Author:
7 * Lauris Kaplinski <lauris@kaplinski.com>
8 *
9 * Copyright (C) 2001-2002 Lauris Kaplinski
10 * Copyright (C) 2001 Ximian, Inc.
11 *
12 * Released under GNU GPL, read the file 'COPYING' for more information
13 */
15 #include "nr-arena-item.h"
16 #include "nr-arena.h"
17 #include <libnr/nr-blit.h>
19 static void nr_arena_class_init (NRArenaClass *klass);
20 static void nr_arena_init (NRArena *arena);
21 static void nr_arena_finalize (NRObject *object);
23 static NRActiveObjectClass *parent_class;
25 NRType
26 nr_arena_get_type (void)
27 {
28 static NRType type = 0;
29 if (!type) {
30 type = nr_object_register_type (NR_TYPE_ACTIVE_OBJECT,
31 "NRArena",
32 sizeof (NRArenaClass),
33 sizeof (NRArena),
34 (void (*) (NRObjectClass *)) nr_arena_class_init,
35 (void (*) (NRObject *)) nr_arena_init);
36 }
37 return type;
38 }
40 static void
41 nr_arena_class_init (NRArenaClass *klass)
42 {
43 NRObjectClass *object_class = (NRObjectClass *) klass;
45 parent_class = (NRActiveObjectClass *) (((NRObjectClass *) klass)->parent);
47 object_class->finalize = nr_arena_finalize;
48 object_class->cpp_ctor = NRObject::invoke_ctor<NRArena>;
49 }
51 static void
52 nr_arena_init (NRArena *arena)
53 {
54 arena->delta = 0; // to be set by desktop from prefs
55 arena->rendermode = RENDERMODE_NORMAL; // default is normal render
56 arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
57 }
59 static void
60 nr_arena_finalize (NRObject *object)
61 {
62 ((NRObjectClass *) (parent_class))->finalize (object);
63 }
65 void
66 nr_arena_request_update (NRArena *arena, NRArenaItem *item)
67 {
68 NRActiveObject *aobject = (NRActiveObject *) arena;
70 nr_return_if_fail (arena != NULL);
71 nr_return_if_fail (NR_IS_ARENA (arena));
72 nr_return_if_fail (item != NULL);
73 nr_return_if_fail (NR_IS_ARENA_ITEM (item));
75 if (aobject->callbacks) {
76 for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
77 NRObjectListener *listener = aobject->callbacks->listeners + i;
78 NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
79 if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_update) {
80 avector->request_update (arena, item, listener->data);
81 }
82 }
83 }
84 }
86 void
87 nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
88 {
89 NRActiveObject *aobject = (NRActiveObject *) arena;
91 nr_return_if_fail (arena != NULL);
92 nr_return_if_fail (NR_IS_ARENA (arena));
93 nr_return_if_fail (area != NULL);
95 if (aobject->callbacks && area && !nr_rect_l_test_empty (area)) {
96 for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
97 NRObjectListener *listener = aobject->callbacks->listeners + i;
98 NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
99 if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_render) {
100 avector->request_render (arena, area, listener->data);
101 }
102 }
103 }
104 }
106 void
107 nr_arena_render_paintserver_fill (NRPixBlock *pb, NRRectL *area, SPPainter *painter, float opacity, NRPixBlock *mask)
108 {
109 NRPixBlock cb, cb_opa;
110 nr_pixblock_setup_fast (&cb, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
111 nr_pixblock_setup_fast (&cb_opa, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
112 cb.visible_area = pb->visible_area;
113 cb_opa.visible_area = pb->visible_area;
115 /* Need separate gradient buffer (lauris)*/
116 // do the filling
117 painter->fill (painter, &cb);
118 cb.empty = FALSE;
120 // do the fill-opacity and mask composite
121 if (opacity < 1.0) {
122 nr_blit_pixblock_pixblock_alpha (&cb_opa, &cb, (int) floor (255 * opacity));
123 cb_opa.empty = FALSE;
124 nr_blit_pixblock_pixblock_mask (pb, &cb_opa, mask);
125 } else {
126 nr_blit_pixblock_pixblock_mask (pb, &cb, mask);
127 }
129 pb->empty = FALSE;
131 nr_pixblock_release (&cb);
132 nr_pixblock_release (&cb_opa);
133 }