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