9db8d7a4063d58fe49c24ae61c38efe799d166a6
1 #ifndef __NR_ARENA_ITEM_H__
2 #define __NR_ARENA_ITEM_H__
4 /*
5 * RGBA display list system for inkscape
6 *
7 * Author:
8 * Lauris Kaplinski <lauris@kaplinski.com>
9 *
10 * Copyright (C) 2001-2002 Lauris Kaplinski
11 * Copyright (C) 2001 Ximian, Inc.
12 *
13 * Released under GNU GPL, read the file 'COPYING' for more information
14 */
16 #define NR_TYPE_ARENA_ITEM (nr_arena_item_get_type ())
17 #define NR_ARENA_ITEM(o) (NR_CHECK_INSTANCE_CAST ((o), NR_TYPE_ARENA_ITEM, NRArenaItem))
18 #define NR_IS_ARENA_ITEM(o) (NR_CHECK_INSTANCE_TYPE ((o), NR_TYPE_ARENA_ITEM))
20 #define NR_ARENA_ITEM_VIRTUAL(i,m) (((NRArenaItemClass *) NR_OBJECT_GET_CLASS (i))->m)
22 /*
23 * NRArenaItem state flags
24 */
26 /*
27 * NR_ARENA_ITEM_STATE_INVALID
28 *
29 * If set or retuned indicates, that given object is in error.
30 * Calling method has to return immediately, with appropriate
31 * error flag.
32 */
34 #define NR_ARENA_ITEM_STATE_INVALID (1 << 0)
37 #define NR_ARENA_ITEM_STATE_BBOX (1 << 1)
38 #define NR_ARENA_ITEM_STATE_COVERAGE (1 << 2)
39 #define NR_ARENA_ITEM_STATE_DRAFT (1 << 3)
40 #define NR_ARENA_ITEM_STATE_RENDER (1 << 4)
41 #define NR_ARENA_ITEM_STATE_CLIP (1 << 5)
42 #define NR_ARENA_ITEM_STATE_MASK (1 << 6)
43 #define NR_ARENA_ITEM_STATE_PICK (1 << 7)
44 #define NR_ARENA_ITEM_STATE_IMAGE (1 << 8)
46 #define NR_ARENA_ITEM_STATE_NONE 0x0000
47 #define NR_ARENA_ITEM_STATE_ALL 0x01fe
49 #define NR_ARENA_ITEM_STATE(i,s) (NR_ARENA_ITEM (i)->state & (s))
50 #define NR_ARENA_ITEM_SET_STATE(i,s) (NR_ARENA_ITEM (i)->state |= (s))
51 #define NR_ARENA_ITEM_UNSET_STATE(i,s) (NR_ARENA_ITEM (i)->state &= ~(s))
53 #define NR_ARENA_ITEM_RENDER_NO_CACHE (1 << 0)
55 #include <libnr/nr-matrix.h>
56 #include <libnr/nr-rect-l.h>
57 #include <libnr/nr-pixblock.h>
58 #include <libnr/nr-object.h>
59 #include "gc-soft-ptr.h"
60 #include "nr-arena-forward.h"
61 #include "display/nr-filter.h"
62 #include <cairo.h>
63 #include <libnr/nr-convert2geom.h>
65 struct NRGC {
66 NRGC(NRGC const *p) : parent(p) {}
67 NRGC const *parent;
68 Geom::Matrix transform;
69 };
71 struct NRArenaItem : public NRObject {
73 NRArena *arena;
74 Inkscape::GC::soft_ptr<NRArenaItem> parent;
75 NRArenaItem *next;
76 Inkscape::GC::soft_ptr<NRArenaItem> prev;
78 /* Item state */
79 unsigned int state : 16;
80 unsigned int propagate : 1;
81 unsigned int sensitive : 1;
82 unsigned int visible : 1;
83 /* Whether items renders opacity itself */
84 unsigned int render_opacity : 1;
85 /* Opacity itself */
86 unsigned int opacity : 8;
88 /* Key for secondary rendering */
89 unsigned int key;
91 /* BBox in grid coordinates */
92 NRRectL bbox;
93 /* BBox in item coordinates - this should be a bounding box as
94 * specified in SVG standard. Required by filters. */
95 boost::optional<Geom::Rect> item_bbox;
96 /* Our affine */
97 Geom::Matrix *transform;
98 /* Clip item */
99 NRArenaItem *clip;
100 /* Mask item */
101 NRArenaItem *mask;
102 /* Filter to be applied after rendering this object, NULL if none */
103 NR::Filter *filter;
104 /* Rendered buffer */
105 unsigned char *px;
107 /* Single data member */
108 void *data;
110 /* Current Transformation Matrix */
111 Geom::Matrix ctm;
113 /* These hold background buffer state for filter rendering */
114 NRPixBlock *background_pb;
115 bool background_new;
117 void init(NRArena *arena) {
118 this->arena = arena;
119 }
120 };
122 struct NRArenaItemClass : public NRObjectClass {
123 NRArenaItem * (* children) (NRArenaItem *item);
124 NRArenaItem * (* last_child) (NRArenaItem *item);
125 void (* add_child) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
126 void (* remove_child) (NRArenaItem *item, NRArenaItem *child);
127 void (* set_child_position) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
129 unsigned int (* update) (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
130 unsigned int (* render) (cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
131 unsigned int (* clip) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
132 NRArenaItem * (* pick) (NRArenaItem *item, Geom::Point p, double delta, unsigned int sticky);
133 };
135 #define NR_ARENA_ITEM_ARENA(ai) (((NRArenaItem *) (ai))->arena)
137 NRType nr_arena_item_get_type (void);
139 NRArenaItem *nr_arena_item_ref (NRArenaItem *item);
140 NRArenaItem *nr_arena_item_unref (NRArenaItem *item);
142 NRArenaItem *nr_arena_item_children (NRArenaItem *item);
143 NRArenaItem *nr_arena_item_last_child (NRArenaItem *item);
144 void nr_arena_item_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
145 void nr_arena_item_remove_child (NRArenaItem *item, NRArenaItem *child);
146 void nr_arena_item_set_child_position (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
148 /*
149 * Invoke update to given state, if item is inside area
150 *
151 * area == NULL is infinite
152 * gc is PARENT gc for invoke, CHILD gc in corresponding virtual method
153 * state - requested to state (bitwise or of requested flags)
154 * reset - reset to state (bitwise or of flags to reset)
155 */
157 unsigned int nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
159 unsigned int nr_arena_item_invoke_render(cairo_t *ct, NRArenaItem *item, NRRectL const *area, NRPixBlock *pb, unsigned int flags);
161 unsigned int nr_arena_item_invoke_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
162 NRArenaItem *nr_arena_item_invoke_pick (NRArenaItem *item, Geom::Point p, double delta, unsigned int sticky);
164 void nr_arena_item_request_update (NRArenaItem *item, unsigned int reset, unsigned int propagate);
165 void nr_arena_item_request_render (NRArenaItem *item);
167 /* Public */
169 NRArenaItem *nr_arena_item_unparent (NRArenaItem *item);
171 void nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child);
173 void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const &transform);
174 void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const *transform);
175 void nr_arena_item_set_opacity (NRArenaItem *item, double opacity);
176 void nr_arena_item_set_sensitive (NRArenaItem *item, unsigned int sensitive);
177 void nr_arena_item_set_visible (NRArenaItem *item, unsigned int visible);
178 void nr_arena_item_set_clip (NRArenaItem *item, NRArenaItem *clip);
179 void nr_arena_item_set_mask (NRArenaItem *item, NRArenaItem *mask);
180 void nr_arena_item_set_order (NRArenaItem *item, int order);
181 void nr_arena_item_set_item_bbox (NRArenaItem *item, boost::optional<Geom::Rect> &bbox);
183 NRPixBlock *nr_arena_item_get_background (NRArenaItem const *item, int depth = 0);
185 /* Helpers */
187 NRArenaItem *nr_arena_item_attach (NRArenaItem *parent, NRArenaItem *child, NRArenaItem *prev, NRArenaItem *next);
188 NRArenaItem *nr_arena_item_detach (NRArenaItem *parent, NRArenaItem *child);
190 #define NR_ARENA_ITEM_SET_DATA(i,v) (((NRArenaItem *) (i))->data = (v))
191 #define NR_ARENA_ITEM_GET_DATA(i) (((NRArenaItem *) (i))->data)
193 #define NR_ARENA_ITEM_SET_KEY(i,k) (((NRArenaItem *) (i))->key = (k))
194 #define NR_ARENA_ITEM_GET_KEY(i) (((NRArenaItem *) (i))->key)
197 #endif /* !__NR_ARENA_ITEM_H__ */
199 /*
200 Local Variables:
201 mode:c++
202 c-file-style:"stroustrup"
203 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
204 indent-tabs-mode:nil
205 fill-column:99
206 End:
207 */
208 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :