74e0f409c85525ef0d96468c63d2605efa44aafd
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 "nr-filter-gaussian.h"
18 #include "nr-filter-types.h"
19 #include <libnr/nr-blit.h>
20 #include "preferences.h"
22 static void nr_arena_class_init (NRArenaClass *klass);
23 static void nr_arena_init (NRArena *arena);
24 static void nr_arena_finalize (NRObject *object);
26 static NRActiveObjectClass *parent_class;
28 NRType
29 nr_arena_get_type (void)
30 {
31 static NRType type = 0;
32 if (!type) {
33 type = nr_object_register_type (NR_TYPE_ACTIVE_OBJECT,
34 "NRArena",
35 sizeof (NRArenaClass),
36 sizeof (NRArena),
37 (void (*) (NRObjectClass *)) nr_arena_class_init,
38 (void (*) (NRObject *)) nr_arena_init);
39 }
40 return type;
41 }
43 static void
44 nr_arena_class_init (NRArenaClass *klass)
45 {
46 NRObjectClass *object_class = (NRObjectClass *) klass;
48 parent_class = (NRActiveObjectClass *) (((NRObjectClass *) klass)->parent);
50 object_class->finalize = nr_arena_finalize;
51 object_class->cpp_ctor = NRObject::invoke_ctor<NRArena>;
52 }
54 static void
55 nr_arena_init (NRArena *arena)
56 {
57 arena->delta = 0; // to be set by desktop from prefs
58 arena->renderoffscreen = false; // use render values from preferences otherwise render exact
59 arena->rendermode = Inkscape::RENDERMODE_NORMAL; // default is normal render
60 arena->blurquality = BLUR_QUALITY_NORMAL;
61 arena->filterquality = Inkscape::Filters::FILTER_QUALITY_NORMAL;
62 arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
63 arena->canvasarena = NULL;
64 }
66 static void
67 nr_arena_finalize (NRObject *object)
68 {
69 ((NRObjectClass *) (parent_class))->finalize (object);
70 }
72 void
73 nr_arena_request_update (NRArena *arena, NRArenaItem *item)
74 {
75 NRActiveObject *aobject = (NRActiveObject *) arena;
77 nr_return_if_fail (arena != NULL);
78 nr_return_if_fail (NR_IS_ARENA (arena));
79 nr_return_if_fail (item != NULL);
80 nr_return_if_fail (NR_IS_ARENA_ITEM (item));
81 // setup render parameter
82 if (arena->renderoffscreen == false) {
83 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
84 arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
85 arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
86 } else {
87 arena->blurquality = BLUR_QUALITY_BEST;
88 arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
89 arena->rendermode = Inkscape::RENDERMODE_NORMAL;
90 }
92 if (aobject->callbacks) {
93 for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
94 NRObjectListener *listener = aobject->callbacks->listeners + i;
95 NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
96 if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_update) {
97 avector->request_update (arena, item, listener->data);
98 }
99 }
100 }
101 }
103 void
104 nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
105 {
106 NRActiveObject *aobject = (NRActiveObject *) arena;
108 nr_return_if_fail (arena != NULL);
109 nr_return_if_fail (NR_IS_ARENA (arena));
110 nr_return_if_fail (area != NULL);
112 // setup render parameter
113 if (arena->renderoffscreen == false) {
114 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
115 arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
116 arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
117 } else {
118 arena->blurquality = BLUR_QUALITY_BEST;
119 arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
120 arena->rendermode = Inkscape::RENDERMODE_NORMAL;
121 }
122 if (aobject->callbacks && area && !nr_rect_l_test_empty_ptr(area)) {
123 for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
124 NRObjectListener *listener = aobject->callbacks->listeners + i;
125 NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
126 if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_render) {
127 avector->request_render (arena, area, listener->data);
128 }
129 }
130 }
131 }
133 void
134 nr_arena_render_paintserver_fill (NRPixBlock *pb, NRRectL *area, SPPainter *painter, float opacity, NRPixBlock *mask)
135 {
136 NRPixBlock cb, cb_opa;
137 nr_pixblock_setup_fast (&cb, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
138 nr_pixblock_setup_fast (&cb_opa, NR_PIXBLOCK_MODE_R8G8B8A8N, area->x0, area->y0, area->x1, area->y1, TRUE);
140 // if memory allocation failed, abort
141 if ((cb.size != NR_PIXBLOCK_SIZE_TINY && cb.data.px == NULL) || (cb_opa.size != NR_PIXBLOCK_SIZE_TINY && cb_opa.data.px == NULL)) {
142 return;
143 }
145 cb.visible_area = pb->visible_area;
146 cb_opa.visible_area = pb->visible_area;
148 /* Need separate gradient buffer (lauris)*/
149 // do the filling
150 painter->fill (painter, &cb);
151 cb.empty = FALSE;
153 // do the fill-opacity and mask composite
154 if (opacity < 1.0) {
155 nr_blit_pixblock_pixblock_alpha (&cb_opa, &cb, (int) floor (255 * opacity));
156 cb_opa.empty = FALSE;
157 nr_blit_pixblock_pixblock_mask (pb, &cb_opa, mask);
158 } else {
159 nr_blit_pixblock_pixblock_mask (pb, &cb, mask);
160 }
162 pb->empty = FALSE;
164 nr_pixblock_release (&cb);
165 nr_pixblock_release (&cb_opa);
166 }
168 /**
169 set arena to offscreen mode
170 rendering will be exact
171 @param arena NRArena object
172 */
173 void
174 nr_arena_set_renderoffscreen (NRArena *arena)
175 {
176 nr_return_if_fail (arena != NULL);
177 nr_return_if_fail (NR_IS_ARENA (arena));
179 // the real assignment to the quality indicators is in the update function
180 arena->renderoffscreen = true;
182 }
184 /*
185 Local Variables:
186 mode:c++
187 c-file-style:"stroustrup"
188 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
189 indent-tabs-mode:nil
190 fill-column:99
191 End:
192 */
193 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :