From: buliabyak Date: Tue, 17 Oct 2006 04:33:53 +0000 (+0000) Subject: purge fred's arena item tile cache (has been disabled for quite some time anyway... X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=2f95b6ec60b75dcab7588ac0cd73dea9d62cf74e;p=inkscape.git purge fred's arena item tile cache (has been disabled for quite some time anyway, bitrotting; enabling it gives no measureable advantage) --- diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp index 84ed621db..7b3e5bc94 100644 --- a/src/display/canvas-arena.cpp +++ b/src/display/canvas-arena.cpp @@ -103,10 +103,6 @@ sp_canvas_arena_init (SPCanvasArena *arena) arena->root = NRArenaGroup::create(arena->arena); nr_arena_group_set_transparent (NR_ARENA_GROUP (arena->root), TRUE); -#ifdef arena_item_tile_cache - arena->root->skipCaching=true; -#endif - arena->active = NULL; nr_active_object_add_listener ((NRActiveObject *) arena->arena, (NRObjectEventVector *) &carenaev, sizeof (carenaev), arena); @@ -186,10 +182,6 @@ sp_canvas_arena_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned i } } -#ifdef arena_item_tile_cache -extern void age_cache(void); -#endif - static void sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf) { @@ -204,9 +196,6 @@ sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf) sp_canvas_prepare_buffer(buf); -#ifdef arena_item_tile_cache - age_cache(); -#endif bw = buf->rect.x1 - buf->rect.x0; bh = buf->rect.y1 - buf->rect.y0; if ((bw < 1) || (bh < 1)) return; diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp index 8df045332..b1319822d 100644 --- a/src/display/nr-arena-group.cpp +++ b/src/display/nr-arena-group.cpp @@ -83,11 +83,6 @@ nr_arena_group_init (NRArenaGroup *group) group->last = NULL; group->style = NULL; nr_matrix_set_identity (&group->child_transform); - -#ifdef arena_item_tile_cache - group->skipCaching=true; -#endif - } static NRArenaItem * diff --git a/src/display/nr-arena-item.cpp b/src/display/nr-arena-item.cpp index 12d252496..d4e237104 100644 --- a/src/display/nr-arena-item.cpp +++ b/src/display/nr-arena-item.cpp @@ -25,6 +25,7 @@ #include "nr-filter.h" #include "libnr/nr-rect.h" #include "nr-arena-group.h" +#include "prefs-utils.h" namespace GC = Inkscape::GC; @@ -32,14 +33,6 @@ static void nr_arena_item_class_init (NRArenaItemClass *klass); static void nr_arena_item_init (NRArenaItem *item); static void nr_arena_item_private_finalize (NRObject *object); -#ifdef arena_item_tile_cache -bool insert_cache (NRArenaItem *owner, int th, int tv, NRPixBlock *ipb, - NRPixBlock *mpb, double activity, double duration); -void remove_caches (NRArenaItem *owner); -bool test_cache (NRArenaItem *owner, int th, int tv, NRPixBlock & ipb, - NRPixBlock &mpb, bool &hasMask); -#endif - static NRObjectClass *parent_class; NRType @@ -90,11 +83,6 @@ nr_arena_item_init (NRArenaItem *item) item->opacity = 255; item->render_opacity = FALSE; -#ifdef arena_item_tile_cache - item->activity = 0.0; - item->skipCaching = false; -#endif - item->transform = NULL; item->clip = NULL; item->mask = NULL; @@ -110,10 +98,6 @@ nr_arena_item_private_finalize (NRObject *object) { NRArenaItem *item = static_cast < NRArenaItem * >(object); -#ifdef arena_item_tile_cache - remove_caches (item); -#endif - item->px = NULL; item->transform = NULL; @@ -255,9 +239,6 @@ nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, if (!(item->state & NR_ARENA_ITEM_STATE_IMAGE) && (item->px)) { item->px = NULL; } -#ifdef arena_item_tile_cache - remove_caches (item); -#endif /* Set up local gc */ childgc = *gc; @@ -324,10 +305,6 @@ nr_arena_item_invoke_render (NRArenaItem *item, NRRectL const *area, area->x1, area->y1); #endif -#ifdef arena_item_tile_cache - item->activity *= 0.5; -#endif - /* If we are outside bbox just return successfully */ if (!item->visible) return item->state | NR_ARENA_ITEM_STATE_RENDER; @@ -360,11 +337,7 @@ nr_arena_item_invoke_render (NRArenaItem *item, NRRectL const *area, } NRPixBlock *dpb = pb; - bool canCache = false; -#ifdef arena_item_tile_cache - bool checkCache = false; - int tile_h = 0, tile_v = 0; -#endif + /* Setup cache if we can */ if ((!(flags & NR_ARENA_ITEM_RENDER_NO_CACHE)) && (carea.x0 <= item->bbox.x0) && (carea.y0 <= item->bbox.y0) && @@ -386,297 +359,57 @@ nr_arena_item_invoke_render (NRArenaItem *item, NRRectL const *area, dpb = &cpb; // Set nocache flag for downstream rendering flags |= NR_ARENA_ITEM_RENDER_NO_CACHE; - } else { -#ifdef arena_item_tile_cache - if (item->skipCaching) { - } else { - int - tl = area->x0 & (~127); - int - tt = area->y0 & (~127); - if (area->x1 <= tl + 128 && area->y1 <= tt + 128) { - checkCache = true; - tile_h = tl / 128; - tile_v = tt / 128; - int - surf = (area->x1 - area->x0) * (area->y1 - area->y0); - if (surf >= 4096) { - canCache = true; - carea.x0 = tl; - carea.y0 = tt; - carea.x1 = tl + 128; - carea.y1 = tt + 128; - } - } - } -#endif - } + } -#ifdef arena_item_tile_cache - item->activity += 1.0; -#endif - -#ifdef arena_item_tile_cache - if (checkCache) { - NRPixBlock - ipb, - mpb; - bool - hasMask; - if (test_cache (item, tile_h, tile_v, ipb, mpb, hasMask)) { - // youpi! c'etait deja cache - if (hasMask) { - nr_blit_pixblock_pixblock_mask (dpb, &ipb, &mpb); - } else if (((item->opacity != 255) && !item->render_opacity)) { - nr_blit_pixblock_pixblock_alpha (dpb, &ipb, item->opacity); - } else { - nr_blit_pixblock_pixblock (pb, &ipb); - } - pb->empty = FALSE; - return item->state | NR_ARENA_ITEM_STATE_RENDER; - } - } -#endif - if (canCache) { -#ifdef arena_item_tile_cache - // nota: exclusif de dpb != pb, donc pas de cas particulier a la fin - - // struct timeval start_time,end_time; - // gettimeofday(&start_time,NULL); - GTimeVal start_time, end_time; - g_get_current_time (&start_time); - int duration = 0; + /* Determine, whether we need temporary buffer */ + if (item->clip || item->mask + || ((item->opacity != 255) && !item->render_opacity && !outline) + || (item->filter && !outline) || item->background_new + || (item->parent && item->parent->background_pb)) { /* Setup and render item buffer */ NRPixBlock ipb; - nr_pixblock_setup_fast (&ipb, NR_PIXBLOCK_MODE_R8G8B8A8P, carea.x0, - carea.y0, carea.x1, carea.y1, TRUE); + nr_pixblock_setup_fast (&ipb, NR_PIXBLOCK_MODE_R8G8B8A8P, + carea.x0, carea.y0, carea.x1, carea.y1, + TRUE); - // if memory allocation failed, abort render + // if memory allocation failed, abort render if (ipb.data.px == NULL) { nr_pixblock_release (&ipb); return (item->state); } + /* If background access is used, save the pixblock address. + * This address is set to NULL at the end of this block */ + if (item->background_new + || (item->parent && item->parent->background_pb)) { + item->background_pb = &ipb; + } ipb.visible_area = pb->visible_area; - { - unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (item, &carea, &ipb, flags); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - nr_pixblock_release (&ipb); - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } + unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (item, &carea, &ipb, flags); + if (state & NR_ARENA_ITEM_STATE_INVALID) { + /* Clean up and return error */ + nr_pixblock_release (&ipb); + if (dpb != pb) + nr_pixblock_release (dpb); + item->state |= NR_ARENA_ITEM_STATE_INVALID; + return item->state; } ipb.empty = FALSE; + /* Run filtering, if a filter is set for this object */ + if (item->filter && !outline) { + item->filter->render (item, &ipb); + } + if (item->clip || item->mask) { /* Setup mask pixblock */ NRPixBlock mpb; - nr_pixblock_setup_fast (&mpb, NR_PIXBLOCK_MODE_A8, carea.x0, carea.y0, carea.x1, carea.y1, TRUE); + nr_pixblock_setup_fast (&mpb, NR_PIXBLOCK_MODE_A8, carea.x0, + carea.y0, carea.x1, carea.y1, TRUE); if (mpb.data.px != NULL) { // if memory allocation was successful - mpb.visible_area = pb->visible_area; - /* Do clip if needed */ - if (item->clip) { - unsigned int state = nr_arena_item_invoke_clip (item->clip, &carea, &mpb); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - nr_pixblock_release (&mpb); - nr_pixblock_release (&ipb); - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } - mpb.empty = FALSE; - } - /* Do mask if needed */ - if (item->mask) { - NRPixBlock tpb; - /* Set up yet another temporary pixblock */ - nr_pixblock_setup_fast (&tpb, NR_PIXBLOCK_MODE_R8G8B8A8N, - carea.x0, carea.y0, carea.x1, - carea.y1, TRUE); - - if (tpb.data.px != NULL) { // if memory allocation was successful - - tpb.visible_area = pb->visible_area; - unsigned int state = NR_ARENA_ITEM_VIRTUAL (item->mask, render) (item->mask, &carea, &tpb, flags); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - nr_pixblock_release (&tpb); - nr_pixblock_release (&mpb); - nr_pixblock_release (&ipb); - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } - /* Composite with clip */ - if (item->clip) { - int x, y; - for (y = carea.y0; y < carea.y1; y++) { - unsigned char *s, *d; - s = NR_PIXBLOCK_PX (&tpb) + (y - carea.y0) * tpb.rs; - d = NR_PIXBLOCK_PX (&mpb) + (y - carea.y0) * mpb.rs; - for (x = carea.x0; x < carea.x1; x++) { - unsigned int m; - m = ((s[0] + s[1] + s[2]) * s[3] + - 127) / (3 * 255); - d[0] = NR_PREMUL (d[0], m); - s += 4; - d += 1; - } - } - } else { - int x, y; - for (y = carea.y0; y < carea.y1; y++) { - unsigned char *s, *d; - s = NR_PIXBLOCK_PX (&tpb) + (y - carea.y0) * tpb.rs; - d = NR_PIXBLOCK_PX (&mpb) + (y - carea.y0) * mpb.rs; - for (x = carea.x0; x < carea.x1; x++) { - unsigned int m; - m = ((s[0] + s[1] + s[2]) * s[3] + - 127) / (3 * 255); - d[0] = m; - s += 4; - d += 1; - } - } - mpb.empty = FALSE; - } - } - nr_pixblock_release (&tpb); - } - /* Multiply with opacity if needed */ - if ((item->opacity != 255) && !item->render_opacity && !outline) { - int x, y; - unsigned int a; - a = item->opacity; - for (y = carea.y0; y < carea.y1; y++) { - unsigned char *d; - d = NR_PIXBLOCK_PX (&mpb) + (y - carea.y0) * mpb.rs; - for (x = carea.x0; x < carea.x1; x++) { - d[0] = NR_PREMUL (d[0], a); - d += 1; - } - } - } - /* Compose rendering pixblock int destination */ - // gettimeofday(&end_time,NULL); - g_get_current_time (&end_time); - duration = - (end_time.tv_sec - start_time.tv_sec) * 1000 + - (end_time.tv_usec - start_time.tv_usec) / 1000; - if (!(ipb.empty)) { - nr_blit_pixblock_pixblock_mask (dpb, &ipb, &mpb); - if (insert_cache - (item, tile_h, tile_v, &ipb, &mpb, item->activity, - (double) duration)) { - } else { - nr_pixblock_release (&mpb); - nr_pixblock_release (&ipb); - } - dpb->empty = FALSE; - } else { - nr_pixblock_release (&ipb); - } - } - } else - if (((item->opacity != 255) && !item->render_opacity - && !outline)) { - /* Opacity only */ - // gettimeofday(&end_time,NULL); - g_get_current_time (&end_time); - duration = - (end_time.tv_sec - start_time.tv_sec) * 1000 + - (end_time.tv_usec - start_time.tv_usec) / 1000; - if (!(ipb.empty)) { - nr_blit_pixblock_pixblock_alpha (dpb, &ipb, item->opacity); - if (insert_cache - (item, tile_h, tile_v, &ipb, NULL, item->activity, - (double) duration)) { - } else { - nr_pixblock_release (&ipb); - } - dpb->empty = FALSE; - } else { - nr_pixblock_release (&ipb); - } - } else { - // gettimeofday(&end_time,NULL); - g_get_current_time (&end_time); - duration = - (end_time.tv_sec - start_time.tv_sec) * 1000 + - (end_time.tv_usec - start_time.tv_usec) / 1000; - if (!(ipb.empty)) { - nr_blit_pixblock_pixblock (dpb, &ipb); - if (insert_cache - (item, tile_h, tile_v, &ipb, NULL, item->activity, - (double) duration)) { - } else { - nr_pixblock_release (&ipb); - } - dpb->empty = FALSE; - } else { - nr_pixblock_release (&ipb); - } - } -#endif - } else { - /* Determine, whether we need temporary buffer */ - if (item->clip || item->mask - || ((item->opacity != 255) && !item->render_opacity && !outline) - || (item->filter && !outline) || item->background_new - || (item->parent && item->parent->background_pb)) { - - /* Setup and render item buffer */ - NRPixBlock ipb; - nr_pixblock_setup_fast (&ipb, NR_PIXBLOCK_MODE_R8G8B8A8P, - carea.x0, carea.y0, carea.x1, carea.y1, - TRUE); - - // if memory allocation failed, abort render - if (ipb.data.px == NULL) { - nr_pixblock_release (&ipb); - return (item->state); - } - - /* If background access is used, save the pixblock address. - * This address is set to NULL at the end of this block */ - if (item->background_new - || (item->parent && item->parent->background_pb)) { - item->background_pb = &ipb; - } - ipb.visible_area = pb->visible_area; - unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (item, &carea, &ipb, flags); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - nr_pixblock_release (&ipb); - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } - ipb.empty = FALSE; - - /* Run filtering, if a filter is set for this object */ - if (item->filter && !outline) { - item->filter->render (item, &ipb); - } - - if (item->clip || item->mask) { - /* Setup mask pixblock */ - NRPixBlock mpb; - nr_pixblock_setup_fast (&mpb, NR_PIXBLOCK_MODE_A8, carea.x0, - carea.y0, carea.x1, carea.y1, TRUE); - - if (mpb.data.px != NULL) { // if memory allocation was successful - mpb.visible_area = pb->visible_area; /* Do clip if needed */ if (item->clip) { @@ -702,55 +435,55 @@ nr_arena_item_invoke_render (NRArenaItem *item, NRRectL const *area, if (tpb.data.px != NULL) { // if memory allocation was successful - tpb.visible_area = pb->visible_area; - unsigned int state = NR_ARENA_ITEM_VIRTUAL (item->mask, render) (item->mask, &carea, &tpb, flags); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - nr_pixblock_release (&tpb); - nr_pixblock_release (&mpb); - nr_pixblock_release (&ipb); - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } - /* Composite with clip */ - if (item->clip) { - int x, y; - for (y = carea.y0; y < carea.y1; y++) { - unsigned char *s, *d; - s = NR_PIXBLOCK_PX (&tpb) + (y - - carea.y0) * tpb.rs; - d = NR_PIXBLOCK_PX (&mpb) + (y - - carea.y0) * mpb.rs; - for (x = carea.x0; x < carea.x1; x++) { - unsigned int m; - m = NR_PREMUL_112 (s[0] + s[1] + s[2], s[3]); - d[0] = - FAST_DIV_ROUND < 3 * 255 * 255 > - (NR_PREMUL_123 (d[0], m)); - s += 4; - d += 1; - } + tpb.visible_area = pb->visible_area; + unsigned int state = NR_ARENA_ITEM_VIRTUAL (item->mask, render) (item->mask, &carea, &tpb, flags); + if (state & NR_ARENA_ITEM_STATE_INVALID) { + /* Clean up and return error */ + nr_pixblock_release (&tpb); + nr_pixblock_release (&mpb); + nr_pixblock_release (&ipb); + if (dpb != pb) + nr_pixblock_release (dpb); + item->state |= NR_ARENA_ITEM_STATE_INVALID; + return item->state; } - } else { - int x, y; - for (y = carea.y0; y < carea.y1; y++) { - unsigned char *s, *d; - s = NR_PIXBLOCK_PX (&tpb) + (y - - carea.y0) * tpb.rs; - d = NR_PIXBLOCK_PX (&mpb) + (y - - carea.y0) * mpb.rs; - for (x = carea.x0; x < carea.x1; x++) { - unsigned int m; - m = NR_PREMUL_112 (s[0] + s[1] + s[2], s[3]); - d[0] = FAST_DIV_ROUND < 3 * 255 > (m); - s += 4; - d += 1; + /* Composite with clip */ + if (item->clip) { + int x, y; + for (y = carea.y0; y < carea.y1; y++) { + unsigned char *s, *d; + s = NR_PIXBLOCK_PX (&tpb) + (y - + carea.y0) * tpb.rs; + d = NR_PIXBLOCK_PX (&mpb) + (y - + carea.y0) * mpb.rs; + for (x = carea.x0; x < carea.x1; x++) { + unsigned int m; + m = NR_PREMUL_112 (s[0] + s[1] + s[2], s[3]); + d[0] = + FAST_DIV_ROUND < 3 * 255 * 255 > + (NR_PREMUL_123 (d[0], m)); + s += 4; + d += 1; + } + } + } else { + int x, y; + for (y = carea.y0; y < carea.y1; y++) { + unsigned char *s, *d; + s = NR_PIXBLOCK_PX (&tpb) + (y - + carea.y0) * tpb.rs; + d = NR_PIXBLOCK_PX (&mpb) + (y - + carea.y0) * mpb.rs; + for (x = carea.x0; x < carea.x1; x++) { + unsigned int m; + m = NR_PREMUL_112 (s[0] + s[1] + s[2], s[3]); + d[0] = FAST_DIV_ROUND < 3 * 255 > (m); + s += 4; + d += 1; + } } + mpb.empty = FALSE; } - mpb.empty = FALSE; - } } nr_pixblock_release (&tpb); } @@ -771,37 +504,37 @@ nr_arena_item_invoke_render (NRArenaItem *item, NRRectL const *area, } /* Compose rendering pixblock int destination */ nr_blit_pixblock_pixblock_mask (dpb, &ipb, &mpb); - } - nr_pixblock_release (&mpb); - /* This pointer wouldn't be valid outside this block, so clear it */ - item->background_pb = NULL; - } else { - /* Opacity only */ - nr_blit_pixblock_pixblock_alpha (dpb, &ipb, item->opacity); } - nr_pixblock_release (&ipb); - dpb->empty = FALSE; + nr_pixblock_release (&mpb); + /* This pointer wouldn't be valid outside this block, so clear it */ + item->background_pb = NULL; } else { - /* Just render */ - unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (item, &carea, dpb, flags); - if (state & NR_ARENA_ITEM_STATE_INVALID) { - /* Clean up and return error */ - if (dpb != pb) - nr_pixblock_release (dpb); - item->state |= NR_ARENA_ITEM_STATE_INVALID; - return item->state; - } - dpb->empty = FALSE; + /* Opacity only */ + nr_blit_pixblock_pixblock_alpha (dpb, &ipb, item->opacity); } - - if (dpb != pb) { - /* Have to blit from cache */ - nr_blit_pixblock_pixblock (pb, dpb); - nr_pixblock_release (dpb); - pb->empty = FALSE; - item->state |= NR_ARENA_ITEM_STATE_IMAGE; + nr_pixblock_release (&ipb); + dpb->empty = FALSE; + } else { + /* Just render */ + unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (item, &carea, dpb, flags); + if (state & NR_ARENA_ITEM_STATE_INVALID) { + /* Clean up and return error */ + if (dpb != pb) + nr_pixblock_release (dpb); + item->state |= NR_ARENA_ITEM_STATE_INVALID; + return item->state; } + dpb->empty = FALSE; + } + + if (dpb != pb) { + /* Have to blit from cache */ + nr_blit_pixblock_pixblock (pb, dpb); + nr_pixblock_release (dpb); + pb->empty = FALSE; + item->state |= NR_ARENA_ITEM_STATE_IMAGE; } + return item->state | NR_ARENA_ITEM_STATE_RENDER; } @@ -1139,228 +872,6 @@ nr_arena_item_detach (NRArenaItem *parent, NRArenaItem *child) return next; } -/* - * - * caches - * - */ - -#ifdef arena_item_tile_cache -typedef struct cache_entry { - int key; - double score; - NRArenaItem *owner; - int th, tv; - int prev, next; - NRPixBlock ipb; - bool hasMask; - NRPixBlock mpb; -} cache_entry; - -int hash_max = 2048, hash_fill = 1024; - -int *keys = NULL; -int nbCch = 0; - -int nbEnt = 0, maxEnt = 0; -cache_entry *entries = NULL; - -//#define tile_cache_stats -#ifdef tile_cache_stats -double hits = 0, misses = 0; -int hitMissCount = 0; -#endif - -int -hash_that (NRArenaItem *owner, int th, int tv) -{ - int res = GPOINTER_TO_INT (owner); - res *= 17; - res += th; - res *= 59; - res += tv; - res *= 217; - if (res < 0) - res = -res; - res %= hash_max; - return res; -} - -bool -test_cache (NRArenaItem *owner, int th, int tv, NRPixBlock & ipb, - NRPixBlock & mpb, bool & hasMask) -{ - if (keys == NULL) { - hash_max = prefs_get_int_attribute ("options.arenatilescachesize", "value", 2048); - hash_fill = (hash_max * 3) / 4; - keys = (int *) malloc (hash_max * sizeof (int)); - for (int i = 0; i < hash_max; i++) - keys[i] = -1; - } - int key = hash_that (owner, th, tv); - if (keys[key] < 0) { -#ifdef tile_cache_stats - misses += 1.0; -#endif - return false; - } - int cur = keys[key]; - while (cur >= 0 && cur < nbEnt) { - if (entries[cur].owner == owner && entries[cur].th == th - && entries[cur].tv == tv) { - hasMask = entries[cur].hasMask; - ipb = entries[cur].ipb; - mpb = entries[cur].mpb; -#ifdef tile_cache_stats - hits += 1.0; -#endif - return true; - } - cur = entries[cur].next; - } -#ifdef tile_cache_stats - misses += 1.0; -#endif - return false; -} - -void -remove_one_cache (int no) -{ - if (no < 0 || no >= nbEnt) - return; - - nr_pixblock_release (&entries[no].ipb); - if (entries[no].hasMask) - nr_pixblock_release (&entries[no].mpb); - - if (entries[no].prev >= 0) - entries[entries[no].prev].next = entries[no].next; - if (entries[no].next >= 0) - entries[entries[no].next].prev = entries[no].prev; - if (entries[no].prev < 0) - keys[entries[no].key] = entries[no].next; - entries[no].prev = entries[no].next = entries[no].key = -1; - - if (no == nbEnt - 1) { - nbEnt--; - return; - } - entries[no] = entries[--nbEnt]; - if (entries[no].prev >= 0) - entries[entries[no].prev].next = no; - if (entries[no].next >= 0) - entries[entries[no].next].prev = no; - if (entries[no].prev < 0) - keys[entries[no].key] = no; -} - -void -remove_caches (NRArenaItem *owner) -{ - if (keys == NULL) { - hash_max = prefs_get_int_attribute ("options.arenatilescachesize", "value", 2048); - hash_fill = (hash_max * 3) / 4; - keys = (int *) malloc (hash_max * sizeof (int)); - for (int i = 0; i < hash_max; i++) - keys[i] = -1; - } - for (int i = nbEnt - 1; i >= 0; i--) { - if (entries[i].owner == owner) { - remove_one_cache (i); - } - } -} -void -age_cache (void) -{ - for (int i = 0; i < nbEnt; i++) - entries[i].score *= 0.95; -} - -bool -insert_cache (NRArenaItem *owner, int th, int tv, NRPixBlock *ipb, - NRPixBlock *mpb, double activity, double duration) -{ - if (keys == NULL) { - hash_max = prefs_get_int_attribute ("options.arenatilescachesize", "value", 2048); - hash_fill = (hash_max * 3) / 4; - keys = (int *) malloc (hash_max * sizeof (int)); - for (int i = 0; i < hash_max; i++) - keys[i] = -1; - } - for (int i = 0; i < nbEnt; i++) - entries[i].score *= 0.95; -#ifdef tile_cache_stats - hits *= 0.95; - misses *= 0.95; - hitMissCount++; - if (hitMissCount > 100) { - hitMissCount = 0; - printf ("hit/miss = %f used/total=%i/%i\n", (misses > 0.001) ? hits / misses : 100000.0, nbEnt, hash_max); // localizing ok - } -#endif - int key = hash_that (owner, th, tv); - double nScore = /*activity* */ duration; - - if (keys[key] >= 0) { - int cur = keys[key]; - while (cur >= 0 && cur < nbEnt) { - if (entries[cur].owner == owner && entries[cur].th == th - && entries[cur].tv == tv) { - remove_one_cache (cur); - break; - } - cur = entries[cur].next; - } - } - - bool doAdd = false; - if (nbEnt < hash_fill) { - doAdd = true; - } else { - double worstS = entries[0].score; - int worstE = 0; - for (int i = 1; i < nbEnt; i++) { - if (entries[i].score < worstS) { - worstS = entries[i].score; - worstE = i; - } - } - if (worstS < nScore) { - doAdd = true; - remove_one_cache (worstE); - } - } - if (doAdd == false) - return false; - if (nbEnt >= maxEnt) { - maxEnt = 2 * nbEnt + 1; - entries = (cache_entry *) realloc (entries, maxEnt * sizeof (cache_entry)); - } - entries[nbEnt].key = key; - entries[nbEnt].score = nScore; - entries[nbEnt].owner = owner; - entries[nbEnt].th = th; - entries[nbEnt].tv = tv; - entries[nbEnt].prev = entries[nbEnt].next = -1; - entries[nbEnt].ipb = *ipb; - if (mpb) { - entries[nbEnt].hasMask = true; - entries[nbEnt].mpb = *mpb; - } else { - entries[nbEnt].hasMask = false; - } - entries[nbEnt].next = keys[key]; - if (entries[nbEnt].next >= 0) - entries[entries[nbEnt].next].prev = nbEnt; - keys[key] = nbEnt; - - nbEnt++; - return true; -} -#endif - /* Local Variables: mode:c++ diff --git a/src/display/nr-arena-item.h b/src/display/nr-arena-item.h index 52408d154..16a7a0c12 100644 --- a/src/display/nr-arena-item.h +++ b/src/display/nr-arena-item.h @@ -60,11 +60,6 @@ #include "nr-arena-forward.h" #include "display/nr-filter.h" -// My testing shows that disabling cache reduces the amount -// of leaked memory when many documents are loaded one from the other, -// while there's no noticeable change in speed -//#define arena_item_tile_cache - struct NRGC { NRGC(NRGC const *p) : parent(p) {} NRGC const *parent; @@ -91,11 +86,6 @@ struct NRArenaItem : public NRObject { /* Key for secondary rendering */ unsigned int key; -#ifdef arena_item_tile_cache - bool skipCaching; - double activity; -#endif - /* BBox in grid coordinates */ NRRectL bbox; /* Our affine */