Author: abrander
Date: 2010-04-03 03:05:56 +0200 (Sat, 03 Apr 2010)
New Revision: 3325

Modified:
   trunk/librawstudio/rs-filter.c
   trunk/librawstudio/rs-filter.h
   trunk/plugins/crop/crop.c
   trunk/plugins/input-file/input-file.c
   trunk/plugins/input-image16/input-image16.c
   trunk/plugins/load-dcraw/dcrawloader.c
   trunk/plugins/load-gdk/load-gdk.c
   trunk/plugins/load-rawspeed/rawstudio-plugin-api.cpp
   trunk/plugins/output-tifffile/output-tifffile.c
   trunk/plugins/resample/resample.c
   trunk/plugins/rotate/rotate.c
   trunk/src/application.c
   trunk/src/rs-batch.c
   trunk/src/rs-loupe.c
   trunk/src/rs-navigator.c
   trunk/src/rs-preview-widget.c
   trunk/src/rs-save-dialog.c
Log:
Replaced rs_filter_get_width() and rs_filter_get_height() by 
rs_filter_get_size().

Modified: trunk/librawstudio/rs-filter.c
===================================================================
--- trunk/librawstudio/rs-filter.c      2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/librawstudio/rs-filter.c      2010-04-03 01:05:56 UTC (rev 3325)
@@ -69,8 +69,7 @@
 
        klass->get_image = NULL;
        klass->get_image8 = NULL;
-       klass->get_width = NULL;
-       klass->get_height = NULL;
+       klass->get_size = NULL;
        klass->previous_changed = NULL;
 
        object_class->dispose = dispose;
@@ -175,10 +174,11 @@
 /* Returns a new rectangle, or NULL if ROI was within bounds*/
 
 static GdkRectangle* 
