Author: abrander
Date: 2009-07-04 22:24:24 +0200 (Sat, 04 Jul 2009)
New Revision: 2536

Modified:
   trunk/plugins/resample/resample.c
   trunk/src/rs-preview-widget.c
Log:
Made RSResample able to report back a scale factor and refactored 
RSPreviewWidget to use it.

Modified: trunk/plugins/resample/resample.c
===================================================================
--- trunk/plugins/resample/resample.c   2009-07-04 19:58:39 UTC (rev 2535)
+++ trunk/plugins/resample/resample.c   2009-07-04 20:24:24 UTC (rev 2536)
@@ -37,6 +37,7 @@
        gint target_height;
        gint new_width;
        gint new_height;
+       gfloat scale;
        gboolean bounding_box;
 };
 
@@ -64,7 +65,8 @@
        PROP_0,
        PROP_WIDTH,
        PROP_HEIGHT,
-       PROP_BOUNDING_BOX
+       PROP_BOUNDING_BOX,
+       PROP_SCALE
 };
 
 static void get_property (GObject *object, guint property_id, GValue *value, 
GParamSpec *pspec);
@@ -116,6 +118,11 @@
                        "bounding-box", "bounding-box", "Use width/height as a 
bounding box",
                        FALSE, G_PARAM_READWRITE)
        );
+       g_object_class_install_property(object_class,
+               PROP_SCALE, g_param_spec_float(
+                       "scale", "scale", "The expected scaling factor in 
bounding box mode",
+                       0.0, 100.0, 1.0, G_PARAM_READABLE)
+       );
 
        filter_class->name = "Resample filter";
        filter_class->get_image = get_image;
@@ -132,6 +139,7 @@
        resample->new_width = -1;
        resample->new_height = -1;
        resample->bounding_box = FALSE;
+       resample->scale = 1.0;
 }
 
 static void
@@ -150,6 +158,9 @@
                case PROP_BOUNDING_BOX:
                        g_value_set_boolean(value, resample->bounding_box);
                        break;
+               case PROP_SCALE:
+                       g_value_set_float(value, resample->scale);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -206,16 +217,19 @@
 {
        RSFilterChangedMask mask = 0;
        gint new_width, new_height;
+
        if (resample->bounding_box && RS_FILTER(resample)->previous)
        {
-               new_width = rs_filter_get_width(RS_FILTER(resample)->previous);
-               new_height = 
rs_filter_get_height(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);
                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;
        }
        else
        {
                new_width = resample->target_width;
                new_height = resample->target_height;
+               resample->scale = 1.0;
        }
 
        if ((new_width != resample->new_width) || (new_height != 
resample->new_height))

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2009-07-04 19:58:39 UTC (rev 2535)
+++ trunk/src/rs-preview-widget.c       2009-07-04 20:24:24 UTC (rev 2536)
@@ -127,8 +127,6 @@
 
        GtkWidget *tool;
 
-       gfloat scale;
-
        /* Crop */
        RS_RECT roi;
        guint roi_grid;
@@ -355,7 +353,6 @@
        preview->loupe = rs_loupe_new();
        g_object_set(preview->loupe_filter_cache, "ignore-roi", TRUE, NULL);
        preview->photo = NULL;
-       preview->scale = 1.0;
 
        preview->navigator_filter_scale = rs_filter_new("RSResample", NULL);
        preview->navigator_filter_cache = rs_filter_new("RSCache", 
preview->navigator_filter_scale);
@@ -444,7 +441,6 @@
                /* Disable resample filter */
                rs_filter_set_enabled(preview->filter_resample[0], FALSE);
 
-               preview->scale = 1.0;
                gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, 
NULL);
 
                gtk_widget_show(preview->vscrollbar);
@@ -454,7 +450,6 @@
                        "width", rs_filter_get_width(preview->filter_input),
                        "height", rs_filter_get_height(preview->filter_input),
                        NULL);
-               preview->scale = 1.0;
                gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, 
NULL);
 
                /* Update scrollbars to reflect the change */
@@ -552,7 +547,7 @@
                }
 
                for(view=0;view<MAX_VIEWS;view++)
-                       g_object_set(preview->filter_denoise[view], "sharpen", 
(gint) (preview->scale * 
preview->photo->settings[preview->snapshot[view]]->sharpen), NULL);
+                       g_object_set(preview->filter_denoise[view], "sharpen", 
(gint) (preview->photo->settings[preview->snapshot[view]]->sharpen), NULL);
        }
 }
 
@@ -1182,10 +1177,12 @@
 
        if (preview->zoom_to_fit)
        {
+               gfloat scale;
+               g_object_get(preview->filter_resample[view], "scale", &scale, 
NULL);
                _scaled_x = x - placement.x;
                _scaled_y = y - placement.y;
-               _real_x = _scaled_x / preview->scale;
-               _real_y = _scaled_y / preview->scale;
+               _real_x = _scaled_x / scale;
+               _real_y = _scaled_y / scale;
        }
        else
        {
@@ -1305,6 +1302,7 @@
 
                if (preview->state & DRAW_ROI)
                {
+                       gfloat scale;
                        if (!cr)
                                cr = redraw_cairo_init(drawable, dirty_area);
                        gchar *text;
@@ -1312,10 +1310,11 @@
 
                        gint x1,y1,x2,y2;
                        /* Translate to screen coordinates */
-                       x1 = preview->roi.x1*preview->scale;
-                       y1 = preview->roi.y1*preview->scale;
-                       x2 = preview->roi.x2*preview->scale;
-                       y2 = preview->roi.y2*preview->scale;
+                       g_object_get(preview->filter_resample[i], "scale", 
&scale, NULL);
+                       x1 = preview->roi.x1 * scale;
+                       y1 = preview->roi.y1 * scale;
+                       x2 = preview->roi.x2 * scale;
+                       y2 = preview->roi.y2 * scale;
 
                        text = g_strdup_printf("%d x %d", 
preview->roi.x2-preview->roi.x1, preview->roi.y2-preview->roi.y1);
 
@@ -1956,10 +1955,12 @@
        /* Update crop_near if mouse button 1 is NOT pressed */
        if ((preview->state & CROP) && !(mask & GDK_BUTTON1_MASK) && 
(preview->state != CROP_START))
        {
-               scaled.x1 = preview->roi.x1*preview->scale;
-               scaled.y1 = preview->roi.y1*preview->scale;
-               scaled.x2 = preview->roi.x2*preview->scale;
-               scaled.y2 = preview->roi.y2*preview->scale;
+               gfloat scale;
+               g_object_get(preview->filter_resample[view], "scale", &scale, 
NULL);
+               scaled.x1 = preview->roi.x1 * scale;
+               scaled.y1 = preview->roi.y1 * scale;
+               scaled.x2 = preview->roi.x2 * scale;
+               scaled.y2 = preview->roi.y2 * scale;
                preview->crop_near = crop_near(&scaled, scaled_x, scaled_y);
                /* Set cursor accordingly */
                switch(preview->crop_near)


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

Reply via email to