index f43152ff9ba74363d202a532b6acb323b553bbd0..103315c5eadd2ca4f316cc6c1e53b4938259dfa2 100644 (file)
#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) {}
};
struct NRArenaItem : public NRObject {
- NRArenaItem();
NRArena *arena;
- NRArenaItem *parent;
+ Inkscape::GC::soft_ptr<NRArenaItem> parent;
NRArenaItem *next;
- NRArenaItem *prev;
+ Inkscape::GC::soft_ptr<NRArenaItem> prev;
/* Item state */
unsigned int state : 16;
/* 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 */
NRArenaItem *clip;
/* Mask item */
NRArenaItem *mask;
+ /* Filter to be applied after rendering this object, NULL if none */
+ NR::Filter *filter;
/* Rendered buffer */
unsigned char *px;
/* Single data member */
void *data;
+ /* Current Transformation Matrix */
+ NR::Matrix ctm;
+
+ /* These hold background buffer state for filter rendering */
+ NRPixBlock *background_pb;
+ bool background_new;
+
void init(NRArena *arena) {
this->arena = arena;
}
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 (* 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, NR::Point p, double delta, unsigned int sticky);
};
@@ -151,7 +152,7 @@ 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);
void nr_arena_item_set_mask (NRArenaItem *item, NRArenaItem *mask);
void nr_arena_item_set_order (NRArenaItem *item, int order);
+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)