Code

Fix include file (<ieeefp.h>, not <ieefp.h>).
[inkscape.git] / src / display / nr-arena-item.h
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 /* TODO: without this, gcc barfs on clause "NR::Filter *filter" later on.
63  * Obviously we shouldn't need to have the next three rows */
64 namespace NR {
65 class Filter;
66 }
68 // My testing shows that disabling cache reduces the amount 
69 // of leaked memory when many documents are loaded one from the other,
70 // while there's no noticeable change in speed
71 //#define arena_item_tile_cache
73 struct NRGC {
74         NRGC(NRGC const *p) : parent(p) {}
75         NRGC const *parent;
76         NRMatrix transform;
77 };
79 struct NRArenaItem : public NRObject {
81         NRArena *arena;
82         Inkscape::GC::soft_ptr<NRArenaItem> parent;
83         NRArenaItem *next;
84         Inkscape::GC::soft_ptr<NRArenaItem> prev;
86         /* Item state */
87         unsigned int state : 16;
88         unsigned int propagate : 1;
89         unsigned int sensitive : 1;
90         unsigned int visible : 1;
91         /* Whether items renders opacity itself */
92         unsigned int render_opacity : 1;
93         /* Opacity itself */
94         unsigned int opacity : 8;
96         /* Key for secondary rendering */
97         unsigned int key;
98   
99 #ifdef arena_item_tile_cache
100   bool     skipCaching;
101   double   activity;
102 #endif
103   
104         /* BBox in grid coordinates */
105         NRRectL bbox;
106         /* Our affine */
107         NRMatrix *transform;
108         /* Clip item */
109         NRArenaItem *clip;
110         /* Mask item */
111         NRArenaItem *mask;
112         /* Filter to be applied after rendering this object, NULL if none */
113         NR::Filter *filter;
114         /* Rendered buffer */
115         unsigned char *px;
117         /* Single data member */
118         void *data;
120         /* Current Transformation Matrix */
121         NR::Matrix ctm;
123         void init(NRArena *arena) {
124                 this->arena = arena;
125         }
126 };
128 struct NRArenaItemClass : public NRObjectClass {
129         NRArenaItem * (* children) (NRArenaItem *item);
130         NRArenaItem * (* last_child) (NRArenaItem *item);
131         void (* add_child) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
132         void (* remove_child) (NRArenaItem *item, NRArenaItem *child);
133         void (* set_child_position) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
135         unsigned int (* update) (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
136         unsigned int (* render) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
137         unsigned int (* clip) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
138         NRArenaItem * (* pick) (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky);
139 };
141 #define NR_ARENA_ITEM_ARENA(ai) (((NRArenaItem *) (ai))->arena)
143 NRType nr_arena_item_get_type (void);
145 NRArenaItem *nr_arena_item_ref (NRArenaItem *item);
146 NRArenaItem *nr_arena_item_unref (NRArenaItem *item);
148 NRArenaItem *nr_arena_item_children (NRArenaItem *item);
149 NRArenaItem *nr_arena_item_last_child (NRArenaItem *item);
150 void nr_arena_item_add_child (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
151 void nr_arena_item_remove_child (NRArenaItem *item, NRArenaItem *child);
152 void nr_arena_item_set_child_position (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
154 /*
155  * Invoke update to given state, if item is inside area
156  *
157  * area == NULL is infinite
158  * gc is PARENT gc for invoke, CHILD gc in corresponding virtual method
159  * state - requested to state (bitwise or of requested flags)
160  * reset - reset to state (bitwise or of flags to reset)
161  */
163 unsigned int nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
165 unsigned int nr_arena_item_invoke_render(NRArenaItem *item, NRRectL const *area, NRPixBlock *pb, unsigned int flags);
167 unsigned int nr_arena_item_invoke_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
168 NRArenaItem *nr_arena_item_invoke_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky);
170 void nr_arena_item_request_update (NRArenaItem *item, unsigned int reset, unsigned int propagate);
171 void nr_arena_item_request_render (NRArenaItem *item);
173 /* Public */
175 NRArenaItem *nr_arena_item_unparent (NRArenaItem *item);
177 void nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child);
179 void nr_arena_item_set_transform(NRArenaItem *item, NR::Matrix const &transform);
180 void nr_arena_item_set_transform(NRArenaItem *item, NRMatrix const *transform);
181 void nr_arena_item_set_opacity (NRArenaItem *item, double opacity);
182 void nr_arena_item_set_sensitive (NRArenaItem *item, unsigned int sensitive);
183 void nr_arena_item_set_visible (NRArenaItem *item, unsigned int visible);
184 void nr_arena_item_set_clip (NRArenaItem *item, NRArenaItem *clip);
185 void nr_arena_item_set_mask (NRArenaItem *item, NRArenaItem *mask);
186 void nr_arena_item_set_order (NRArenaItem *item, int order);
188 /* Helpers */
190 NRArenaItem *nr_arena_item_attach (NRArenaItem *parent, NRArenaItem *child, NRArenaItem *prev, NRArenaItem *next);
191 NRArenaItem *nr_arena_item_detach (NRArenaItem *parent, NRArenaItem *child);
193 #define NR_ARENA_ITEM_SET_DATA(i,v) (((NRArenaItem *) (i))->data = (v))
194 #define NR_ARENA_ITEM_GET_DATA(i) (((NRArenaItem *) (i))->data)
196 #define NR_ARENA_ITEM_SET_KEY(i,k) (((NRArenaItem *) (i))->key = (k))
197 #define NR_ARENA_ITEM_GET_KEY(i) (((NRArenaItem *) (i))->key)
199 #endif