-clamp_roi(const GdkRectangle *roi, RSFilter *filter)
+clamp_roi(const GdkRectangle *roi, RSFilter *filter, const RSFilterRequest 
*request)
 {
-       int w = rs_filter_get_width(filter);
-       int h = rs_filter_get_height(filter);
+       RSFilterResponse *response = rs_filter_get_size(filter, request);
+       gint w = rs_filter_response_get_width(response);
+       gint h = rs_filter_response_get_height(response);
 
        if ((roi->x >= 0) && (roi->y >=0) && (roi->x + roi->width <= w) && 
(roi->y + roi->height <= h))
                return NULL;
@@ -221,7 +221,7 @@
 
        if (filter->enabled && (roi = rs_filter_request_get_roi(request)))
        {
-               roi = clamp_roi(roi, filter);
+               roi = clamp_roi(roi, filter, request);
                if (roi)
                {
                        r = rs_filter_request_clone(request);
@@ -314,7 +314,7 @@
 
        if (filter->enabled && (roi = rs_filter_request_get_roi(request)))
        {
-               roi = clamp_roi(roi, filter);
+               roi = clamp_roi(roi, filter, request);
                if (roi)
                {
                        r = rs_filter_request_clone(request);
@@ -372,41 +372,49 @@
 }
 
 /**
- * Get the returned width of a RSFilter
+ * Get predicted size of a RSFilter
  * @param filter A RSFilter
- * @return Width in pixels
+ * @param request A RSFilterRequest defining parameters for the request
  */
-gint
-rs_filter_get_width(RSFilter *filter)
+RSFilterResponse *
+rs_filter_get_size(RSFilter *filter, const RSFilterRequest *request)
 {
-       gint width;
+       RSFilterResponse *response = NULL;
+
        g_assert(RS_IS_FILTER(filter));
 
-       if (RS_FILTER_GET_CLASS(filter)->get_width && filter->enabled)
-               width = RS_FILTER_GET_CLASS(filter)->get_width(filter);
-       else
-               width = rs_filter_get_width(filter->previous);
+       if (RS_FILTER_GET_CLASS(filter)->get_size && filter->enabled)
+               response = RS_FILTER_GET_CLASS(filter)->get_size(filter, 
request);
+       else if (filter->previous)
+               response = rs_filter_get_size(filter->previous, request);
 
-       return width;
+       return response;
 }
 
 /**
- * Get the returned height of a RSFilter
+ * Get predicted size of a RSFilter
  * @param filter A RSFilter
- * @return Height in pixels
+ * @param request A RSFilterRequest defining parameters for the request
+ * @param width A pointer to a gint where the width will be written or NULL
+ * @param height A pointer to a gint where the height will be written or NULL
+ * @return TRUE if width/height is known, FALSE otherwise
  */
-gint
-rs_filter_get_height(RSFilter *filter)
+gboolean
+rs_filter_get_size_simple(RSFilter *filter, const RSFilterRequest *request, 
gint *width, gint *height)
 {
-       gint height;
-       g_assert(RS_IS_FILTER(filter));
+       gint w, h;
+       RSFilterResponse *response = rs_filter_get_size(filter, request);
 
-       if (RS_FILTER_GET_CLASS(filter)->get_height && filter->enabled)
-               height = RS_FILTER_GET_CLASS(filter)->get_height(filter);
-       else
-               height = rs_filter_get_height(filter->previous);
+       w = rs_filter_response_get_width(response);
+       h = rs_filter_response_get_height(response);
+       if (width)
+               *width = w;
+       if (height)
+               *height = h;
 
-       return height;
+       g_object_unref(response);
+
+       return ((w>0) && (h>0));
 }
 
 /**
@@ -705,11 +713,13 @@
        for(i=0; i<n_next; i++)
        {
                RSFilter *next = 
RS_FILTER(g_slist_nth_data(filter->next_filters, i));
+               RSFilterResponse *response = rs_filter_get_size(filter, 
RS_FILTER_REQUEST_QUICK);
 
                /* Edge - print dimensions along */
                g_string_append_printf(str, "\t\"%p\" -> \"%p\" [label=\" 
%dx%d\"];\n",
                        filter, next,
-                       rs_filter_get_width(filter), 
rs_filter_get_height(filter));
+                       rs_filter_response_get_width(response), 
rs_filter_response_get_height(response));
+               g_object_unref(response);
 
                /* Recursively call ourself for every "next" filter */
                rs_filter_graph_helper(str, next);

Modified: trunk/librawstudio/rs-filter.h
===================================================================
--- trunk/librawstudio/rs-filter.h      2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/librawstudio/rs-filter.h      2010-04-03 01:05:56 UTC (rev 3325)
@@ -97,8 +97,7 @@
        const gchar *name;
        RSFilterFunc get_image;
        RSFilterFunc get_image8;
-       gint (*get_width)(RSFilter *filter);
-       gint (*get_height)(RSFilter *filter);
+       RSFilterResponse *(*get_size)(RSFilter *filter, const RSFilterRequest 
*request);
        void (*previous_changed)(RSFilter *filter, RSFilter *parent, 
RSFilterChangedMask mask);
 };
 
@@ -144,18 +143,21 @@
 extern RSFilterResponse *rs_filter_get_image8(RSFilter *filter, const 
RSFilterRequest *request);
 
 /**
- * Get the returned width of a RSFilter
+ * Get predicted size of a RSFilter
  * @param filter A RSFilter
- * @return Width in pixels
+ * @param request A RSFilterRequest defining parameters for the request
  */
-extern gint rs_filter_get_width(RSFilter *filter);
+extern RSFilterResponse *rs_filter_get_size(RSFilter *filter, const 
RSFilterRequest *request);
 
 /**
- * Get the returned height of a RSFilter
+ * Get predicted size of a RSFilter
  * @param filter A RSFilter
- * @return Height in pixels
+ * @param request A RSFilterRequest defining parameters for the request
+ * @param width A pointer to a gint where the width will be written or NULL
+ * @param height A pointer to a gint where the height will be written or NULL
+ * @return TRUE if width/height is known, FALSE otherwise
  */
-extern gint rs_filter_get_height(RSFilter *filter);
+extern gboolean rs_filter_get_size_simple(RSFilter *filter, const 
RSFilterRequest *request, gint *width, gint *height);
 
 /**
  * Set a GObject property on zero or more filters above #filter recursively

Modified: trunk/plugins/crop/crop.c
===================================================================
--- trunk/plugins/crop/crop.c   2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/plugins/crop/crop.c   2010-04-03 01:05:56 UTC (rev 3325)
@@ -65,8 +65,7 @@
 static void set_property (GObject *object, guint property_id, const GValue 
*value, GParamSpec *pspec);
 static void calc(RSCrop *crop);
 static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest 
*request);
-static gint get_width(RSFilter *filter);
-static gint get_height(RSFilter *filter);
+static RSFilterResponse *get_size(RSFilter *filter, const RSFilterRequest 
*request);
 
 static RSFilterClass *rs_crop_parent_class = NULL;
 
@@ -130,8 +129,7 @@
 
        filter_class->name = "Crop filter";
        filter_class->get_image = get_image;
-       filter_class->get_width = get_width;
-       filter_class->get_height = get_height;
+       filter_class->get_size = get_size;
 }
 
 static void
@@ -243,8 +241,10 @@
        crop->scale = 1.0f;
        rs_filter_get_recursive(RS_FILTER(crop), "scale", &crop->scale, NULL);
 
-       gint parent_width = rs_filter_get_width(filter->previous);
-       gint parent_height = rs_filter_get_height(filter->previous);
+       RSFilterResponse *response = rs_filter_get_size(filter->previous, 
RS_FILTER_REQUEST_QUICK);
+       gint parent_width = rs_filter_response_get_width(response);
+       gint parent_height = rs_filter_response_get_height(response);
+       g_object_unref(response);
 
        crop->effective.x1 = CLAMP((float)crop->target.x1 * crop->scale + 0.5f, 
0, parent_width-1);
        crop->effective.x2 = CLAMP((float)crop->target.x2 * crop->scale + 0.5f, 
0, parent_width-1);
@@ -264,10 +264,14 @@
        RSFilterResponse *response;
        RS_IMAGE16 *output;
        RS_IMAGE16 *input;
-       gint parent_width = rs_filter_get_width(filter->previous);
-       gint parent_height = rs_filter_get_height(filter->previous);
        gint row;
 
+       /* We request response twice, is that wise? */
+       response = rs_filter_get_size(filter->previous, request);
+       gint parent_width = rs_filter_response_get_width(response);
+       gint parent_height = rs_filter_response_get_height(response);
+       g_object_unref(response);
+
        calc(crop);
 
        /* Special case for full crop */
@@ -325,21 +329,19 @@
        return response;
 }
 
-static gint
-get_width(RSFilter *filter)
+static RSFilterResponse *
+get_size(RSFilter *filter, const RSFilterRequest *request)
 {
        RSCrop *crop = RS_CROP(filter);
 
        calc(crop);
 
-       return crop->width;
-}
+       RSFilterResponse *previous_response = 
rs_filter_get_size(filter->previous, request);
+       RSFilterResponse *response = 
rs_filter_response_clone(previous_response);
+       g_object_unref(previous_response);
 
-static gint
-get_height(RSFilter *filter)
-{
-       RSCrop *crop = RS_CROP(filter);
-       calc(crop);
+       rs_filter_response_set_width(response, crop->width);
+       rs_filter_response_set_height(response, crop->height);
 
-       return crop->height;
+       return response;
 }

Modified: trunk/plugins/input-file/input-file.c
===================================================================
--- trunk/plugins/input-file/input-file.c       2010-04-03 01:03:39 UTC (rev 
3324)
+++ trunk/plugins/input-file/input-file.c       2010-04-03 01:05:56 UTC (rev 
3325)
@@ -50,8 +50,7 @@
 static void get_property (GObject *object, guint property_id, GValue *value, 
GParamSpec *pspec);
 static void set_property (GObject *object, guint property_id, const GValue 
*value, GParamSpec *pspec);
 static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest 
*request);
-static gint get_width(RSFilter *filter);
-static gint get_height(RSFilter *filter);
+static RSFilterResponse *get_size(RSFilter *filter, const RSFilterRequest 
*request);
 
 static RSFilterClass *rs_input_file_parent_class = NULL;
 
