Author: post
Date: 2011-03-30 22:38:53 +0200 (Wed, 30 Mar 2011)
New Revision: 3944

Modified:
   trunk/plugins/cache/cache.c
Log:
Add case for cache, where cached image does not have ROI, and request doesn't. 
Huge speedup on zoom in+out & loupe.

Modified: trunk/plugins/cache/cache.c
===================================================================
--- trunk/plugins/cache/cache.c 2011-03-29 22:00:37 UTC (rev 3943)
+++ trunk/plugins/cache/cache.c 2011-03-30 20:38:53 UTC (rev 3944)
@@ -161,6 +161,40 @@
                inner_rect->y + inner_rect->height <= outer_rect->y + 
outer_rect->height;
 }
 
+static gint get_cached_width(RSCache *cache)
+{
+       gint ret = -1;
+       if (rs_filter_response_has_image(cache->cached_image)) {
+               RS_IMAGE16 *img = 
rs_filter_response_get_image(cache->cached_image);
+               ret = img->w;
+               g_object_unref(img);
+       }
+
+       if (rs_filter_response_has_image8(cache->cached_image)) {
+               GdkPixbuf *img  =  
rs_filter_response_get_image8(cache->cached_image);
+               ret = gdk_pixbuf_get_width(img);
+               g_object_unref(img);
+       }
+       return ret;
+}
+
+static gint get_cached_height(RSCache *cache)
+{
+       gint ret = -1;
+       if (rs_filter_response_has_image(cache->cached_image)) {
+               RS_IMAGE16 *img = 
rs_filter_response_get_image(cache->cached_image);
+               ret = img->h;
+               g_object_unref(img);
+       }
+
+       if (rs_filter_response_has_image8(cache->cached_image)) {
+               GdkPixbuf *img  =  
rs_filter_response_get_image8(cache->cached_image);
+               ret = gdk_pixbuf_get_height(img);
+               g_object_unref(img);
+       }
+       return ret;
+}
+
 static void
 set_roi_to_full(RSCache *cache) {
        GdkRectangle *r = g_new(GdkRectangle, 1);
@@ -182,6 +216,8 @@
                rs_filter_response_set_roi(cache->cached_image,r);
                g_object_unref(img);
        }
+       filter_debug("Cache[%p]: Setting request ROI to full from cache!", 
cache);
+       filter_debug("Cache[%p]: Saved   ROI x:%d, y:%d, w:%d, h:%d", cache, 
r->x, r->y, r->width, r->height);
 }
 
 static RSFilterResponse *
@@ -211,17 +247,38 @@
                if (!rs_filter_response_get_roi(cache->cached_image) && roi)
                        set_roi_to_full(cache);
 
+               if (!roi && rs_filter_response_get_roi(cache->cached_image))
+               {
+                               roi = g_new(GdkRectangle, 1);
+                               roi->x = 0;
+                               roi->y = 0;
+                               roi->width = get_cached_width(cache);
+                               roi->height = get_cached_height(cache);
+                               rs_filter_request_set_roi(request, roi);
+                               filter_debug("Cache[%p]: Setting request ROI 
from cache!", filter);
+               }
+               if (rs_filter_response_get_roi(cache->cached_image) && roi)
+               {
+                       roi->x = MAX(0, roi->x);
+                       roi->y = MAX(0, roi->y);
+                       roi->width = MIN(roi->width, get_cached_width(cache));
+                       roi->height = MIN(roi->height, 
get_cached_height(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))
                                {
                                        filter_debug("Cache[%p]: Cached image 
ROI does not cover requested ROI!", filter);
+#if 0
+                                       GdkRectangle *r = 
rs_filter_response_get_roi(cache->cached_image);
+                                       filter_debug("Cache[%p]: Request ROI 
x:%d, y:%d, w:%d, h:%d", filter, roi->x, roi->y, roi->width, roi->height);
+                                       filter_debug("Cache[%p]: Cached  ROI 
x:%d, y:%d, w:%d, h:%d", filter, r->x, r->y, r->width, r->height);
+#endif
                                        flush(cache);
                                }
-
-               if (!roi && rs_filter_response_get_roi(cache->cached_image))
-                       flush(cache);
-
+               }
        }
 
        if (!rs_filter_response_has_image(cache->cached_image))
@@ -229,9 +286,21 @@
                filter_debug("Cache[%p]: Cached image NOT found", filter);
                g_object_unref(cache->cached_image);
                cache->cached_image = rs_filter_get_image(filter->previous, 
request);
-               rs_filter_response_set_roi(cache->cached_image, roi);
+
+               if (cache->cached_image && !roi)
+                       set_roi_to_full(cache);
+               else
+               {
+                       rs_filter_response_set_roi(cache->cached_image, roi);
+                       if (roi)
+                               filter_debug("Cache[%p]: Saved   ROI x:%d, 
y:%d, w:%d, h:%d", filter, roi->x, roi->y, roi->width, roi->height);
+               }
+
                if (rs_filter_request_get_quick(request))
+               {
                        rs_filter_response_set_quick(cache->cached_image);
+                       filter_debug("Cache[%p]: Setting image as quick", 
filter);
+               }
        }
 
        RSFilterResponse *fr = rs_filter_response_clone(cache->cached_image);


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

Reply via email to