summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2011-08-07 10:53:12 +0000
committerKrzysztof Kosiński <tweenk.pl@gmail.com>2011-08-07 10:53:12 +0000
commit75976ea07dba9b97186667524d0a76603de416af (patch)
tree4cb68dabb3cb7d5219e6ed6b660f0ded13fc25d3 /src/display
parentFix compilation (oops). (diff)
downloadinkscape-75976ea07dba9b97186667524d0a76603de416af.tar.gz
inkscape-75976ea07dba9b97186667524d0a76603de416af.zip
Rewrite NRArena -> Inkscape::Drawing. Call render and update
methods on the Drawing rather than on the root DrawingItem. (bzr r10347.1.25)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/Makefile_insert4
-rw-r--r--src/display/canvas-arena.cpp82
-rw-r--r--src/display/canvas-arena.h4
-rw-r--r--src/display/display-forward.h15
-rw-r--r--src/display/drawing-group.cpp6
-rw-r--r--src/display/drawing-group.h2
-rw-r--r--src/display/drawing-image.cpp8
-rw-r--r--src/display/drawing-image.h2
-rw-r--r--src/display/drawing-item.cpp42
-rw-r--r--src/display/drawing-item.h41
-rw-r--r--src/display/drawing-shape.cpp16
-rw-r--r--src/display/drawing-shape.h2
-rw-r--r--src/display/drawing-text.cpp10
-rw-r--r--src/display/drawing-text.h4
-rw-r--r--src/display/drawing.cpp159
-rw-r--r--src/display/drawing.h103
-rw-r--r--src/display/nr-arena.cpp198
-rw-r--r--src/display/nr-arena.h75
-rw-r--r--src/display/nr-filter-image.cpp19
-rw-r--r--src/display/nr-filter.cpp6
20 files changed, 393 insertions, 405 deletions
diff --git a/src/display/Makefile_insert b/src/display/Makefile_insert
index 1c51f19a0..1c7a21dae 100644
--- a/src/display/Makefile_insert
+++ b/src/display/Makefile_insert
@@ -23,6 +23,8 @@ ink_common_sources += \
display/canvas-text.h \
display/curve.cpp \
display/curve.h \
+ display/drawing.cpp \
+ display/drawing.h \
display/drawing-context.cpp \
display/drawing-context.h \
display/drawing-group.cpp \
@@ -45,8 +47,6 @@ ink_common_sources += \
display/guideline.h \
display/nr-3dutils.cpp \
display/nr-3dutils.h \
- display/nr-arena.h \
- display/nr-arena.cpp \
display/nr-arena-forward.h \
display/nr-filter-blend.cpp \
display/nr-filter-blend.h \
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index 81416fefb..6026ebd3f 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -15,7 +15,6 @@
#include "display/display-forward.h"
#include "display/sp-canvas-util.h"
#include "helper/sp-marshal.h"
-#include "display/nr-arena.h"
#include "display/canvas-arena.h"
#include "display/cairo-utils.h"
#include "display/drawing-context.h"
@@ -43,14 +42,8 @@ static gint sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event);
static gint sp_canvas_arena_send_event (SPCanvasArena *arena, GdkEvent *event);
-static void sp_canvas_arena_request_update (NRArena *arena, DrawingItem *item, void *data);
-static void sp_canvas_arena_request_render (NRArena *arena, NRRectL *area, void *data);
-
-NRArenaEventVector carenaev = {
- {NULL},
- sp_canvas_arena_request_update,
- sp_canvas_arena_request_render
-};
+static void sp_canvas_arena_request_update (SPCanvasArena *ca, DrawingItem *item);
+static void sp_canvas_arena_request_render (SPCanvasArena *ca, Geom::IntRect const &area);
static SPCanvasItemClass *parent_class;
static guint signals[LAST_SIGNAL] = {0};
@@ -108,21 +101,27 @@ sp_canvas_arena_init (SPCanvasArena *arena)
{
arena->sticky = FALSE;
- arena->arena = NRArena::create();
- nr_object_ref(arena->arena);
- arena->arena->canvasarena = arena;
- arena->arena->item_deleted.connect(
+ new (&arena->drawing) Inkscape::Drawing(arena);
+
+ Inkscape::DrawingGroup *root = new DrawingGroup(arena->drawing);
+ root->setPickChildren(true);
+ root->setCached(true);
+ arena->drawing.setRoot(root);
+
+ arena->drawing.signal_request_update.connect(
+ sigc::bind<0>(
+ sigc::ptr_fun(&sp_canvas_arena_request_update),
+ arena));
+ arena->drawing.signal_request_render.connect(
+ sigc::bind<0>(
+ sigc::ptr_fun(&sp_canvas_arena_request_render),
+ arena));
+ arena->drawing.signal_item_deleted.connect(
sigc::bind<0>(
sigc::ptr_fun(&sp_canvas_arena_item_deleted),
arena));
- arena->root = new DrawingGroup(arena->arena);
- arena->root->setPickChildren(true);
- arena->root->setCached(true);
-
arena->active = NULL;
-
- nr_active_object_add_listener ((NRActiveObject *) arena->arena, (NRObjectEventVector *) &carenaev, sizeof (carenaev), arena);
}
static void
@@ -130,11 +129,7 @@ sp_canvas_arena_destroy (GtkObject *object)
{
SPCanvasArena *arena = SP_CANVAS_ARENA (object);
- delete arena->root;
-
- nr_active_object_remove_listener_by_data ((NRActiveObject *) arena->arena, arena);
- nr_object_unref ((NRObject *) arena->arena);
- arena->arena = NULL;
+ arena->drawing.~Drawing();
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
@@ -151,9 +146,9 @@ sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned
arena->ctx.ctm = affine;
unsigned reset = flags & SP_CANVAS_UPDATE_AFFINE ? DrawingItem::STATE_ALL : 0;
- arena->root->update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_ALL, reset);
+ arena->drawing.update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_ALL, reset);
- Geom::OptIntRect b = arena->root->visualBounds();
+ Geom::OptIntRect b = arena->drawing.root()->visualBounds();
if (b) {
item->x1 = b->left() - 1;
item->y1 = b->top() - 1;
@@ -163,7 +158,7 @@ sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned
if (arena->cursor) {
/* Mess with enter/leave notifiers */
- DrawingItem *new_arena = arena->root->pick(arena->c, arena->arena->delta, arena->sticky);
+ DrawingItem *new_arena = arena->drawing.pick(arena->c, arena->drawing.delta, arena->sticky);
if (new_arena != arena->active) {
GdkEventCrossing ec;
ec.window = GTK_WIDGET (item->canvas)->window;
@@ -205,8 +200,8 @@ sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf)
Inkscape::DrawingContext ct(buf->ct, r->min());
- arena->root->update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_ALL, 0);
- arena->root->render(ct, *r, 0);
+ arena->drawing.update(Geom::IntRect::infinite(), arena->ctx);
+ arena->drawing.render(ct, *r);
}
static double
@@ -214,8 +209,8 @@ sp_canvas_arena_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_
{
SPCanvasArena *arena = SP_CANVAS_ARENA (item);
- arena->root->update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK, 0);
- DrawingItem *picked = arena->root->pick(p, arena->arena->delta, arena->sticky);
+ arena->drawing.update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK);
+ DrawingItem *picked = arena->drawing.pick(p, arena->drawing.delta, arena->sticky);
arena->picked = picked;
@@ -235,7 +230,7 @@ sp_canvas_arena_viewbox_changed (SPCanvasItem *item, Geom::IntRect const &new_ar
Geom::IntRect expanded = new_area;
Geom::IntPoint expansion(new_area.width()/2, new_area.height()/2);
expanded.expandBy(expansion);
- nr_arena_set_cache_limit(arena->arena, expanded);
+ arena->drawing.setCacheLimit(expanded);
}
static gint
@@ -260,8 +255,8 @@ sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event)
arena->c = Geom::Point(event->crossing.x, event->crossing.y);
/* fixme: Not sure abut this, but seems the right thing (Lauris) */
- arena->root->update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK, 0);
- arena->active = arena->root->pick(arena->c, arena->arena->delta, arena->sticky);
+ arena->drawing.update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK, 0);
+ arena->active = arena->drawing.pick(arena->c, arena->drawing.delta, arena->sticky);
ret = sp_canvas_arena_send_event (arena, event);
}
break;
@@ -279,8 +274,8 @@ sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event)
arena->c = Geom::Point(event->motion.x, event->motion.y);
/* fixme: Not sure abut this, but seems the right thing (Lauris) */
- arena->root->update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK, 0);
- new_arena = arena->root->pick(arena->c, arena->arena->delta, arena->sticky);
+ arena->drawing.update(Geom::IntRect::infinite(), arena->ctx, DrawingItem::STATE_PICK);
+ new_arena = arena->drawing.pick(arena->c, arena->drawing.delta, arena->sticky);
if (new_arena != arena->active) {
GdkEventCrossing ec;
ec.window = event->motion.window;
@@ -324,16 +319,16 @@ sp_canvas_arena_send_event (SPCanvasArena *arena, GdkEvent *event)
}
static void
-sp_canvas_arena_request_update (NRArena */*arena*/, DrawingItem */*item*/, void *data)
+sp_canvas_arena_request_update (SPCanvasArena *ca, DrawingItem */*item*/)
{
- sp_canvas_item_request_update (SP_CANVAS_ITEM (data));
+ sp_canvas_item_request_update (SP_CANVAS_ITEM (ca));
}
static void
-sp_canvas_arena_request_render (NRArena */*arena*/, NRRectL *area, void *data)
+sp_canvas_arena_request_render (SPCanvasArena *ca, Geom::IntRect const &area)
{
- if (!area) return;
- sp_canvas_request_redraw (SP_CANVAS_ITEM (data)->canvas, area->x0, area->y0, area->x1, area->y1);
+ SPCanvas *canvas = SP_CANVAS_ITEM (ca)->canvas;
+ sp_canvas_request_redraw (canvas, area.left(), area.top(), area.right(), area.bottom());
}
void
@@ -365,11 +360,10 @@ sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, NRR
Geom::OptIntRect area = r.upgrade_2geom();
if (!area) return;
Inkscape::DrawingContext ct(surface, area->min());
- ca->root->update(Geom::IntRect::infinite(), ca->ctx, DrawingItem::STATE_ALL, 0);
- ca->root->render(ct, *area, 0);
+ ca->drawing.update(Geom::IntRect::infinite(), ca->ctx);
+ ca->drawing.render(ct, *area);
}
-
/*
Local Variables:
mode:c++
diff --git a/src/display/canvas-arena.h b/src/display/canvas-arena.h
index e63a524f2..6c65bb0e5 100644
--- a/src/display/canvas-arena.h
+++ b/src/display/canvas-arena.h
@@ -16,6 +16,7 @@
#include <cairo.h>
#include <2geom/rect.h>
#include "display/display-forward.h"
+#include "display/drawing.h"
#include "display/drawing-item.h"
#include "display/sp-canvas.h"
#include "display/sp-canvas-item.h"
@@ -38,8 +39,7 @@ struct _SPCanvasArena {
guint sticky : 1;
Geom::Point c; // what is this?
- NRArena *arena;
- Inkscape::DrawingGroup *root;
+ Inkscape::Drawing drawing;
Inkscape::UpdateContext ctx;
Inkscape::DrawingItem *active;
diff --git a/src/display/display-forward.h b/src/display/display-forward.h
index d7e7d72ab..7dccb76ef 100644
--- a/src/display/display-forward.h
+++ b/src/display/display-forward.h
@@ -10,23 +10,30 @@ typedef struct _SPCanvasItemClass SPCanvasItemClass;
struct SPCanvasGroup;
struct SPCanvasGroupClass;
class SPCurve;
-
-class NRArena;
+typedef struct _SPCanvasArena SPCanvasArena;
namespace Inkscape {
-class DrawingContext;
-class DrawingSurface;
+class Drawing;
class DrawingItem;
class DrawingGroup;
class DrawingImage;
class DrawingShape;
class DrawingGlyphs;
class DrawingText;
+class UpdateContext;
+
+class DrawingContext;
+class DrawingSurface;
+class DrawingCache;
namespace Display {
class TemporaryItem;
class TemporaryItemList;
}
+
+namespace Filters {
+ class Filter;
+}
}
#endif /* !SEEN_DISPLAY_DISPLAY_FORWARD_H */
diff --git a/src/display/drawing-group.cpp b/src/display/drawing-group.cpp
index feaa7622a..38ab73ca2 100644
--- a/src/display/drawing-group.cpp
+++ b/src/display/drawing-group.cpp
@@ -10,16 +10,16 @@
*/
#include "display/cairo-utils.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
#include "display/drawing-group.h"
#include "libnr/nr-values.h"
-#include "nr-arena.h"
#include "style.h"
namespace Inkscape {
-DrawingGroup::DrawingGroup(Drawing *drawing)
+DrawingGroup::DrawingGroup(Drawing &drawing)
: DrawingItem(drawing)
, _style(NULL)
, _child_transform(NULL)
@@ -75,7 +75,7 @@ unsigned
DrawingGroup::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset)
{
unsigned beststate = STATE_ALL;
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) {
UpdateContext child_ctx(ctx);
diff --git a/src/display/drawing-group.h b/src/display/drawing-group.h
index 072944b6c..7b0645bf4 100644
--- a/src/display/drawing-group.h
+++ b/src/display/drawing-group.h
@@ -22,7 +22,7 @@ class DrawingGroup
: public DrawingItem
{
public:
- DrawingGroup(Drawing *drawing);
+ DrawingGroup(Drawing &drawing);
~DrawingGroup();
bool pickChildren() { return _pick_children; }
diff --git a/src/display/drawing-image.cpp b/src/display/drawing-image.cpp
index 879809cfa..64601354d 100644
--- a/src/display/drawing-image.cpp
+++ b/src/display/drawing-image.cpp
@@ -10,15 +10,15 @@
*/
#include "display/cairo-utils.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-image.h"
-#include "nr-arena.h"
#include "preferences.h"
#include "style.h"
namespace Inkscape {
-DrawingImage::DrawingImage(Drawing *drawing)
+DrawingImage::DrawingImage(Drawing &drawing)
: DrawingItem(drawing)
, _pixbuf(NULL)
, _surface(NULL)
@@ -115,7 +115,7 @@ DrawingImage::_updateItem(Geom::IntRect const &, UpdateContext const &, unsigned
void
DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags)
{
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
if (!outline) {
if (!_pixbuf) return;
@@ -200,7 +200,7 @@ DrawingImage::_pickItem(Geom::Point const &p, double delta, bool /*sticky*/)
{
if (!_pixbuf) return NULL;
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
if (outline) {
Geom::Rect r = bounds();
diff --git a/src/display/drawing-image.h b/src/display/drawing-image.h
index d66395aab..de8591221 100644
--- a/src/display/drawing-image.h
+++ b/src/display/drawing-image.h
@@ -24,7 +24,7 @@ class DrawingImage
: public DrawingItem
{
public:
- DrawingImage(Drawing *drawing);
+ DrawingImage(Drawing &drawing);
~DrawingImage();
void setARGB32Pixbuf(GdkPixbuf *pb);
diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp
index 53639f765..47f6c55a1 100644
--- a/src/display/drawing-item.cpp
+++ b/src/display/drawing-item.cpp
@@ -11,11 +11,11 @@
#include "display/cairo-utils.h"
#include "display/cairo-templates.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
#include "display/drawing-group.h"
#include "display/drawing-surface.h"
-#include "nr-arena.h"
#include "nr-filter.h"
#include "preferences.h"
#include "style.h"
@@ -42,7 +42,7 @@ namespace Inkscape {
* has been deleted.
*/
-DrawingItem::DrawingItem(Drawing *drawing)
+DrawingItem::DrawingItem(Drawing &drawing)
: _drawing(drawing)
, _parent(NULL)
, _key(0)
@@ -61,21 +61,21 @@ DrawingItem::DrawingItem(Drawing *drawing)
// , _renders_opacity(0)
, _clip_child(0)
, _mask_child(0)
+ , _drawing_root(0)
, _pick_children(0)
{
- nr_object_ref(_drawing);
}
DrawingItem::~DrawingItem()
{
- _drawing->item_deleted.emit(this);
+ _drawing.signal_item_deleted.emit(this);
//if (!_children.empty()) {
// g_warning("Removing item with children");
//}
// remove from the set of cached items
if (_cached) {
- _drawing->cached_items.erase(this);
+ _drawing._cached_items.erase(this);
}
// remove this item from parent's children list
// due to the effect of clearChildren(), this only happens for the top-level deleted item
@@ -92,13 +92,14 @@ DrawingItem::~DrawingItem()
_parent->_children.erase(ithis);
}
_parent->_markForUpdate(STATE_ALL, false);
+ } else if (_drawing_root) {
+ _drawing._root = NULL;
}
clearChildren();
delete _transform;
delete _clip;
delete _mask;
delete _filter;
- nr_object_unref(_drawing);
}
DrawingItem *
@@ -187,9 +188,9 @@ DrawingItem::setCached(bool c)
{
_cached = c;
if (c) {
- _drawing->cached_items.insert(this);
+ _drawing._cached_items.insert(this);
} else {
- _drawing->cached_items.erase(this);
+ _drawing._cached_items.erase(this);
}
_markForUpdate(STATE_CACHE, false);
}
@@ -266,8 +267,8 @@ DrawingItem::setItemBounds(Geom::OptRect const &bounds)
void
DrawingItem::update(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset)
{
- bool render_filters = (_drawing->rendermode == Inkscape::RENDERMODE_NORMAL);
- bool outline = (_drawing->rendermode == Inkscape::RENDERMODE_OUTLINE);
+ bool render_filters = _drawing.renderFilters();
+ bool outline = _drawing.outline();
// Set reset flags according to propagation status
if (_propagate) {
@@ -324,7 +325,7 @@ DrawingItem::update(Geom::IntRect const &area, UpdateContext const &ctx, unsigne
// update cache if enabled
if (_cached) {
- Geom::OptIntRect cl = _drawing->cache_limit;
+ Geom::OptIntRect cl = _drawing.cacheLimit();
cl.intersectWith(_drawbox);
if (cl) {
if (_cache) {
@@ -373,8 +374,8 @@ struct MaskLuminanceToAlpha {
void
DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags)
{
- bool outline = (_drawing->rendermode == Inkscape::RENDERMODE_OUTLINE);
- bool render_filters = (_drawing->rendermode == Inkscape::RENDERMODE_NORMAL);
+ bool outline = _drawing.outline();
+ bool render_filters = _drawing.renderFilters();
/* If we are invisible, just return successfully */
if (!_visible) return;
@@ -530,19 +531,19 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig
_renderItem(ct, *carea, flags);
// render clip and mask, if any
- guint32 saved_rgba = _drawing->outlinecolor; // save current outline color
+ guint32 saved_rgba = _drawing.outlinecolor; // save current outline color
// render clippath as an object, using a different color
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (_clip) {
- _drawing->outlinecolor = prefs->getInt("/options/wireframecolors/clips", 0x00ff00ff); // green clips
+ _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/clips", 0x00ff00ff); // green clips
_clip->render(ct, *carea, flags);
}
// render mask as an object, using a different color
if (_mask) {
- _drawing->outlinecolor = prefs->getInt("/options/wireframecolors/masks", 0x0000ffff); // blue masks
+ _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/masks", 0x0000ffff); // blue masks
_mask->render(ct, *carea, flags);
}
- _drawing->outlinecolor = saved_rgba; // restore outline color
+ _drawing.outlinecolor = saved_rgba; // restore outline color
}
/** @brief Rasterize the clipping path.
@@ -624,7 +625,7 @@ DrawingItem::pick(Geom::Point const &p, double delta, bool sticky)
void
DrawingItem::_markForRendering()
{
- bool outline = (_drawing->rendermode == Inkscape::RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
Geom::OptIntRect dirty = outline ? _bbox : _drawbox;
if (!dirty) return;
@@ -634,8 +635,7 @@ DrawingItem::_markForRendering()
i->_cache->markDirty(*dirty);
}
}
-
- nr_arena_request_render_rect (_drawing, dirty);
+ _drawing.signal_request_render.emit(*dirty);
}
/** @brief Marks the item as needing a recomputation of internal data.
@@ -665,7 +665,7 @@ DrawingItem::_markForUpdate(unsigned flags, bool propagate)
if (_parent) {
_parent->_markForUpdate(flags, false);
} else {
- nr_arena_request_update (_drawing, this);
+ _drawing.signal_request_update.emit(this);
}
}
}
diff --git a/src/display/drawing-item.h b/src/display/drawing-item.h
index f26c65df5..ba0c42695 100644
--- a/src/display/drawing-item.h
+++ b/src/display/drawing-item.h
@@ -13,22 +13,16 @@
#define SEEN_INKSCAPE_DISPLAY_DRAWING_ITEM_H
#include <exception>
+#include <boost/utility.hpp>
#include <boost/intrusive/list.hpp>
#include <2geom/rect.h>
#include <2geom/affine.h>
+#include "display/display-forward.h"
-class NRArena;
class SPStyle;
-void nr_arena_set_cache_limit(NRArena *, Geom::OptIntRect const &);
namespace Inkscape {
-typedef ::NRArena Drawing;
-class DrawingContext;
-class DrawingCache;
-class DrawingItem;
-namespace Filters { class Filter; }
-
struct UpdateContext {
Geom::Affine ctm;
};
@@ -39,10 +33,8 @@ class InvalidItemException : public std::exception {
}
};
-typedef boost::intrusive::list_base_hook<> ChildrenListHook;
-
class DrawingItem
- : public ChildrenListHook
+ : boost::noncopyable
{
public:
enum RenderFlags {
@@ -59,9 +51,8 @@ public:
STATE_RENDER = (1<<4), // can be rendered
STATE_ALL = (1<<5)-1
};
- typedef boost::intrusive::list<DrawingItem> ChildrenList;
- DrawingItem(Drawing *drawing);
+ DrawingItem(Drawing &drawing);
virtual ~DrawingItem();
Geom::OptIntRect geometricBounds() const { return _bbox; }
@@ -69,7 +60,7 @@ public:
Geom::OptRect itemBounds() const { return _item_bbox; }
Geom::Affine ctm() const { return _ctm; }
Geom::Affine transform() const { return _transform ? *_transform : Geom::identity(); }
- Drawing *drawing() const { return _drawing; }
+ Drawing &drawing() const { return _drawing; }
DrawingItem *parent() const;
void appendChild(DrawingItem *item);
@@ -112,11 +103,21 @@ protected:
virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, bool sticky = false) { return NULL; }
virtual bool _canClip() { return false; }
- Drawing *_drawing;
+ // member variables start here
+
+ Drawing &_drawing;
DrawingItem *_parent;
+
+ typedef boost::intrusive::list_member_hook<> ListHook;
+ ListHook _child_hook;
+
+ typedef boost::intrusive::list<
+ DrawingItem,
+ boost::intrusive::member_hook<DrawingItem, ListHook, &DrawingItem::_child_hook>
+ > ChildrenList;
ChildrenList _children;
- unsigned _key; ///< Some SPItems can have more than one NRArenaItem;
+ unsigned _key; ///< Some SPItems can have more than one DrawingItem;
/// this value is a hack used to distinguish between them
float _opacity;
@@ -140,12 +141,14 @@ protected:
//unsigned _renders_opacity : 1; ///< Whether object needs temporary surface for opacity
unsigned _clip_child : 1; ///< If set, this is not a child of _parent, but a clipping path
unsigned _mask_child : 1; ///< If set, this is not a child of _parent, but a mask
+ unsigned _drawing_root : 1; ///< If set, this is the root item of Drawing
unsigned _pick_children : 1; ///< For groups: if true, children are returned from pick(),
/// otherwise the group is returned
- // temporary hacks until I rewrite NRArena to Inkscape::Drawing
- friend class NRArena;
- friend void ::nr_arena_set_cache_limit(NRArena *, Geom::OptIntRect const &);
+ friend class Drawing;
+
+private:
+ DrawingItem(DrawingItem const &);
};
struct DeleteDisposer {
diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp
index 602aa2515..1e41bf5dd 100644
--- a/src/display/drawing-shape.cpp
+++ b/src/display/drawing-shape.cpp
@@ -19,10 +19,10 @@
#include "display/canvas-arena.h"
#include "display/canvas-bpath.h"
#include "display/curve.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-group.h"
#include "display/drawing-shape.h"
-#include "display/nr-arena.h"
#include "helper/geom-curves.h"
#include "helper/geom.h"
#include "libnr/nr-convert2geom.h"
@@ -32,7 +32,7 @@
namespace Inkscape {
-DrawingShape::DrawingShape(Drawing *drawing)
+DrawingShape::DrawingShape(Drawing &drawing)
: DrawingItem(drawing)
, _curve(NULL)
, _style(NULL)
@@ -112,7 +112,7 @@ DrawingShape::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, u
}
boundingbox = Geom::OptRect();
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
// clear Cairo data to force update
_nrstyle.update();
@@ -163,10 +163,10 @@ DrawingShape::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne
if (!_curve || !_style) return;
if (!area.intersects(_bbox)) return; // skip if not within bounding box
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
if (outline) {
- guint32 rgba = _drawing->outlinecolor;
+ guint32 rgba = _drawing.outlinecolor;
{ Inkscape::DrawingContext::Save save(ct);
ct.transform(_ctm);
@@ -243,7 +243,7 @@ DrawingShape::_pickItem(Geom::Point const &p, double delta, bool /*sticky*/)
if (!_curve) return NULL;
if (!_style) return NULL;
- bool outline = (_drawing->rendermode == RENDERMODE_OUTLINE);
+ bool outline = _drawing.outline();
if (SP_SCALE24_TO_FLOAT(_style->opacity.value) == 0 && !outline)
// fully transparent, no pick unless outline mode
@@ -267,8 +267,8 @@ DrawingShape::_pickItem(Geom::Point const &p, double delta, bool /*sticky*/)
bool needfill = (_nrstyle.fill.type != NRStyle::PAINT_NONE
&& _nrstyle.fill.opacity > 1e-3 && !outline);
- if (_drawing->canvasarena) {
- Geom::Rect viewbox = _drawing->canvasarena->item.canvas->getViewbox();
+ if (_drawing.arena()) {
+ Geom::Rect viewbox = _drawing.arena()->item.canvas->getViewbox();
viewbox.expandBy (width);
pathv_matrix_point_bbox_wind_distance(_curve->get_pathvector(), _ctm, p, NULL, needfill? &wind : NULL, &dist, 0.5, &viewbox);
} else {
diff --git a/src/display/drawing-shape.h b/src/display/drawing-shape.h
index 4b7b75e2a..153dcd54e 100644
--- a/src/display/drawing-shape.h
+++ b/src/display/drawing-shape.h
@@ -24,7 +24,7 @@ class DrawingShape
: public DrawingItem
{
public:
- DrawingShape(Drawing *drawing);
+ DrawingShape(Drawing &drawing);
~DrawingShape();
void setPath(SPCurve *curve);
diff --git a/src/display/drawing-text.cpp b/src/display/drawing-text.cpp
index 5fc732779..2f0881c49 100644
--- a/src/display/drawing-text.cpp
+++ b/src/display/drawing-text.cpp
@@ -11,17 +11,17 @@
#include "display/cairo-utils.h"
#include "display/canvas-bpath.h" // for SPWindRule (WTF!)
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-surface.h"
#include "display/drawing-text.h"
-#include "display/nr-arena.h"
#include "helper/geom.h"
#include "libnrtype/font-instance.h"
#include "style.h"
namespace Inkscape {
-DrawingGlyphs::DrawingGlyphs(Drawing *drawing)
+DrawingGlyphs::DrawingGlyphs(Drawing &drawing)
: DrawingItem(drawing)
, _glyph_transform(NULL)
, _font(NULL)
@@ -115,7 +115,7 @@ DrawingGlyphs::_pickItem(Geom::Point const &p, double delta, bool /*sticky*/)
-DrawingText::DrawingText(Drawing *drawing)
+DrawingText::DrawingText(Drawing &drawing)
: DrawingGroup(drawing)
{}
@@ -164,9 +164,9 @@ DrawingText::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, un
void
DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags)
{
- if (_drawing->rendermode == RENDERMODE_OUTLINE) {
+ if (_drawing.outline()) {
DrawingContext::Save save(ct);
- guint32 rgba = _drawing->outlinecolor;
+ guint32 rgba = _drawing.outlinecolor;
ct.setSource(rgba);
ct.setTolerance(1.25); // low quality, but good enough for outline mode
ct.newPath();
diff --git a/src/display/drawing-text.h b/src/display/drawing-text.h
index f95a5073c..671f8f64e 100644
--- a/src/display/drawing-text.h
+++ b/src/display/drawing-text.h
@@ -24,7 +24,7 @@ class DrawingGlyphs
: public DrawingItem
{
public:
- DrawingGlyphs(Drawing *drawing);
+ DrawingGlyphs(Drawing &drawing);
~DrawingGlyphs();
void setGlyph(font_instance *font, int glyph, Geom::Affine const &trans);
@@ -46,7 +46,7 @@ class DrawingText
: public DrawingGroup
{
public:
- DrawingText(Drawing *drawing);
+ DrawingText(Drawing &drawing);
~DrawingText();
void clear();
diff --git a/src/display/drawing.cpp b/src/display/drawing.cpp
new file mode 100644
index 000000000..22bd84587
--- /dev/null
+++ b/src/display/drawing.cpp
@@ -0,0 +1,159 @@
+/**
+ * @file
+ * @brief SVG drawing for display
+ *//*
+ * Authors:
+ * Krzysztof Kosiński <tweenk.pl@gmail.com>
+ *
+ * Copyright (C) 2011 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "display/drawing.h"
+#include "nr-filter-gaussian.h"
+#include "nr-filter-types.h"
+
+namespace Inkscape {
+
+Drawing::Drawing(SPCanvasArena *arena)
+ : _root(NULL)
+ , outlinecolor(0x000000ff)
+ , delta(0)
+ , _exact(false)
+ , _rendermode(RENDERMODE_NORMAL)
+ , _colormode(COLORMODE_NORMAL)
+ , _blur_quality(BLUR_QUALITY_BEST)
+ , _filter_quality(Filters::FILTER_QUALITY_BEST)
+ , _canvasarena(arena)
+{
+
+}
+
+Drawing::~Drawing()
+{
+ delete _root;
+}
+
+void
+Drawing::setRoot(DrawingItem *item)
+{
+ delete _root;
+ _root = item;
+ _root->_drawing_root = true;
+}
+
+RenderMode
+Drawing::renderMode() const
+{
+ return _exact ? RENDERMODE_NORMAL : _rendermode;
+}
+ColorMode
+Drawing::colorMode() const
+{
+ return (outline() || _exact) ? COLORMODE_NORMAL : _colormode;
+}
+bool
+Drawing::outline() const
+{
+ return renderMode() == RENDERMODE_OUTLINE;
+}
+bool
+Drawing::renderFilters() const
+{
+ return renderMode() == RENDERMODE_NORMAL;
+}
+int
+Drawing::blurQuality() const
+{
+ if (renderMode() == RENDERMODE_NORMAL) {
+ return _exact ? BLUR_QUALITY_BEST : _blur_quality;
+ } else {
+ return BLUR_QUALITY_WORST;
+ }
+}
+int
+Drawing::filterQuality() const
+{
+ if (renderMode() == RENDERMODE_NORMAL) {
+ return _exact ? Filters::FILTER_QUALITY_BEST : _filter_quality;
+ } else {
+ return Filters::FILTER_QUALITY_WORST;
+ }
+}
+
+void
+Drawing::setRenderMode(RenderMode mode)
+{
+ _rendermode = mode;
+}
+void
+Drawing::setColorMode(ColorMode mode)
+{
+ _colormode = mode;
+}
+void
+Drawing::setBlurQuality(int q)
+{
+ _blur_quality = q;
+}
+void
+Drawing::setFilterQuality(int q)
+{
+ _filter_quality = q;
+}
+void
+Drawing::setExact(bool e)
+{
+ _exact = e;
+}
+
+Geom::OptIntRect const &
+Drawing::cacheLimit() const
+{
+ return _cache_limit;
+}
+void
+Drawing::setCacheLimit(Geom::OptIntRect const &r)
+{
+ _cache_limit = r;
+ for (std::set<DrawingItem *>::iterator i = _cached_items.begin();
+ i != _cached_items.end(); ++i)
+ {
+ (*i)->_markForUpdate(DrawingItem::STATE_CACHE, false);
+ }
+}
+
+void
+Drawing::update(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset)
+{
+ // TODO add autocache
+ if (!_root) return;
+ _root->update(area, ctx, flags, reset);
+}
+
+void
+Drawing::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags)
+{
+ if (!_root) return;
+ _root->render(ct, area, flags);
+}
+
+DrawingItem *
+Drawing::pick(Geom::Point const &p, double delta, bool sticky)
+{
+ if (!_root) return NULL;
+ return _root->pick(p, delta, sticky);
+}
+
+} // end namespace Inkscape
+
+/*
+ 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 :
diff --git a/src/display/drawing.h b/src/display/drawing.h
new file mode 100644
index 000000000..4560d277d
--- /dev/null
+++ b/src/display/drawing.h
@@ -0,0 +1,103 @@
+/**
+ * @file
+ * @brief SVG drawing for display
+ *//*
+ * Authors:
+ * Krzysztof Kosiński <tweenk.pl@gmail.com>
+ *
+ * Copyright (C) 2011 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_INKSCAPE_DISPLAY_DRAWING_H
+#define SEEN_INKSCAPE_DISPLAY_DRAWING_H
+
+#include <set>
+#include <boost/utility.hpp>
+#include <sigc++/sigc++.h>
+#include <2geom/rect.h>
+#include "display/display-forward.h"
+#include "display/drawing-item.h"
+#include "display/rendermode.h"
+
+namespace Inkscape {
+
+struct OutlineColors {
+ guint32 paths;
+ guint32 clippaths;
+ guint32 masks;
+ guint32 images;
+};
+
+class Drawing
+ : boost::noncopyable
+{
+public:
+ Drawing(SPCanvasArena *arena = NULL);
+ ~Drawing();
+
+ DrawingItem *root() { return _root; }
+ SPCanvasArena *arena() { return _canvasarena; }
+ void setRoot(DrawingItem *item);
+
+ RenderMode renderMode() const;
+ ColorMode colorMode() const;
+ bool outline() const;
+ bool renderFilters() const;
+ int blurQuality() const;
+ int filterQuality() const;
+ void setRenderMode(RenderMode mode);
+ void setColorMode(ColorMode mode);
+ void setBlurQuality(int q);
+ void setFilterQuality(int q);
+ void setExact(bool e);
+
+ Geom::OptIntRect const &cacheLimit() const;
+ void setCacheLimit(Geom::OptIntRect const &r);
+
+ OutlineColors const &colors() const { return _colors; }
+
+ void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = DrawingItem::STATE_ALL, unsigned reset = 0);
+ void render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags = 0);
+ DrawingItem *pick(Geom::Point const &p, double delta, bool sticky);
+
+ sigc::signal<void, DrawingItem *> signal_request_update;
+ sigc::signal<void, Geom::IntRect const &> signal_request_render;
+ sigc::signal<void, DrawingItem *> signal_item_deleted;
+
+private:
+ DrawingItem *_root;
+ std::set<DrawingItem *> _cached_items;
+public:
+ // TODO: remove these temporarily public members
+ guint32 outlinecolor;
+ double delta;
+private:
+ bool _exact; // if true then rendering must be exact
+ RenderMode _rendermode;
+ ColorMode _colormode;
+ int _blur_quality;
+ int _filter_quality;
+ Geom::OptIntRect _cache_limit;
+
+ OutlineColors _colors;
+
+ SPCanvasArena *_canvasarena; // may be NULL is this arena is not the screen but used for export etc.
+
+ friend class DrawingItem;
+};
+
+} // end namespace Inkscape
+
+#endif // !SEEN_INKSCAPE_DRAWING_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 :
diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp
deleted file mode 100644
index b3e962201..000000000
--- a/src/display/nr-arena.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-#define __NR_ARENA_C__
-
-/*
- * RGBA display list system for inkscape
- *
- * Author:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * Copyright (C) 2001-2002 Lauris Kaplinski
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#include "display/drawing-item.h"
-#include "display/nr-arena.h"
-#include "display/nr-filter-gaussian.h"
-#include "display/nr-filter-types.h"
-#include "preferences.h"
-#include "color.h"
-#include "libnr/nr-rect.h"
-#include "libnr/nr-rect-l.h"
-
-static void nr_arena_class_init (NRArenaClass *klass);
-static void nr_arena_init (NRArena *arena);
-static void nr_arena_finalize (NRObject *object);
-
-static NRActiveObjectClass *parent_class;
-
-NRType
-nr_arena_get_type (void)
-{
- static NRType type = 0;
- if (!type) {
- type = nr_object_register_type (NR_TYPE_ACTIVE_OBJECT,
- "NRArena",
- sizeof (NRArenaClass),
- sizeof (NRArena),
- (void (*) (NRObjectClass *)) nr_arena_class_init,
- (void (*) (NRObject *)) nr_arena_init);
- }
- return type;
-}
-
-static void
-nr_arena_class_init (NRArenaClass *klass)
-{
- NRObjectClass *object_class = (NRObjectClass *) klass;
-
- parent_class = (NRActiveObjectClass *) (((NRObjectClass *) klass)->parent);
-
- object_class->finalize = nr_arena_finalize;
- object_class->cpp_ctor = NRObject::invoke_ctor<NRArena>;
-}
-
-static void
-nr_arena_init (NRArena *arena)
-{
- arena->delta = 0; // to be set by desktop from prefs
- arena->renderoffscreen = false; // use render values from preferences otherwise render exact
- arena->rendermode = Inkscape::RENDERMODE_NORMAL; // default is normal render
- arena->colormode = Inkscape::COLORMODE_NORMAL; // default is normal color
- arena->blurquality = BLUR_QUALITY_NORMAL;
- arena->filterquality = Inkscape::Filters::FILTER_QUALITY_NORMAL;
- arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
- arena->canvasarena = NULL;
-}
-
-static void
-nr_arena_finalize (NRObject *object)
-{
- ((NRObjectClass *) (parent_class))->finalize (object);
-}
-
-void
-nr_arena_request_update (NRArena *arena, Inkscape::DrawingItem *item)
-{
- NRActiveObject *aobject = (NRActiveObject *) arena;
-
- nr_return_if_fail (arena != NULL);
- nr_return_if_fail (NR_IS_ARENA (arena));
- nr_return_if_fail (item != NULL);
-
- // setup render parameter
- if (arena->renderoffscreen == false) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
- arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
- } else {
- arena->blurquality = BLUR_QUALITY_BEST;
- arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
- arena->rendermode = Inkscape::RENDERMODE_NORMAL;
- arena->colormode = Inkscape::COLORMODE_NORMAL;
- }
-
- if (aobject->callbacks) {
- for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
- NRObjectListener *listener = aobject->callbacks->listeners + i;
- NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
- if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_update) {
- avector->request_update (arena, item, listener->data);
- }
- }
- }
-}
-
-void
-nr_arena_request_render_rect (NRArena *arena, Geom::OptIntRect const &area)
-{
- NRActiveObject *aobject = (NRActiveObject *) arena;
-
- nr_return_if_fail (arena != NULL);
- nr_return_if_fail (NR_IS_ARENA (arena));
- if (!area) return;
-
- // setup render parameter
- if (arena->renderoffscreen == false) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- arena->blurquality = prefs->getInt("/options/blurquality/value", 0);
- arena->filterquality = prefs->getInt("/options/filterquality/value", 0);
- } else {
- arena->blurquality = BLUR_QUALITY_BEST;
- arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
- arena->rendermode = Inkscape::RENDERMODE_NORMAL;
- arena->colormode = Inkscape::COLORMODE_NORMAL;
- }
- NRRectL nr_area(*area);
- if (aobject->callbacks) {
- for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
- NRObjectListener *listener = aobject->callbacks->listeners + i;
- NRArenaEventVector *avector = (NRArenaEventVector *) listener->vector;
- if ((listener->size >= sizeof (NRArenaEventVector)) && avector->request_render) {
- avector->request_render (arena, &nr_area, listener->data);
- }
- }
- }
-}
-
-/**
- set arena to offscreen mode
- rendering will be exact
- @param arena NRArena object
-*/
-void
-nr_arena_set_renderoffscreen (NRArena *arena)
-{
- nr_return_if_fail (arena != NULL);
- nr_return_if_fail (NR_IS_ARENA (arena));
-
- // the real assignment to the quality indicators is in the update function
- arena->renderoffscreen = true;
-
-}
-
-void
-nr_arena_set_cache_limit (NRArena *arena, Geom::OptIntRect const &cache_limit)
-{
- arena->cache_limit = cache_limit;
- for (std::set<Inkscape::DrawingItem *>::iterator i = arena->cached_items.begin();
- i != arena->cached_items.end(); ++i)
- {
- (*i)->_markForUpdate(Inkscape::DrawingItem::STATE_CACHE, false);
- }
-}
-
-#define FLOAT_TO_UINT8(f) (int(f*255))
-#define RGBA_R(v) ((v) >> 24)
-#define RGBA_G(v) (((v) >> 16) & 0xff)
-#define RGBA_B(v) (((v) >> 8) & 0xff)
-#define RGBA_A(v) ((v) & 0xff)
-
-void nr_arena_separate_color_plates(guint32* rgba){
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool render_cyan = prefs->getBool("/options/printcolorspreview/cyan", true);
- bool render_magenta = prefs->getBool("/options/printcolorspreview/magenta", true);
- bool render_yellow = prefs->getBool("/options/printcolorspreview/yellow", true);
- bool render_black = prefs->getBool("/options/printcolorspreview/black", true);
-
- float rgb_v[3];
- float cmyk_v[4];
- sp_color_rgb_to_cmyk_floatv (cmyk_v, RGBA_R(*rgba)/256.0, RGBA_G(*rgba)/256.0, RGBA_B(*rgba)/256.0);
- sp_color_cmyk_to_rgb_floatv (rgb_v, render_cyan ? cmyk_v[0] : 0,
- render_magenta ? cmyk_v[1] : 0,
- render_yellow ? cmyk_v[2] : 0,
- render_black ? cmyk_v[3] : 0);
- *rgba = (FLOAT_TO_UINT8(rgb_v[0])<<24) + (FLOAT_TO_UINT8(rgb_v[1])<<16) + (FLOAT_TO_UINT8(rgb_v[2])<<8) + 0xff;
-}
-
-/*
- 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 :
diff --git a/src/display/nr-arena.h b/src/display/nr-arena.h
deleted file mode 100644
index a444ed505..000000000
--- a/src/display/nr-arena.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef __NR_ARENA_H__
-#define __NR_ARENA_H__
-
-/*
- * RGBA display list system for inkscape
- *
- * Author:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * Copyright (C) 2001-2002 Lauris Kaplinski
- * Copyright (C) 2001 Ximian, Inc.
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#include <set>
-#include <glib/gmacros.h>
-#include <sigc++/sigc++.h>
-#include <2geom/rect.h>
-#include "display/rendermode.h"
-#include "libnr/nr-forward.h"
-#include "libnr/nr-object.h"
-#include "display/display-forward.h"
-
-G_BEGIN_DECLS
-
-typedef struct _SPCanvasArena SPCanvasArena;
-
-G_END_DECLS
-
-#define NR_TYPE_ARENA (nr_arena_get_type ())
-#define NR_ARENA(o) (NR_CHECK_INSTANCE_CAST ((o), NR_TYPE_ARENA, NRArena))
-#define NR_IS_ARENA(o) (NR_CHECK_INSTANCE_TYPE ((o), NR_TYPE_ARENA))
-
-class SPPainter;
-
-NRType nr_arena_get_type (void);
-
-struct NRArenaEventVector {
- NRObjectEventVector parent;
- void (* request_update) (NRArena *arena, Inkscape::DrawingItem *item, void *data);
- void (* request_render) (NRArena *arena, NRRectL *area, void *data);
-};
-
-struct NRArena : public NRActiveObject {
- static NRArena *create() {
- return reinterpret_cast<NRArena *>(nr_object_new(NR_TYPE_ARENA));
- }
-
- double delta;
- bool renderoffscreen; // if true then rendering must be exact
- Inkscape::RenderMode rendermode;
- Inkscape::ColorMode colormode;
- int blurquality; // will be updated during update from preferences
- int filterquality; // will be updated during update from preferences
- Geom::OptIntRect cache_limit;
- std::set<Inkscape::DrawingItem *> cached_items;
-
- guint32 outlinecolor;
- SPCanvasArena *canvasarena; // may be NULL is this arena is not the screen but used for export etc.
-
- sigc::signal<void, Inkscape::DrawingItem *> item_deleted;
-};
-
-struct NRArenaClass : public NRActiveObjectClass {
-};
-
-void nr_arena_request_update (NRArena *arena, Inkscape::DrawingItem *item);
-void nr_arena_request_render_rect (NRArena *arena, Geom::OptIntRect const &area);
-void nr_arena_set_renderoffscreen (NRArena *arena);
-void nr_arena_set_cache_limit (NRArena *arena, Geom::OptIntRect const &cache_limit);
-
-void nr_arena_separate_color_plates(guint32* rgba);
-
-#endif
diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
index 55cd02697..b176cdcef 100644
--- a/src/display/nr-filter-image.cpp
+++ b/src/display/nr-filter-image.cpp
@@ -14,7 +14,7 @@
#include "sp-item.h"
#include "display/cairo-utils.h"
#include "display/drawing-context.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-item.h"
#include "display/nr-filter.h"
#include "display/nr-filter-image.h"
@@ -73,18 +73,17 @@ void FilterImage::render_cairo(FilterSlot &slot)
// like the one for DrawingItems
document->ensureUpToDate();
- NRArena* arena = NRArena::create();
+ Drawing drawing;
Geom::OptRect optarea = SVGElem->getBounds(Geom::identity());
if (!optarea) return;
unsigned const key = SPItem::display_key_new(1);
- DrawingItem *ai = SVGElem->invoke_show(arena, key, SP_ITEM_SHOW_DISPLAY);
-
+ DrawingItem *ai = SVGElem->invoke_show(drawing, key, SP_ITEM_SHOW_DISPLAY);
if (!ai) {
- g_warning("feImage renderer: error creating NRArenaItem for SVG Element");
- nr_object_unref((NRObject *) arena);
+ g_warning("feImage renderer: error creating DrawingItem for SVG Element");
return;
}
+ drawing.setRoot(ai);
Geom::Rect area = *optarea;
Geom::Affine pu2pb = slot.get_units().get_matrix_primitiveunits2pb();
@@ -104,13 +103,9 @@ void FilterImage::render_cairo(FilterSlot &slot)
ct.translate(render_rect.min());
// Update to renderable state
- UpdateContext ctx;
- ai->setTransform(Geom::identity());
- ai->update(render_rect, ctx, DrawingItem::STATE_ALL, 0);
- ai->render(ct, render_rect, DrawingItem::RENDER_BYPASS_CACHE);
+ drawing.update(render_rect);
+ drawing.render(ct, render_rect);
SVGElem->invoke_hide(key);
- //delete ai; // should be deleted by hide() above
- nr_object_unref((NRObject*) arena);
slot.set(_output, out);
cairo_surface_destroy(out);
diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp
index abd102452..e84e6f0c2 100644
--- a/src/display/nr-filter.cpp
+++ b/src/display/nr-filter.cpp
@@ -38,7 +38,7 @@
#include "display/nr-filter-tile.h"
#include "display/nr-filter-turbulence.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-item.h"
#include "display/drawing-context.h"
#include <2geom/affine.h>
@@ -108,8 +108,8 @@ int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &bgct, Draw
return 1;
}
- FilterQuality const filterquality = (FilterQuality)item->drawing()->filterquality;
- int const blurquality = item->drawing()->blurquality;
+ FilterQuality const filterquality = (FilterQuality)item->drawing().filterQuality();
+ int const blurquality = item->drawing().blurQuality();
Geom::Affine trans = item->ctm();