@@ -87,8 +86,7 @@
 
        filter_class->name = "File loader based on rs_filetypes";
        filter_class->get_image = get_image;
-       filter_class->get_width = get_width;
-       filter_class->get_height = get_height;
+       filter_class->get_size = get_size;
 }
 
 static void
@@ -159,24 +157,17 @@
        return response;
 }
 
-static gint
-get_width(RSFilter *filter)
+static RSFilterResponse *
+get_size(RSFilter *filter, const RSFilterRequest *request)
 {
+       RSFilterResponse *response = rs_filter_response_new();
        RSInputFile *input = RS_INPUT_FILE(filter);
 
        if (input->image)
-               return input->image->w;
-       else
-               return -1;
-}
+       {
+               rs_filter_response_set_width(response, input->image->w);
+               rs_filter_response_set_height(response, input->image->h);
+       }
 
-static gint
-get_height(RSFilter *filter)
-{
-       RSInputFile *input = RS_INPUT_FILE(filter);
-
-       if (input->image)
-               return input->image->h;
-       else
-               return -1;
+       return response;
 }

Modified: trunk/plugins/input-image16/input-image16.c
===================================================================
--- trunk/plugins/input-image16/input-image16.c 2010-04-03 01:03:39 UTC (rev 
3324)
+++ trunk/plugins/input-image16/input-image16.c 2010-04-03 01:05:56 UTC (rev 
3325)
@@ -54,9 +54,8 @@
 static void get_property (GObject *object, guint property_id, GValue *value, 
GParamSpec *pspec);
 static void set_property (GObject *object, guint property_id, const GValue 
*value, GParamSpec *pspec);
 static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest 
*request);
+static RSFilterResponse *get_size(RSFilter *filter, const RSFilterRequest 
*request);
 static void dispose (GObject *object);
-static gint get_width(RSFilter *filter);
-static gint get_height(RSFilter *filter);
 
 static RSFilterClass *rs_input_image16_parent_class = NULL;
 
@@ -98,8 +97,7 @@
 
        filter_class->name = "Import a RS_IMAGE16 into a RSFilter chain";
        filter_class->get_image = get_image;
-       filter_class->get_width = get_width;
-       filter_class->get_height = get_height;
+       filter_class->get_size = get_size;
 }
 
 static void
@@ -195,25 +193,18 @@
        return rs_filter_response_new();
 }
 
-static gint
-get_width(RSFilter *filter)
+static RSFilterResponse *
+get_size(RSFilter *filter, const RSFilterRequest *request)
 {
        RSInputImage16 *input_image16 = RS_INPUT_IMAGE16(filter);
 
-       if (!RS_IS_IMAGE16(input_image16->image))
-               return -1;
+       RSFilterResponse *response = 
rs_filter_response_clone(RS_FILTER_RESPONSE(input_image16->image_response));
 
-       return input_image16->image->w;
-}
+       if (input_image16->image)
+       {
+               rs_filter_response_set_width(response, input_image16->image->w);
+               rs_filter_response_set_height(response, 
input_image16->image->h);
+       }
 
-static gint
-get_height(RSFilter *filter)
-{
-       RSInputImage16 *input_image16 = RS_INPUT_IMAGE16(filter);
-
-       if (!RS_IS_IMAGE16(input_image16->image))
-               return -1;
-
-       return input_image16->image->h;
+       return response;
 }
-

Modified: trunk/plugins/load-dcraw/dcrawloader.c
===================================================================
--- trunk/plugins/load-dcraw/dcrawloader.c      2010-04-03 01:03:39 UTC (rev 
3324)
+++ trunk/plugins/load-dcraw/dcrawloader.c      2010-04-03 01:05:56 UTC (rev 
3325)
@@ -177,6 +177,8 @@
        dcraw_data *raw = g_new0(dcraw_data, 1);
        RS_IMAGE16 *image = NULL;
 
+       RSFilterResponse* response = rs_filter_response_new();
+
        rs_io_lock();
        if (!dcraw_open(raw, (char *) filename))
        {
@@ -189,8 +191,9 @@
                rs_io_unlock();
        g_free(raw);
 
-       RSFilterResponse* response = rs_filter_response_new();
        rs_filter_response_set_image(response, image);
+       rs_filter_response_set_width(response, image->w);
+       rs_filter_response_set_height(response, image->h);
        g_object_unref(image);
        return response;
 }

Modified: trunk/plugins/load-gdk/load-gdk.c
===================================================================
--- trunk/plugins/load-gdk/load-gdk.c   2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/plugins/load-gdk/load-gdk.c   2010-04-03 01:05:56 UTC (rev 3325)
@@ -64,6 +64,8 @@
 
        RSFilterResponse* response = rs_filter_response_new();
        rs_filter_response_set_image(response, image);
+       rs_filter_response_set_width(response, image->w);
+       rs_filter_response_set_height(response, image->h);
        g_object_unref(image);
        return response;
 }

Modified: trunk/plugins/load-rawspeed/rawstudio-plugin-api.cpp
===================================================================
--- trunk/plugins/load-rawspeed/rawstudio-plugin-api.cpp        2010-04-03 
01:03:39 UTC (rev 3324)
+++ trunk/plugins/load-rawspeed/rawstudio-plugin-api.cpp        2010-04-03 
01:05:56 UTC (rev 3325)
@@ -149,6 +149,8 @@
 
        RSFilterResponse* response = rs_filter_response_new();
        rs_filter_response_set_image(response, image);
+       rs_filter_response_set_width(response, image->w);
+       rs_filter_response_set_height(response, image->h);
        g_object_unref(image);
        return response;
 }

Modified: trunk/plugins/output-tifffile/output-tifffile.c
===================================================================
--- trunk/plugins/output-tifffile/output-tifffile.c     2010-04-03 01:03:39 UTC 
(rev 3324)
+++ trunk/plugins/output-tifffile/output-tifffile.c     2010-04-03 01:05:56 UTC 
(rev 3325)
@@ -209,19 +209,17 @@
        if (tifffile->color_space && 
!g_str_equal(G_OBJECT_TYPE_NAME(tifffile->color_space), "RSSrgb"))
                profile = rs_color_space_get_icc_profile(tifffile->color_space);
 
