Code

Minor cleanup work on macros
[inkscape.git] / src / display / nr-arena.cpp
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 = Inkscape::RENDERMODE_NORMAL; // default is normal render
56     arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
57     arena->canvasarena = NULL;
58 }
60 static void
61 nr_arena_finalize (NRObject *object)
62 {
63     ((NRObjectClass *) (parent_class))->finalize (object);
64 }
66 void
67 nr_arena_request_update (NRArena *arena, NRArenaItem *item)
68 {
69     NRActiveObject *aobject = (NRActiveObject *) arena;
71     nr_return_if_fail (arena != NULL);
72     nr_return_if_fail (NR_IS_ARENA (arena));
73     nr_return_if_fail (item != NULL);
74     nr_return_if_fail (NR_IS_ARENA_ITEM (item));
76     if (aobject->callbacks) {
77         for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
78             NRObjectListener *listener = aobject->callbacks->listeners + i;
79             NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
80             if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_update) {
81                 avector->request_update (arena, item, listener->data);
82             }
83         }
84     }
85 }
87 void
88 nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
89 {
90     NRActiveObject *aobject = (NRActiveObject *) arena;
92     nr_return_if_fail (arena != NULL);
93     nr_return_if_fail (NR_IS_ARENA (arena));
94     nr_return_if_fail (area != NULL);
96     if (aobject->callbacks && area && !nr_rect_l_test_empty_ptr(area)) {
97         for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
98             NRObjectListener *listener = aobject->callbacks->listeners + i;
99             NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
100             if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_render) {
101                 avector->request_render (arena, area, listener->data);
102             }
103         }
104     }
107 void
108 nr_arena_render_paintserver_fill (NRPixBlock *pb, NRRectL *area, SPPainter *painter, float opacity, NRPixBlock *mask)
110     NRPixBlock cb, cb_opa;
111     nr_pixblock_setup_fast (&cb, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
112     nr_pixblock_setup_fast (&cb_opa, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
114     // if memory allocation failed, abort
115     if ((cb.size != NR_PIXBLOCK_SIZE_TINY && cb.data.px == NULL) || (cb_opa.size != NR_PIXBLOCK_SIZE_TINY && cb_opa.data.px == NULL)) {
116         return;
117     }
119     cb.visible_area = pb->visible_area;
120     cb_opa.visible_area = pb->visible_area;
122     /* Need separate gradient buffer (lauris)*/
123     // do the filling
124     painter->fill (painter, &cb);
125     cb.empty = FALSE;
127     // do the fill-opacity and mask composite
128     if (opacity < 1.0) {
129         nr_blit_pixblock_pixblock_alpha (&cb_opa, &cb, (int) floor (255 * opacity));
130         cb_opa.empty = FALSE;
131         nr_blit_pixblock_pixblock_mask (pb, &cb_opa, mask);
132     } else {
133         nr_blit_pixblock_pixblock_mask (pb, &cb, mask);
134     }
136     pb->empty = FALSE;
138     nr_pixblock_release (&cb);
139     nr_pixblock_release (&cb_opa);
143 /*
144   Local Variables:
145   mode:c++
146   c-file-style:"stroustrup"
147   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
148   indent-tabs-mode:nil
149   fill-column:99
150   End:
151 */
152 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :