index f43152ff9ba74363d202a532b6acb323b553bbd0..2faa7d2d05557de7ccb2413a0b30388b235a86c5 100644 (file)
#define NR_ARENA_ITEM_RENDER_NO_CACHE (1 << 0)
-#include <libnr/nr-matrix.h>
+#include <2geom/matrix.h>
#include <libnr/nr-rect-l.h>
#include <libnr/nr-pixblock.h>
#include <libnr/nr-object.h>
+#include "gc-soft-ptr.h"
#include "nr-arena-forward.h"
-
-// My testing shows that disabling cache reduces the amount
-// of leaked memory when many documents are loaded one from the other,
-// while there's no noticeable change in speed
-//#define arena_item_tile_cache
+#include "display/nr-filter.h"
+#include <cairo.h>
struct NRGC {
- NRGC(NRGC const *p) : parent(p) {}
- NRGC const *parent;
- NRMatrix transform;
+ NRGC(NRGC const *p) : parent(p) {}
+ NRGC const *parent;
+ Geom::Matrix transform;
};
struct NRArenaItem : public NRObject {
- NRArenaItem();
-
- NRArena *arena;
- NRArenaItem *parent;
- NRArenaItem *next;
- NRArenaItem *prev;
-
- /* Item state */
- unsigned int state : 16;
- unsigned int propagate : 1;
- unsigned int sensitive : 1;
- unsigned int visible : 1;
- /* Whether items renders opacity itself */
- unsigned int render_opacity : 1;
- /* Opacity itself */
- unsigned int opacity : 8;
-
- /* Key for secondary rendering */
- unsigned int key;
-
-#ifdef arena_item_tile_cache
- bool skipCaching;
- double activity;
-#endif
-
- /* BBox in grid coordinates */
- NRRectL bbox;
- /* Our affine */
- NRMatrix *transform;
- /* Clip item */
- NRArenaItem *clip;
- /* Mask item */
- NRArenaItem *mask;
- /* Rendered buffer */
- unsigned char *px;
-
- /* Single data member */
- void *data;
-
- void init(NRArena *arena) {
- this->arena = arena;
- }
+
+ NRArena *arena;
+ Inkscape::GC::soft_ptr<NRArenaItem> parent;
+ NRArenaItem *next;
+ Inkscape::GC::soft_ptr<NRArenaItem> prev;
+
+ /* Item state */
+ unsigned int state : 16;
+ unsigned int propagate : 1;
+ unsigned int sensitive : 1;
+ unsigned int visible : 1;
+ /* Whether items renders opacity itself */
+ unsigned int render_opacity : 1;
+ /* Opacity itself */
+ unsigned int opacity : 8;
+
+ /* Key for secondary rendering */
+ unsigned int key;
+
+ /* BBox in grid coordinates */
+ NRRectL bbox;
+ /* Redraw area in grid coordinates = bbox filter-enlarged and clipped/masked */
+ NRRectL drawbox;
+ /* BBox in item coordinates - this should be a bounding box as
+ * specified in SVG standard. Required by filters. */
+ Geom::OptRect item_bbox;
+ /* Our affine */
+ Geom::Matrix *transform;
+ /* Clip item */
+ NRArenaItem *clip;
+ /* Mask item */
+ NRArenaItem *mask;
+ /* Filter to be applied after rendering this object, NULL if none */
+ Inkscape::Filters::Filter *filter;
+ /* Rendered buffer */
+ unsigned char *px;
+
+ /* Single data member */
+ void *data;
+
+ /* Current Transformation Matrix */
+ Geom::Matrix ctm;
+
+ /* These hold background buffer state for filter rendering */
+ NRPixBlock *background_pb;
+ bool background_new;
+
+ void init(NRArena *arena) {
+ this->arena = arena;
+ }
};
struct NRArenaItemClass : public NRObjectClass {
- NRArenaItem * (* children) (NRArenaItem *item);
- NRArenaItem * (* last_child) (NRArenaItem *item);
- void (* add_child) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
- void (* remove_child) (NRArenaItem *item, NRArenaItem *child);
- void (* set_child_position) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
-
- unsigned int (* update) (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
- unsigned int (* render) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
- unsigned int (* clip) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
- NRArenaItem * (* pick) (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky);
+ NRArenaItem * (* children) (NRArenaItem *item);
+ NRArenaItem * (* last_child) (NRArenaItem *item);
+ void (* add_child) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
+ void (* remove_child) (NRArenaItem *item, NRArenaItem *child);
+ void (* set_child_position) (NRArenaItem *item, NRArenaItem *child, NRArenaItem *ref);
+
+ unsigned int (* update) (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
+ unsigned int (* render) (cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock *pb, unsigned int flags);
+ unsigned int (* clip) (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
+ NRArenaItem * (* pick) (NRArenaItem *item, Geom::Point p, double delta, unsigned int sticky);
};
#define NR_ARENA_ITEM_ARENA(ai) (((NRArenaItem *) (ai))->arena)
@@ -151,10 +157,10 @@ void nr_arena_item_set_child_position (NRArenaItem *item, NRArenaItem *child, NR
unsigned int nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset);
-unsigned int nr_arena_item_invoke_render(NRArenaItem *item, NRRectL const *area, NRPixBlock *pb, unsigned int flags);
+unsigned int nr_arena_item_invoke_render(cairo_t *ct, NRArenaItem *item, NRRectL const *area, NRPixBlock *pb, unsigned int flags);
unsigned int nr_arena_item_invoke_clip (NRArenaItem *item, NRRectL *area, NRPixBlock *pb);
-NRArenaItem *nr_arena_item_invoke_pick (NRArenaItem *item, NR::Point p, double delta, unsigned int sticky);
+NRArenaItem *nr_arena_item_invoke_pick (NRArenaItem *item, Geom::Point p, double delta, unsigned int sticky);
void nr_arena_item_request_update (NRArenaItem *item, unsigned int reset, unsigned int propagate);
void nr_arena_item_request_render (NRArenaItem *item);
void nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child);
-void nr_arena_item_set_transform(NRArenaItem *item, NR::Matrix const &transform);
-void nr_arena_item_set_transform(NRArenaItem *item, NRMatrix const *transform);
+void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const &transform);
+void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const *transform);
void nr_arena_item_set_opacity (NRArenaItem *item, double opacity);
void nr_arena_item_set_sensitive (NRArenaItem *item, unsigned int sensitive);
void nr_arena_item_set_visible (NRArenaItem *item, unsigned int visible);
void nr_arena_item_set_clip (NRArenaItem *item, NRArenaItem *clip);
void nr_arena_item_set_mask (NRArenaItem *item, NRArenaItem *mask);
void nr_arena_item_set_order (NRArenaItem *item, int order);
+void nr_arena_item_set_item_bbox (NRArenaItem *item, Geom::OptRect &bbox);
+
+NRPixBlock *nr_arena_item_get_background (NRArenaItem const *item, int depth = 0);
/* Helpers */
-NRArenaItem *nr_arena_item_attach_ref (NRArenaItem *parent, NRArenaItem *child, NRArenaItem *prev, NRArenaItem *next);
-NRArenaItem *nr_arena_item_detach_unref (NRArenaItem *parent, NRArenaItem *child);
+NRArenaItem *nr_arena_item_attach (NRArenaItem *parent, NRArenaItem *child, NRArenaItem *prev, NRArenaItem *next);
+NRArenaItem *nr_arena_item_detach (NRArenaItem *parent, NRArenaItem *child);
#define NR_ARENA_ITEM_SET_DATA(i,v) (((NRArenaItem *) (i))->data = (v))
#define NR_ARENA_ITEM_GET_DATA(i) (((NRArenaItem *) (i))->data)
@@ -185,4 +194,16 @@ NRArenaItem *nr_arena_item_detach_unref (NRArenaItem *parent, NRArenaItem *child
#define NR_ARENA_ITEM_SET_KEY(i,k) (((NRArenaItem *) (i))->key = (k))
#define NR_ARENA_ITEM_GET_KEY(i) (((NRArenaItem *) (i))->key)
-#endif
+
+#endif /* !__NR_ARENA_ITEM_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :