From 328fad57dbfb65e3bd31062021d5cc3081e68515 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Fri, 22 Jul 2011 04:09:27 +0200 Subject: Replace direct use of Cairo contexts and surfaces in the rendering tree with wrappers which keep some extra information about the surface, amd NRRect and NRRectL use with Geom::Rect and Geom::IntRect. Should simplify implementing filter primitive subregions. (bzr r10347.1.17) --- src/dialogs/clonetiler.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'src/dialogs') diff --git a/src/dialogs/clonetiler.cpp b/src/dialogs/clonetiler.cpp index f8553f2aa..1738754b4 100644 --- a/src/dialogs/clonetiler.cpp +++ b/src/dialogs/clonetiler.cpp @@ -14,6 +14,8 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif + +#include #include #include #include @@ -23,6 +25,7 @@ #include "desktop-handles.h" #include "dialog-events.h" #include "display/cairo-utils.h" +#include "display/drawing-context.h" #include "display/nr-arena.h" #include "display/nr-arena-item.h" #include "document.h" @@ -875,29 +878,20 @@ static guint32 clonetiler_trace_pick(Geom::Rect box) nr_arena_item_set_transform(trace_root, &t); NRGC gc(NULL); gc.transform.setIdentity(); - nr_arena_item_invoke_update( trace_root, NULL, &gc, + nr_arena_item_invoke_update( trace_root, Geom::IntRect::infinite(), &gc, NR_ARENA_ITEM_STATE_ALL, NR_ARENA_ITEM_STATE_NONE ); /* Item integer bbox in points */ - NRRectL ibox; - ibox.x0 = floor(trace_zoom * box[Geom::X].min()); - ibox.y0 = floor(trace_zoom * box[Geom::Y].min()); - ibox.x1 = ceil(trace_zoom * box[Geom::X].max()); - ibox.y1 = ceil(trace_zoom * box[Geom::Y].max()); + Geom::IntRect ibox = (box * Geom::Scale(trace_zoom)).roundOutwards(); /* Find visible area */ - int width = ibox.x1 - ibox.x0; - int height = ibox.y1 - ibox.y0; - double R = 0, G = 0, B = 0, A = 0; - - cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); - cairo_t *ct = cairo_create(s); - cairo_translate(ct, -ibox.x0, -ibox.y0); + cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height()); + Inkscape::DrawingContext ct(s, ibox.min()); /* Render */ - nr_arena_item_invoke_render(ct, trace_root, &ibox, NULL, + nr_arena_item_invoke_render(ct, trace_root, ibox, NR_ARENA_ITEM_RENDER_NO_CACHE ); - cairo_destroy(ct); + double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); -- cgit v1.2.3 From 4dd33aa4d5c57706c7f64f63391174954160a308 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Sat, 6 Aug 2011 14:18:32 +0200 Subject: Rewrite NRArenaItem hierarchy into C++ (bzr r10347.1.21) --- src/dialogs/clonetiler.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'src/dialogs') diff --git a/src/dialogs/clonetiler.cpp b/src/dialogs/clonetiler.cpp index 55b405523..2b08a307a 100644 --- a/src/dialogs/clonetiler.cpp +++ b/src/dialogs/clonetiler.cpp @@ -27,7 +27,7 @@ #include "display/cairo-utils.h" #include "display/drawing-context.h" #include "display/nr-arena.h" -#include "display/nr-arena-item.h" +#include "display/drawing-item.h" #include "document.h" #include "filter-chemistry.h" #include "helper/unit-menu.h" @@ -834,7 +834,7 @@ static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj) static NRArena const *trace_arena = NULL; static unsigned trace_visionkey; -static NRArenaItem *trace_root; +static Inkscape::DrawingItem *trace_root; static gdouble trace_zoom; static SPDocument *trace_doc; @@ -852,6 +852,8 @@ 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(); /* Create ArenaItem and set transform */ trace_visionkey = SPItem::display_key_new(1); @@ -874,13 +876,8 @@ static guint32 clonetiler_trace_pick(Geom::Rect box) return 0; } - Geom::Affine t(Geom::Scale(trace_zoom, trace_zoom)); - nr_arena_item_set_transform(trace_root, &t); - NRGC gc(NULL); - gc.transform.setIdentity(); - nr_arena_item_invoke_update( trace_root, Geom::IntRect::infinite(), &gc, - NR_ARENA_ITEM_STATE_ALL, - NR_ARENA_ITEM_STATE_NONE ); + trace_root->setTransform(Geom::Scale(trace_zoom)); + trace_root->update(); /* Item integer bbox in points */ Geom::IntRect ibox = (box * Geom::Scale(trace_zoom)).roundOutwards(); @@ -889,8 +886,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 */ - nr_arena_item_invoke_render(ct, trace_root, ibox, - NR_ARENA_ITEM_RENDER_NO_CACHE ); + trace_root->render(ct, ibox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); -- cgit v1.2.3 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/dialogs/clonetiler.cpp | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'src/dialogs') 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; } } -- cgit v1.2.3