-       rs_tiff_generic_init(tiff, rs_filter_get_width(filter), 
rs_filter_get_height(filter), 3, profile, tifffile->uncompressed);
-
        RSFilterRequest *request = rs_filter_request_new();
        rs_filter_request_set_quick(request, FALSE);
        rs_filter_param_set_object(RS_FILTER_PARAM(request), "colorspace", 
tifffile->color_space);
 
        if (tifffile->save16bit)
        {
-               gint width = rs_filter_get_width(filter);
                gint col;
                response = rs_filter_get_image(filter, request);
                RS_IMAGE16 *image = rs_filter_response_get_image(response);
-               gushort *line = g_new(gushort, width*3);
+               rs_tiff_generic_init(tiff, image->w, image->h, 3, profile, 
tifffile->uncompressed);
+               gushort *line = g_new(gushort, image->w*3);
 
                g_assert(image->channels == 3);
                g_assert(image->pixelsize == 4);
@@ -231,7 +229,7 @@
                for(row=0;row<image->h;row++)
                {
                        gushort *buf = GET_PIXEL(image, 0, row);
-                       for(col=0;col<width; col++)
+                       for(col=0;col<image->w; col++)
                        {
                                line[col*3 + R] = buf[col*4 + R];
                                line[col*3 + G] = buf[col*4 + G];

Modified: trunk/plugins/resample/resample.c
===================================================================
--- trunk/plugins/resample/resample.c   2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/plugins/resample/resample.c   2010-04-03 01:05:56 UTC (rev 3325)
@@ -75,8 +75,7 @@
 static void previous_changed(RSFilter *filter, RSFilter *parent, 
RSFilterChangedMask mask);
 static RSFilterChangedMask recalculate_dimensions(RSResample *resample);
 static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest 
*request);
-static gint get_width(RSFilter *filter);
-static gint get_height(RSFilter *filter);
+static RSFilterResponse *get_size(RSFilter *filter, const RSFilterRequest 
*request);
 static void ResizeH(ResampleInfo *info);
 void ResizeV(ResampleInfo *info);
 extern void ResizeV_SSE2(ResampleInfo *info);
@@ -128,8 +127,7 @@
 
        filter_class->name = "Resample filter";
        filter_class->get_image = get_image;
-       filter_class->get_width = get_width;
-       filter_class->get_height = get_height;
+       filter_class->get_size = get_size;
        filter_class->previous_changed = previous_changed;
 }
 
@@ -219,11 +217,16 @@
 {
        RSFilterChangedMask mask = 0;
        gint new_width, new_height;
+       gint previous_width = 0;
+       gint previous_height = 0;
 
+       if (RS_FILTER(resample)->previous)
+               rs_filter_get_size_simple(RS_FILTER(resample)->previous, 
RS_FILTER_REQUEST_QUICK, &previous_width, &previous_height);
+
        if (resample->bounding_box && RS_FILTER(resample)->previous)
        {
-               const gint previous_width = new_width = 
rs_filter_get_width(RS_FILTER(resample)->previous);
-               const gint previous_height = new_height = 
rs_filter_get_height(RS_FILTER(resample)->previous);
+               new_width = previous_width;
+               new_height = previous_height;
                rs_constrain_to_bounding_box(resample->target_width, 
resample->target_height, &new_width, &new_height);
                resample->scale = ((((gfloat) new_width)/ previous_width) + 
(((gfloat) new_height)/ previous_height))/2.0;
        }
@@ -233,8 +236,6 @@
                new_height = resample->target_height;
                if (RS_FILTER(resample)->previous)
                {
-                       const gint previous_width = 
rs_filter_get_width(RS_FILTER(resample)->previous);
-                       const gint previous_height = 
rs_filter_get_height(RS_FILTER(resample)->previous);
                        if (previous_width > 0 && previous_height > 0)
                                resample->scale = MIN((gfloat)new_width / 
previous_width, (gfloat)new_height / previous_height);
                        else
@@ -307,9 +308,10 @@
        RS_IMAGE16 *afterVertical;
        RS_IMAGE16 *input;
        RS_IMAGE16 *output = NULL;
-       gint input_width = rs_filter_get_width(filter->previous);
-       gint input_height = rs_filter_get_height(filter->previous);
+       gint input_width;
+       gint input_height;
 
+       rs_filter_get_size_simple(filter->previous, request, &input_width, 
&input_height);
 
        /* Return the input, if the new size is uninitialized */
        if ((resample->new_width == -1) || (resample->new_height == -1))
@@ -430,26 +432,22 @@
        return response;
 }
 
-static gint
-get_width(RSFilter *filter)
+static RSFilterResponse *
+get_size(RSFilter *filter, const RSFilterRequest *request)
 {
        RSResample *resample = RS_RESAMPLE(filter);
+       RSFilterResponse *previous_response = 
rs_filter_get_size(filter->previous, request);
 
-       if (resample->new_width == -1)
-               return rs_filter_get_width(filter->previous);
-       else
-               return resample->new_width;
-}
+       if ((resample->new_width == -1) || (resample->new_height == -1))
+               return previous_response;
 
-static gint
-get_height(RSFilter *filter)
-{
-       RSResample *resample = RS_RESAMPLE(filter);
+       RSFilterResponse *response = 
rs_filter_response_clone(previous_response);
+       g_object_unref(previous_response);
 
-       if (resample->new_height == -1)
-               return rs_filter_get_height(filter->previous);
-       else
-               return resample->new_height;
+       rs_filter_response_set_width(response, resample->new_width);
+       rs_filter_response_set_height(response, resample->new_height);
+
+       return response;
 }
 
 static guint

Modified: trunk/plugins/rotate/rotate.c
===================================================================
--- trunk/plugins/rotate/rotate.c       2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/plugins/rotate/rotate.c       2010-04-03 01:05:56 UTC (rev 3325)
@@ -72,11 +72,10 @@
 static void previous_changed(RSFilter *filter, RSFilter *parent, 
RSFilterChangedMask mask);
 static RSFilterResponse *get_image(RSFilter *filter, const RSFilterRequest 
*request);
 static void turn_right_angle(RS_IMAGE16 *in, RS_IMAGE16 *out, gint start_y, 
gint end_y, const int direction);
-static gint get_width(RSFilter *filter);
-static gint get_height(RSFilter *filter);
+static RSFilterResponse *get_size(RSFilter *filter, const RSFilterRequest 
*request);
 static void inline bilinear(RS_IMAGE16 *in, gushort *out, gint x, gint y);
 static void inline nearest(RS_IMAGE16 *in, gushort *out, gint x, gint y);
-static void recalculate(RSRotate *rotate);
+static void recalculate(RSRotate *rotate, const RSFilterRequest *request);
 gpointer start_rotate_thread(gpointer _thread_info);
 
 static RSFilterClass *rs_rotate_parent_class = NULL;
@@ -112,8 +111,7 @@
        filter_class->name = "Bilinear rotate filter";
        filter_class->previous_changed = previous_changed;
        filter_class->get_image = get_image;
-       filter_class->get_width = get_width;
-       filter_class->get_height = get_height;
+       filter_class->get_size = get_size;
 }
 
 static void
@@ -208,7 +206,7 @@
                /* Calculate rotated ROI */
                old_roi = rs_filter_request_get_roi(request);
                RSFilterRequest *new_request = rs_filter_request_clone(request);
-               recalculate(rotate);
+               recalculate(rotate, request);
                
                gdouble minx, miny;
                gdouble maxx, maxy;
@@ -216,8 +214,9 @@
                matrix3_affine_translate(&rotate->affine, -minx, -miny);
 
                /* Create new ROI */
-               gint prev_w =  rs_filter_get_width(filter->previous);
-               gint prev_h =  rs_filter_get_height(filter->previous);
+               gint prev_w;
+               gint prev_h;
+               rs_filter_get_size_simple(filter->previous, request, &prev_w, 
&prev_h);
                roi = g_new(GdkRectangle, 1);
                roi->x = MAX(0, (gint)minx);
                roi->y = MAX(0, (gint)miny);
@@ -257,7 +256,7 @@
                straight = TRUE;
        } else {
                output = rs_image16_new(rotate->new_width, rotate->new_height, 
3, 4);
-               recalculate(rotate);
+               recalculate(rotate, request);
        }
 
        if (rs_filter_request_get_quick(request))
