X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdisplay%2Fnr-arena-item.h;h=103315c5eadd2ca4f316cc6c1e53b4938259dfa2;hb=4ef05efc2175d330cdd17e09e855b1daf1436c38;hp=f43152ff9ba74363d202a532b6acb323b553bbd0;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/display/nr-arena-item.h b/src/display/nr-arena-item.h index f43152ff9..103315c5e 100644 --- a/src/display/nr-arena-item.h +++ b/src/display/nr-arena-item.h @@ -56,12 +56,10 @@ #include #include #include +#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 struct NRGC { NRGC(NRGC const *p) : parent(p) {} @@ -70,12 +68,11 @@ struct NRGC { }; struct NRArenaItem : public NRObject { - NRArenaItem(); NRArena *arena; - NRArenaItem *parent; + Inkscape::GC::soft_ptr parent; NRArenaItem *next; - NRArenaItem *prev; + Inkscape::GC::soft_ptr prev; /* Item state */ unsigned int state : 16; @@ -90,11 +87,6 @@ struct NRArenaItem : public NRObject { /* 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 */ @@ -103,12 +95,21 @@ struct NRArenaItem : public NRObject { 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; } @@ -122,7 +123,7 @@ struct NRArenaItemClass : public NRObjectClass { 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); @@ -174,10 +175,12 @@ 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); +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)