Author: post
Date: 2009-07-11 21:34:31 +0200 (Sat, 11 Jul 2009)
New Revision: 2585

Modified:
   trunk/plugins/cache/cache.c
Log:
Reworked cache to cache response instead of individual parts - simpler and more 
robust.

Modified: trunk/plugins/cache/cache.c
===================================================================
--- trunk/plugins/cache/cache.c 2009-07-11 19:32:41 UTC (rev 2584)
+++ trunk/plugins/cache/cache.c 2009-07-11 19:34:31 UTC (rev 2585)
@@ -32,13 +32,10 @@
 struct _RSCache {
        RSFilter parent;
 
-       RS_IMAGE16 *image;
-       GdkPixbuf *image8;
+       RSFilterResponse *cached_image;
        gboolean ignore_changed;
        RSFilterChangedMask mask;
-       GdkRectangle *last_roi;
        gboolean ignore_roi;
-       gboolean quick;
        gint latency;
 };
 
@@ -100,12 +97,10 @@
 static void
 rs_cache_init(RSCache *cache)
 {
-       cache->image = NULL;
-       cache->image8 = NULL;
        cache->ignore_changed = FALSE;
-       cache->last_roi = NULL;
        cache->ignore_roi = FALSE;
        cache->latency = 0;
+       cache->cached_image = rs_filter_response_new();
 }
 
 static void
@@ -160,102 +155,111 @@
                inner_rect->y + inner_rect->height <= outer_rect->y + 
outer_rect->height;
 }
 
+static void
+set_roi_to_full(RSCache *cache) {
+       GdkRectangle *r = g_new(GdkRectangle, 1);
+       r->x = 0;
+       r->y = 0;
+
+       if (rs_filter_response_has_image(cache->cached_image)) {
+               RS_IMAGE16 *img = 
rs_filter_response_get_image(cache->cached_image);
+               r->width = img->w;
+               r->height = img->h;
+               rs_filter_response_set_roi(cache->cached_image,r);
+               g_object_unref(img);
+       }
+
+       if (rs_filter_response_has_image8(cache->cached_image)) {
+               GdkPixbuf *img  =  
rs_filter_response_get_image8(cache->cached_image);
+               r->width = gdk_pixbuf_get_width(img);
+               r->height = gdk_pixbuf_get_height(img);
+               rs_filter_response_set_roi(cache->cached_image,r);
+               g_object_unref(img);
+       }
+}
+
 static RSFilterResponse *
 get_image(RSFilter *filter, const RSFilterParam *param)
 {
-       RSFilterResponse *response;
        RSCache *cache = RS_CACHE(filter);
        GdkRectangle *roi = rs_filter_param_get_roi(param);
 
-       if (cache->quick && !rs_filter_param_get_quick(param))
-               flush(cache);
+       if (rs_filter_response_has_image(cache->cached_image)) {
 
-       /* FIXME: Fix this to save more correct RSFilterResponse */
-       if (!cache->ignore_roi && roi)
-       {
-               if (cache->last_roi)
-               {
-                       if (!rectangle_is_inside(cache->last_roi, roi))
-                               flush(cache);
-               }
+               if (rs_filter_response_get_quick(cache->cached_image) && 
!rs_filter_param_get_quick(param))
+                       flush(cache);
 
-               /* cache->last_roi can change in flush() */
-               if (!cache->last_roi)
-               {
-                       cache->last_roi = g_new(GdkRectangle, 1);
-                       *cache->last_roi = *roi;
-               }
-       }
+               if (!rs_filter_response_get_roi(cache->cached_image) && roi)
+                       set_roi_to_full(cache);
 
-       if (!roi && cache->last_roi)
-               flush(cache);
+               if (!cache->ignore_roi && roi)
+                       if (rs_filter_response_get_roi(cache->cached_image)) 
+                               if 
(!rectangle_is_inside(rs_filter_response_get_roi(cache->cached_image), roi))
+                                       flush(cache);
 
-       if (!cache->image)
+               if (!roi && rs_filter_response_get_roi(cache->cached_image))
+                       flush(cache);
+       }
+
+       if (!rs_filter_response_has_image(cache->cached_image))
        {
-               response = rs_filter_get_image(filter->previous, param);
-               cache->quick = rs_filter_param_get_quick(param);
-               cache->image = rs_filter_response_get_image(response);
-               g_object_unref(response);
+               g_object_unref(cache->cached_image);
+               cache->cached_image = rs_filter_get_image(filter->previous, 
param);
+               rs_filter_response_set_roi(cache->cached_image, roi);
+               if (rs_filter_param_get_quick(param))
+                       rs_filter_response_set_quick(cache->cached_image);
        }
 
-       response = rs_filter_response_new();
+       RSFilterResponse *fr = rs_filter_response_clone(cache->cached_image);
+       RS_IMAGE16* img = rs_filter_response_get_image(cache->cached_image);
+       rs_filter_response_set_image(fr, img);
 
-       if (cache->quick)
-               rs_filter_response_set_quick(response);
+       if (img)
+               g_object_unref(img);
 
-       if (cache->image)
-               rs_filter_response_set_image(response, cache->image);
-
-       return response;
+       return fr;
 }
 
