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].

Reply via email to