From 847e41fa241ce3700119163efb9153b15d504f2e Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Sun, 13 Jun 2004 13:19:19 +0000 Subject: [PATCH] don't call tile_ewidth() three times from the inner loop. 2004-06-13 Sven Neumann * app/paint-funcs/paint-funcs.c (shapeburst_region): don't call tile_ewidth() three times from the inner loop. * app/base/tile-manager.c (tile_manager_get): don't call tile_size() twice on the same tile. * app/base/tile-private.h: added tile_size_inline(), an inline version of the tile_size() function. * app/base/tile-cache.c * app/base/tile-manager.c * app/base/tile-swap.c * app/base/tile.c: use tile_size_inline() from inside the tile subsystem. --- ChangeLog | 17 +++++++++++++++++ app/base/tile-cache.c | 14 +++++++------- app/base/tile-manager.c | 11 ++++++----- app/base/tile-private.h | 9 +++++++++ app/base/tile-swap.c | 36 +++++++++++++++++------------------ app/base/tile.c | 2 +- app/paint-funcs/paint-funcs.c | 18 +++++++++++++----- 7 files changed, 71 insertions(+), 36 deletions(-) diff --git a/ChangeLog b/ChangeLog index df9b026c0c..abe73f6cba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-06-13 Sven Neumann + + * app/paint-funcs/paint-funcs.c (shapeburst_region): don't call + tile_ewidth() three times from the inner loop. + + * app/base/tile-manager.c (tile_manager_get): don't call + tile_size() twice on the same tile. + + * app/base/tile-private.h: added tile_size_inline(), an inline + version of the tile_size() function. + + * app/base/tile-cache.c + * app/base/tile-manager.c + * app/base/tile-swap.c + * app/base/tile.c: use tile_size_inline() from inside the tile + subsystem. + 2004-06-13 Simon Budig * app/tools/gimpiscissorstool.c: Minor tweaks to two macros. diff --git a/app/base/tile-cache.c b/app/base/tile-cache.c index 38dcdc49f3..acdcb35b72 100644 --- a/app/base/tile-cache.c +++ b/app/base/tile-cache.c @@ -149,7 +149,7 @@ tile_cache_insert (Tile *tile) tile->listhead = NULL; if (list == &dirty_list) - cur_cache_dirty -= tile_size (tile); + cur_cache_dirty -= tile_size_inline (tile); } else { @@ -168,7 +168,7 @@ tile_cache_insert (Tile *tile) } } - cur_cache_size += tile_size (tile); + cur_cache_size += tile_size_inline (tile); } /* Put the tile at the end of the proper list */ @@ -191,7 +191,7 @@ tile_cache_insert (Tile *tile) if (tile->dirty || (tile->swap_offset == -1)) { - cur_cache_dirty += tile_size (tile); + cur_cache_dirty += tile_size_inline (tile); #ifdef USE_PTHREADS pthread_mutex_lock (&dirty_mutex); @@ -226,10 +226,10 @@ tile_cache_flush_internal (Tile *tile) if (list) { - cur_cache_size -= tile_size (tile); + cur_cache_size -= tile_size_inline (tile); if (list == &dirty_list) - cur_cache_dirty -= tile_size (tile); + cur_cache_dirty -= tile_size_inline (tile); if (tile->next) tile->next->prev = tile->prev; @@ -342,7 +342,7 @@ tile_idle_thread (gpointer data) list = tile->listhead; if (list == &dirty_list) - cur_cache_dirty -= tile_size (tile); + cur_cache_dirty -= tile_size_inline (tile); if (tile->next) tile->next->prev = tile->prev; @@ -416,7 +416,7 @@ tile_idle_preswap (gpointer data) clean_list.first = tile; clean_list.last = tile; - cur_cache_dirty -= tile_size (tile); + cur_cache_dirty -= tile_size_inline (tile); } return TRUE; diff --git a/app/base/tile-manager.c b/app/base/tile-manager.c index 456abe669e..d58f136bd8 100644 --- a/app/base/tile-manager.c +++ b/app/base/tile-manager.c @@ -216,13 +216,16 @@ tile_manager_get (TileManager *tm, { /* Copy-on-write required */ Tile *newtile = g_new (Tile, 1); + gint newsize; tile_init (newtile, (*tile_ptr)->bpp); newtile->ewidth = (*tile_ptr)->ewidth; newtile->eheight = (*tile_ptr)->eheight; newtile->valid = (*tile_ptr)->valid; - newtile->data = g_new (guchar, tile_size (newtile)); + + newsize = tile_size_inline (newtile); + newtile->data = g_new (guchar, newsize); if (!newtile->valid) g_warning ("Oh boy, r/w tile is invalid... we suck. " @@ -235,14 +238,12 @@ tile_manager_get (TileManager *tm, if ((*tile_ptr)->data) { - memcpy (newtile->data, - (*tile_ptr)->data, tile_size (newtile)); + memcpy (newtile->data, (*tile_ptr)->data, newsize); } else { tile_lock (*tile_ptr); - memcpy (newtile->data, - (*tile_ptr)->data, tile_size (newtile)); + memcpy (newtile->data, (*tile_ptr)->data, newsize); tile_release (*tile_ptr, FALSE); } diff --git a/app/base/tile-private.h b/app/base/tile-private.h index e016225b42..42cace95ed 100644 --- a/app/base/tile-private.h +++ b/app/base/tile-private.h @@ -102,4 +102,13 @@ struct _Tile #endif +/* an inlined version of tile_size() */ +static inline gint +tile_size_inline (Tile *tile) +{ + return tile->ewidth * tile->eheight * tile->bpp; +} + + + #endif /* __TILE_PRIVATE_H__ */ diff --git a/app/base/tile-swap.c b/app/base/tile-swap.c index 0c62839158..57a5f4c5f2 100644 --- a/app/base/tile-swap.c +++ b/app/base/tile-swap.c @@ -411,8 +411,8 @@ tile_swap_command (Tile *tile, if (swap_file->fd == -1) goto out; } - } - while ((* swap_file->swap_func) (swap_file->fd, + } + while ((* swap_file->swap_func) (swap_file->fd, tile, command, swap_file->user_data)); out: @@ -521,7 +521,7 @@ tile_swap_default_in_async (DefSwapFile *def_swap_file, if (!async_swapin_tiles) async_swapin_tiles = async_swapin_tiles_end; - + pthread_cond_signal (&async_swapin_signal); pthread_mutex_unlock (&async_swapin_mutex); @@ -579,22 +579,22 @@ tile_swap_default_in (DefSwapFile *def_swap_file, } } - bytes = tile_size (tile); + bytes = tile_size_inline (tile); tile_alloc (tile); nleft = bytes; while (nleft > 0) { - do + do { err = read (fd, tile->data + bytes - nleft, nleft); - } + } while ((err == -1) && ((errno == EAGAIN) || (errno == EINTR))); if (err <= 0) { if (read_err_msg) - g_message ("unable to read tile data from disk: %s (%d/%d bytes read)", + g_message ("unable to read tile data from disk: %s (%d/%d bytes read)", g_strerror (errno), err, nleft); read_err_msg = FALSE; return; @@ -624,12 +624,12 @@ tile_swap_default_out (DefSwapFile *def_swap_file, off_t newpos; bytes = TILE_WIDTH * TILE_HEIGHT * tile->bpp; - rbytes = tile_size (tile); + rbytes = tile_size_inline (tile); /* If there is already a valid swap_offset, use it */ if (tile->swap_offset == -1) newpos = tile_swap_find_offset (def_swap_file, fd, bytes); - else + else newpos = tile->swap_offset; if (def_swap_file->cur_position != newpos) @@ -638,7 +638,7 @@ tile_swap_default_out (DefSwapFile *def_swap_file, if (offset == -1) { if (seek_err_msg) - g_message ("unable to seek to tile location on disk: %s", + g_message ("unable to seek to tile location on disk: %s", g_strerror (errno)); seek_err_msg = FALSE; return; @@ -653,7 +653,7 @@ tile_swap_default_out (DefSwapFile *def_swap_file, if (err <= 0) { if (write_err_msg) - g_message ("unable to write tile data to disk: %s (%d/%d bytes written)", + g_message ("unable to write tile data to disk: %s (%d/%d bytes written)", g_strerror (errno), err, nleft); write_err_msg = FALSE; return; @@ -708,7 +708,7 @@ tile_swap_default_delete (DefSwapFile *def_swap_file, { gap2->end = gap->end; tile_swap_gap_destroy (gap); - def_swap_file->gaps = + def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp); g_list_free (tmp); } @@ -726,7 +726,7 @@ tile_swap_default_delete (DefSwapFile *def_swap_file, { gap2->start = gap->start; tile_swap_gap_destroy (gap); - def_swap_file->gaps = + def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp); g_list_free (tmp); } @@ -814,7 +814,7 @@ tile_swap_find_offset (DefSwapFile *def_swap_file, if (gap->start == gap->end) { tile_swap_gap_destroy (gap); - def_swap_file->gaps = + def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp); g_list_free (tmp); } @@ -827,7 +827,7 @@ tile_swap_find_offset (DefSwapFile *def_swap_file, offset = def_swap_file->swap_file_end; - tile_swap_resize (def_swap_file, fd, + tile_swap_resize (def_swap_file, fd, def_swap_file->swap_file_end + swap_file_grow); if ((offset + bytes) < (def_swap_file->swap_file_end)) @@ -899,16 +899,16 @@ tile_swap_in_attempt (DefSwapFile *def_swap_file, return; } - bytes = tile_size (tile); + bytes = tile_size_inline (tile); tile_alloc (tile); nleft = bytes; while (nleft > 0) { - do + do { err = read (fd, tile->data + bytes - nleft, nleft); - } + } while ((err == -1) && ((errno == EAGAIN) || (errno == EINTR))); if (err <= 0) diff --git a/app/base/tile.c b/app/base/tile.c index af81e25927..42e3439fed 100644 --- a/app/base/tile.c +++ b/app/base/tile.c @@ -220,7 +220,7 @@ tile_alloc (Tile *tile) /* Allocate the data for the tile. */ - tile->data = g_new (guchar, tile_size (tile)); + tile->data = g_new (guchar, tile_size_inline (tile)); #ifdef HINTS_SANITY tile_exist_count++; diff --git a/app/paint-funcs/paint-funcs.c b/app/paint-funcs/paint-funcs.c index e029a70e2d..2fad40b14f 100644 --- a/app/paint-funcs/paint-funcs.c +++ b/app/paint-funcs/paint-funcs.c @@ -3552,7 +3552,9 @@ shapeburst_region (PixelRegion *srcPR, min = (gint) MIN (min_left, min_prev); fraction = 255; - /* This might need to be changed to 0 instead of k = (min) ? (min - 1) : 0 */ + /* This might need to be changed to 0 + instead of k = (min) ? (min - 1) : 0 */ + for (k = (min) ? (min - 1) : 0; k <= min; k++) { x = j; @@ -3561,15 +3563,21 @@ shapeburst_region (PixelRegion *srcPR, while (y >= end) { + gint width; + tile = tile_manager_get_tile (srcPR->tiles, x, y, TRUE, FALSE); + tile_data = tile_data_pointer (tile, x % TILE_WIDTH, y % TILE_HEIGHT); - boundary = MIN ((y % TILE_HEIGHT), - (tile_ewidth (tile) - (x % TILE_WIDTH) - 1)); - boundary = MIN (boundary, (y - end)) + 1; - inc = 1 - tile_ewidth (tile); + width = tile_ewidth (tile); + + boundary = MIN (y % TILE_HEIGHT, + width - (x % TILE_WIDTH) - 1); + boundary = MIN (boundary, y - end) + 1; + + inc = 1 - width; while (boundary--) {