The function RLoadImage uses code to store the RImage in a cache and recover it later.
This cache avoids to read the disk if the image was previously loaded. This patch adds two helpers functions: +RImage *get_image_from_cache(const char *file, struct stat *st) To recover the image from the cache. +void store_image_in_cache(RImage *image, const char *file, struct stat *st) To store the image in the cache. Signed-off-by: Rodolfo García Peñas (kix) <[email protected]> --- wrlib/load.c | 106 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/wrlib/load.c b/wrlib/load.c index 3b73c64..1af9678 100644 --- a/wrlib/load.c +++ b/wrlib/load.c @@ -123,28 +123,19 @@ static void init_cache(void) } } -RImage *RLoadImage(RContext * context, const char *file, int index) +static RImage *get_image_from_cache(const char *file, struct stat *st) { - RImage *image = NULL; int i; - struct stat st; - - assert(file != NULL); - if (RImageCacheSize < 0) { + if (RImageCacheSize < 0) init_cache(); - } if (RImageCacheSize > 0) { - for (i = 0; i < RImageCacheSize; i++) { if (RImageCache[i].file && strcmp(file, RImageCache[i].file) == 0) { - - if (stat(file, &st) == 0 && st.st_mtime == RImageCache[i].last_modif) { + if (stat(file, st) == 0 && st->st_mtime == RImageCache[i].last_modif) { RImageCache[i].last_use = time(NULL); - return RCloneImage(RImageCache[i].image); - } else { free(RImageCache[i].file); RImageCache[i].file = NULL; @@ -154,6 +145,61 @@ RImage *RLoadImage(RContext * context, const char *file, int index) } } + return NULL; +} + +static void store_image_in_cache(RImage *image, const char *file, struct stat *st) +{ + int i; + + /* store image in cache */ + if (RImageCacheSize > 0 && image && + (RImageCacheMaxImage == 0 || RImageCacheMaxImage >= image->width * image->height)) { + time_t oldest = time(NULL); + int oldest_idx = 0; + int done = 0; + + for (i = 0; i < RImageCacheSize; i++) { + if (!RImageCache[i].file) { + RImageCache[i].file = malloc(strlen(file) + 1); + strcpy(RImageCache[i].file, file); + RImageCache[i].image = RCloneImage(image); + RImageCache[i].last_modif = st->st_mtime; + RImageCache[i].last_use = time(NULL); + done = 1; + break; + } else { + if (oldest > RImageCache[i].last_use) { + oldest = RImageCache[i].last_use; + oldest_idx = i; + } + } + } + + /* if no slot available, dump least recently used one */ + if (!done) { + free(RImageCache[oldest_idx].file); + RReleaseImage(RImageCache[oldest_idx].image); + RImageCache[oldest_idx].file = malloc(strlen(file) + 1); + strcpy(RImageCache[oldest_idx].file, file); + RImageCache[oldest_idx].image = RCloneImage(image); + RImageCache[oldest_idx].last_modif = st->st_mtime; + RImageCache[oldest_idx].last_use = time(NULL); + } + } +} + +RImage *RLoadImage(RContext *context, const char *file, int index) +{ + RImage *image = NULL; + struct stat st; + + assert(file != NULL); + + image = get_image_from_cache(file, &st); + if (image) + return image; + switch (identFile(file)) { case IM_ERROR: return NULL; @@ -201,41 +247,7 @@ RImage *RLoadImage(RContext * context, const char *file, int index) return NULL; } - /* store image in cache */ - if (RImageCacheSize > 0 && image && - (RImageCacheMaxImage == 0 || RImageCacheMaxImage >= image->width * image->height)) { - time_t oldest = time(NULL); - int oldest_idx = 0; - int done = 0; - - for (i = 0; i < RImageCacheSize; i++) { - if (!RImageCache[i].file) { - RImageCache[i].file = malloc(strlen(file) + 1); - strcpy(RImageCache[i].file, file); - RImageCache[i].image = RCloneImage(image); - RImageCache[i].last_modif = st.st_mtime; - RImageCache[i].last_use = time(NULL); - done = 1; - break; - } else { - if (oldest > RImageCache[i].last_use) { - oldest = RImageCache[i].last_use; - oldest_idx = i; - } - } - } - - /* if no slot available, dump least recently used one */ - if (!done) { - free(RImageCache[oldest_idx].file); - RReleaseImage(RImageCache[oldest_idx].image); - RImageCache[oldest_idx].file = malloc(strlen(file) + 1); - strcpy(RImageCache[oldest_idx].file, file); - RImageCache[oldest_idx].image = RCloneImage(image); - RImageCache[oldest_idx].last_modif = st.st_mtime; - RImageCache[oldest_idx].last_use = time(NULL); - } - } + store_image_in_cache(image, file, &st); return image; } -- 1.8.4.rc3 -- To unsubscribe, send mail to [email protected].
