From cd3043cf07c274cd641b8483b55177e9a5cb1e10 Mon Sep 17 00:00:00 2001 From: Andrius Ramanauskas Date: Wed, 19 Apr 2006 05:14:26 +0000 Subject: Rendering optimisation, which gives best results for zoomed in drawings with complex (multi-node) paths. Optimisation focus - eliminating cubicTo and LineTo nodes outside of visible area, so no unneeded calculations is needed and less memory is consumed (this avoids crashes which were occurring previously if zooming into a complex drawing) (bzr r541) --- src/libnr/nr-pixblock.cpp | 24 ++++++++++++------------ src/libnr/nr-pixblock.h | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) (limited to 'src/libnr') diff --git a/src/libnr/nr-pixblock.cpp b/src/libnr/nr-pixblock.cpp index 9b1ff2752..59e64b558 100644 --- a/src/libnr/nr-pixblock.cpp +++ b/src/libnr/nr-pixblock.cpp @@ -64,10 +64,10 @@ nr_pixblock_setup_fast (NRPixBlock *pb, NR_PIXBLOCK_MODE mode, int x0, int y0, i pb->mode = mode; pb->empty = 1; - pb->area.x0 = x0; - pb->area.y0 = y0; - pb->area.x1 = x1; - pb->area.y1 = y1; + pb->visible_area.x0 = pb->area.x0 = x0; + pb->visible_area.y0 = pb->area.y0 = y0; + pb->visible_area.x1 = pb->area.x1 = x1; + pb->visible_area.y1 = pb->area.y1 = y1; pb->rs = bpp * w; } @@ -103,10 +103,10 @@ nr_pixblock_setup (NRPixBlock *pb, NR_PIXBLOCK_MODE mode, int x0, int y0, int x1 pb->mode = mode; pb->empty = 1; - pb->area.x0 = x0; - pb->area.y0 = y0; - pb->area.x1 = x1; - pb->area.y1 = y1; + pb->visible_area.x0 = pb->area.x0 = x0; + pb->visible_area.y0 = pb->area.y0 = y0; + pb->visible_area.x1 = pb->area.x1 = x1; + pb->visible_area.y1 = pb->area.y1 = y1; pb->rs = bpp * w; } @@ -130,10 +130,10 @@ nr_pixblock_setup_extern (NRPixBlock *pb, NR_PIXBLOCK_MODE mode, int x0, int y0, pb->size = NR_PIXBLOCK_SIZE_STATIC; pb->mode = mode; pb->empty = empty; - pb->area.x0 = x0; - pb->area.y0 = y0; - pb->area.x1 = x1; - pb->area.y1 = y1; + pb->visible_area.x0 = pb->area.x0 = x0; + pb->visible_area.y0 = pb->area.y0 = y0; + pb->visible_area.x1 = pb->area.x1 = x1; + pb->visible_area.y1 = pb->area.y1 = y1; pb->data.px = px; pb->rs = rs; diff --git a/src/libnr/nr-pixblock.h b/src/libnr/nr-pixblock.h index 2a13dd921..c9ccb4fc6 100644 --- a/src/libnr/nr-pixblock.h +++ b/src/libnr/nr-pixblock.h @@ -41,6 +41,7 @@ struct NRPixBlock { bool empty : 1; ///< Empty flag unsigned int rs; ///< Size of line in bytes NRRectL area; + NRRectL visible_area; union { unsigned char *px; ///< Pointer to buffer unsigned char p[sizeof (unsigned char *)]; ///< Tiny buffer -- cgit v1.2.3