36
35
#include "base/gimplut.h"
37
36
#include "base/levels.h"
38
#include "gegl/gimplevelsconfig.h"
39
#include "gegl/gimpoperationlevels.h"
39
41
#include "core/gimpdrawable.h"
40
42
#include "core/gimpdrawable-histogram.h"
41
43
#include "core/gimpimage.h"
42
#include "core/gimpimagemap.h"
44
45
#include "widgets/gimpcolorbar.h"
46
#include "widgets/gimphandlebar.h"
45
47
#include "widgets/gimphelp-ids.h"
46
48
#include "widgets/gimphistogramview.h"
49
#include "widgets/gimpwidgets-constructors.h"
48
51
#include "display/gimpdisplay.h"
50
53
#include "gimphistogramoptions.h"
51
54
#include "gimplevelstool.h"
52
#include "gimptoolcontrol.h"
54
56
#include "gimp-intl.h"
57
#define LOW_INPUT (1 << 0)
58
#define GAMMA (1 << 1)
59
#define HIGH_INPUT (1 << 2)
60
#define LOW_OUTPUT (1 << 3)
61
#define HIGH_OUTPUT (1 << 4)
62
#define INPUT_LEVELS (1 << 5)
63
#define OUTPUT_LEVELS (1 << 6)
64
#define INPUT_SLIDERS (1 << 7)
65
#define OUTPUT_SLIDERS (1 << 8)
66
#define ALL_CHANNELS (1 << 9)
69
#define HISTOGRAM_WIDTH 256
70
#define GRADIENT_HEIGHT 12
71
#define CONTROL_HEIGHT 8
73
#define LEVELS_EVENT_MASK (GDK_BUTTON_PRESS_MASK | \
74
GDK_BUTTON_RELEASE_MASK | \
75
GDK_BUTTON_MOTION_MASK)
59
#define PICK_LOW_INPUT (1 << 0)
60
#define PICK_GAMMA (1 << 1)
61
#define PICK_HIGH_INPUT (1 << 2)
62
#define PICK_ALL_CHANNELS (1 << 8)
64
#define HISTOGRAM_WIDTH 256
65
#define GRADIENT_HEIGHT 12
66
#define CONTROL_HEIGHT 10
78
69
/* local function prototypes */
80
static void gimp_levels_tool_finalize (GObject *object);
82
static gboolean gimp_levels_tool_initialize (GimpTool *tool,
86
static void gimp_levels_tool_color_picked (GimpColorTool *color_tool,
87
GimpColorPickState pick_state,
88
GimpImageType sample_type,
92
static void gimp_levels_tool_map (GimpImageMapTool *image_map_tool);
93
static void gimp_levels_tool_dialog (GimpImageMapTool *image_map_tool);
94
static void gimp_levels_tool_dialog_unmap (GtkWidget *dialog,
95
GimpLevelsTool *tool);
96
static void gimp_levels_tool_reset (GimpImageMapTool *image_map_tool);
97
static gboolean gimp_levels_tool_settings_load (GimpImageMapTool *image_mao_tool,
100
static gboolean gimp_levels_tool_settings_save (GimpImageMapTool *image_map_tool,
103
static void levels_update (GimpLevelsTool *tool,
105
static void levels_channel_callback (GtkWidget *widget,
106
GimpLevelsTool *tool);
107
static void levels_channel_reset_callback (GtkWidget *widget,
108
GimpLevelsTool *tool);
110
static gboolean levels_menu_sensitivity (gint value,
113
static void levels_stretch_callback (GtkWidget *widget,
114
GimpLevelsTool *tool);
115
static void levels_low_input_adjustment_update (GtkAdjustment *adjustment,
116
GimpLevelsTool *tool);
117
static void levels_gamma_adjustment_update (GtkAdjustment *adjustment,
118
GimpLevelsTool *tool);
119
static void levels_high_input_adjustment_update (GtkAdjustment *adjustment,
120
GimpLevelsTool *tool);
121
static void levels_low_output_adjustment_update (GtkAdjustment *adjustment,
122
GimpLevelsTool *tool);
123
static void levels_high_output_adjustment_update (GtkAdjustment *adjustment,
124
GimpLevelsTool *tool);
125
static void levels_input_picker_toggled (GtkWidget *widget,
126
GimpLevelsTool *tool);
128
static gint levels_input_area_event (GtkWidget *widget,
130
GimpLevelsTool *tool);
131
static gboolean levels_input_area_expose (GtkWidget *widget,
132
GdkEventExpose *event,
133
GimpLevelsTool *tool);
135
static gint levels_output_area_event (GtkWidget *widget,
137
GimpLevelsTool *tool);
138
static gboolean levels_output_area_expose (GtkWidget *widget,
139
GdkEventExpose *event,
140
GimpLevelsTool *tool);
71
static void gimp_levels_tool_finalize (GObject *object);
73
static gboolean gimp_levels_tool_initialize (GimpTool *tool,
77
static void gimp_levels_tool_color_picked (GimpColorTool *color_tool,
78
GimpColorPickState pick_state,
79
GimpImageType sample_type,
83
static GeglNode * gimp_levels_tool_get_operation (GimpImageMapTool *im_tool,
85
static void gimp_levels_tool_map (GimpImageMapTool *im_tool);
86
static void gimp_levels_tool_dialog (GimpImageMapTool *im_tool);
87
static void gimp_levels_tool_dialog_unmap (GtkWidget *dialog,
88
GimpLevelsTool *tool);
89
static void gimp_levels_tool_reset (GimpImageMapTool *im_tool);
90
static gboolean gimp_levels_tool_settings_import(GimpImageMapTool *im_tool,
91
const gchar *filename,
93
static gboolean gimp_levels_tool_settings_export(GimpImageMapTool *im_tool,
94
const gchar *filename,
97
static void gimp_levels_tool_config_notify (GObject *object,
99
GimpLevelsTool *tool);
101
static void levels_update_input_bar (GimpLevelsTool *tool);
103
static void levels_channel_callback (GtkWidget *widget,
104
GimpLevelsTool *tool);
105
static void levels_channel_reset_callback (GtkWidget *widget,
106
GimpLevelsTool *tool);
108
static gboolean levels_menu_sensitivity (gint value,
111
static void levels_stretch_callback (GtkWidget *widget,
112
GimpLevelsTool *tool);
113
static void levels_low_input_changed (GtkAdjustment *adjustment,
114
GimpLevelsTool *tool);
115
static void levels_gamma_changed (GtkAdjustment *adjustment,
116
GimpLevelsTool *tool);
117
static void levels_linear_gamma_changed (GtkAdjustment *adjustment,
118
GimpLevelsTool *tool);
119
static void levels_high_input_changed (GtkAdjustment *adjustment,
120
GimpLevelsTool *tool);
121
static void levels_low_output_changed (GtkAdjustment *adjustment,
122
GimpLevelsTool *tool);
123
static void levels_high_output_changed (GtkAdjustment *adjustment,
124
GimpLevelsTool *tool);
125
static void levels_input_picker_toggled (GtkWidget *widget,
126
GimpLevelsTool *tool);
128
static void levels_to_curves_callback (GtkWidget *widget,
129
GimpLevelsTool *tool);
143
132
G_DEFINE_TYPE (GimpLevelsTool, gimp_levels_tool, GIMP_TYPE_IMAGE_MAP_TOOL)
401
410
/* Input levels frame */
402
411
frame = gimp_frame_new (_("Input Levels"));
412
gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
413
gtk_widget_show (frame);
415
vbox = gtk_vbox_new (FALSE, 2);
416
gtk_container_add (GTK_CONTAINER (frame), vbox);
417
gtk_widget_show (vbox);
419
frame = gtk_frame_new (NULL);
420
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
403
421
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
404
422
gtk_widget_show (frame);
406
vbox2 = gtk_vbox_new (FALSE, 2);
424
vbox2 = gtk_vbox_new (FALSE, 0);
407
425
gtk_container_add (GTK_CONTAINER (frame), vbox2);
408
426
gtk_widget_show (vbox2);
410
frame = gtk_frame_new (NULL);
411
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
412
gtk_box_pack_start (GTK_BOX (vbox2), frame, TRUE, TRUE, 0);
413
gtk_widget_show (frame);
415
tool->hist_view = gimp_histogram_view_new (FALSE);
416
gtk_container_add (GTK_CONTAINER (frame), tool->hist_view);
417
gtk_widget_show (GTK_WIDGET (tool->hist_view));
428
tool->histogram_view = gimp_histogram_view_new (FALSE);
429
gtk_box_pack_start (GTK_BOX (vbox2), tool->histogram_view, TRUE, TRUE, 0);
430
gtk_widget_show (GTK_WIDGET (tool->histogram_view));
419
432
gimp_histogram_options_connect_view (GIMP_HISTOGRAM_OPTIONS (tool_options),
420
GIMP_HISTOGRAM_VIEW (tool->hist_view));
422
g_object_get (tool->hist_view, "border-width", &border, NULL);
424
frame = gtk_frame_new (NULL);
425
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
426
gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
427
gtk_widget_show (frame);
429
tool->input_area = gtk_event_box_new ();
430
gtk_widget_set_size_request (tool->input_area, -1,
431
GRADIENT_HEIGHT + CONTROL_HEIGHT);
432
gtk_widget_add_events (tool->input_area, LEVELS_EVENT_MASK);
433
gtk_container_add (GTK_CONTAINER (frame), tool->input_area);
434
gtk_widget_show (tool->input_area);
436
g_signal_connect (tool->input_area, "event",
437
G_CALLBACK (levels_input_area_event),
439
g_signal_connect_after (tool->input_area, "expose-event",
440
G_CALLBACK (levels_input_area_expose),
433
GIMP_HISTOGRAM_VIEW (tool->histogram_view));
435
g_object_get (tool->histogram_view, "border-width", &border, NULL);
443
437
vbox3 = gtk_vbox_new (FALSE, 0);
444
gtk_container_add (GTK_CONTAINER (tool->input_area), vbox3);
438
gtk_container_set_border_width (GTK_CONTAINER (vbox3), border);
439
gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
445
440
gtk_widget_show (vbox3);
447
tool->input_bar = g_object_new (GIMP_TYPE_COLOR_BAR,
442
tool->input_bar = g_object_new (GIMP_TYPE_COLOR_BAR, NULL);
451
443
gtk_widget_set_size_request (tool->input_bar, -1, GRADIENT_HEIGHT / 2);
452
444
gtk_box_pack_start (GTK_BOX (vbox3), tool->input_bar, FALSE, FALSE, 0);
453
445
gtk_widget_show (tool->input_bar);
455
bar = g_object_new (GIMP_TYPE_COLOR_BAR,
447
bar = g_object_new (GIMP_TYPE_COLOR_BAR, NULL);
459
448
gtk_widget_set_size_request (bar, -1, GRADIENT_HEIGHT / 2);
460
449
gtk_box_pack_start (GTK_BOX (vbox3), bar, FALSE, FALSE, 0);
461
450
gtk_widget_show (bar);
452
tool->input_sliders = g_object_new (GIMP_TYPE_HANDLE_BAR, NULL);
453
gtk_widget_set_size_request (tool->input_sliders, -1, CONTROL_HEIGHT);
454
gtk_box_pack_start (GTK_BOX (vbox3), tool->input_sliders, FALSE, FALSE, 0);
455
gtk_widget_show (tool->input_sliders);
457
g_signal_connect_swapped (tool->input_bar, "button-press-event",
458
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->button_press_event),
459
tool->input_sliders);
461
g_signal_connect_swapped (tool->input_bar, "button-release-event",
462
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->button_release_event),
463
tool->input_sliders);
465
g_signal_connect_swapped (tool->input_bar, "motion-notify-event",
466
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->motion_notify_event),
467
tool->input_sliders);
469
g_signal_connect_swapped (bar, "button-press-event",
470
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->button_press_event),
471
tool->input_sliders);
473
g_signal_connect_swapped (bar, "button-release-event",
474
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->button_release_event),
475
tool->input_sliders);
477
g_signal_connect_swapped (bar, "motion-notify-event",
478
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->input_sliders)->motion_notify_event),
479
tool->input_sliders);
463
481
/* Horizontal box for input levels spinbuttons */
464
482
hbox = gtk_hbox_new (FALSE, 6);
465
gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
483
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
466
484
gtk_widget_show (hbox);
468
486
/* low input spin */
470
488
gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0);
471
489
gtk_widget_show (hbox2);
473
button = gimp_levels_tool_color_picker_new (tool, LOW_INPUT);
491
button = gimp_levels_tool_color_picker_new (tool, PICK_LOW_INPUT);
474
492
gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
475
493
gtk_widget_show (button);
477
spinbutton = gimp_spin_button_new (&data, 0, 0, 255, 1, 10, 10, 0.5, 0);
495
spinbutton = gimp_spin_button_new (&data,
496
config->low_input[config->channel] * 255.0,
497
0, 255, 1, 10, 0, 0.5, 0);
478
498
gtk_box_pack_start (GTK_BOX (hbox2), spinbutton, FALSE, FALSE, 0);
479
499
gtk_widget_show (spinbutton);
481
501
tool->low_input = GTK_ADJUSTMENT (data);
482
502
g_signal_connect (tool->low_input, "value-changed",
483
G_CALLBACK (levels_low_input_adjustment_update),
503
G_CALLBACK (levels_low_input_changed),
506
gimp_handle_bar_set_adjustment (GIMP_HANDLE_BAR (tool->input_sliders), 0,
486
509
/* input gamma spin */
487
spinbutton = gimp_spin_button_new (&data, 1, 0.1, 10, 0.01, 0.1, 1, 0.5, 2);
510
spinbutton = gimp_spin_button_new (&data,
511
config->gamma[config->channel],
512
0.1, 10, 0.01, 0.1, 0, 0.5, 2);
488
513
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, TRUE, FALSE, 0);
489
514
gimp_help_set_help_data (spinbutton, _("Gamma"), NULL);
490
515
gtk_widget_show (spinbutton);
492
517
tool->gamma = GTK_ADJUSTMENT (data);
493
518
g_signal_connect (tool->gamma, "value-changed",
494
G_CALLBACK (levels_gamma_adjustment_update),
519
G_CALLBACK (levels_gamma_changed),
522
tool->gamma_linear = GTK_ADJUSTMENT (gtk_adjustment_new (127, 0, 255,
524
g_signal_connect (tool->gamma_linear, "value-changed",
525
G_CALLBACK (levels_linear_gamma_changed),
528
gimp_handle_bar_set_adjustment (GIMP_HANDLE_BAR (tool->input_sliders), 1,
530
g_object_unref (tool->gamma_linear);
497
532
/* high input spin */
498
533
hbox2 = gtk_hbox_new (FALSE, 2);
499
534
gtk_box_pack_end (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0);
500
535
gtk_widget_show (hbox2);
502
button = gimp_levels_tool_color_picker_new (tool, HIGH_INPUT);
537
button = gimp_levels_tool_color_picker_new (tool, PICK_HIGH_INPUT);
503
538
gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
504
539
gtk_widget_show (button);
506
spinbutton = gimp_spin_button_new (&data, 255, 0, 255, 1, 10, 10, 0.5, 0);
541
spinbutton = gimp_spin_button_new (&data,
542
config->high_input[config->channel] * 255.0,
543
0, 255, 1, 10, 0, 0.5, 0);
507
544
gtk_box_pack_start (GTK_BOX (hbox2), spinbutton, FALSE, FALSE, 0);
508
545
gtk_widget_show (spinbutton);
510
547
tool->high_input = GTK_ADJUSTMENT (data);
511
548
g_signal_connect (tool->high_input, "value-changed",
512
G_CALLBACK (levels_high_input_adjustment_update),
549
G_CALLBACK (levels_high_input_changed),
552
gimp_handle_bar_set_adjustment (GIMP_HANDLE_BAR (tool->input_sliders), 2,
515
555
/* Output levels frame */
516
556
frame = gimp_frame_new (_("Output Levels"));
557
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
558
gtk_widget_show (frame);
560
vbox = gtk_vbox_new (FALSE, 4);
561
gtk_container_add (GTK_CONTAINER (frame), vbox);
562
gtk_widget_show (vbox);
564
frame = gtk_frame_new (NULL);
565
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
517
566
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
518
567
gtk_widget_show (frame);
520
vbox2 = gtk_vbox_new (FALSE, 4);
569
vbox2 = gtk_vbox_new (FALSE, 0);
570
gtk_container_set_border_width (GTK_CONTAINER (vbox2), border);
521
571
gtk_container_add (GTK_CONTAINER (frame), vbox2);
522
572
gtk_widget_show (vbox2);
524
frame = gtk_frame_new (NULL);
525
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
526
gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);
527
gtk_widget_show (frame);
529
tool->output_area = gtk_event_box_new ();
530
gtk_widget_set_size_request (tool->output_area, -1,
531
GRADIENT_HEIGHT + CONTROL_HEIGHT);
532
gtk_widget_add_events (bar, LEVELS_EVENT_MASK);
533
gtk_container_add (GTK_CONTAINER (frame), tool->output_area);
534
gtk_widget_show (tool->output_area);
536
g_signal_connect (tool->output_area, "event",
537
G_CALLBACK (levels_output_area_event),
539
g_signal_connect_after (tool->output_area, "expose-event",
540
G_CALLBACK (levels_output_area_expose),
543
vbox3 = gtk_vbox_new (FALSE, 0);
544
gtk_container_add (GTK_CONTAINER (tool->output_area), vbox3);
545
gtk_widget_show (vbox3);
547
tool->output_bar = g_object_new (GIMP_TYPE_COLOR_BAR,
574
tool->output_bar = g_object_new (GIMP_TYPE_COLOR_BAR, NULL);
551
575
gtk_widget_set_size_request (tool->output_bar, -1, GRADIENT_HEIGHT);
552
gtk_box_pack_start (GTK_BOX (vbox3), tool->output_bar, FALSE, FALSE, 0);
576
gtk_box_pack_start (GTK_BOX (vbox2), tool->output_bar, FALSE, FALSE, 0);
553
577
gtk_widget_show (tool->output_bar);
579
tool->output_sliders = g_object_new (GIMP_TYPE_HANDLE_BAR, NULL);
580
gtk_widget_set_size_request (tool->output_sliders, -1, CONTROL_HEIGHT);
581
gtk_box_pack_start (GTK_BOX (vbox2), tool->output_sliders, FALSE, FALSE, 0);
582
gtk_widget_show (tool->output_sliders);
584
g_signal_connect_swapped (tool->output_bar, "button-press-event",
585
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->output_sliders)->button_press_event),
586
tool->output_sliders);
588
g_signal_connect_swapped (tool->output_bar, "button-release-event",
589
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->output_sliders)->button_release_event),
590
tool->output_sliders);
592
g_signal_connect_swapped (tool->output_bar, "motion-notify-event",
593
G_CALLBACK (GTK_WIDGET_GET_CLASS (tool->output_sliders)->motion_notify_event),
594
tool->output_sliders);
555
596
/* Horizontal box for levels spin widgets */
556
597
hbox = gtk_hbox_new (FALSE, 6);
557
gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
598
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
558
599
gtk_widget_show (hbox);
560
601
/* low output spin */
561
spinbutton = gimp_spin_button_new (&data, 0, 0, 255, 1, 10, 10, 0.5, 0);
602
spinbutton = gimp_spin_button_new (&data,
603
config->low_output[config->channel] * 255.0,
604
0, 255, 1, 10, 0, 0.5, 0);
562
605
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
563
606
gtk_widget_show (spinbutton);
565
608
tool->low_output = GTK_ADJUSTMENT (data);
566
609
g_signal_connect (tool->low_output, "value-changed",
567
G_CALLBACK (levels_low_output_adjustment_update),
610
G_CALLBACK (levels_low_output_changed),
613
gimp_handle_bar_set_adjustment (GIMP_HANDLE_BAR (tool->output_sliders), 0,
570
616
/* high output spin */
571
spinbutton = gimp_spin_button_new (&data, 255, 0, 255, 1, 10, 10, 0.5, 0);
617
spinbutton = gimp_spin_button_new (&data,
618
config->high_output[config->channel] * 255.0,
619
0, 255, 1, 10, 0, 0.5, 0);
572
620
gtk_box_pack_end (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
573
621
gtk_widget_show (spinbutton);
575
623
tool->high_output = GTK_ADJUSTMENT (data);
576
624
g_signal_connect (tool->high_output, "value-changed",
577
G_CALLBACK (levels_high_output_adjustment_update),
625
G_CALLBACK (levels_high_output_changed),
628
gimp_handle_bar_set_adjustment (GIMP_HANDLE_BAR (tool->output_sliders), 2,
632
/* all channels frame */
581
633
frame = gimp_frame_new (_("All Channels"));
582
gtk_box_pack_end (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
634
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
583
635
gtk_widget_show (frame);
585
hbox = gtk_hbox_new (FALSE, 0);
637
hbox = gtk_hbox_new (FALSE, 6);
586
638
gtk_container_add (GTK_CONTAINER (frame), hbox);
587
639
gtk_widget_show (hbox);
589
hbbox = gtk_hbutton_box_new ();
590
gtk_box_set_spacing (GTK_BOX (hbbox), 4);
591
gtk_box_pack_start (GTK_BOX (hbox), hbbox, FALSE, FALSE, 0);
592
gtk_widget_show (hbbox);
594
gtk_box_pack_start (GTK_BOX (hbbox), image_map_tool->load_button,
596
gtk_widget_show (image_map_tool->load_button);
598
gtk_box_pack_start (GTK_BOX (hbbox), image_map_tool->save_button,
600
gtk_widget_show (image_map_tool->save_button);
602
641
hbbox = gtk_hbox_new (FALSE, 6);
603
642
gtk_box_pack_end (GTK_BOX (hbox), hbbox, FALSE, FALSE, 0);
604
643
gtk_widget_show (hbbox);
644
696
gimp_levels_tool_reset (GimpImageMapTool *image_map_tool)
646
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
648
levels_init (tool->levels);
649
levels_update (tool, ALL);
653
gimp_levels_tool_settings_load (GimpImageMapTool *image_map_tool,
657
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
668
if (! fgets (buf, sizeof (buf), file) ||
669
strcmp (buf, "# GIMP Levels File\n") != 0)
671
g_set_error (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE,
672
_("not a GIMP Levels file"));
676
for (i = 0; i < 5; i++)
678
fields = fscanf (file, "%d %d %d %d ",
687
if (! fgets (buf, 50, file))
690
gamma[i] = g_ascii_strtod (buf, &nptr);
692
if (buf == nptr || errno == ERANGE)
696
for (i = 0; i < 5; i++)
698
tool->levels->low_input[i] = low_input[i];
699
tool->levels->high_input[i] = high_input[i];
700
tool->levels->low_output[i] = low_output[i];
701
tool->levels->high_output[i] = high_output[i];
702
tool->levels->gamma[i] = gamma[i];
705
levels_update (tool, ALL);
710
g_set_error (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE,
716
gimp_levels_tool_settings_save (GimpImageMapTool *image_map_tool,
719
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
723
fprintf (file, "# GIMP Levels File\n");
725
for (i = 0; i < 5; i++)
727
gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
729
fprintf (file, "%d %d %d %d %s\n",
730
tool->levels->low_input[i],
731
tool->levels->high_input[i],
732
tool->levels->low_output[i],
733
tool->levels->high_output[i],
734
g_ascii_formatd (buf, G_ASCII_DTOSTR_BUF_SIZE, "%f",
735
tool->levels->gamma[i]));
742
levels_draw_slider (GtkWidget *widget,
749
for (y = 0; y < CONTROL_HEIGHT; y++)
750
gdk_draw_line (widget->window, fill_gc,
751
xpos - y / 2, GRADIENT_HEIGHT + y,
752
xpos + y / 2, GRADIENT_HEIGHT + y);
754
gdk_draw_line (widget->window, border_gc,
757
xpos - (CONTROL_HEIGHT - 1) / 2,
758
GRADIENT_HEIGHT + CONTROL_HEIGHT - 1);
760
gdk_draw_line (widget->window, border_gc,
763
xpos + (CONTROL_HEIGHT - 1) / 2,
764
GRADIENT_HEIGHT + CONTROL_HEIGHT - 1);
766
gdk_draw_line (widget->window, border_gc,
767
xpos - (CONTROL_HEIGHT - 1) / 2,
768
GRADIENT_HEIGHT + CONTROL_HEIGHT - 1,
769
xpos + (CONTROL_HEIGHT - 1) / 2,
770
GRADIENT_HEIGHT + CONTROL_HEIGHT - 1);
774
levels_update (GimpLevelsTool *tool,
777
GimpHistogramChannel channel;
781
channel = tool->channel;
698
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
699
GimpHistogramChannel channel = tool->config->channel;
701
g_object_freeze_notify (image_map_tool->config);
703
if (image_map_tool->default_config)
705
gimp_config_copy (GIMP_CONFIG (image_map_tool->default_config),
706
GIMP_CONFIG (image_map_tool->config),
786
if (tool->channel == 1)
787
channel = GIMP_HISTOGRAM_ALPHA;
789
channel = GIMP_HISTOGRAM_VALUE;
792
/* Recalculate the transfer arrays */
793
levels_calculate_transfers (tool->levels);
796
if (GIMP_IMAGE_MAP_TOOL (tool)->drawable)
797
gimp_lut_setup (tool->lut,
798
(GimpLutFunc) levels_lut_func,
800
gimp_drawable_bytes (GIMP_IMAGE_MAP_TOOL (tool)->drawable));
802
if (update & LOW_INPUT)
803
gtk_adjustment_set_value (tool->low_input,
804
tool->levels->low_input[tool->channel]);
807
gtk_adjustment_set_value (tool->gamma,
808
tool->levels->gamma[tool->channel]);
810
if (update & HIGH_INPUT)
811
gtk_adjustment_set_value (tool->high_input,
812
tool->levels->high_input[tool->channel]);
814
if (update & LOW_OUTPUT)
815
gtk_adjustment_set_value (tool->low_output,
816
tool->levels->low_output[tool->channel]);
818
if (update & HIGH_OUTPUT)
819
gtk_adjustment_set_value (tool->high_output,
820
tool->levels->high_output[tool->channel]);
822
if (update & INPUT_LEVELS)
826
case GIMP_HISTOGRAM_VALUE:
827
case GIMP_HISTOGRAM_ALPHA:
828
case GIMP_HISTOGRAM_RGB:
829
gimp_color_bar_set_buffers (GIMP_COLOR_BAR (tool->input_bar),
830
tool->levels->input[tool->channel],
831
tool->levels->input[tool->channel],
832
tool->levels->input[tool->channel]);
835
case GIMP_HISTOGRAM_RED:
836
case GIMP_HISTOGRAM_GREEN:
837
case GIMP_HISTOGRAM_BLUE:
838
gimp_color_bar_set_buffers (GIMP_COLOR_BAR (tool->input_bar),
839
tool->levels->input[GIMP_HISTOGRAM_RED],
840
tool->levels->input[GIMP_HISTOGRAM_GREEN],
841
tool->levels->input[GIMP_HISTOGRAM_BLUE]);
846
if (update & OUTPUT_LEVELS)
848
gimp_color_bar_set_channel (GIMP_COLOR_BAR (tool->output_bar), channel);
851
if (update & INPUT_SLIDERS)
853
gtk_widget_queue_draw (tool->input_area);
856
if (update & OUTPUT_SLIDERS)
858
gtk_widget_queue_draw (tool->output_area);
711
gimp_config_reset (GIMP_CONFIG (image_map_tool->config));
714
g_object_set (tool->config,
718
g_object_thaw_notify (image_map_tool->config);
722
gimp_levels_tool_settings_import (GimpImageMapTool *image_map_tool,
723
const gchar *filename,
726
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
730
file = g_fopen (filename, "rt");
734
g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
735
_("Could not open '%s' for reading: %s"),
736
gimp_filename_to_utf8 (filename),
741
success = gimp_levels_config_load_cruft (tool->config, file, error);
749
gimp_levels_tool_settings_export (GimpImageMapTool *image_map_tool,
750
const gchar *filename,
753
GimpLevelsTool *tool = GIMP_LEVELS_TOOL (image_map_tool);
757
file = g_fopen (filename, "wt");
761
g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
762
_("Could not open '%s' for writing: %s"),
763
gimp_filename_to_utf8 (filename),
768
success = gimp_levels_config_save_cruft (tool->config, file, error);
776
gimp_levels_tool_config_notify (GObject *object,
778
GimpLevelsTool *tool)
780
GimpLevelsConfig *config = GIMP_LEVELS_CONFIG (object);
782
if (! tool->low_input)
785
if (! strcmp (pspec->name, "channel"))
787
gimp_histogram_view_set_channel (GIMP_HISTOGRAM_VIEW (tool->histogram_view),
789
gimp_color_bar_set_channel (GIMP_COLOR_BAR (tool->output_bar),
791
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (tool->channel_menu),
794
else if (! strcmp (pspec->name, "gamma") ||
795
! strcmp (pspec->name, "low-input") ||
796
! strcmp (pspec->name, "high-input"))
798
tool->low_input->upper = 255;
799
tool->high_input->lower = 0;
800
tool->gamma_linear->lower = 0;
801
tool->gamma_linear->upper = 255;
803
gtk_adjustment_set_value (tool->low_input,
804
config->low_input[config->channel] * 255.0);
805
gtk_adjustment_set_value (tool->gamma,
806
config->gamma[config->channel]);
807
gtk_adjustment_set_value (tool->high_input,
808
config->high_input[config->channel] * 255.0);
810
tool->low_input->upper = gtk_adjustment_get_value (tool->high_input);
811
tool->high_input->lower = gtk_adjustment_get_value (tool->low_input);
812
tool->gamma_linear->lower = gtk_adjustment_get_value (tool->low_input);
813
tool->gamma_linear->upper = gtk_adjustment_get_value (tool->high_input);
814
gtk_adjustment_changed (tool->low_input);
815
gtk_adjustment_changed (tool->high_input);
816
gtk_adjustment_changed (tool->gamma_linear);
818
levels_update_input_bar (tool);
820
else if (! strcmp (pspec->name, "low-output"))
822
gtk_adjustment_set_value (tool->low_output,
823
config->low_output[config->channel] * 255.0);
825
else if (! strcmp (pspec->name, "high-output"))
827
gtk_adjustment_set_value (tool->high_output,
828
config->high_output[config->channel] * 255.0);
831
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
835
levels_update_input_bar (GimpLevelsTool *tool)
837
GimpLevelsConfig *config = tool->config;
839
switch (config->channel)
841
case GIMP_HISTOGRAM_VALUE:
842
case GIMP_HISTOGRAM_ALPHA:
843
case GIMP_HISTOGRAM_RGB:
848
for (i = 0; i < 256; i++)
850
v[i] = gimp_operation_levels_map_input (config,
852
i / 255.0) * 255.999;
855
gimp_color_bar_set_buffers (GIMP_COLOR_BAR (tool->input_bar),
860
case GIMP_HISTOGRAM_RED:
861
case GIMP_HISTOGRAM_GREEN:
862
case GIMP_HISTOGRAM_BLUE:
869
for (i = 0; i < 256; i++)
871
r[i] = gimp_operation_levels_map_input (config,
873
i / 255.0) * 255.999;
874
g[i] = gimp_operation_levels_map_input (config,
875
GIMP_HISTOGRAM_GREEN,
876
i / 255.0) * 255.999;
877
b[i] = gimp_operation_levels_map_input (config,
879
i / 255.0) * 255.999;
882
gimp_color_bar_set_buffers (GIMP_COLOR_BAR (tool->input_bar),
920
939
levels_stretch_callback (GtkWidget *widget,
940
GimpLevelsTool *tool)
942
GimpDrawable *drawable = GIMP_IMAGE_MAP_TOOL (tool)->drawable;
944
gimp_levels_config_stretch (tool->config, tool->histogram,
945
gimp_drawable_is_rgb (drawable));
949
levels_linear_gamma_update (GimpLevelsTool *tool)
951
gdouble low_input = gtk_adjustment_get_value (tool->low_input);
952
gdouble high_input = gtk_adjustment_get_value (tool->high_input);
953
gdouble delta, mid, tmp, value;
955
delta = (high_input - low_input) / 2.0;
956
mid = low_input + delta;
957
tmp = log10 (1.0 / tool->config->gamma[tool->config->channel]);
958
value = mid + delta * tmp;
960
gtk_adjustment_set_value (tool->gamma_linear, value);
964
levels_linear_gamma_changed (GtkAdjustment *adjustment,
965
GimpLevelsTool *tool)
967
gdouble low_input = gtk_adjustment_get_value (tool->low_input);
968
gdouble high_input = gtk_adjustment_get_value (tool->high_input);
969
gdouble delta, mid, tmp, value;
971
delta = (high_input - low_input) / 2.0;
975
mid = low_input + delta;
976
tmp = (gtk_adjustment_get_value (adjustment) - mid) / delta;
977
value = 1.0 / pow (10, tmp);
979
/* round the gamma value to the nearest 1/100th */
980
value = floor (value * 100 + 0.5) / 100.0;
982
gtk_adjustment_set_value (tool->gamma, value);
987
levels_low_input_changed (GtkAdjustment *adjustment,
988
GimpLevelsTool *tool)
990
GimpLevelsConfig *config = tool->config;
991
gint value = ROUND (gtk_adjustment_get_value (adjustment));
993
tool->high_input->lower = value;
994
tool->gamma_linear->lower = value;
995
gtk_adjustment_changed (tool->high_input);
996
gtk_adjustment_changed (tool->gamma_linear);
998
if (config->low_input[config->channel] != value / 255.0)
1000
g_object_set (config,
1001
"low-input", value / 255.0,
1005
levels_linear_gamma_update (tool);
1009
levels_gamma_changed (GtkAdjustment *adjustment,
921
1010
GimpLevelsTool *tool)
923
levels_stretch (tool->levels, tool->hist, tool->color);
924
levels_update (tool, ALL);
926
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
930
levels_low_input_adjustment_update (GtkAdjustment *adjustment,
931
GimpLevelsTool *tool)
933
gint value = ROUND (adjustment->value);
935
value = CLAMP (value, 0, tool->levels->high_input[tool->channel]);
937
/* enforce a consistent displayed value (low_input <= high_input) */
938
gtk_adjustment_set_value (adjustment, value);
940
if (tool->levels->low_input[tool->channel] != value)
942
tool->levels->low_input[tool->channel] = value;
943
levels_update (tool, INPUT_LEVELS | INPUT_SLIDERS);
945
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
950
levels_gamma_adjustment_update (GtkAdjustment *adjustment,
951
GimpLevelsTool *tool)
953
if (tool->levels->gamma[tool->channel] != adjustment->value)
955
tool->levels->gamma[tool->channel] = adjustment->value;
956
levels_update (tool, INPUT_LEVELS | INPUT_SLIDERS);
958
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
963
levels_high_input_adjustment_update (GtkAdjustment *adjustment,
964
GimpLevelsTool *tool)
966
gint value = ROUND (adjustment->value);
968
value = CLAMP (value, tool->levels->low_input[tool->channel], 255);
970
/* enforce a consistent displayed value (high_input >= low_input) */
971
gtk_adjustment_set_value (adjustment, value);
973
if (tool->levels->high_input[tool->channel] != value)
975
tool->levels->high_input[tool->channel] = value;
976
levels_update (tool, INPUT_LEVELS | INPUT_SLIDERS);
978
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
983
levels_low_output_adjustment_update (GtkAdjustment *adjustment,
984
GimpLevelsTool *tool)
986
gint value = ROUND (adjustment->value);
988
if (tool->levels->low_output[tool->channel] != value)
990
tool->levels->low_output[tool->channel] = value;
991
levels_update (tool, OUTPUT_LEVELS | OUTPUT_SLIDERS);
993
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
998
levels_high_output_adjustment_update (GtkAdjustment *adjustment,
999
GimpLevelsTool *tool)
1001
gint value = ROUND (adjustment->value);
1003
if (tool->levels->high_output[tool->channel] != value)
1005
tool->levels->high_output[tool->channel] = value;
1006
levels_update (tool, OUTPUT_LEVELS | OUTPUT_SLIDERS);
1008
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
1012
GimpLevelsConfig *config = tool->config;
1013
gdouble value = gtk_adjustment_get_value (adjustment);
1015
if (config->gamma[config->channel] != value)
1017
g_object_set (config,
1022
levels_linear_gamma_update (tool);
1026
levels_high_input_changed (GtkAdjustment *adjustment,
1027
GimpLevelsTool *tool)
1029
GimpLevelsConfig *config = tool->config;
1030
gint value = ROUND (gtk_adjustment_get_value (adjustment));
1032
tool->low_input->upper = value;
1033
tool->gamma_linear->upper = value;
1034
gtk_adjustment_changed (tool->low_input);
1035
gtk_adjustment_changed (tool->gamma_linear);
1037
if (config->high_input[config->channel] != value / 255.0)
1039
g_object_set (config,
1040
"high-input", value / 255.0,
1044
levels_linear_gamma_update (tool);
1048
levels_low_output_changed (GtkAdjustment *adjustment,
1049
GimpLevelsTool *tool)
1051
GimpLevelsConfig *config = tool->config;
1052
gint value = ROUND (gtk_adjustment_get_value (adjustment));
1054
if (config->low_output[config->channel] != value / 255.0)
1056
g_object_set (config,
1057
"low-output", value / 255.0,
1063
levels_high_output_changed (GtkAdjustment *adjustment,
1064
GimpLevelsTool *tool)
1066
GimpLevelsConfig *config = tool->config;
1067
gint value = ROUND (gtk_adjustment_get_value (adjustment));
1069
if (config->high_output[config->channel] != value / 255.0)
1071
g_object_set (config,
1072
"high-output", value / 255.0,
1038
levels_input_area_event (GtkWidget *widget,
1040
GimpLevelsTool *tool)
1042
GdkEventButton *bevent;
1043
GdkEventMotion *mevent;
1046
gboolean update = FALSE;
1048
switch (event->type)
1050
case GDK_BUTTON_PRESS:
1051
bevent = (GdkEventButton *) event;
1053
distance = G_MAXINT;
1054
for (i = 0; i < 3; i++)
1055
if (fabs (bevent->x - tool->slider_pos[i]) < distance)
1057
tool->active_slider = i;
1058
distance = fabs (bevent->x - tool->slider_pos[i]);
1065
case GDK_BUTTON_RELEASE:
1066
switch (tool->active_slider)
1068
case 0: /* low input */
1069
levels_update (tool, LOW_INPUT | GAMMA);
1072
levels_update (tool, GAMMA);
1074
case 2: /* high input */
1075
levels_update (tool, HIGH_INPUT | GAMMA);
1079
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
1082
case GDK_MOTION_NOTIFY:
1083
mevent = (GdkEventMotion *) event;
1084
gdk_window_get_pointer (widget->window, &x, NULL, NULL);
1094
gdouble delta, mid, tmp;
1098
g_object_get (tool->hist_view, "border-width", &border, NULL);
1100
width = widget->allocation.width - 2 * border;
1105
switch (tool->active_slider)
1107
case 0: /* low input */
1108
tool->levels->low_input[tool->channel] =
1109
((gdouble) (x - border) / (gdouble) width) * 255.0;
1111
tool->levels->low_input[tool->channel] =
1112
CLAMP (tool->levels->low_input[tool->channel],
1113
0, tool->levels->high_input[tool->channel]);
1117
delta = (gdouble) (tool->slider_pos[2] - tool->slider_pos[0]) / 2.0;
1118
mid = tool->slider_pos[0] + delta;
1120
x = CLAMP (x, tool->slider_pos[0], tool->slider_pos[2]);
1121
tmp = (gdouble) (x - mid) / delta;
1123
tool->levels->gamma[tool->channel] = 1.0 / pow (10, tmp);
1125
/* round the gamma value to the nearest 1/100th */
1126
tool->levels->gamma[tool->channel] =
1127
floor (tool->levels->gamma[tool->channel] * 100 + 0.5) / 100.0;
1130
case 2: /* high input */
1131
tool->levels->high_input[tool->channel] =
1132
((gdouble) (x - border) / (gdouble) width) * 255.0;
1134
tool->levels->high_input[tool->channel] =
1135
CLAMP (tool->levels->high_input[tool->channel],
1136
tool->levels->low_input[tool->channel], 255);
1140
levels_update (tool, INPUT_SLIDERS | INPUT_LEVELS);
1148
levels_input_area_expose (GtkWidget *widget,
1149
GdkEventExpose *event,
1150
GimpLevelsTool *tool)
1152
Levels *levels = tool->levels;
1153
gint width = widget->allocation.width;
1154
gdouble delta, mid, tmp;
1157
g_object_get (tool->hist_view, "border-width", &border, NULL);
1159
width -= 2 * border;
1161
tool->slider_pos[0] = ROUND ((gdouble) width *
1162
levels->low_input[tool->channel] /
1165
tool->slider_pos[2] = ROUND ((gdouble) width *
1166
levels->high_input[tool->channel] /
1169
delta = (gdouble) (tool->slider_pos[2] - tool->slider_pos[0]) / 2.0;
1170
mid = tool->slider_pos[0] + delta;
1171
tmp = log10 (1.0 / levels->gamma[tool->channel]);
1173
tool->slider_pos[1] = ROUND (mid + delta * tmp) + border;
1175
levels_draw_slider (widget,
1176
widget->style->black_gc,
1177
widget->style->black_gc,
1178
tool->slider_pos[0]);
1179
levels_draw_slider (widget,
1180
widget->style->black_gc,
1181
widget->style->dark_gc[GTK_STATE_NORMAL],
1182
tool->slider_pos[1]);
1183
levels_draw_slider (widget,
1184
widget->style->black_gc,
1185
widget->style->white_gc,
1186
tool->slider_pos[2]);
1192
levels_output_area_event (GtkWidget *widget,
1194
GimpLevelsTool *tool)
1196
GdkEventButton *bevent;
1197
GdkEventMotion *mevent;
1200
gboolean update = FALSE;
1202
switch (event->type)
1204
case GDK_BUTTON_PRESS:
1205
bevent = (GdkEventButton *) event;
1207
distance = G_MAXINT;
1208
for (i = 3; i < 5; i++)
1209
if (fabs (bevent->x - tool->slider_pos[i]) < distance)
1211
tool->active_slider = i;
1212
distance = fabs (bevent->x - tool->slider_pos[i]);
1219
case GDK_BUTTON_RELEASE:
1220
switch (tool->active_slider)
1222
case 3: /* low output */
1223
levels_update (tool, LOW_OUTPUT);
1225
case 4: /* high output */
1226
levels_update (tool, HIGH_OUTPUT);
1230
gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (tool));
1233
case GDK_MOTION_NOTIFY:
1234
mevent = (GdkEventMotion *) event;
1235
gdk_window_get_pointer (widget->window, &x, NULL, NULL);
1248
g_object_get (tool->hist_view, "border-width", &border, NULL);
1250
width = widget->allocation.width - 2 * border;
1255
switch (tool->active_slider)
1257
case 3: /* low output */
1258
tool->levels->low_output[tool->channel] =
1259
((gdouble) (x - border) / (gdouble) width) * 255.0;
1261
tool->levels->low_output[tool->channel] =
1262
CLAMP (tool->levels->low_output[tool->channel], 0, 255);
1265
case 4: /* high output */
1266
tool->levels->high_output[tool->channel] =
1267
((gdouble) (x - border) / (gdouble) width) * 255.0;
1269
tool->levels->high_output[tool->channel] =
1270
CLAMP (tool->levels->high_output[tool->channel], 0, 255);
1274
levels_update (tool, OUTPUT_SLIDERS);
1281
levels_output_area_expose (GtkWidget *widget,
1282
GdkEventExpose *event,
1283
GimpLevelsTool *tool)
1285
Levels *levels = tool->levels;
1286
gint width = widget->allocation.width;
1289
g_object_get (tool->hist_view, "border-width", &border, NULL);
1291
width -= 2 * border;
1293
tool->slider_pos[3] = ROUND ((gdouble) width *
1294
levels->low_output[tool->channel] /
1297
tool->slider_pos[4] = ROUND ((gdouble) width *
1298
levels->high_output[tool->channel] /
1301
levels_draw_slider (widget,
1302
widget->style->black_gc,
1303
widget->style->black_gc,
1304
tool->slider_pos[3]);
1305
levels_draw_slider (widget,
1306
widget->style->black_gc,
1307
widget->style->white_gc,
1308
tool->slider_pos[4]);
1314
levels_input_adjust_by_color (Levels *levels,
1103
levels_input_adjust_by_color (GimpLevelsConfig *config,
1316
1105
GimpHistogramChannel channel,
1106
const GimpRGB *color)
1319
1108
switch (value & 0xF)
1322
levels_adjust_by_colors (levels, channel, color, NULL, NULL);
1325
levels_adjust_by_colors (levels, channel, NULL, color, NULL);
1328
levels_adjust_by_colors (levels, channel, NULL, NULL, color);
1110
case PICK_LOW_INPUT:
1111
gimp_levels_config_adjust_by_colors (config, channel, color, NULL, NULL);
1114
gimp_levels_config_adjust_by_colors (config, channel, NULL, color, NULL);
1116
case PICK_HIGH_INPUT:
1117
gimp_levels_config_adjust_by_colors (config, channel, NULL, NULL, color);