@@ -347,26 +346,22 @@
 }
 
 
-static gint
-get_width(RSFilter *filter)
+static RSFilterResponse *
+get_size(RSFilter *filter, const RSFilterRequest *request)
 {
        RSRotate *rotate = RS_ROTATE(filter);
+       RSFilterResponse *previous_response = 
rs_filter_get_size(filter->previous, request);
 
        if (rotate->dirty)
-               recalculate(rotate);
+               recalculate(rotate, request);
 
-       return rotate->new_width;
-}
+       RSFilterResponse *response = 
rs_filter_response_clone(previous_response);
+       g_object_unref(previous_response);
 
-static gint
-get_height(RSFilter *filter)
-{
-       RSRotate *rotate = RS_ROTATE(filter);
+       rs_filter_response_set_width(response, rotate->new_width);
+       rs_filter_response_set_height(response, rotate->new_height);
 
-       if (rotate->dirty)
-               recalculate(rotate);
-
-       return rotate->new_height;
+       return response;
 }
 
 static void inline
@@ -453,11 +448,13 @@
 }
 
 static void
-recalculate(RSRotate *rotate)
+recalculate(RSRotate *rotate, const RSFilterRequest *request)
 {
        RSFilter *previous = RS_FILTER(rotate)->previous;
-       gint previous_width = rs_filter_get_width(previous);
-       gint previous_height = rs_filter_get_height(previous);
+       RSFilterResponse *response = rs_filter_get_size(previous, request);
+       gint previous_width = rs_filter_response_get_width(response);
+       gint previous_height = rs_filter_response_get_height(response);
+       g_object_unref(response);
 
        /* Bail out, if parent returns negative dimensions */
        if ((previous_width < 0) || (previous_height < 0))

Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c     2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/application.c     2010-04-03 01:05:56 UTC (rev 3325)
@@ -185,7 +185,9 @@
                "rectangle", photo->crop,
                "settings", photo->settings[snapshot],
                NULL);
-       actual_scale = ((gdouble) width / (gdouble) 
rs_filter_get_width(finput));
+       gint input_width;
+       rs_filter_get_size_simple(finput, RS_FILTER_REQUEST_QUICK, 
&input_width, NULL);
+       actual_scale = ((gdouble) width / (gdouble) input_width);
        if (0 < width && 0 < height) /* We only wan't to set width and height 
if they are not -1 */
                rs_filter_set_recursive(fend, "width", width, "height", height, 
NULL);
 

