[Rawstudio-commit] r2195 - trunk/src
Anders Brander
anders at brander.dk
Sun Feb 1 05:30:39 CET 2009
Author: abrander
Date: 2009-02-01 05:30:36 +0100 (Sun, 01 Feb 2009)
New Revision: 2195
Modified:
trunk/src/rs-preview-widget.c
Log:
Ported RSPreviewWidget to RSResample, RSRotate and RSCrop.
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2009-02-01 03:50:50 UTC (rev 2194)
+++ trunk/src/rs-preview-widget.c 2009-02-01 04:30:36 UTC (rev 2195)
@@ -116,11 +116,11 @@
GdkColor bgcolor; /* Background color of widget */
VIEW_SPLIT split;
gint views;
- RS_MATRIX3 affine;
- RS_MATRIX3 inverse_affine;
GtkWidget *tool;
+ gfloat scale;
+
/* Crop */
RS_RECT roi;
guint roi_grid;
@@ -137,12 +137,13 @@
RSFilter *filter_input[MAX_VIEWS];
RSFilter *filter_demosaic[MAX_VIEWS];
- RSFilter *filter_transform[MAX_VIEWS];
+ RSFilter *filter_crop[MAX_VIEWS];
+ RSFilter *filter_rotate[MAX_VIEWS];
+ RSFilter *filter_resample[MAX_VIEWS];
RSFilter *filter_sharpen[MAX_VIEWS];
RSFilter *filter_cache[MAX_VIEWS];
RSFilter *filter_end[MAX_VIEWS]; /* For convenience */
- gdouble actual_scale;
RS_PHOTO *photo;
void *transform;
gint snapshot[MAX_VIEWS];
@@ -298,8 +299,11 @@
{
preview->filter_input[i] = rs_filter_new("RSInputImage16", NULL);
preview->filter_demosaic[i] = rs_filter_new("RSDemosaic", preview->filter_input[i]);
- preview->filter_transform[i] = rs_filter_new("RSTransform", preview->filter_demosaic[i]);
- preview->filter_cache[i] = rs_filter_new("RSCache", preview->filter_transform[i]);
+ preview->filter_cache[i] = rs_filter_new("RSCache", preview->filter_demosaic[i]);
+ preview->filter_rotate[i] = rs_filter_new("RSRotate", preview->filter_cache[i]);
+ preview->filter_crop[i] = rs_filter_new("RSCrop", preview->filter_rotate[i]);
+ preview->filter_resample[i] = rs_filter_new("RSResample", preview->filter_crop[i]);
+ preview->filter_cache[i] = rs_filter_new("RSCache", preview->filter_resample[i]);
preview->filter_sharpen[i] = rs_filter_new("RSSharpen", preview->filter_cache[i]);
preview->filter_cache[i] = rs_filter_new("RSCache", preview->filter_sharpen[i]);
preview->filter_end[i] = preview->filter_cache[i];
@@ -315,7 +319,7 @@
DIRTY(preview->dirty[i], ALL);
}
preview->photo = NULL;
- preview->actual_scale = 0.0;
+ preview->scale = 1.0;
/* We'll take care of double buffering ourself */
gtk_widget_set_double_buffered(GTK_WIDGET(preview), FALSE);
@@ -419,15 +423,10 @@
for(view=0;view<preview->views;view++)
{
- gfloat actual_scale;
g_object_set(preview->filter_input[view], "image", preview->photo->input, NULL);
- g_object_set(preview->filter_transform[view],
- "crop", preview->photo->crop,
- "angle", preview->photo->angle,
- "orientation", preview->photo->orientation,
- NULL);
- g_object_get(preview->filter_transform[view], "actual_scale", &actual_scale, NULL);
- g_object_set(preview->filter_sharpen[view], "amount", actual_scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
+ g_object_set(preview->filter_rotate[view], "angle", preview->photo->angle, NULL);
+ g_object_set(preview->filter_crop[view], "rectangle", preview->photo->crop, NULL);
+ g_object_set(preview->filter_sharpen[view], "amount", preview->scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
rescale(preview, view);
}
}
@@ -529,8 +528,6 @@
void
rs_preview_widget_set_snapshot(RSPreviewWidget *preview, const guint view, const gint snapshot)
{
- gfloat actual_scale;
-
g_assert(RS_IS_PREVIEW_WIDGET(preview));
g_assert(VIEW_IS_VALID(view));
@@ -544,8 +541,7 @@
rs_color_transform_set_from_settings(preview->rct[view], preview->photo->settings[preview->snapshot[view]], MASK_ALL);
- g_object_get(preview->filter_transform[view], "actual_scale", &actual_scale, NULL);
- g_object_set(preview->filter_sharpen[view], "amount", actual_scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
+ g_object_set(preview->filter_sharpen[view], "amount", preview->scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
DIRTY(preview->dirty[view], BUFFER);
DIRTY(preview->dirty[view], SCREEN);
@@ -771,7 +767,7 @@
preview->roi = *preview->photo->crop;
rs_photo_set_crop(preview->photo, NULL);
for(view=0;view<preview->views;view++)
- g_object_set(preview->filter_transform[view], "crop", NULL, NULL);
+ g_object_set(preview->filter_crop[view], "rectangle", NULL, NULL);
preview->state = CROP_IDLE;
rs_preview_widget_update(preview, TRUE);
}
@@ -795,7 +791,7 @@
rs_photo_set_crop(preview->photo, NULL);
for(view=0;view<preview->views;view++)
- g_object_set(preview->filter_transform[view], "crop", NULL, NULL);
+ g_object_set(preview->filter_crop[view], "rectangle", NULL, NULL);
/* FIXME: Manual redraw might be needed? */
}
@@ -827,7 +823,7 @@
preview->photo->angle = 0.0f;
for(view=0;view<preview->views;view++)
- g_object_set(preview->filter_transform[view], "angle", 0.0, NULL);
+ g_object_set(preview->filter_rotate[view], "angle", 0.0, NULL);
}
static void
@@ -948,6 +944,7 @@
gint _real_x, _real_y;
gint _max_w, _max_h;
+ /* FIXME: This is so outdated */
if (!preview->photo)
return ret;
@@ -962,9 +959,8 @@
{
_scaled_x = x - placement.x;
_scaled_y = y - placement.y;
- matrix3_affine_transform_point_int(&preview->inverse_affine,
- _scaled_x, _scaled_y,
- &_real_x, &_real_y);
+ _real_x = _scaled_x / preview->scale;
+ _real_y = _scaled_y / preview->scale;
}
else
{
@@ -1056,9 +1052,9 @@
{
gint max_width, max_height;
gint width, height;
- gfloat actual_scale = 1.0;
- RS_MATRIX3 *affine, *inverse_affine;
+ /* FIXME: This is outdated */
+
if (!preview->photo)
return;
@@ -1070,14 +1066,26 @@
width = MIN(width, max_width);
height = MIN(height, max_height);
+ /* FIXME: Don't expect crop to be previous */
+ preview->scale = ((gfloat) width) / ((gfloat) rs_filter_get_width(preview->filter_crop[0]));
+ preview->scale = MIN(preview->scale, ((gfloat) height) / ((gfloat) rs_filter_get_height(preview->filter_crop[0])));
+ width = preview->scale * rs_filter_get_width(preview->filter_crop[0]);
+ height = preview->scale * rs_filter_get_height(preview->filter_crop[0]);
if (preview->zoom_to_fit)
- g_object_set(preview->filter_transform[view], "scale", -1.0, "width", width, "height", height, NULL);
+ g_object_set(preview->filter_resample[view],
+ "width", width,
+ "height", height,
+ NULL);
else
{
gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, cur_busy);
GUI_CATCHUP();
gdouble upper;
- g_object_set(preview->filter_transform[view], "scale", 1.0, "width", -1, "height", -1, NULL);
+ g_object_set(preview->filter_resample[view],
+ "width", rs_filter_get_width(preview->filter_crop[0]),
+ "height", rs_filter_get_height(preview->filter_crop[0]),
+ NULL);
+ preview->scale = 1.0;
gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, NULL);
/* Update scrollbars to reflect the change */
@@ -1087,20 +1095,9 @@
g_object_set(G_OBJECT(preview->vadjustment), "upper", upper, NULL);
}
- /* Read back needed stuff from RSTransform */
- g_object_get(preview->filter_transform[view],
- "actual_scale", &actual_scale,
- "affine", &affine,
- "inverseaffine", &inverse_affine,
- NULL);
-
- /* Needed for motion() */
- preview->affine = *affine;
- preview->inverse_affine = *inverse_affine;
-
/* Update sharpen */
g_object_set(preview->filter_sharpen[view],
- "amount", actual_scale * preview->photo->settings[preview->snapshot[view]]->sharpen,
+ "amount", preview->scale * preview->photo->settings[preview->snapshot[view]]->sharpen,
NULL);
}
@@ -1195,8 +1192,10 @@
gint x1,y1,x2,y2;
/* Translate to screen coordinates */
- matrix3_affine_transform_point_int(&preview->affine, preview->roi.x1, preview->roi.y1, &x1, &y1);
- matrix3_affine_transform_point_int(&preview->affine, preview->roi.x2, preview->roi.y2, &x2, &y2);
+ x1 = preview->roi.x1*preview->scale;
+ y1 = preview->roi.y1*preview->scale;
+ x2 = preview->roi.x2*preview->scale;
+ y2 = preview->roi.y2*preview->scale;
text = g_strdup_printf("%d x %d", preview->roi.x2-preview->roi.x1, preview->roi.y2-preview->roi.y1);
@@ -1661,7 +1660,7 @@
preview->state = WB_PICKER;
for(i=0;i<MAX_VIEWS;i++)
- g_object_set(preview->filter_transform[view], "angle", preview->photo->angle, NULL);
+ g_object_set(preview->filter_rotate[view], "angle", preview->photo->angle, NULL);
}
return FALSE;
}
@@ -1771,8 +1770,10 @@
/* Update crop_near if mouse button 1 is NOT pressed */
if ((preview->state & CROP) && !(mask & GDK_BUTTON1_MASK) && (preview->state != CROP_START))
{
- matrix3_affine_transform_point_int(&preview->affine, preview->roi.x1, preview->roi.y1, &scaled.x1, &scaled.y1);
- matrix3_affine_transform_point_int(&preview->affine, preview->roi.x2, preview->roi.y2, &scaled.x2, &scaled.y2);
+ 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;
preview->crop_near = crop_near(&scaled, scaled_x, scaled_y);
/* Set cursor accordingly */
switch(preview->crop_near)
@@ -1921,11 +1922,7 @@
DIRTY(preview->dirty[view], BUFFER);
DIRTY(preview->dirty[view], SCREEN);
if (mask & MASK_SHARPEN)
- {
- gfloat actual_scale = 1.0;
- g_object_get(preview->filter_transform[view], "actual_scale", &actual_scale, NULL);
- g_object_set(preview->filter_sharpen[view], "amount", actual_scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
- }
+ g_object_set(preview->filter_sharpen[view], "amount", preview->scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
if (mask ^ MASK_SHARPEN)
rs_color_transform_set_from_settings(preview->rct[view], preview->photo->settings[preview->snapshot[view]], mask);
}
@@ -1941,11 +1938,10 @@
gint view;
for(view=0;view<preview->views; view++)
{
- g_object_set(preview->filter_transform[view],
- "crop", photo->crop,
- "angle", photo->angle,
- "orientation", photo->orientation,
- NULL);
+ /* FIXME: Fix orientation */
+// g_object_set(preview->filter_transform[view], "orientation", photo->orientation, NULL);
+ g_object_set(preview->filter_rotate[view], "angle", photo->angle, NULL);
+ g_object_set(preview->filter_crop[view], "rectangle", photo->crop, NULL);
}
}
@@ -2033,7 +2029,7 @@
{
rs_photo_set_crop(preview->photo, &preview->roi);
for(view=0;view<preview->views;view++)
- g_object_set(preview->filter_transform[view], "crop", &preview->roi, NULL);
+ g_object_set(preview->filter_crop[view], "rectangle", &preview->roi, NULL);
}
gtk_widget_destroy(preview->tool);
preview->state = WB_PICKER;
More information about the Rawstudio-commit
mailing list