Simplified "Advanced Options" dialog.

2007-10-23  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/fp.c: Simplified "Advanced Options" dialog.

svn path=/trunk/; revision=23924
This commit is contained in:
Sven Neumann 2007-10-23 18:26:18 +00:00 committed by Sven Neumann
parent a4e099e2be
commit ba5334d147
2 changed files with 155 additions and 199 deletions

View File

@ -1,7 +1,7 @@
2007-10-23 Sven Neumann <sven@gimp.org>
* plug-ins/common/fp.c: made preview windows transient to the
plug-in dialog.
plug-in dialog. Simplified "Advanced Options" dialog.
2007-10-23 Michael Natterer <mitch@gimp.org>

View File

@ -121,11 +121,10 @@ typedef struct
FPIntensity intensity_range;
gint value_by;
gint selection_only;
gboolean real_time;
guchar offset;
guchar visible_frames;
guchar cutoff[INTENSITIES];
gint touched[JUDGE_BY];
gboolean touched[JUDGE_BY];
gint red_adjust[JUDGE_BY][256];
gint blue_adjust[JUDGE_BY][256];
gint green_adjust[JUDGE_BY][256];
@ -176,7 +175,6 @@ static void fp_redraw_all_windows (void);
static void fp_refresh_previews (gint which);
static void fp_init_filter_packs (void);
static void fp_drag (GtkWidget *button);
static void fp_preview_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val);
@ -203,12 +201,6 @@ static void fp_create_table_entry (GtkWidget **box,
GtkWidget *smaller_frame,
const gchar *description);
static void fp_checkbutton_in_box (GtkWidget *vbox,
const gchar *label,
GtkSignalFunc func,
gpointer data,
gboolean clicked);
static void fp_frames_checkbutton_in_box (GtkWidget *vbox,
const gchar *label,
GtkSignalFunc func,
@ -278,17 +270,16 @@ static ReducedImage *reduced;
static FPValues fpvals =
{
.25, /* Initial Roughness */
.6, /* Initial Degree of Aliasing */
80, /* Initial preview size */
MIDTONES, /* Initial Range */
BY_VAL, /* Initial God knows what */
TRUE, /* Selection Only */
TRUE, /* Real Time */
0, /* Offset */
0, /* Visible frames */
{32,224,255}, /* cutoffs */
{0,0,0} /* touched */
.25, /* Initial Roughness */
.6, /* Initial Degree of Aliasing */
80, /* Initial preview size */
MIDTONES, /* Initial Range */
BY_VAL, /* Initial God knows what */
TRUE, /* Selection Only */
0, /* Offset */
0, /* Visible frames */
{ 32, 224, 255 }, /* cutoffs */
{ FALSE, FALSE, FALSE } /* touched */
};
static GimpDrawable *drawable;
@ -675,8 +666,8 @@ fp_create_range (void)
G_CALLBACK (fp_change_current_range),
&fpvals.intensity_range, fpvals.intensity_range,
_("Sha_dows"), SHADOWS, NULL,
_("_Midtones"), MIDTONES, NULL,
_("Sha_dows"), SHADOWS, NULL,
_("_Midtones"), MIDTONES, NULL,
_("H_ighlights"), HIGHLIGHTS, NULL,
NULL);
@ -894,26 +885,6 @@ fp_create_preview (GtkWidget **preview,
gtk_container_add (GTK_CONTAINER (*frame), *preview);
}
static void
fp_checkbutton_in_box (GtkWidget *vbox,
const gchar *label,
GtkSignalFunc function,
gpointer data,
gboolean clicked)
{
GtkWidget *button;
button = gtk_check_button_new_with_mnemonic (label);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_signal_connect (button, "clicked",
G_CALLBACK (function),
data);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), clicked);
}
static void
fp_frames_checkbutton_in_box (GtkWidget *vbox,
const gchar *label,
@ -1077,7 +1048,7 @@ static void
fp_selection_made (GtkWidget *widget,
gpointer data)
{
fpvals.touched[fpvals.value_by] = 1;
fpvals.touched[fpvals.value_by] = TRUE;
if (data == (gpointer) hue_red)
{
@ -1180,7 +1151,7 @@ fp_response (GtkWidget *widget,
static void
fp_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val)
gdouble *scale_val)
{
static gdouble prevValue = 0.25;
@ -1190,8 +1161,10 @@ fp_scale_update (GtkAdjustment *adjustment,
{
fp_create_nudge (nudgeArray);
fp_refresh_previews (fpvals.visible_frames);
if (AW.window != NULL && GTK_WIDGET_VISIBLE (AW.window))
fp_create_smoothness_graph (AW.aliasing_preview);
prevValue = adjustment->value;
}
}
@ -1294,35 +1267,6 @@ fp_dialog (void)
/************ Advanced Options Window ******************/
/***********************************************************/
static void
fp_drag (GtkWidget *button)
{
static gboolean notFirstTime = FALSE;
if (! notFirstTime)
return;
notFirstTime = TRUE;
if (GTK_TOGGLE_BUTTON (button)->active)
{
fpvals.real_time=TRUE;
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.roughness_scale),0);
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.aliasing_scale),0);
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.preview_size_scale),0);
}
else
{
fpvals.real_time=FALSE;
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.roughness_scale),
GTK_UPDATE_DELAYED);
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.aliasing_scale),
GTK_UPDATE_DELAYED);
gtk_range_set_update_policy (GTK_RANGE (fp_widgets.preview_size_scale),
GTK_UPDATE_DELAYED);
}
}
static void
fp_preview_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val)
@ -1337,11 +1281,12 @@ fp_advanced_dialog (GtkWidget *parent)
const gchar *rangeNames[] = { N_("Shadows:"),
N_("Midtones:"),
N_("Highlights:") };
GtkWidget *frame, *mainvbox;
GtkWidget *frame, *hbox;
GtkObject *smoothnessData;
GtkWidget *graphFrame, *table, *scale;
GtkWidget *vbox, *label, *labelTable, *alignment, *inner_vbox;
gint i;
GtkWidget *graphFrame, *scale;
GtkWidget *vbox, *label, *labelTable, *alignment;
GtkWidget *inner_vbox, *innermost_vbox;
gint i;
AW.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@ -1355,49 +1300,49 @@ fp_advanced_dialog (GtkWidget *parent)
G_CALLBACK (sub_dialog_destroy),
NULL);
mainvbox = gtk_hbox_new (FALSE, 12);
gtk_container_set_border_width (GTK_CONTAINER (mainvbox), 12);
gtk_container_add (GTK_CONTAINER (AW.window), mainvbox);
gtk_widget_show (mainvbox);
hbox = gtk_hbox_new (FALSE, 12);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
gtk_container_add (GTK_CONTAINER (AW.window), hbox);
gtk_widget_show (hbox);
frame = gimp_frame_new (_("Smoothness of Aliasing"));
gtk_box_pack_start (GTK_BOX (mainvbox), frame, TRUE, TRUE, 0);
frame = gimp_frame_new (_("Affected Range"));
gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
table = gtk_table_new (3, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
vbox = gtk_vbox_new (FALSE, 12);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
graphFrame = gtk_aspect_frame_new (NULL, 0.5, 0.5, 1, TRUE);
gtk_frame_set_shadow_type (GTK_FRAME (graphFrame), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (graphFrame),0);
gtk_container_set_border_width (GTK_CONTAINER (graphFrame), 0);
gtk_box_pack_start (GTK_BOX (vbox), graphFrame, FALSE, FALSE, 0);
gtk_widget_show (graphFrame);
gtk_table_attach (GTK_TABLE (table), graphFrame, 0, 1, 0, 1,
GTK_EXPAND, 0, 0, 0);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (graphFrame), vbox);
gtk_widget_show (vbox);
alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start_defaults (GTK_BOX (vbox), alignment);
gtk_widget_show (alignment);
inner_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (alignment), inner_vbox);
gtk_container_add (GTK_CONTAINER (graphFrame), inner_vbox);
gtk_widget_show (inner_vbox);
alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start_defaults (GTK_BOX (inner_vbox), alignment);
gtk_widget_show (alignment);
innermost_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (alignment), innermost_vbox);
gtk_widget_show (innermost_vbox);
AW.aliasing_preview = gimp_preview_area_new ();
gtk_widget_set_size_request (AW.aliasing_preview, 256, MAX_ROUGHNESS);
gtk_box_pack_start (GTK_BOX (inner_vbox), AW.aliasing_preview, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (innermost_vbox),
AW.aliasing_preview, TRUE, TRUE, 0);
gtk_widget_show (AW.aliasing_preview);
fp_create_smoothness_graph (AW.aliasing_preview);
AW.range_preview = gimp_preview_area_new ();
gtk_widget_set_size_request (AW.range_preview, 256, RANGE_HEIGHT);
gtk_box_pack_start(GTK_BOX (inner_vbox), AW.range_preview, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX (innermost_vbox),
AW.range_preview, TRUE, TRUE, 0);
gtk_widget_show (AW.range_preview);
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
@ -1405,22 +1350,8 @@ fp_advanced_dialog (GtkWidget *parent)
labelTable = gtk_table_new (3, 4, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (labelTable), 6);
gtk_table_set_row_spacings (GTK_TABLE (labelTable), 6);
gtk_box_pack_start (GTK_BOX (vbox), labelTable, FALSE, FALSE, 0);
gtk_widget_show (labelTable);
gtk_table_attach (GTK_TABLE (table), labelTable, 0, 1, 1, 2,
GTK_EXPAND, 0, 0, 0);
for (i = 0; i < 12; i++)
{
label = fp_widgets.range_label[i] = gtk_label_new ("-");
if (!(i % 4))
{
gtk_label_set_text (GTK_LABEL(label), gettext (rangeNames[i/4]));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
}
gtk_widget_show (label);
gtk_table_attach (GTK_TABLE (labelTable), label, i%4, i%4+1, i/4, i/4+1,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
}
/************************************************************/
@ -1428,7 +1359,7 @@ fp_advanced_dialog (GtkWidget *parent)
gtk_widget_set_size_request (AW.aliasing_graph,
2 * MARGIN + 256,
RANGE_HEIGHT);
gtk_box_pack_start (GTK_BOX (vbox), AW.aliasing_graph, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (inner_vbox), AW.aliasing_graph, TRUE, TRUE, 0);
gtk_widget_show (AW.aliasing_graph);
gtk_widget_set_events (AW.aliasing_graph, RANGE_ADJUST_MASK);
@ -1438,6 +1369,24 @@ fp_advanced_dialog (GtkWidget *parent)
/************************************************************/
for (i = 0; i < 12; i++)
{
label = fp_widgets.range_label[i] = gtk_label_new ("-");
if (!(i % 4))
{
gtk_label_set_text (GTK_LABEL(label), gettext (rangeNames[i/4]));
gimp_label_set_attributes (GTK_LABEL (label),
PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD,
-1);
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
}
gtk_widget_show (label);
gtk_table_attach (GTK_TABLE (labelTable), label, i%4, i%4+1, i/4, i/4+1,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
}
smoothnessData = gtk_adjustment_new (fpvals.aliasing,
0, 1.0, 0.05, 0.01, 0.0);
@ -1447,8 +1396,7 @@ fp_advanced_dialog (GtkWidget *parent)
gtk_scale_set_digits (GTK_SCALE (scale), 2);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (scale), 0);
gtk_table_attach (GTK_TABLE (table), scale, 0, 1, 2, 3,
0, 0, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
gtk_widget_show (scale);
g_signal_connect (smoothnessData, "value-changed",
@ -1457,24 +1405,21 @@ fp_advanced_dialog (GtkWidget *parent)
/******************* MISC OPTIONS ***************************/
vbox = gtk_vbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (mainvbox), vbox, TRUE, TRUE, 0);
gtk_widget_show (vbox);
fp_checkbutton_in_box (vbox, _("Preview as You Drag"),
GTK_SIGNAL_FUNC (fp_drag),
NULL, TRUE);
frame = gimp_frame_new (_("Preview Size"));
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
smoothnessData = gtk_adjustment_new (fpvals.preview_size,
50, MAX_PREVIEW_SIZE,
5, 5, 0.0);
fp_widgets.preview_size_scale = scale =
gtk_hscale_new (GTK_ADJUSTMENT (smoothnessData));
gtk_container_add (GTK_CONTAINER (frame), scale);
gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
gtk_widget_set_size_request (scale, 100, -1);
gtk_scale_set_digits (GTK_SCALE (scale), 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
@ -1486,6 +1431,8 @@ fp_advanced_dialog (GtkWidget *parent)
&fpvals.preview_size);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
update_range_labels ();
}
static void
@ -1578,23 +1525,13 @@ fp_range_change_events (GtkWidget *widget,
draw_it (NULL);
if (fpvals.real_time)
{
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasing_preview);
fp_refresh_previews (fpvals.visible_frames);
}
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasing_preview);
break;
case GDK_BUTTON_RELEASE:
if (!fpvals.real_time)
{
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasing_preview);
fp_refresh_previews (fpvals.visible_frames);
}
fp_refresh_previews (fpvals.visible_frames);
break;
case GDK_MOTION_NOTIFY:
@ -1606,13 +1543,9 @@ fp_range_change_events (GtkWidget *widget,
slider_erase (AW.aliasing_graph->window, *new);
*new = x;
draw_it (NULL);
if (fpvals.real_time)
{
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasing_preview);
fp_refresh_previews (fpvals.visible_frames);
}
fp_range_preview_spill (AW.range_preview, fpvals.value_by);
update_range_labels ();
fp_create_smoothness_graph (AW.aliasing_preview);
}
break;
@ -1626,9 +1559,9 @@ fp_range_change_events (GtkWidget *widget,
static void
update_range_labels (void)
{
gchar buffer[3];
gchar buffer[4];
gtk_label_set_text (GTK_LABEL(fp_widgets.range_label[1]),"0");
gtk_label_set_text (GTK_LABEL(fp_widgets.range_label[1]), "0");
g_snprintf (buffer, sizeof (buffer), "%d", fpvals.cutoff[SHADOWS]);
gtk_label_set_text (GTK_LABEL (fp_widgets.range_label[3]), buffer);
@ -1645,6 +1578,7 @@ static void
fp_init_filter_packs (void)
{
gint i, j;
for (i = 0; i < 256; i++)
for (j = BY_HUE; j < JUDGE_BY; j++)
{
@ -1831,17 +1765,19 @@ fp_render_preview (GtkWidget *preview,
/*DO SATURATION FIRST*/
if (change_what != NONEATALL)
{
gint adjust = partial * fpvals.sat_adjust[JudgeBy][Inten];
if (M != m)
{
for (k = 0; k < 3; k++)
if (backupP[k] == M)
P[k] = MAX (P[k] +
partial * fpvals.sat_adjust[JudgeBy][Inten],
middle);
{
P[k] = MAX (P[k] + adjust, middle);
}
else if (backupP[k] == m)
P[k] = MIN (P[k] -
partial * fpvals.sat_adjust[JudgeBy][Inten],
middle);
{
P[k] = MIN (P[k] - adjust, middle);
}
}
P[0] += partial * fpvals.red_adjust[JudgeBy][Inten];
@ -1864,15 +1800,21 @@ fp_render_preview (GtkWidget *preview,
case SATURATION:
for (JudgeBy = BY_HUE; JudgeBy < JUDGE_BY; JudgeBy++)
for (k = 0; k < 3; k++)
if (M != m)
{
if (backupP[k] == M)
P[k] = MAX (P[k] + partial * tempSat[JudgeBy][Inten],
middle);
else if (backupP[k] == m)
P[k] = MIN (P[k]- partial * tempSat[JudgeBy][Inten],
middle);
{
gint adjust = partial * tempSat[JudgeBy][Inten];
for (k = 0; k < 3; k++)
if (M != m)
{
if (backupP[k] == M)
{
P[k] = MAX (P[k] + adjust, middle);
}
else if (backupP[k] == m)
{
P[k] = MIN (P[k] - adjust, middle);
}
}
}
break;
@ -1886,9 +1828,9 @@ fp_render_preview (GtkWidget *preview,
break;
}
a[(i * RW + j) * 4 + 0] = CLAMP0255(P[0]);
a[(i * RW + j) * 4 + 1] = CLAMP0255(P[1]);
a[(i * RW + j) * 4 + 2] = CLAMP0255(P[2]);
a[(i * RW + j) * 4 + 0] = CLAMP0255 (P[0]);
a[(i * RW + j) * 4 + 1] = CLAMP0255 (P[1]);
a[(i * RW + j) * 4 + 2] = CLAMP0255 (P[2]);
if (bytes == 4)
a[(i * RW + j) * 4 + 3] = reduced->rgb[i * RW * bytes + j * bytes + 3];
@ -1959,37 +1901,50 @@ fp_create_smoothness_graph (GtkWidget *preview)
for (i = 0; i < MAX_ROUGHNESS; i++)
{
gint coor = MAX_ROUGHNESS - i;
for (j = 0; j < 256; j++) {
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 255;
data[3 * (i * 256 + j) + 2] = 255;
if (!(i % (MAX_ROUGHNESS / 4))) {
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 128;
data[3 * (i * 256 + j) + 2] = 128;
}
if (!((j + 1) % 32)) {
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 128;
data[3 * (i * 256 + j) + 2] = 128;
}
toBeBlack = FALSE;
if (nArray[j] == coor)
toBeBlack = TRUE;
if (j < 255) {
gint jump = abs (nArray[j] - nArray[j+1]);
if (abs (coor - nArray[j]) < jump &&
abs (coor - nArray[j + 1]) < jump)
for (j = 0; j < 256; j++)
{
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 255;
data[3 * (i * 256 + j) + 2] = 255;
if (!(i % (MAX_ROUGHNESS / 4)))
{
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 128;
data[3 * (i * 256 + j) + 2] = 128;
}
if (!((j + 1) % 32))
{
data[3 * (i * 256 + j) + 0] = 255;
data[3 * (i * 256 + j) + 1] = 128;
data[3 * (i * 256 + j) + 2] = 128;
}
toBeBlack = FALSE;
if (nArray[j] == coor)
toBeBlack = TRUE;
if (j < 255)
{
gint jump = abs (nArray[j] - nArray[j+1]);
if (abs (coor - nArray[j]) < jump &&
abs (coor - nArray[j + 1]) < jump)
toBeBlack = TRUE;
}
if (toBeBlack)
{
data[3 * (i * 256 + j) + 0] = 0;
data[3 * (i * 256 + j) + 1] = 0;
data[3 * (i * 256 + j) + 2] = 0;
}
}
if (toBeBlack) {
data[3 * (i * 256 + j) + 0] = 0;
data[3 * (i * 256 + j) + 1] = 0;
data[3 * (i * 256 + j) + 2] = 0;
}
}
}
gimp_preview_area_draw (GIMP_PREVIEW_AREA (preview),
0, 0, 256, MAX_ROUGHNESS,
GIMP_RGB_IMAGE,
@ -2042,7 +1997,7 @@ fp_range_preview_spill (GtkWidget *preview,
case BY_SAT:
gimp_hsv_set (&hsv,
0.5,
((j-(gint)fpvals.offset+256)%256) / 255.0,
((j - (gint) fpvals.offset + 256) % 256) / 255.0,
0.5);
gimp_hsv_to_rgb (&hsv, &rgb);
gimp_rgb_get_uchar (&rgb,
@ -2054,6 +2009,7 @@ fp_range_preview_spill (GtkWidget *preview,
}
}
}
gimp_preview_area_draw (GIMP_PREVIEW_AREA (preview),
0, 0, 256, RANGE_HEIGHT,
GIMP_RGB_IMAGE,
@ -2090,7 +2046,7 @@ static void
fp_preview_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
gint which = fpvals.visible_frames;
gint which = fpvals.visible_frames;
if (widget == origPreview)
fp_render_preview (origPreview, NONEATALL, 0);