Modified: trunk/src/rs-batch.c
===================================================================
--- trunk/src/rs-batch.c        2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/rs-batch.c        2010-04-03 01:05:56 UTC (rev 3325)
@@ -608,8 +608,9 @@
                        {
                                case LOCK_SCALE:
                                        scale = queue->scale/100.0;
-                                       width = (gint) (((gdouble) 
rs_filter_get_width(fcrop)) * scale);
-                                       height = (gint) (((gdouble) 
rs_filter_get_height(fcrop)) * scale);
+                                       rs_filter_get_size_simple(fcrop, 
RS_FILTER_REQUEST_QUICK, &width, &height);
+                                       width = (gint) (((gdouble) width) * 
scale);
+                                       height = (gint) (((gdouble) height) * 
scale);
                                        break;
                                case LOCK_WIDTH:
                                        width = queue->width;

Modified: trunk/src/rs-loupe.c
===================================================================
--- trunk/src/rs-loupe.c        2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/rs-loupe.c        2010-04-03 01:05:56 UTC (rev 3325)
@@ -211,8 +211,9 @@
        GdkDrawable *drawable = GDK_DRAWABLE(loupe->canvas->window);
        GdkGC *gc = gdk_gc_new(drawable);
 
-       const gint width = rs_filter_get_width(loupe->filter);
-       const gint height = rs_filter_get_height(loupe->filter);
+       gint width;
+       gint height;
+       rs_filter_get_size_simple(loupe->filter, RS_FILTER_REQUEST_QUICK, 
&width, &height);
 
        /* Get window size */
        gint window_width, window_height;

Modified: trunk/src/rs-navigator.c
===================================================================
--- trunk/src/rs-navigator.c    2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/rs-navigator.c    2010-04-03 01:05:56 UTC (rev 3325)
@@ -128,8 +128,7 @@
 static void
 get_placement(RSNavigator *navigator, GdkRectangle *placement)
 {
-       placement->width = rs_filter_get_width(navigator->cache);
-       placement->height = rs_filter_get_height(navigator->cache);
+       rs_filter_get_size_simple(navigator->cache, RS_FILTER_REQUEST_QUICK, 
&placement->width, &placement->height);
        placement->x = navigator->widget_width/2 - placement->width/2;
        placement->y = navigator->widget_height/2 - placement->height/2;
 }
@@ -343,8 +342,7 @@
                GdkPixbuf *pixbuf = rs_filter_response_get_image8(response);
                GdkRectangle placement, rect;
 
-               placement.width = rs_filter_get_width(navigator->cache);
-               placement.height = rs_filter_get_height(navigator->cache);
+               rs_filter_get_size_simple(navigator->cache, 
RS_FILTER_REQUEST_QUICK, &placement.width, &placement.height);
                placement.x = navigator->widget_width/2 - placement.width/2;
                placement.y = navigator->widget_height/2 - placement.height/2;
 

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/rs-preview-widget.c       2010-04-03 01:05:56 UTC (rev 3325)
@@ -450,6 +450,8 @@
 void
 rs_preview_widget_set_zoom_to_fit(RSPreviewWidget *preview, gboolean 
zoom_to_fit)
 {
+       gint width;
+       gint height;
        gint view;
        g_assert(RS_IS_PREVIEW_WIDGET(preview));
 
@@ -501,11 +503,12 @@
 
                if (preview->photo)
                {
+                       rs_filter_get_size_simple(preview->filter_end[0], 
preview->request[0], &width, &height);
                        /* Update scrollbars to reflect the change */
                        gdouble val;
-                       val = (gdouble) 
rs_filter_get_width(preview->filter_end[0]);
+                       val = (gdouble) width;
                        g_object_set(G_OBJECT(preview->hadjustment), "upper", 
val, NULL);
-                       val = (gdouble) 
rs_filter_get_height(preview->filter_end[0]);
+                       val = (gdouble) height;
                        g_object_set(G_OBJECT(preview->vadjustment), "upper", 
val, NULL);
 
                        if (inside_image)
@@ -526,9 +529,10 @@
                gtk_widget_show(preview->vscrollbar);
                gtk_widget_show(preview->hscrollbar);
 
+               rs_filter_get_size_simple(preview->filter_end[0], 
preview->request[0], &width, &height);
                rs_filter_set_recursive(preview->filter_end[0],
-                       "width", rs_filter_get_width(preview->filter_input),
-                       "height", rs_filter_get_height(preview->filter_input),
+                       "width", width,
+                       "height", height,
                        NULL);
                gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, 
NULL);
 
@@ -946,7 +950,7 @@
 
        g_assert(RS_IS_PREVIEW_WIDGET(preview));
 
-       if (rs_filter_get_width(preview->filter_input) < 0)
+       if (!rs_filter_get_size_simple(preview->filter_input, 
preview->request[0], NULL, NULL))
                return;
 
        if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(preview)))
@@ -1258,8 +1262,10 @@
 {
        gint xoffset = 0, yoffset = 0;
        gint width, height;
+       gint filter_width, filter_height;
 
-       if (rs_filter_get_width(preview->filter_end[view])<1)
+       rs_filter_get_size_simple(preview->filter_end[view], 
preview->request[view], &filter_width, &filter_height);
+       if (filter_width<1)
                return FALSE;
        if (!VIEW_IS_VALID(view))
                return FALSE;
@@ -1279,10 +1285,10 @@
                height = (height - 
preview->views*SPLITTER_WIDTH)/preview->views;
        }
 
