Code

revert jasper's way overzealous fix in png-write.cpp rev 13700; new fix in item_rende...
[inkscape.git] / src / display / nr-arena-item.h
index 737fed879f916612e67fb4e56d11a47d1db91791..103315c5eadd2ca4f316cc6c1e53b4938259dfa2 100644 (file)
 #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) {}
@@ -71,7 +68,8 @@ struct NRGC {
 };
 
 struct NRArenaItem : public NRObject {
-       Inkscape::GC::soft_ptr<NRArena> arena;
+
+       NRArena *arena;
        Inkscape::GC::soft_ptr<NRArenaItem> parent;
        NRArenaItem *next;
        Inkscape::GC::soft_ptr<NRArenaItem> prev;
@@ -89,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 */
@@ -102,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;
        }
@@ -121,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);
 };
@@ -150,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);
@@ -173,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)