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/display/nr-arena.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/display/nr-arena.cpp') diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp index ce62a81dc..5747de26c 100644 --- a/src/display/nr-arena.cpp +++ b/src/display/nr-arena.cpp @@ -104,13 +104,13 @@ nr_arena_request_update (NRArena *arena, NRArenaItem *item) } void -nr_arena_request_render_rect (NRArena *arena, NRRectL *area) +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)); - nr_return_if_fail (area != NULL); + if (!area) return; // setup render parameter if (arena->renderoffscreen == false) { @@ -123,12 +123,13 @@ nr_arena_request_render_rect (NRArena *arena, NRRectL *area) arena->rendermode = Inkscape::RENDERMODE_NORMAL; arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL; } - if (aobject->callbacks && area && !nr_rect_l_test_empty_ptr(area)) { + 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, area, listener->data); + avector->request_render (arena, &nr_area, listener->data); } } } -- cgit v1.2.3 From 905b8a96963f78358abfd109c0c49758c6fe4e9d Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Thu, 28 Jul 2011 07:04:08 +0200 Subject: Per-item render cache. Cache some offscreen data to facilitate smoother navigation. (bzr r10347.1.20) --- src/display/nr-arena.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/display/nr-arena.cpp') diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp index 5747de26c..735d44e9e 100644 --- a/src/display/nr-arena.cpp +++ b/src/display/nr-arena.cpp @@ -151,6 +151,17 @@ nr_arena_set_renderoffscreen (NRArena *arena) } +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) + { + nr_arena_item_request_update(*i, NR_ARENA_ITEM_STATE_CACHE, FALSE); + } +} + #define FLOAT_TO_UINT8(f) (int(f*255)) #define RGBA_R(v) ((v) >> 24) #define RGBA_G(v) (((v) >> 16) & 0xff) -- 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/display/nr-arena.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src/display/nr-arena.cpp') diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp index 735d44e9e..b3e962201 100644 --- a/src/display/nr-arena.cpp +++ b/src/display/nr-arena.cpp @@ -12,13 +12,14 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "nr-arena-item.h" -#include "nr-arena.h" -#include "nr-filter-gaussian.h" -#include "nr-filter-types.h" +#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); @@ -58,7 +59,7 @@ 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->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL; // default is normal color + 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 @@ -72,14 +73,14 @@ nr_arena_finalize (NRObject *object) } void -nr_arena_request_update (NRArena *arena, NRArenaItem *item) +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); - nr_return_if_fail (NR_IS_ARENA_ITEM (item)); + // setup render parameter if (arena->renderoffscreen == false) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -89,7 +90,7 @@ nr_arena_request_update (NRArena *arena, NRArenaItem *item) arena->blurquality = BLUR_QUALITY_BEST; arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST; arena->rendermode = Inkscape::RENDERMODE_NORMAL; - arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL; + arena->colormode = Inkscape::COLORMODE_NORMAL; } if (aobject->callbacks) { @@ -121,7 +122,7 @@ nr_arena_request_render_rect (NRArena *arena, Geom::OptIntRect const &area) arena->blurquality = BLUR_QUALITY_BEST; arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST; arena->rendermode = Inkscape::RENDERMODE_NORMAL; - arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL; + arena->colormode = Inkscape::COLORMODE_NORMAL; } NRRectL nr_area(*area); if (aobject->callbacks) { @@ -155,10 +156,10 @@ 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(); + for (std::set::iterator i = arena->cached_items.begin(); i != arena->cached_items.end(); ++i) { - nr_arena_item_request_update(*i, NR_ARENA_ITEM_STATE_CACHE, FALSE); + (*i)->_markForUpdate(Inkscape::DrawingItem::STATE_CACHE, false); } } -- 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/display/nr-arena.cpp | 198 ----------------------------------------------- 1 file changed, 198 deletions(-) delete mode 100644 src/display/nr-arena.cpp (limited to 'src/display/nr-arena.cpp') 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 : -- cgit v1.2.3