-       placement->x = xoffset + (width - 
rs_filter_get_width(preview->filter_end[view]))/2;
-       placement->y = yoffset + (height - 
rs_filter_get_height(preview->filter_end[view]))/2;
-       placement->width = rs_filter_get_width(preview->filter_end[view]);
-       placement->height = rs_filter_get_height(preview->filter_end[view]);
+       placement->x = xoffset + (width - filter_width)/2;
+       placement->y = yoffset + (height - filter_height)/2;
+       placement->width = filter_width;
+       placement->height = filter_height;
        return TRUE;
 }
 
@@ -1309,12 +1315,13 @@
        gint _scaled_x, _scaled_y;
        gint _real_x, _real_y;
        gint _max_w, _max_h;
+       gint filter_width, filter_height;
 
        /* FIXME: This is so outdated */
        if (!preview->photo)
                return ret;
 
-       if (!rs_filter_get_width(preview->filter_end[view])<0)
+       if (!rs_filter_get_size_simple(preview->filter_end[view], 
preview->request[view], &filter_width, &filter_height))
                return ret;
 
        rs_image16_transform_getwh(preview->photo->input, preview->photo->crop, 
preview->photo->angle, preview->photo->orientation, &_max_w, &_max_h);
@@ -1338,13 +1345,13 @@
                _real_y = _scaled_y;
        }
 
-       if ((_scaled_x < rs_filter_get_width(preview->filter_end[view])) && 
(_scaled_y < rs_filter_get_height(preview->filter_end[view])) && (_scaled_x >= 
0) && (_scaled_y >= 0))
+       if ((_scaled_x < filter_width) && (_scaled_y < filter_height) && 
(_scaled_x >= 0) && (_scaled_y >= 0))
                ret = TRUE;
 
        if (scaled_x)
-               *scaled_x = MIN(MAX(0, _scaled_x), 
rs_filter_get_width(preview->filter_end[view]));
+               *scaled_x = MIN(MAX(0, _scaled_x), filter_width);
        if (scaled_y)
-               *scaled_y = MIN(MAX(0, _scaled_y), 
rs_filter_get_height(preview->filter_end[view]));
+               *scaled_y = MIN(MAX(0, _scaled_y), filter_height);
        if (real_x)
                *real_x = MIN(MAX(0, _real_x), _max_w);
        if (real_y)
@@ -1394,8 +1401,7 @@
 
        for(i=0;i<preview->views;i++)
        {
-               width = rs_filter_get_width(preview->filter_end[i]);
-               height = rs_filter_get_height(preview->filter_end[i]);
+               rs_filter_get_size_simple(preview->filter_end[i], 
preview->request[i], &width, &height);
 
                if (preview->zoom_to_fit)
                        get_placement(preview, i, &placement);
@@ -2310,10 +2316,12 @@
                {
                        if ((view==0) && (mask & RS_FILTER_CHANGED_DIMENSION))
                        {
+                               gint width, height;
+                               
rs_filter_get_size_simple(preview->filter_end[0], preview->request[0], &width, 
&height);
                                gdouble val;
-                               val = (gdouble) 
rs_filter_get_width(preview->filter_end[0]);
+                               val = (gdouble) width;
                                g_object_set(G_OBJECT(preview->hadjustment), 
"upper", val, NULL);
-                               val = (gdouble) 
rs_filter_get_height(preview->filter_end[0]);
+                               val = (gdouble) height;
                                g_object_set(G_OBJECT(preview->vadjustment), 
"upper", val, NULL);
                        }
                        DIRTY(preview->dirty[view], SCREEN);

Modified: trunk/src/rs-save-dialog.c
===================================================================
--- trunk/src/rs-save-dialog.c  2010-04-03 01:03:39 UTC (rev 3324)
+++ trunk/src/rs-save-dialog.c  2010-04-03 01:05:56 UTC (rev 3325)
@@ -197,8 +197,10 @@
                g_object_unref(dialog->photo);
        dialog->photo = g_object_ref(photo);
 
-       dialog->w_original = rs_filter_get_width(dialog->fcrop);
-       dialog->h_original = rs_filter_get_height(dialog->fcrop);
+       gint w, h;
+       rs_filter_get_size_simple(dialog->fcrop, RS_FILTER_REQUEST_QUICK, &w, 
&h);
+       dialog->w_original = w;
+       dialog->h_original = h;
 
        gtk_spin_button_set_value(dialog->w_spin, dialog->w_original);
        gtk_spin_button_set_value(dialog->h_spin, dialog->h_original);
@@ -295,7 +297,9 @@
        rs_job_update_description(slot, description);
        g_free(description);
 
-       actual_scale = ((gdouble) dialog->save_width / (gdouble) 
rs_filter_get_width(dialog->fcrop));
+       gint input_width;
+       rs_filter_get_size_simple(dialog->fcrop, RS_FILTER_REQUEST_QUICK, 
&input_width, NULL);
+       actual_scale = ((gdouble) dialog->save_width / (gdouble) input_width);
 
        /* Set input profile */
        RSDcpFile *dcp_profile  = rs_photo_get_dcp_profile(dialog->photo);


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

Reply via email to