summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/desktop.cpp21
-rw-r--r--src/dialogs/clonetiler.cpp30
-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
-rw-r--r--src/extension/internal/cairo-png-out.cpp10
-rw-r--r--src/extension/internal/cairo-ps-out.cpp9
-rw-r--r--src/extension/internal/cairo-render-context.cpp8
-rw-r--r--src/extension/internal/cairo-renderer-pdf-out.cpp10
-rw-r--r--src/extension/internal/cairo-renderer.cpp1
-rw-r--r--src/extension/internal/emf-win32-inout.cpp13
-rw-r--r--src/extension/internal/latex-pstricks-out.cpp12
-rw-r--r--src/extension/print.cpp23
-rw-r--r--src/extension/print.h2
-rw-r--r--src/flood-context.cpp31
-rw-r--r--src/helper/pixbuf-ops.cpp19
-rw-r--r--src/helper/png-write.cpp24
-rw-r--r--src/marker.cpp10
-rw-r--r--src/print.cpp13
-rw-r--r--src/sp-clippath.cpp11
-rw-r--r--src/sp-clippath.h2
-rw-r--r--src/sp-flowtext.cpp6
-rw-r--r--src/sp-flowtext.h2
-rw-r--r--src/sp-image.cpp6
-rw-r--r--src/sp-item-group.cpp16
-rw-r--r--src/sp-item-group.h4
-rw-r--r--src/sp-item.cpp14
-rw-r--r--src/sp-item.h4
-rw-r--r--src/sp-mask.cpp10
-rw-r--r--src/sp-mask.h2
-rw-r--r--src/sp-pattern.cpp24
-rw-r--r--src/sp-root.cpp10
-rw-r--r--src/sp-shape.cpp8
-rw-r--r--src/sp-shape.h2
-rw-r--r--src/sp-switch.cpp6
-rw-r--r--src/sp-switch.h2
-rw-r--r--src/sp-symbol.cpp8
-rw-r--r--src/sp-text.cpp8
-rw-r--r--src/sp-text.h2
-rw-r--r--src/sp-use.cpp8
-rw-r--r--src/svg-view.cpp4
-rw-r--r--src/text-context.h1
-rw-r--r--src/trace/trace.cpp2
-rw-r--r--src/ui/cache/svg_preview_cache.cpp10
-rw-r--r--src/ui/cache/svg_preview_cache.h2
-rw-r--r--src/ui/dialog/filedialogimpl-win32.cpp4
-rw-r--r--src/ui/dialog/icon-preview.cpp21
-rw-r--r--src/ui/view/view.h2
-rw-r--r--src/widgets/desktop-widget.cpp1
-rw-r--r--src/widgets/icon.cpp49
-rw-r--r--src/widgets/stroke-style.cpp14
68 files changed, 619 insertions, 680 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index cceee9499..7a71862d3 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -72,7 +72,7 @@
#include "display/canvas-temporary-item-list.h"
#include "display/drawing-group.h"
#include "display/gnome-canvas-acetate.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/snap-indicator.h"
#include "display/sodipodi-ctrlrect.h"
#include "display/sp-canvas-group.h"
@@ -230,7 +230,7 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid
drawing = sp_canvas_item_new (main, SP_TYPE_CANVAS_ARENA, NULL);
g_signal_connect (G_OBJECT (drawing), "arena_event", G_CALLBACK (_arena_handler), this);
- SP_CANVAS_ARENA (drawing)->arena->delta = prefs->getDouble("/options/cursortolerance/value", 1.0); // default is 1 px
+ SP_CANVAS_ARENA (drawing)->drawing.delta = prefs->getDouble("/options/cursortolerance/value", 1.0); // default is 1 px
if (prefs->getBool("/options/startmode/outline")) {
// Start in outline mode
@@ -287,11 +287,11 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid
_modified_connection = namedview->connectModified(sigc::bind<2>(sigc::ptr_fun(&_namedview_modified), this));
Inkscape::DrawingItem *ai = document->getRoot()->invoke_show(
- SP_CANVAS_ARENA (drawing)->arena,
+ SP_CANVAS_ARENA (drawing)->drawing,
dkey,
SP_ITEM_SHOW_DISPLAY);
if (ai) {
- SP_CANVAS_ARENA (drawing)->root->prependChild(ai);
+ SP_CANVAS_ARENA (drawing)->drawing.root()->prependChild(ai);
}
namedview->show(this);
@@ -404,6 +404,7 @@ void SPDesktop::destroy()
if (drawing) {
doc()->getRoot()->invoke_hide(dkey);
+ g_object_unref(drawing);
drawing = NULL;
}
@@ -455,14 +456,14 @@ SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempi
}
void SPDesktop::_setDisplayMode(Inkscape::RenderMode mode) {
- SP_CANVAS_ARENA (drawing)->arena->rendermode = mode;
+ SP_CANVAS_ARENA (drawing)->drawing.setRenderMode(mode);
canvas->rendermode = mode;
_display_mode = mode;
sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (main), _d2w); // redraw
_widget->setTitle( sp_desktop_document(this)->getName() );
}
void SPDesktop::_setDisplayColorMode(Inkscape::ColorMode mode) {
- SP_CANVAS_ARENA (drawing)->arena->colormode = mode;
+ SP_CANVAS_ARENA (drawing)->drawing.setColorMode(mode);
canvas->colorrendermode = mode;
_display_color_mode = mode;
sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (main), _d2w); // redraw
@@ -1570,11 +1571,11 @@ SPDesktop::setDocument (SPDocument *doc)
number = namedview->getViewCount();
ai = doc->getRoot()->invoke_show(
- SP_CANVAS_ARENA (drawing)->arena,
+ SP_CANVAS_ARENA (drawing)->drawing,
dkey,
SP_ITEM_SHOW_DISPLAY);
if (ai) {
- SP_CANVAS_ARENA (drawing)->root->prependChild(ai);
+ SP_CANVAS_ARENA (drawing)->drawing.root()->prependChild(ai);
}
namedview->show(this);
/* Ugly hack */
@@ -1788,9 +1789,9 @@ _namedview_modified (SPObject *obj, guint flags, SPDesktop *desktop)
SP_RGBA32_G_U(nv->pagecolor) +
SP_RGBA32_B_U(nv->pagecolor)) >= 384) {
// the background color is light or transparent, use black outline
- SP_CANVAS_ARENA (desktop->drawing)->arena->outlinecolor = prefs->getInt("/options/wireframecolors/onlight", 0xff);
+ SP_CANVAS_ARENA (desktop->drawing)->drawing.outlinecolor = prefs->getInt("/options/wireframecolors/onlight", 0xff);
} else { // use white outline
- SP_CANVAS_ARENA (desktop->drawing)->arena->outlinecolor = prefs->getInt("/options/wireframecolors/ondark", 0xffffffff);
+ SP_CANVAS_ARENA (desktop->drawing)->drawing.outlinecolor = prefs->getInt("/options/wireframecolors/ondark", 0xffffffff);
}
}
}
diff --git a/src/dialogs/clonetiler.cpp b/src/dialogs/clonetiler.cpp
index 2b08a307a..109b235d0 100644
--- a/src/dialogs/clonetiler.cpp
+++ b/src/dialogs/clonetiler.cpp
@@ -25,8 +25,8 @@
#include "desktop-handles.h"
#include "dialog-events.h"
#include "display/cairo-utils.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
-#include "display/nr-arena.h"
#include "display/drawing-item.h"
#include "document.h"
#include "filter-chemistry.h"
@@ -832,15 +832,14 @@ static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj)
return result;
}
-static NRArena const *trace_arena = NULL;
+static Inkscape::Drawing *trace_drawing = NULL;
static unsigned trace_visionkey;
-static Inkscape::DrawingItem *trace_root;
static gdouble trace_zoom;
-static SPDocument *trace_doc;
+static SPDocument *trace_doc = NULL;
static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from)
{
- if (!trace_arena)
+ if (!trace_drawing)
return;
for (SPObject *o = from->firstChild(); o != NULL; o = o->next) {
@@ -852,13 +851,11 @@ static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from)
static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *original)
{
- // FIXME MEMORY LEAK: the stuff here is never freed
-
- trace_arena = NRArena::create();
+ trace_drawing = new Inkscape::Drawing();
/* Create ArenaItem and set transform */
trace_visionkey = SPItem::display_key_new(1);
trace_doc = doc;
- trace_root = trace_doc->getRoot()->invoke_show((NRArena *) trace_arena, trace_visionkey, SP_ITEM_SHOW_DISPLAY);
+ trace_drawing->setRoot(trace_doc->getRoot()->invoke_show(*trace_drawing, trace_visionkey, SP_ITEM_SHOW_DISPLAY));
// hide the (current) original and any tiled clones, we only want to pick the background
original->invoke_hide(trace_visionkey);
@@ -872,12 +869,12 @@ static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *origin
static guint32 clonetiler_trace_pick(Geom::Rect box)
{
- if (!trace_arena) {
+ if (!trace_drawing) {
return 0;
}
- trace_root->setTransform(Geom::Scale(trace_zoom));
- trace_root->update();
+ trace_drawing->root()->setTransform(Geom::Scale(trace_zoom));
+ trace_drawing->update();
/* Item integer bbox in points */
Geom::IntRect ibox = (box * Geom::Scale(trace_zoom)).roundOutwards();
@@ -886,7 +883,7 @@ static guint32 clonetiler_trace_pick(Geom::Rect box)
cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height());
Inkscape::DrawingContext ct(s, ibox.min());
/* Render */
- trace_root->render(ct, ibox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
+ trace_drawing->render(ct, ibox);
double R = 0, G = 0, B = 0, A = 0;
ink_cairo_surface_average_color(s, R, G, B, A);
cairo_surface_destroy(s);
@@ -898,10 +895,9 @@ static void clonetiler_trace_finish()
{
if (trace_doc) {
trace_doc->getRoot()->invoke_hide(trace_visionkey);
- }
- if (trace_arena) {
- ((NRObject *) trace_arena)->unreference();
- trace_arena = NULL;
+ delete trace_drawing;
+ trace_doc = NULL;
+ trace_drawing = NULL;
}
}
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();
diff --git a/src/extension/internal/cairo-png-out.cpp b/src/extension/internal/cairo-png-out.cpp
index 4b551e730..678a46095 100644
--- a/src/extension/internal/cairo-png-out.cpp
+++ b/src/extension/internal/cairo-png-out.cpp
@@ -27,7 +27,7 @@
#include "extension/print.h"
#include "extension/db.h"
#include "extension/output.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/curve.h"
#include "display/canvas-bpath.h"
@@ -56,11 +56,11 @@ png_render_document_to_file(SPDocument *doc, gchar const *filename)
doc->ensureUpToDate();
/* Start */
- // Create new arena
+
SPItem *base = doc->getRoot();
- NRArena *arena = NRArena::create();
+ Inkscape::Drawing drawing;
unsigned dkey = SPItem::display_key_new(1);
- base->invoke_show(arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ base->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY);
/* Create renderer and context */
renderer = new CairoRenderer();
@@ -75,9 +75,7 @@ png_render_document_to_file(SPDocument *doc, gchar const *filename)
}
renderer->destroyContext(ctx);
- /* Release arena */
base->invoke_hide(dkey);
- nr_object_unref((NRObject *) arena);
/* end */
delete renderer;
diff --git a/src/extension/internal/cairo-ps-out.cpp b/src/extension/internal/cairo-ps-out.cpp
index 7e5324e57..9cc3a4ce3 100644
--- a/src/extension/internal/cairo-ps-out.cpp
+++ b/src/extension/internal/cairo-ps-out.cpp
@@ -29,7 +29,7 @@
#include "extension/print.h"
#include "extension/db.h"
#include "extension/output.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/curve.h"
#include "display/canvas-bpath.h"
@@ -85,10 +85,9 @@ ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int l
if (!base)
return false;
- /* Create new arena */
- NRArena *arena = NRArena::create();
+ Inkscape::Drawing drawing;
unsigned dkey = SPItem::display_key_new(1);
- base->invoke_show(arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ base->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY);
/* Create renderer and context */
CairoRenderer *renderer = new CairoRenderer();
@@ -110,9 +109,7 @@ ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int l
}
}
- /* Release arena */
base->invoke_hide(dkey);
- nr_object_unref((NRObject *) arena);
renderer->destroyContext(ctx);
delete renderer;
diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp
index c7cba09bb..c3a8a790b 100644
--- a/src/extension/internal/cairo-render-context.cpp
+++ b/src/extension/internal/cairo-render-context.cpp
@@ -32,7 +32,7 @@
#include <glib/gmem.h>
#include <glibmm/i18n.h>
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/display-forward.h"
#include "display/curve.h"
#include "display/canvas-bpath.h"
@@ -1092,8 +1092,8 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver
pattern_ctx->setTransform(&pcs2dev);
pattern_ctx->pushState();
- // create arena and group
- NRArena *arena = NRArena::create();
+ // create drawing and group
+ Inkscape::Drawing drawing;
unsigned dkey = SPItem::display_key_new(1);
// show items and render them
@@ -1101,7 +1101,7 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver
if (pat_i && SP_IS_OBJECT (pat_i) && pattern_hasItemChildren(pat_i)) { // find the first one with item children
for ( SPObject *child = pat_i->firstChild() ; child; child = child->getNext() ) {
if (SP_IS_ITEM (child)) {
- SP_ITEM (child)->invoke_show (arena, dkey, SP_ITEM_REFERENCE_FLAGS);
+ SP_ITEM (child)->invoke_show (drawing, dkey, SP_ITEM_REFERENCE_FLAGS);
_renderer->renderItem(pattern_ctx, SP_ITEM (child));
}
}
diff --git a/src/extension/internal/cairo-renderer-pdf-out.cpp b/src/extension/internal/cairo-renderer-pdf-out.cpp
index 5be9e15c3..7ea5718f7 100644
--- a/src/extension/internal/cairo-renderer-pdf-out.cpp
+++ b/src/extension/internal/cairo-renderer-pdf-out.cpp
@@ -29,7 +29,7 @@
#include "extension/print.h"
#include "extension/db.h"
#include "extension/output.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/curve.h"
#include "display/canvas-bpath.h"
@@ -81,10 +81,10 @@ pdf_render_document_to_file(SPDocument *doc, gchar const *filename, unsigned int
}
/* Create new arena */
- NRArena *arena = NRArena::create();
- nr_arena_set_renderoffscreen (arena);
+ Inkscape::Drawing drawing;
+ drawing.setExact(true);
unsigned dkey = SPItem::display_key_new(1);
- base->invoke_show(arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ base->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY);
/* Create renderer and context */
CairoRenderer *renderer = new CairoRenderer();
@@ -105,9 +105,7 @@ pdf_render_document_to_file(SPDocument *doc, gchar const *filename, unsigned int
}
}
- /* Release arena */
base->invoke_hide(dkey);
- nr_object_unref((NRObject *) arena);
renderer->destroyContext(ctx);
delete renderer;
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index 76fc5073f..5e7fb991a 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -36,7 +36,6 @@
#include <glib/gmem.h>
#include <glibmm/i18n.h>
-#include "display/nr-arena.h"
#include "display/display-forward.h"
#include "display/curve.h"
#include "display/canvas-bpath.h"
diff --git a/src/extension/internal/emf-win32-inout.cpp b/src/extension/internal/emf-win32-inout.cpp
index 646b33507..aadfce86f 100644
--- a/src/extension/internal/emf-win32-inout.cpp
+++ b/src/extension/internal/emf-win32-inout.cpp
@@ -36,8 +36,8 @@
#include "extension/print.h"
#include "extension/db.h"
#include "extension/output.h"
-#include "display/nr-arena.h"
-#include "display/nr-arena-item.h"
+#include "display/drawing.h"
+#include "display/drawing-item.h"
#include "unit-constants.h"
#include "clear-n_.h"
@@ -106,9 +106,10 @@ emf_print_document_to_file(SPDocument *doc, gchar const *filename)
/* fixme: This has to go into module constructor somehow */
/* Create new arena */
mod->base = doc->getRoot();
- mod->arena = NRArena::create();
+ Inkscape::Drawing drawing;
mod->dkey = SPItem::display_key_new(1);
- mod->root = mod->base->invoke_show(mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ mod->root = mod->base->invoke_show(drawing, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ drawing.setRoot(mod->root);
/* Print document */
ret = mod->begin(doc);
if (ret) {
@@ -120,9 +121,7 @@ emf_print_document_to_file(SPDocument *doc, gchar const *filename)
/* Release arena */
mod->base->invoke_hide(mod->dkey);
mod->base = NULL;
- mod->root = NULL;
- nr_object_unref((NRObject *) mod->arena);
- mod->arena = NULL;
+ mod->root = NULL; // deleted by invoke_hide
/* end */
mod->set_param_string("destination", oldoutput);
diff --git a/src/extension/internal/latex-pstricks-out.cpp b/src/extension/internal/latex-pstricks-out.cpp
index 000280158..3a16268e6 100644
--- a/src/extension/internal/latex-pstricks-out.cpp
+++ b/src/extension/internal/latex-pstricks-out.cpp
@@ -18,8 +18,8 @@
#include "extension/system.h"
#include "extension/print.h"
#include "extension/db.h"
-#include "display/nr-arena.h"
#include "display/display-forward.h"
+#include "display/drawing.h"
#include "sp-root.h"
@@ -61,21 +61,19 @@ void LatexOutput::save(Inkscape::Extension::Output * /*mod2*/, SPDocument *doc,
/* Start */
context.module = mod;
/* fixme: This has to go into module constructor somehow */
- // Create new arena
mod->base = doc->getRoot();
- mod->arena = NRArena::create();
+ Inkscape::Drawing drawing;
mod->dkey = SPItem::display_key_new (1);
- mod->root = (mod->base)->invoke_show (mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ mod->root = (mod->base)->invoke_show (drawing, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ drawing.setRoot(mod->root);
/* Print document */
ret = mod->begin (doc);
(mod->base)->invoke_print (&context);
ret = mod->finish ();
- /* Release arena */
+ /* Release things */
(mod->base)->invoke_hide (mod->dkey);
mod->base = NULL;
mod->root = NULL; // should have been deleted by invoke_hide
- nr_object_unref ((NRObject *) mod->arena);
- mod->arena = NULL;
/* end */
mod->set_param_string("destination", oldoutput);
diff --git a/src/extension/print.cpp b/src/extension/print.cpp
index ad8c4c38d..f2dbb0b9b 100644
--- a/src/extension/print.cpp
+++ b/src/extension/print.cpp
@@ -15,25 +15,22 @@
namespace Inkscape {
namespace Extension {
-Print::Print (Inkscape::XML::Node * in_repr, Implementation::Implementation * in_imp) : Extension(in_repr, in_imp)
+Print::Print (Inkscape::XML::Node * in_repr, Implementation::Implementation * in_imp)
+ : Extension(in_repr, in_imp)
+ , base(NULL)
+ , drawing(NULL)
+ , root(NULL)
+ , dkey(0)
{
- base = NULL;
- arena = NULL;
- root = NULL;
- dkey = 0;
-
- return;
}
Print::~Print (void)
-{
- return;
-}
+{}
bool
Print::check (void)
{
- return Extension::check();
+ return Extension::check();
}
unsigned int
@@ -108,14 +105,14 @@ Print::text (const char* text, Geom::Point p, const SPStyle* style)
bool
Print::textToPath (void)
{
- return imp->textToPath(this);
+ return imp->textToPath(this);
}
//whether embed font in print output (EPS especially)
bool
Print::fontEmbedded (void)
{
- return imp->fontEmbedded(this);
+ return imp->fontEmbedded(this);
}
} } /* namespace Inkscape, Extension */
diff --git a/src/extension/print.h b/src/extension/print.h
index b3c686d26..c2276126b 100644
--- a/src/extension/print.h
+++ b/src/extension/print.h
@@ -23,7 +23,7 @@ class Print : public Extension {
public: /* TODO: These are public for the short term, but this should be fixed */
SPItem *base;
- NRArena *arena;
+ Inkscape::Drawing *drawing;
Inkscape::DrawingItem *root;
unsigned int dkey;
diff --git a/src/flood-context.cpp b/src/flood-context.cpp
index a71333a4f..8603f8b66 100644
--- a/src/flood-context.cpp
+++ b/src/flood-context.cpp
@@ -32,11 +32,10 @@
#include "desktop-handles.h"
#include "desktop-style.h"
#include "display/cairo-utils.h"
-#include "display/canvas-arena.h"
#include "display/drawing-context.h"
#include "display/drawing-image.h"
#include "display/drawing-item.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/sp-canvas.h"
#include "document.h"
#include "flood-context.h"
@@ -777,10 +776,6 @@ static void sp_flood_do_flood_fill(SPEventContext *event_context, GdkEvent *even
SPDesktop *desktop = event_context->desktop;
SPDocument *document = sp_desktop_document(desktop);
- /* Create new arena */
- NRArena *arena = NRArena::create();
- unsigned dkey = SPItem::display_key_new(1);
-
document->ensureUpToDate();
Geom::OptRect bbox = document->getRoot()->getBounds(Geom::identity());
@@ -809,20 +804,22 @@ static void sp_flood_do_flood_fill(SPEventContext *event_context, GdkEvent *even
Geom::Scale scale(zoom_scale, zoom_scale);
Geom::Affine affine = scale * Geom::Translate(-origin * scale);
-
- /* Create ArenaItems and set transform */
- Inkscape::DrawingItem *root = document->getRoot()->invoke_show( arena, dkey, SP_ITEM_SHOW_DISPLAY);
- root->setTransform(affine);
-
- Inkscape::UpdateContext ctx;
- Geom::IntRect final_bbox = Geom::IntRect::from_xywh(0, 0, width, height);
- root->update(final_bbox, ctx, Inkscape::DrawingItem::STATE_ALL, 0);
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
guchar *px = g_new(guchar, stride * height);
guint32 bgcolor, dtc;
- { // this block limits the lifetime of DrawingContext
+ { // this block limits the lifetime of Drawing and DrawingContext
+ /* Create DrawingItems and set transform */
+ unsigned dkey = SPItem::display_key_new(1);
+ Inkscape::Drawing drawing;
+ Inkscape::DrawingItem *root = document->getRoot()->invoke_show( drawing, dkey, SP_ITEM_SHOW_DISPLAY);
+ root->setTransform(affine);
+ drawing.setRoot(root);
+
+ Geom::IntRect final_bbox = Geom::IntRect::from_xywh(0, 0, width, height);
+ drawing.update(final_bbox);
+
cairo_surface_t *s = cairo_image_surface_create_for_data(
px, CAIRO_FORMAT_ARGB32, width, height, stride);
Inkscape::DrawingContext ct(s, Geom::Point(0,0));
@@ -838,15 +835,13 @@ static void sp_flood_do_flood_fill(SPEventContext *event_context, GdkEvent *even
ct.paint();
ct.setOperator(CAIRO_OPERATOR_OVER);
- root->render(ct, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
+ drawing.render(ct, final_bbox);
cairo_surface_flush(s);
cairo_surface_destroy(s);
// Hide items
document->getRoot()->invoke_hide(dkey);
-
- nr_object_unref((NRObject *) arena);
}
guchar *trace_px = g_new(guchar, width * height);
diff --git a/src/helper/pixbuf-ops.cpp b/src/helper/pixbuf-ops.cpp
index 959007450..3f987dc01 100644
--- a/src/helper/pixbuf-ops.cpp
+++ b/src/helper/pixbuf-ops.cpp
@@ -23,9 +23,9 @@
#include "interface.h"
#include "helper/png-write.h"
#include "display/cairo-utils.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
-#include "display/nr-arena.h"
#include "document.h"
#include "sp-item.h"
#include "sp-root.h"
@@ -112,9 +112,9 @@ sp_generate_internal_bitmap(SPDocument *doc, gchar const */*filename*/,
if (width == 0 || height == 0) return NULL;
GdkPixbuf* pixbuf = NULL;
- /* Create new arena for offscreen rendering*/
- NRArena *arena = NRArena::create();
- nr_arena_set_renderoffscreen(arena);
+ /* Create new drawing for offscreen rendering*/
+ Inkscape::Drawing drawing;
+ drawing.setExact(true);
unsigned dkey = SPItem::display_key_new(1);
doc->ensureUpToDate();
@@ -133,9 +133,9 @@ sp_generate_internal_bitmap(SPDocument *doc, gchar const */*filename*/,
Geom::Affine affine = scale * Geom::Translate(-origin * scale);
/* Create ArenaItems and set transform */
- Inkscape::DrawingItem *root = doc->getRoot()->invoke_show( arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ Inkscape::DrawingItem *root = doc->getRoot()->invoke_show( drawing, dkey, SP_ITEM_SHOW_DISPLAY);
root->setTransform(affine);
- Inkscape::UpdateContext ctx;
+ drawing.setRoot(root);
// We show all and then hide all items we don't want, instead of showing only requested items,
// because that would not work if the shown item references something in defs
@@ -144,7 +144,7 @@ sp_generate_internal_bitmap(SPDocument *doc, gchar const */*filename*/,
}
Geom::IntRect final_bbox = Geom::IntRect::from_xywh(0, 0, width, height);
- root->update(final_bbox, ctx, Inkscape::DrawingItem::STATE_ALL, 0);
+ drawing.update(final_bbox);
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
@@ -152,7 +152,7 @@ sp_generate_internal_bitmap(SPDocument *doc, gchar const */*filename*/,
Inkscape::DrawingContext ct(surface, Geom::Point(0,0));
// render items
- root->render(ct, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
+ drawing.render(ct, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
pixbuf = gdk_pixbuf_new_from_data(cairo_image_surface_get_data(surface),
GDK_COLORSPACE_RGB, TRUE,
@@ -167,8 +167,7 @@ sp_generate_internal_bitmap(SPDocument *doc, gchar const */*filename*/,
g_warning("sp_generate_internal_bitmap: not enough memory to create pixel buffer. Need %lld.", size);
cairo_surface_destroy(surface);
}
- doc->getRoot()->invoke_hide(dkey);
- nr_object_unref((NRObject *) arena);
+ doc->getRoot()->invoke_hide(dkey);
// gdk_pixbuf_save (pixbuf, "C:\\temp\\internal.jpg", "jpeg", NULL, "quality","100", NULL);
diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp
index 7812969a0..24da697c1 100644
--- a/src/helper/png-write.cpp
+++ b/src/helper/png-write.cpp
@@ -23,9 +23,9 @@
#include <png.h>
#include "png-write.h"
#include "io/sys.h"
+#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
-#include "display/nr-arena.h"
#include "document.h"
#include "sp-item.h"
#include "sp-root.h"
@@ -51,7 +51,7 @@ static unsigned int const MAX_STRIPE_SIZE = 1024*1024;
struct SPEBP {
unsigned long int width, height, sheight;
guint32 background;
- Inkscape::DrawingItem *root; // the root arena item to show; it is assumed that all unneeded items are hidden
+ Inkscape::Drawing *drawing; // it is assumed that all unneeded items are hidden
guchar *px;
unsigned (*status)(float, void *);
void *data;
@@ -326,8 +326,7 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v
Geom::IntRect bbox = Geom::IntRect::from_xywh(0, row, ebp->width, num_rows);
/* Update to renderable state */
- Inkscape::UpdateContext ctx;
- ebp->root->update(bbox, ctx, Inkscape::DrawingItem::STATE_ALL, 0);
+ ebp->drawing->update(bbox);
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, ebp->width);
unsigned char *px = g_new(guchar, num_rows * stride);
@@ -341,7 +340,7 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v
ct.setOperator(CAIRO_OPERATOR_OVER);
/* Render */
- ebp->root->render(ct, bbox, 0);
+ ebp->drawing->render(ct, bbox);
cairo_surface_destroy(s);
*to_free = px;
@@ -451,15 +450,15 @@ sp_export_png_file(SPDocument *doc, gchar const *filename,
ebp.height = height;
ebp.background = bgcolor;
- /* Create new arena */
- NRArena *const arena = NRArena::create();
- // export with maximum blur rendering quality
- nr_arena_set_renderoffscreen(arena);
+ /* Create new drawing */
+ Inkscape::Drawing drawing;
+ drawing.setExact(true); // export with maximum blur rendering quality
unsigned const dkey = SPItem::display_key_new(1);
// Create ArenaItems and set transform
- ebp.root = doc->getRoot()->invoke_show(arena, dkey, SP_ITEM_SHOW_DISPLAY);
- ebp.root->setTransform(affine);
+ drawing.setRoot(doc->getRoot()->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY));
+ drawing.root()->setTransform(affine);
+ ebp.drawing = &drawing;
// We show all and then hide all items we don't want, instead of showing only requested items,
// because that would not work if the shown item references something in defs
@@ -483,9 +482,6 @@ sp_export_png_file(SPDocument *doc, gchar const *filename,
// Hide items, this releases arenaitem
doc->getRoot()->invoke_hide(dkey);
- /* Free arena */
- nr_object_unref((NRObject *) arena);
-
return write_status;
}
diff --git a/src/marker.cpp b/src/marker.cpp
index 11a270e73..c8fa9218d 100644
--- a/src/marker.cpp
+++ b/src/marker.cpp
@@ -43,7 +43,7 @@ static void sp_marker_set (SPObject *object, unsigned int key, const gchar *valu
static void sp_marker_update (SPObject *object, SPCtx *ctx, guint flags);
static Inkscape::XML::Node *sp_marker_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static Inkscape::DrawingItem *sp_marker_private_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+static Inkscape::DrawingItem *sp_marker_private_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static void sp_marker_private_hide (SPItem *item, unsigned int key);
static void sp_marker_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags);
static void sp_marker_print (SPItem *item, SPPrintContext *ctx);
@@ -168,7 +168,7 @@ sp_marker_release (SPObject *object)
marker = (SPMarker *) object;
while (marker->views) {
- /* Destroy all NRArenaitems etc. */
+ /* Destroy all DrawingItems etc. */
/* Parent class ::hide method */
((SPItemClass *) parent_class)->hide ((SPItem *) marker, marker->views->key);
sp_marker_view_remove (marker, marker->views, TRUE);
@@ -444,7 +444,7 @@ static void sp_marker_update(SPObject *object, SPCtx *ctx, guint flags)
((SPObjectClass *) (parent_class))->update (object, (SPCtx *) &rctx, flags);
}
- // As last step set additional transform of arena group
+ // As last step set additional transform of drawing group
for (SPMarkerView *v = marker->views; v != NULL; v = v->next) {
for (unsigned i = 0 ; i < v->items.size() ; i++) {
if (v->items[i]) {
@@ -523,7 +523,7 @@ sp_marker_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::X
* This routine is disabled to break propagation.
*/
static Inkscape::DrawingItem *
-sp_marker_private_show (SPItem */*item*/, NRArena */*arena*/, unsigned int /*key*/, unsigned int /*flags*/)
+sp_marker_private_show (SPItem */*item*/, Inkscape::Drawing &/*drawing*/, unsigned int /*key*/, unsigned int /*flags*/)
{
/* Break propagation */
return NULL;
@@ -599,7 +599,7 @@ sp_marker_show_dimension (SPMarker *marker, unsigned int key, unsigned int size)
/**
* Shows an instance of a marker. This is called during sp_shape_update_marker_view()
- * show and transform a child item in the arena for all views with the given key.
+ * show and transform a child item in the drawing for all views with the given key.
*/
Inkscape::DrawingItem *
sp_marker_show_instance ( SPMarker *marker, Inkscape::DrawingItem *parent,
diff --git a/src/print.cpp b/src/print.cpp
index 29c5b0ed2..2eadf0fa9 100644
--- a/src/print.cpp
+++ b/src/print.cpp
@@ -15,7 +15,7 @@
# include "config.h"
#endif
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-item.h"
#include "inkscape.h"
#include "desktop.h"
@@ -117,21 +117,20 @@ sp_print_document_to_file(SPDocument *doc, gchar const *filename)
/* Start */
context.module = mod;
/* fixme: This has to go into module constructor somehow */
- /* Create new arena */
+ /* Create new drawing */
mod->base = doc->getRoot();
- mod->arena = NRArena::create();
+ Inkscape::Drawing drawing;
mod->dkey = SPItem::display_key_new(1);
- mod->root = (mod->base)->invoke_show(mod->arena, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ mod->root = (mod->base)->invoke_show(drawing, mod->dkey, SP_ITEM_SHOW_DISPLAY);
+ drawing.setRoot(mod->root);
/* Print document */
ret = mod->begin(doc);
(mod->base)->invoke_print(&context);
ret = mod->finish();
- /* Release arena */
+ /* Release drawing items */
(mod->base)->invoke_hide(mod->dkey);
mod->base = NULL;
- nr_object_unref((NRObject *) mod->arena);
mod->root = NULL; // should be deleted by invoke_hide
- mod->arena = NULL;
/* end */
mod->set_param_string("destination", oldoutput);
diff --git a/src/sp-clippath.cpp b/src/sp-clippath.cpp
index 14c206828..0b3320e59 100644
--- a/src/sp-clippath.cpp
+++ b/src/sp-clippath.cpp
@@ -15,7 +15,7 @@
#include <cstring>
#include <string>
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-group.h"
#include "xml/repr.h"
@@ -242,17 +242,14 @@ Inkscape::XML::Node *SPClipPath::write(SPObject *object, Inkscape::XML::Document
return repr;
}
-Inkscape::DrawingItem *SPClipPath::show(NRArena *arena, unsigned int key)
+Inkscape::DrawingItem *SPClipPath::show(Inkscape::Drawing &drawing, unsigned int key)
{
- g_return_val_if_fail(arena != NULL, NULL);
- g_return_val_if_fail(NR_IS_ARENA(arena), NULL);
-
- Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(drawing);
display = sp_clippath_view_new_prepend(display, key, ai);
for ( SPObject *child = firstChild() ; child ; child = child->getNext() ) {
if (SP_IS_ITEM(child)) {
- Inkscape::DrawingItem *ac = SP_ITEM(child)->invoke_show(arena, key, SP_ITEM_REFERENCE_FLAGS);
+ Inkscape::DrawingItem *ac = SP_ITEM(child)->invoke_show(drawing, key, SP_ITEM_REFERENCE_FLAGS);
if (ac) {
/* The order is not important in clippath */
ai->appendChild(ac);
diff --git a/src/sp-clippath.h b/src/sp-clippath.h
index d163e0709..11817eb77 100644
--- a/src/sp-clippath.h
+++ b/src/sp-clippath.h
@@ -40,7 +40,7 @@ public:
static const gchar *create(GSList *reprs, SPDocument *document, Geom::Affine const* applyTransform);
static GType sp_clippath_get_type(void);
- Inkscape::DrawingItem *show(NRArena *arena, unsigned int key);
+ Inkscape::DrawingItem *show(Inkscape::Drawing &drawing, unsigned int key);
void hide(unsigned int key);
void setBBox(unsigned int key, NRRect *bbox);
diff --git a/src/sp-flowtext.cpp b/src/sp-flowtext.cpp
index cbdc8684b..710f799a5 100644
--- a/src/sp-flowtext.cpp
+++ b/src/sp-flowtext.cpp
@@ -50,7 +50,7 @@ static void sp_flowtext_bbox(SPItem const *item, NRRect *bbox, Geom::Affine cons
static void sp_flowtext_print(SPItem *item, SPPrintContext *ctx);
static gchar *sp_flowtext_description(SPItem *item);
static void sp_flowtext_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
-static Inkscape::DrawingItem *sp_flowtext_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags);
+static Inkscape::DrawingItem *sp_flowtext_show(SPItem *item, Inkscape::Drawing &drawing, unsigned key, unsigned flags);
static void sp_flowtext_hide(SPItem *item, unsigned key);
static SPItemClass *parent_class;
@@ -409,10 +409,10 @@ static void sp_flowtext_snappoints(SPItem const *item, std::vector<Inkscape::Sna
}
static Inkscape::DrawingItem *
-sp_flowtext_show(SPItem *item, NRArena *arena, unsigned/* key*/, unsigned /*flags*/)
+sp_flowtext_show(SPItem *item, Inkscape::Drawing &drawing, unsigned/* key*/, unsigned /*flags*/)
{
SPFlowtext *group = (SPFlowtext *) item;
- Inkscape::DrawingGroup *flowed = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *flowed = new Inkscape::DrawingGroup(drawing);
flowed->setPickChildren(false);
flowed->setStyle(group->style);
diff --git a/src/sp-flowtext.h b/src/sp-flowtext.h
index d06105c30..de41ba47f 100644
--- a/src/sp-flowtext.h
+++ b/src/sp-flowtext.h
@@ -31,7 +31,7 @@ struct SPFlowtext : public SPItem {
//semiprivate: (need to be accessed by the C-style functions still)
Inkscape::Text::Layout layout;
- /** discards the NRArena objects representing this text. */
+ /** discards the drawing objects representing this text. */
void _clearFlow(Inkscape::DrawingGroup* in_arena);
double par_indent;
diff --git a/src/sp-image.cpp b/src/sp-image.cpp
index 3a1280aa0..225cccfca 100644
--- a/src/sp-image.cpp
+++ b/src/sp-image.cpp
@@ -84,7 +84,7 @@ static void sp_image_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &
static void sp_image_print (SPItem * item, SPPrintContext *ctx);
static gchar * sp_image_description (SPItem * item);
static void sp_image_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
-static Inkscape::DrawingItem *sp_image_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+static Inkscape::DrawingItem *sp_image_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static Geom::Affine sp_image_set_transform (SPItem *item, Geom::Affine const &xform);
static void sp_image_set_curve(SPImage *image);
@@ -1149,10 +1149,10 @@ static gchar *sp_image_description( SPItem *item )
return ret;
}
-static Inkscape::DrawingItem *sp_image_show( SPItem *item, NRArena *arena, unsigned int /*key*/, unsigned int /*flags*/ )
+static Inkscape::DrawingItem *sp_image_show( SPItem *item, Inkscape::Drawing &drawing, unsigned int /*key*/, unsigned int /*flags*/ )
{
SPImage * image = SP_IMAGE(item);
- Inkscape::DrawingImage *ai = new Inkscape::DrawingImage(arena);
+ Inkscape::DrawingImage *ai = new Inkscape::DrawingImage(drawing);
sp_image_update_arenaitem(image, ai);
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index c27319c83..f8ab0460a 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -68,7 +68,7 @@ static void sp_group_set(SPObject *object, unsigned key, char const *value);
static void sp_group_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags);
static void sp_group_print (SPItem * item, SPPrintContext *ctx);
static gchar * sp_group_description (SPItem * item);
-static Inkscape::DrawingItem *sp_group_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+static Inkscape::DrawingItem *sp_group_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static void sp_group_hide (SPItem * item, unsigned int key);
static void sp_group_snappoints (SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
@@ -313,9 +313,9 @@ static void sp_group_set(SPObject *object, unsigned key, char const *value) {
}
static Inkscape::DrawingItem *
-sp_group_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags)
+sp_group_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags)
{
- return SP_GROUP(item)->group->show(arena, key, flags);
+ return SP_GROUP(item)->group->show(drawing, key, flags);
}
static void
@@ -744,19 +744,19 @@ gchar *CGroup::getDescription() {
len), len);
}
-Inkscape::DrawingItem *CGroup::show (NRArena *arena, unsigned int key, unsigned int flags) {
+Inkscape::DrawingItem *CGroup::show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) {
Inkscape::DrawingGroup *ai;
SPObject *object = _group;
- ai = new Inkscape::DrawingGroup(arena);
+ ai = new Inkscape::DrawingGroup(drawing);
ai->setPickChildren(_group->effectiveLayerMode(key) == SPGroup::LAYER);
ai->setStyle(object->style);
- _showChildren(arena, ai, key, flags);
+ _showChildren(drawing, ai, key, flags);
return ai;
}
-void CGroup::_showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
+void CGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
Inkscape::DrawingItem *ac = NULL;
SPItem * child = NULL;
GSList *l = g_slist_reverse(_group->childList(false, SPObject::ActionShow));
@@ -764,7 +764,7 @@ void CGroup::_showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned
SPObject *o = SP_OBJECT (l->data);
if (SP_IS_ITEM (o)) {
child = SP_ITEM (o);
- ac = child->invoke_show (arena, key, flags);
+ ac = child->invoke_show (drawing, key, flags);
ai->appendChild(ac);
}
l = g_slist_remove (l, o);
diff --git a/src/sp-item-group.h b/src/sp-item-group.h
index 88586a6b0..99f375e44 100644
--- a/src/sp-item-group.h
+++ b/src/sp-item-group.h
@@ -73,13 +73,13 @@ public:
virtual void onPrint(SPPrintContext *ctx);
virtual void onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref);
virtual gchar *getDescription();
- virtual Inkscape::DrawingItem *show (NRArena *arena, unsigned int key, unsigned int flags);
+ virtual Inkscape::DrawingItem *show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide (unsigned int key);
gint getItemCount();
protected:
- virtual void _showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
+ virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
SPGroup *_group;
};
diff --git a/src/sp-item.cpp b/src/sp-item.cpp
index 9ab924423..bd3802dd3 100644
--- a/src/sp-item.cpp
+++ b/src/sp-item.cpp
@@ -29,7 +29,6 @@
#include "sp-item.h"
#include "svg/svg.h"
#include "print.h"
-#include "display/nr-arena.h"
#include "display/drawing-item.h"
#include "attributes.h"
#include "document.h"
@@ -513,7 +512,6 @@ void SPItem::clip_ref_changed(SPObject *old_clip, SPObject *clip, SPItem *item)
/* Hide clippath */
for (v = item->display; v != NULL; v = v->next) {
SP_CLIPPATH(old_clip)->hide(v->arenaitem->key());
- v->arenaitem->setClip(NULL);
}
}
if (SP_IS_CLIPPATH(clip)) {
@@ -539,7 +537,6 @@ void SPItem::mask_ref_changed(SPObject *old_mask, SPObject *mask, SPItem *item)
/* Hide mask */
for (SPItemView *v = item->display; v != NULL; v = v->next) {
sp_mask_hide(SP_MASK(old_mask), v->arenaitem->key());
- v->arenaitem->setMask(NULL);
}
}
if (SP_IS_MASK(mask)) {
@@ -1017,14 +1014,11 @@ unsigned SPItem::display_key_new(unsigned numkeys)
return dkey - numkeys;
}
-Inkscape::DrawingItem *SPItem::invoke_show(NRArena *arena, unsigned key, unsigned flags)
+Inkscape::DrawingItem *SPItem::invoke_show(Inkscape::Drawing &drawing, unsigned key, unsigned flags)
{
- g_assert(arena != NULL);
- g_assert(NR_IS_ARENA(arena));
-
Inkscape::DrawingItem *ai = NULL;
if (((SPItemClass *) G_OBJECT_GET_CLASS(this))->show) {
- ai = ((SPItemClass *) G_OBJECT_GET_CLASS(this))->show(this, arena, key, flags);
+ ai = ((SPItemClass *) G_OBJECT_GET_CLASS(this))->show(this, drawing, key, flags);
}
if (ai != NULL) {
@@ -1042,7 +1036,7 @@ Inkscape::DrawingItem *SPItem::invoke_show(NRArena *arena, unsigned key, unsigne
int clip_key = display->arenaitem->key();
// Show and set clip
- Inkscape::DrawingItem *ac = cp->show(arena, clip_key);
+ Inkscape::DrawingItem *ac = cp->show(drawing, clip_key);
ai->setClip(ac);
// Update bbox, in case the clip uses bbox units
@@ -1060,7 +1054,7 @@ Inkscape::DrawingItem *SPItem::invoke_show(NRArena *arena, unsigned key, unsigne
int mask_key = display->arenaitem->key();
// Show and set mask
- Inkscape::DrawingItem *ac = sp_mask_show(mask, arena, mask_key);
+ Inkscape::DrawingItem *ac = sp_mask_show(mask, drawing, mask_key);
ai->setMask(ac);
// Update bbox, in case the mask uses bbox units
diff --git a/src/sp-item.h b/src/sp-item.h
index f8cc948bb..633deb508 100644
--- a/src/sp-item.h
+++ b/src/sp-item.h
@@ -181,7 +181,7 @@ public:
gchar *description();
void invoke_print(SPPrintContext *ctx);
static unsigned int display_key_new(unsigned int numkeys);
- Inkscape::DrawingItem *invoke_show(NRArena *arena, unsigned int key, unsigned int flags);
+ Inkscape::DrawingItem *invoke_show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
void invoke_hide(unsigned int key);
void getSnappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs=0) const;
void adjust_pattern(/* Geom::Affine const &premul, */ Geom::Affine const &postmul, bool set = false);
@@ -246,7 +246,7 @@ public:
/** Give short description of item (for status display) */
gchar * (* description) (SPItem * item);
- Inkscape::DrawingItem * (* show) (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+ Inkscape::DrawingItem * (* show) (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
void (* hide) (SPItem *item, unsigned int key);
/** Write to an iterator the points that should be considered for snapping
diff --git a/src/sp-mask.cpp b/src/sp-mask.cpp
index f23be6fc5..f23172a17 100644
--- a/src/sp-mask.cpp
+++ b/src/sp-mask.cpp
@@ -15,7 +15,7 @@
#include <string>
#include <2geom/transforms.h>
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-group.h"
#include "xml/repr.h"
@@ -297,19 +297,17 @@ sp_mask_create (GSList *reprs, SPDocument *document, Geom::Affine const* applyTr
return mask_id;
}
-Inkscape::DrawingItem *sp_mask_show(SPMask *mask, NRArena *arena, unsigned int key)
+Inkscape::DrawingItem *sp_mask_show(SPMask *mask, Inkscape::Drawing &drawing, unsigned int key)
{
g_return_val_if_fail (mask != NULL, NULL);
g_return_val_if_fail (SP_IS_MASK (mask), NULL);
- g_return_val_if_fail (arena != NULL, NULL);
- g_return_val_if_fail (NR_IS_ARENA (arena), NULL);
- Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(drawing);
mask->display = sp_mask_view_new_prepend (mask->display, key, ai);
for ( SPObject *child = mask->firstChild() ; child; child = child->getNext() ) {
if (SP_IS_ITEM (child)) {
- Inkscape::DrawingItem *ac = SP_ITEM (child)->invoke_show (arena, key, SP_ITEM_REFERENCE_FLAGS);
+ Inkscape::DrawingItem *ac = SP_ITEM (child)->invoke_show (drawing, key, SP_ITEM_REFERENCE_FLAGS);
if (ac) {
ai->prependChild(ac);
}
diff --git a/src/sp-mask.h b/src/sp-mask.h
index e7a4723cf..b1048e6be 100644
--- a/src/sp-mask.h
+++ b/src/sp-mask.h
@@ -90,7 +90,7 @@ protected:
}
};
-Inkscape::DrawingItem *sp_mask_show (SPMask *mask, NRArena *arena, unsigned int key);
+Inkscape::DrawingItem *sp_mask_show (SPMask *mask, Inkscape::Drawing &drawing, unsigned int key);
void sp_mask_hide (SPMask *mask, unsigned int key);
void sp_mask_set_bbox (SPMask *mask, unsigned int key, NRRect *bbox);
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index 805a93267..9aefdf6ff 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -24,7 +24,7 @@
#include "display/cairo-utils.h"
#include "display/drawing-context.h"
#include "display/drawing-surface.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-group.h"
#include "attributes.h"
#include "document-private.h"
@@ -630,17 +630,18 @@ sp_pattern_create_pattern(SPPaintServer *ps,
return cairo_pattern_create_rgba(0,0,0,0);
}
- /* Create arena */
- NRArena *arena = NRArena::create();
+ /* Create drawing for rendering */
+ Inkscape::Drawing drawing;
unsigned int dkey = SPItem::display_key_new (1);
- Inkscape::DrawingGroup *root = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *root = new Inkscape::DrawingGroup(drawing);
+ drawing.setRoot(root);
for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext() ) {
if (SP_IS_ITEM (child)) {
- // for each item in pattern, show it on our arena, add to the group,
+ // for each item in pattern, show it on our drawing, add to the group,
// and connect to the release signal in case the item gets deleted
Inkscape::DrawingItem *cai;
- cai = SP_ITEM(child)->invoke_show (arena, dkey, SP_ITEM_SHOW_DISPLAY);
+ cai = SP_ITEM(child)->invoke_show (drawing, dkey, SP_ITEM_SHOW_DISPLAY);
root->appendChild(cai);
}
}
@@ -676,7 +677,10 @@ sp_pattern_create_pattern(SPPaintServer *ps,
// oversample the pattern slightly
// TODO: find optimum value
- Geom::Point c(pattern_tile.dimensions()*ps2user.descrim()*full.descrim()*1.1);
+ // TODO: this is lame. instead of using descrim(), we should extract
+ // the scaling component from the complete matrix and use it
+ // to find the optimum tile size for rendering
+ Geom::Point c(pattern_tile.dimensions()*vb2ps.descrim()*ps2user.descrim()*full.descrim()*1.1);
c[Geom::X] = ceil(c[Geom::X]);
c[Geom::Y] = ceil(c[Geom::Y]);
@@ -692,15 +696,13 @@ sp_pattern_create_pattern(SPPaintServer *ps,
// TODO: make sure there are no leaks.
Inkscape::UpdateContext ctx;
ctx.ctm = vb2ps;
- root->update(Geom::IntRect::infinite(), ctx, Inkscape::DrawingItem::STATE_ALL, 0);
- root->render(ct, one_tile, 0);
+ drawing.update(Geom::IntRect::infinite(), ctx);
+ drawing.render(ct, one_tile);
for (SPObject *child = shown->firstChild() ; child != NULL; child = child->getNext() ) {
if (SP_IS_ITEM (child)) {
SP_ITEM(child)->invoke_hide(dkey);
}
}
- nr_object_unref(arena);
- delete root;
if (needs_opacity) {
ct.popGroupToSource(); // pop raw pattern
diff --git a/src/sp-root.cpp b/src/sp-root.cpp
index bbb12f5d3..a6df580d3 100644
--- a/src/sp-root.cpp
+++ b/src/sp-root.cpp
@@ -46,7 +46,7 @@ static void sp_root_update(SPObject *object, SPCtx *ctx, guint flags);
static void sp_root_modified(SPObject *object, guint flags);
static Inkscape::XML::Node *sp_root_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static Inkscape::DrawingItem *sp_root_show(SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+static Inkscape::DrawingItem *sp_root_show(SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static void sp_root_print(SPItem *item, SPPrintContext *ctx);
static SPGroupClass *parent_class;
@@ -538,7 +538,7 @@ static void sp_root_update(SPObject *object, SPCtx *ctx, guint flags)
if (((SPObjectClass *) (parent_class))->update)
((SPObjectClass *) (parent_class))->update(object, (SPCtx *) &rctx, flags);
- /* As last step set additional transform of arena group */
+ /* As last step set additional transform of drawing group */
for (SPItemView *v = root->display; v != NULL; v = v->next) {
Inkscape::DrawingGroup *g = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
g->setChildTransform(root->c2p);
@@ -608,16 +608,16 @@ sp_root_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:
}
/**
- * Displays the SPRoot item on the NRArena.
+ * Displays the SPRoot item on the drawing.
*/
static Inkscape::DrawingItem *
-sp_root_show(SPItem *item, NRArena *arena, unsigned int key, unsigned int flags)
+sp_root_show(SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags)
{
SPRoot *root = SP_ROOT(item);
Inkscape::DrawingItem *ai;
if (((SPItemClass *) (parent_class))->show) {
- ai = ((SPItemClass *) (parent_class))->show(item, arena, key, flags);
+ ai = ((SPItemClass *) (parent_class))->show(item, drawing, key, flags);
if (ai) {
Inkscape::DrawingGroup *g = dynamic_cast<Inkscape::DrawingGroup *>(ai);
g->setChildTransform(root->c2p);
diff --git a/src/sp-shape.cpp b/src/sp-shape.cpp
index 1512898f5..eff0665af 100644
--- a/src/sp-shape.cpp
+++ b/src/sp-shape.cpp
@@ -852,12 +852,12 @@ sp_shape_print (SPItem *item, SPPrintContext *ctx)
/**
* Sets style, path, and paintbox. Updates marker views, including dimensions.
*/
-Inkscape::DrawingItem * SPShape::sp_shape_show(SPItem *item, NRArena *arena, unsigned int /*key*/, unsigned int /*flags*/)
+Inkscape::DrawingItem * SPShape::sp_shape_show(SPItem *item, Inkscape::Drawing &drawing, unsigned int /*key*/, unsigned int /*flags*/)
{
SPObject *object = item;
SPShape *shape = SP_SHAPE(item);
- Inkscape::DrawingShape *s = new Inkscape::DrawingShape(arena);
+ Inkscape::DrawingShape *s = new Inkscape::DrawingShape(drawing);
s->setStyle(object->style);
s->setPath(shape->curve);
Geom::OptRect paintbox = item->getBounds(Geom::identity());
@@ -1015,8 +1015,6 @@ sp_shape_marker_release (SPObject *marker, SPShape *shape)
/* Hide marker */
for (v = item->display; v != NULL; v = v->next) {
sp_marker_hide ((SPMarker *) (shape->marker[i]), v->arenaitem->key() + i);
- /* fixme: Do we need explicit remove here? (Lauris) */
- /* v->arenaitem->setMask(NULL); */
}
/* Detach marker */
shape->release_connect[i].disconnect();
@@ -1066,8 +1064,6 @@ sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value)
for (v = item->display; v != NULL; v = v->next) {
sp_marker_hide ((SPMarker *) (shape->marker[key]),
v->arenaitem->key() + key);
- /* fixme: Do we need explicit remove here? (Lauris) */
- /* v->arenaitem->setMask(NULL); */
}
/* Unref marker */
diff --git a/src/sp-shape.h b/src/sp-shape.h
index 4da2d5a2d..355d8e7cc 100644
--- a/src/sp-shape.h
+++ b/src/sp-shape.h
@@ -67,7 +67,7 @@ private:
static Inkscape::XML::Node *sp_shape_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
static void sp_shape_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags);
- static Inkscape::DrawingItem *sp_shape_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+ static Inkscape::DrawingItem *sp_shape_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static void sp_shape_hide (SPItem *item, unsigned int key);
static void sp_shape_snappoints (SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
diff --git a/src/sp-switch.cpp b/src/sp-switch.cpp
index bb1495387..500e43c9c 100644
--- a/src/sp-switch.cpp
+++ b/src/sp-switch.cpp
@@ -117,7 +117,7 @@ void CSwitch::onOrderChanged (Inkscape::XML::Node *, Inkscape::XML::Node *, Inks
_reevaluate();
}
-void CSwitch::_reevaluate(bool /*add_to_arena*/) {
+void CSwitch::_reevaluate(bool /*add_to_drawing*/) {
SPObject *evaluated_child = _evaluateFirst();
if (!evaluated_child || _cached_item == evaluated_child) {
return;
@@ -157,7 +157,7 @@ void CSwitch::_releaseLastItem(SPObject *obj)
_cached_item = NULL;
}
-void CSwitch::_showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
+void CSwitch::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
SPObject *evaluated_child = _evaluateFirst();
GSList *l = _childList(false, SPObject::ActionShow);
@@ -166,7 +166,7 @@ void CSwitch::_showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned
if (SP_IS_ITEM (o)) {
SPItem * child = SP_ITEM(o);
child->setEvaluated(o == evaluated_child);
- Inkscape::DrawingItem *ac = child->invoke_show (arena, key, flags);
+ Inkscape::DrawingItem *ac = child->invoke_show (drawing, key, flags);
if (ac) {
ai->appendChild(ac);
}
diff --git a/src/sp-switch.h b/src/sp-switch.h
index 7b108947d..8eafe6e7b 100644
--- a/src/sp-switch.h
+++ b/src/sp-switch.h
@@ -42,7 +42,7 @@ public:
protected:
virtual GSList *_childList(bool add_ref, SPObject::Action action);
- virtual void _showChildren (NRArena *arena, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
+ virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
SPObject *_evaluateFirst();
void _reevaluate(bool add_to_arena = false);
diff --git a/src/sp-symbol.cpp b/src/sp-symbol.cpp
index 1f35a0ee1..bee28f8e3 100644
--- a/src/sp-symbol.cpp
+++ b/src/sp-symbol.cpp
@@ -37,7 +37,7 @@ static void sp_symbol_update (SPObject *object, SPCtx *ctx, guint flags);
static void sp_symbol_modified (SPObject *object, guint flags);
static Inkscape::XML::Node *sp_symbol_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
-static Inkscape::DrawingItem *sp_symbol_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
+static Inkscape::DrawingItem *sp_symbol_show (SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
static void sp_symbol_hide (SPItem *item, unsigned int key);
static void sp_symbol_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags);
static void sp_symbol_print (SPItem *item, SPPrintContext *ctx);
@@ -325,7 +325,7 @@ static void sp_symbol_update(SPObject *object, SPCtx *ctx, guint flags)
((SPObjectClass *) (parent_class))->update (object, (SPCtx *) &rctx, flags);
}
- // As last step set additional transform of arena group
+ // As last step set additional transform of drawing group
for (SPItemView *v = symbol->display; v != NULL; v = v->next) {
Inkscape::DrawingGroup *g = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem);
g->setChildTransform(symbol->c2p);
@@ -368,7 +368,7 @@ static Inkscape::XML::Node *sp_symbol_write(SPObject *object, Inkscape::XML::Doc
return repr;
}
-static Inkscape::DrawingItem *sp_symbol_show(SPItem *item, NRArena *arena, unsigned int key, unsigned int flags)
+static Inkscape::DrawingItem *sp_symbol_show(SPItem *item, Inkscape::Drawing &drawing, unsigned int key, unsigned int flags)
{
SPSymbol *symbol = SP_SYMBOL(item);
Inkscape::DrawingItem *ai = 0;
@@ -376,7 +376,7 @@ static Inkscape::DrawingItem *sp_symbol_show(SPItem *item, NRArena *arena, unsig
if (symbol->cloned) {
// Cloned <symbol> is actually renderable
if (((SPItemClass *) (parent_class))->show) {
- ai = ((SPItemClass *) (parent_class))->show (item, arena, key, flags);
+ ai = ((SPItemClass *) (parent_class))->show (item, drawing, key, flags);
Inkscape::DrawingGroup *g = dynamic_cast<Inkscape::DrawingGroup *>(ai);
if (g) {
g->setChildTransform(symbol->c2p);
diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index ed848c646..34722ce5d 100644
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
@@ -72,7 +72,7 @@ static void sp_text_modified (SPObject *object, guint flags);
static Inkscape::XML::Node *sp_text_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
static void sp_text_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags);
-static Inkscape::DrawingItem *sp_text_show (SPItem *item, NRArena *arena, unsigned key, unsigned flags);
+static Inkscape::DrawingItem *sp_text_show (SPItem *item, Inkscape::Drawing &drawing, unsigned key, unsigned flags);
static void sp_text_hide (SPItem *item, unsigned key);
static char *sp_text_description (SPItem *item);
static void sp_text_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
@@ -273,7 +273,7 @@ static void sp_text_modified(SPObject *object, guint flags)
// FIXME: all that we need to do here is to call setStyle, to set the changed
// style, but there's no easy way to access the drawing glyphs or texts corresponding to a
- // text object. Therefore we do here the same as in _update, that is, destroy all arena items
+ // text object. Therefore we do here the same as in _update, that is, destroy all items
// and create new ones. This is probably quite wasteful.
if (flags & ( SP_OBJECT_STYLE_MODIFIED_FLAG )) {
SPText *text = SP_TEXT (object);
@@ -386,11 +386,11 @@ sp_text_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, un
static Inkscape::DrawingItem *
-sp_text_show(SPItem *item, NRArena *arena, unsigned /* key*/, unsigned /*flags*/)
+sp_text_show(SPItem *item, Inkscape::Drawing &drawing, unsigned /* key*/, unsigned /*flags*/)
{
SPText *group = (SPText *) item;
- Inkscape::DrawingGroup *flowed = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *flowed = new Inkscape::DrawingGroup(drawing);
flowed->setPickChildren(false);
flowed->setStyle(group->style);
diff --git a/src/sp-text.h b/src/sp-text.h
index f865713c7..e426c425b 100644
--- a/src/sp-text.h
+++ b/src/sp-text.h
@@ -56,7 +56,7 @@ struct SPText : public SPItem {
static void _adjustCoordsRecursive(SPItem *item, Geom::Affine const &m, double ex, bool is_root = true);
static void _adjustFontsizeRecursive(SPItem *item, double ex, bool is_root = true);
- /** discards the NRArena objects representing this text. */
+ /** discards the drawing objects representing this text. */
void _clearFlow(Inkscape::DrawingGroup *in_arena);
private:
diff --git a/src/sp-use.cpp b/src/sp-use.cpp
index 2f83679de..89df9130d 100644
--- a/src/sp-use.cpp
+++ b/src/sp-use.cpp
@@ -53,7 +53,7 @@ static void sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &tr
static void sp_use_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs);
static void sp_use_print(SPItem *item, SPPrintContext *ctx);
static gchar *sp_use_description(SPItem *item);
-static Inkscape::DrawingItem *sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags);
+static Inkscape::DrawingItem *sp_use_show(SPItem *item, Inkscape::Drawing &drawing, unsigned key, unsigned flags);
static void sp_use_hide(SPItem *item, unsigned key);
static void sp_use_href_changed(SPObject *old_ref, SPObject *ref, SPUse *use);
@@ -347,16 +347,16 @@ sp_use_description(SPItem *item)
}
static Inkscape::DrawingItem *
-sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags)
+sp_use_show(SPItem *item, Inkscape::Drawing &drawing, unsigned key, unsigned flags)
{
SPUse *use = SP_USE(item);
- Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(arena);
+ Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(drawing);
ai->setPickChildren(false);
ai->setStyle(item->style);
if (use->child) {
- Inkscape::DrawingItem *ac = SP_ITEM(use->child)->invoke_show(arena, key, flags);
+ Inkscape::DrawingItem *ac = SP_ITEM(use->child)->invoke_show(drawing, key, flags);
if (ac) {
ai->prependChild(ac);
}
diff --git a/src/svg-view.cpp b/src/svg-view.cpp
index 3221ce146..8773dfab7 100644
--- a/src/svg-view.cpp
+++ b/src/svg-view.cpp
@@ -204,12 +204,12 @@ SPSVGView::setDocument (SPDocument *document)
if (document) {
Inkscape::DrawingItem *ai = document->getRoot()->invoke_show(
- SP_CANVAS_ARENA (_drawing)->arena,
+ SP_CANVAS_ARENA (_drawing)->drawing,
_dkey,
SP_ITEM_SHOW_DISPLAY);
if (ai) {
- SP_CANVAS_ARENA (_drawing)->root->prependChild(ai);
+ SP_CANVAS_ARENA (_drawing)->drawing.root()->prependChild(ai);
}
doRescale (!_rescale);
diff --git a/src/text-context.h b/src/text-context.h
index a140c2f08..50a738ca0 100644
--- a/src/text-context.h
+++ b/src/text-context.h
@@ -31,7 +31,6 @@
class SPTextContext;
class SPTextContextClass;
-class SPCanvasArena;
struct SPTextContext : public SPEventContext {
diff --git a/src/trace/trace.cpp b/src/trace/trace.cpp
index 7093ff683..7c47dc442 100644
--- a/src/trace/trace.cpp
+++ b/src/trace/trace.cpp
@@ -29,7 +29,7 @@
#include "sp-image.h"
#include <2geom/transforms.h>
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "display/drawing-shape.h"
#include "siox.h"
diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp
index ae5355c58..912bc1a40 100644
--- a/src/ui/cache/svg_preview_cache.cpp
+++ b/src/ui/cache/svg_preview_cache.cpp
@@ -30,18 +30,18 @@
#include "display/cairo-utils.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "ui/cache/svg_preview_cache.h"
-GdkPixbuf* render_pixbuf(Inkscape::DrawingItem* root, double scale_factor, const Geom::Rect& dbox, unsigned psize)
+GdkPixbuf* render_pixbuf(Inkscape::Drawing &drawing, double scale_factor, const Geom::Rect& dbox, unsigned psize)
{
Geom::Affine t(Geom::Scale(scale_factor, scale_factor));
- root->setTransform(Geom::Scale(scale_factor));
+ drawing.root()->setTransform(Geom::Scale(scale_factor));
Geom::IntRect ibox = (dbox * Geom::Scale(scale_factor)).roundOutwards();
- root->update(ibox);
+ drawing.update(ibox);
/* Find visible area */
int width = ibox.width();
@@ -59,7 +59,7 @@ GdkPixbuf* render_pixbuf(Inkscape::DrawingItem* root, double scale_factor, const
CAIRO_FORMAT_ARGB32, psize, psize);
Inkscape::DrawingContext ct(s, area.min());
- root->render(ct, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
+ drawing.render(ct, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
cairo_surface_flush(s);
GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data(cairo_image_surface_get_data(s),
diff --git a/src/ui/cache/svg_preview_cache.h b/src/ui/cache/svg_preview_cache.h
index b9fa6f627..2318307e2 100644
--- a/src/ui/cache/svg_preview_cache.h
+++ b/src/ui/cache/svg_preview_cache.h
@@ -16,7 +16,7 @@
#include "display/display-forward.h"
-GdkPixbuf* render_pixbuf(Inkscape::DrawingItem* root, double scale_factor, const Geom::Rect& dbox, unsigned psize);
+GdkPixbuf* render_pixbuf(Inkscape::Drawing &drawing, double scale_factor, const Geom::Rect& dbox, unsigned psize);
namespace Inkscape {
namespace UI {
diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp
index bb800f9ca..4f4093a99 100644
--- a/src/ui/dialog/filedialogimpl-win32.cpp
+++ b/src/ui/dialog/filedialogimpl-win32.cpp
@@ -34,8 +34,8 @@
#include "extension/output.h"
#include "extension/db.h"
-#include "display/nr-arena-item.h"
-#include "display/nr-arena.h"
+//#include "display/drawing-item.h"
+//#include "display/drawing.h"
#include "sp-item.h"
#include "display/canvas-arena.h"
diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp
index a6d76eb13..9865c0cdb 100644
--- a/src/ui/dialog/icon-preview.cpp
+++ b/src/ui/dialog/icon-preview.cpp
@@ -16,6 +16,7 @@
# include <config.h>
#endif
+#include <boost/scoped_ptr.hpp>
#include <gtk/gtk.h>
#include <glib/gmem.h>
#include <glibmm/i18n.h>
@@ -25,7 +26,7 @@
#include "desktop.h"
#include "desktop-handles.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "document.h"
#include "inkscape.h"
#include "preferences.h"
@@ -36,9 +37,10 @@
#include "icon-preview.h"
extern "C" {
-// takes doc, root, icon, and icon name to produce pixels
+// takes doc, drawing, icon, and icon name to produce pixels
+// this is defined in widgets/icon.cpp
guchar *
-sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
+sp_icon_doc_icon( SPDocument *doc, Inkscape::Drawing &drawing,
const gchar *name, unsigned int psize, unsigned &stride);
}
@@ -438,20 +440,16 @@ void IconPreviewPanel::renderPreview( SPObject* obj )
g_message("%s setting up to render '%s' as the icon", getTimestr().c_str(), id );
#endif // ICON_VERBOSE
- Inkscape::DrawingItem *root = NULL;
+ Inkscape::Drawing drawing;
- /* Create new arena */
- NRArena *arena = NRArena::create();
-
- /* Create ArenaItem and set transform */
+ /* Create drawing items and set transform */
unsigned int visionkey = SPItem::display_key_new(1);
-
- root = doc->getRoot()->invoke_show( arena, visionkey, SP_ITEM_SHOW_DISPLAY );
+ drawing.setRoot(doc->getRoot()->invoke_show( drawing, visionkey, SP_ITEM_SHOW_DISPLAY ));
for ( int i = 0; i < numEntries; i++ ) {
unsigned unused;
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, sizes[i]);
- guchar * px = sp_icon_doc_icon( doc, root, id, sizes[i], unused);
+ guchar * px = sp_icon_doc_icon( doc, drawing, id, sizes[i], unused);
// g_message( " size %d %s", sizes[i], (px ? "worked" : "failed") );
if ( px ) {
memcpy( pixMem[i], px, sizes[i] * stride );
@@ -465,7 +463,6 @@ void IconPreviewPanel::renderPreview( SPObject* obj )
updateMagnify();
doc->getRoot()->invoke_hide(visionkey);
- nr_object_unref((NRObject *) arena);
renderTimer->stop();
minDelay = std::max( 0.1, renderTimer->elapsed() * 3.0 );
#if ICON_VERBOSE
diff --git a/src/ui/view/view.h b/src/ui/view/view.h
index 13499a2e4..db6061434 100644
--- a/src/ui/view/view.h
+++ b/src/ui/view/view.h
@@ -65,7 +65,7 @@ namespace Inkscape {
/**
* View is an abstract base class of all UI document views. This
* includes both the editing window and the SVG preview, but does not
- * include the non-UI RGBA buffer-based NRArena nor the XML editor or
+ * include the non-UI RGBA buffer-based Inkscape::Drawing nor the XML editor or
* similar views. The View base class has very little functionality of
* its own.
*/
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index af329f3fc..08f0eadfb 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -36,7 +36,6 @@
#include "desktop-widget.h"
#include "display/sp-canvas.h"
#include "display/canvas-arena.h"
-#include "display/nr-arena.h"
#include "document.h"
#include "ege-color-prof-tracker.h"
#include "ege-select-one-action.h"
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index fea825444..a57b56b5c 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -33,7 +33,7 @@
#include "display/cairo-utils.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "io/sys.h"
#include "sp-root.h"
@@ -1088,9 +1088,9 @@ static Geom::IntRect round_rect(Geom::Rect const &r)
return ret;
}
-// takes doc, root, icon, and icon name to produce pixels
+// takes doc, drawing, icon, and icon name to produce pixels
extern "C" guchar *
-sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
+sp_icon_doc_icon( SPDocument *doc, Inkscape::Drawing &drawing,
gchar const *name, unsigned psize,
unsigned &stride)
{
@@ -1115,8 +1115,8 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
if ( dbox ) {
/* Update to renderable state */
double sf = 1.0;
- root->setTransform(Geom::Scale(sf));
- root->update();
+ drawing.root()->setTransform(Geom::Scale(sf));
+ drawing.update();
/* Item integer bbox in points */
// NOTE: previously, each rect coordinate was rounded using floor(c + 0.5)
Geom::IntRect ibox = round_rect(*dbox);
@@ -1141,8 +1141,8 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
}
sf = (double)psize / (double)block;
- root->setTransform(Geom::Scale(sf));
- root->update();
+ drawing.root()->setTransform(Geom::Scale(sf));
+ drawing.update();
ibox = round_rect(*dbox * Geom::Scale(sf));
if ( dump ) {
@@ -1185,7 +1185,7 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
CAIRO_FORMAT_ARGB32, psize, psize, stride);
Inkscape::DrawingContext ct(s, ua.min());
- root->render(ct, ua, Inkscape::DrawingItem::RENDER_BYPASS_CACHE);
+ drawing.render(ct, ua);
cairo_surface_destroy(s);
// convert to GdkPixbuf format
@@ -1206,9 +1206,21 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::DrawingItem *root,
class SVGDocCache
{
public:
- SVGDocCache( SPDocument *doc, Inkscape::DrawingItem *root ) : doc(doc), root(root) {}
+ SVGDocCache( SPDocument *doc )
+ : doc(doc)
+ , visionkey(SPItem::display_key_new(1))
+ {
+ doc->doRef();
+ doc->ensureUpToDate();
+ drawing.setRoot(doc->getRoot()->invoke_show(drawing, visionkey, SP_ITEM_SHOW_DISPLAY ));
+ }
+ ~SVGDocCache() {
+ doc->getRoot()->invoke_hide(visionkey);
+ doc->doUnref();
+ }
SPDocument *doc;
- Inkscape::DrawingItem *root;
+ Inkscape::Drawing drawing;
+ unsigned visionkey;
};
static std::map<Glib::ustring, SVGDocCache *> doc_cache;
@@ -1275,27 +1287,14 @@ guchar *IconImpl::load_svg_pixels(std::list<Glib::ustring> const &names,
if ( dump ) {
g_message("Loaded icon file %s", doc_filename);
}
- // prep the document
- doc->ensureUpToDate();
-
- // Create new arena
- NRArena *arena = NRArena::create();
-
- // Create ArenaItem and set transform
- unsigned visionkey = SPItem::display_key_new(1);
- // fixme: Memory manage root if needed (Lauris)
- // This needs to be fixed indeed; this leads to a memory leak of a few megabytes these days
- // because shapes are being rendered which are not being freed
- Inkscape::DrawingItem *root = doc->getRoot()->invoke_show( arena, visionkey, SP_ITEM_SHOW_DISPLAY );
-
// store into the cache
- info = new SVGDocCache(doc, root);
+ info = new SVGDocCache(doc);
doc_cache[key] = info;
}
}
if (info) {
for (std::list<Glib::ustring>::const_iterator it = names.begin(); !px && (it != names.end()); ++it ) {
- px = sp_icon_doc_icon( info->doc, info->root, it->c_str(), psize, stride );
+ px = sp_icon_doc_icon( info->doc, info->drawing, it->c_str(), psize, stride );
}
}
}
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index 4f6466ce8..8d9b9b429 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -29,7 +29,7 @@
#include "dialogs/dialog-events.h"
#include "display/canvas-bpath.h" // for SP_STROKE_LINEJOIN_*
#include "display/display-forward.h"
-#include "display/nr-arena.h"
+#include "display/drawing.h"
#include "document-private.h"
#include "gradient-chemistry.h"
#include "helper/stock-items.h"
@@ -153,8 +153,7 @@ sp_stroke_radio_button(Gtk::RadioButton *tb, char const *icon,
static Gtk::Image *
sp_marker_prev_new(unsigned psize, gchar const *mname,
SPDocument *source, SPDocument *sandbox,
- gchar const *menu_id, NRArena const * /*arena*/, unsigned /*visionkey*/,
- Inkscape::DrawingItem *root)
+ gchar const *menu_id, Inkscape::Drawing &drawing, unsigned /*visionkey*/)
{
// Retrieve the marker named 'mname' from the source SVG document
SPObject const *marker = source->getObjectById(mname);
@@ -209,7 +208,7 @@ sp_marker_prev_new(unsigned psize, gchar const *mname,
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Glib::wrap(svg_preview_cache.get_preview_from_cache(key));
if (!pixbuf) {
- pixbuf = Glib::wrap(render_pixbuf(root, sf, *dbox, psize));
+ pixbuf = Glib::wrap(render_pixbuf(drawing, sf, *dbox, psize));
svg_preview_cache.set_preview_in_cache(key, pixbuf->gobj());
}
@@ -249,9 +248,9 @@ static void
sp_marker_menu_build (Gtk::Menu *m, GSList *marker_list, SPDocument *source, SPDocument *sandbox, gchar const *menu_id)
{
// Do this here, outside of loop, to speed up preview generation:
- NRArena const *arena = NRArena::create();
+ Inkscape::Drawing drawing;
unsigned const visionkey = SPItem::display_key_new(1);
- Inkscape::DrawingItem *root = sandbox->getRoot()->invoke_show((NRArena *) arena, visionkey, SP_ITEM_SHOW_DISPLAY);
+ drawing.setRoot(sandbox->getRoot()->invoke_show(drawing, visionkey, SP_ITEM_SHOW_DISPLAY));
for (; marker_list != NULL; marker_list = marker_list->next) {
Inkscape::XML::Node *repr = reinterpret_cast<SPItem *>(marker_list->data)->getRepr();
@@ -272,7 +271,7 @@ sp_marker_menu_build (Gtk::Menu *m, GSList *marker_list, SPDocument *source, SPD
// generate preview
- Gtk::Image *prv = sp_marker_prev_new (22, markid, source, sandbox, menu_id, arena, visionkey, root);
+ Gtk::Image *prv = sp_marker_prev_new (22, markid, source, sandbox, menu_id, drawing, visionkey);
prv->show();
hb->pack_start(*prv, false, false, 6);
@@ -290,7 +289,6 @@ sp_marker_menu_build (Gtk::Menu *m, GSList *marker_list, SPDocument *source, SPD
}
sandbox->getRoot()->invoke_hide(visionkey);
- nr_object_unref((NRObject *) arena);
}
/**