From 75976ea07dba9b97186667524d0a76603de416af Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Sun, 7 Aug 2011 12:53:12 +0200 Subject: Rewrite NRArena -> Inkscape::Drawing. Call render and update methods on the Drawing rather than on the root DrawingItem. (bzr r10347.1.25) --- src/display/Makefile_insert | 4 +- src/display/canvas-arena.cpp | 82 ++++++++--------- src/display/canvas-arena.h | 4 +- src/display/display-forward.h | 15 ++- src/display/drawing-group.cpp | 6 +- src/display/drawing-group.h | 2 +- src/display/drawing-image.cpp | 8 +- src/display/drawing-image.h | 2 +- src/display/drawing-item.cpp | 42 ++++----- src/display/drawing-item.h | 41 +++++---- src/display/drawing-shape.cpp | 16 ++-- src/display/drawing-shape.h | 2 +- src/display/drawing-text.cpp | 10 +- src/display/drawing-text.h | 4 +- src/display/drawing.cpp | 159 ++++++++++++++++++++++++++++++++ src/display/drawing.h | 103 +++++++++++++++++++++ src/display/nr-arena.cpp | 198 ---------------------------------------- src/display/nr-arena.h | 75 --------------- src/display/nr-filter-image.cpp | 19 ++-- src/display/nr-filter.cpp | 6 +- 20 files changed, 393 insertions(+), 405 deletions(-) create mode 100644 src/display/drawing.cpp create mode 100644 src/display/drawing.h delete mode 100644 src/display/nr-arena.cpp delete mode 100644 src/display/nr-arena.h (limited to 'src/display') 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 #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 +#include #include #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 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 + > 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 + * + * 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::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 + * + * 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 +#include +#include +#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 signal_request_update; + sigc::signal signal_request_render; + sigc::signal signal_item_deleted; + +private: + DrawingItem *_root; + std::set _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 - * - * 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; -} - -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::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 - * - * Copyright (C) 2001-2002 Lauris Kaplinski - * Copyright (C) 2001 Ximian, Inc. - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#include -#include -#include -#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(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 cached_items; - - guint32 outlinecolor; - SPCanvasArena *canvasarena; // may be NULL is this arena is not the screen but used for export etc. - - sigc::signal 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(); -- cgit v1.2.3