Code

Fix crash in cycle-selection (and restructure internals).
[inkscape.git] / src / display / nr-arena-item.h
index 22b9929206acfc1be9b9867c3ae8e1ed4d9dbe14..d1b157775530d3015b95feac0cf2258bc3bccd48 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 {
-       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;
-  
-#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)
@@ -150,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);
@@ -164,14 +171,17 @@ NRArenaItem *nr_arena_item_unparent (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);
 
 /* Helpers */
 
@@ -184,4 +194,16 @@ NRArenaItem *nr_arena_item_detach (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:fileencoding=utf-8:textwidth=99 :