+
 static RSFilterResponse *
 get_image8(RSFilter *filter, const RSFilterParam *param)
 {
-       RSFilterResponse *response;
        RSCache *cache = RS_CACHE(filter);
        GdkRectangle *roi = rs_filter_param_get_roi(param);
 
-       if (cache->quick && !rs_filter_param_get_quick(param))
-               flush(cache);
+       if (rs_filter_response_has_image8(cache->cached_image)) {
 
-       /* FIXME: Fix this to save more correct RSFilterResponse */
-       if (!cache->ignore_roi && roi)
-       {
-               if (cache->last_roi)
-               {
-                       if (!rectangle_is_inside(cache->last_roi, roi))
-                               flush(cache);
-               }
+               if (rs_filter_response_get_quick(cache->cached_image) && 
!rs_filter_param_get_quick(param))
+                       flush(cache);
 
-               /* cache->last_roi can change in flush() */
-               if (!cache->last_roi)
-               {
-                       cache->last_roi = g_new(GdkRectangle, 1);
-                       *cache->last_roi = *roi;
-               }
-       }
+               if (!rs_filter_response_get_roi(cache->cached_image) && roi)
+                       set_roi_to_full(cache);
 
-       if (!roi && cache->last_roi)
-               flush(cache);
+               if (!cache->ignore_roi && roi) 
+                       if (rs_filter_response_get_roi(cache->cached_image)) 
+                               if 
(!rectangle_is_inside(rs_filter_response_get_roi(cache->cached_image), roi))
+                                       flush(cache);
 
-       if (!cache->image8)
+               if (!roi && rs_filter_response_get_roi(cache->cached_image))
+                       flush(cache);
+       }
+
+       if (!rs_filter_response_has_image8(cache->cached_image))
        {
-               response = rs_filter_get_image8(filter->previous, param);
-               cache->image8 = rs_filter_response_get_image8(response);
-               cache->quick = rs_filter_param_get_quick(param);
-               g_object_unref(response);
+               g_object_unref(cache->cached_image);
+               cache->cached_image = rs_filter_get_image8(filter->previous, 
param);
+               rs_filter_response_set_roi(cache->cached_image, roi);
+               if (rs_filter_param_get_quick(param))
+                       rs_filter_response_set_quick(cache->cached_image);
        }
 
-       response = rs_filter_response_new();
+       RSFilterResponse *fr = rs_filter_response_clone(cache->cached_image);
+       GdkPixbuf* img = rs_filter_response_get_image8(cache->cached_image);
+       rs_filter_response_set_image8(fr, img);
+       if (img)
+               g_object_unref(img);
 
-       if (cache->quick)
-               cache->quick = rs_filter_param_get_quick(param);
-
-       if (cache->image8)
-               rs_filter_response_set_image8(response, cache->image8);
-
-       return response;
+       return fr;
 }
 
 static gboolean
@@ -271,20 +275,8 @@
 static void
 flush(RSCache *cache)
 {
-       if (cache->last_roi)
-               g_free(cache->last_roi);
-
-       cache->last_roi = NULL;
-
-       if (cache->image)
-               g_object_unref(cache->image);
-
-       cache->image = NULL;
-
-       if (cache->image8)
-               g_object_unref(cache->image8);
-
-       cache->image8 = NULL;
+       g_object_unref(cache->cached_image);
+       cache->cached_image = rs_filter_response_new();
 }
 
 static void


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to