1997-11-25 06:05:25 +08:00
|
|
|
/* The GIMP -- an image manipulation program
|
|
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
1998-04-13 13:44:11 +08:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
|
|
|
#include "appenv.h"
|
1998-01-29 11:13:44 +08:00
|
|
|
#include "actionarea.h"
|
1999-08-24 10:52:40 +08:00
|
|
|
#include "color_panel.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "color_picker.h"
|
1999-04-16 04:52:36 +08:00
|
|
|
#include "draw_core.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "drawable.h"
|
|
|
|
#include "gdisplay.h"
|
1999-05-13 19:12:32 +08:00
|
|
|
#include "cursorutil.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "info_dialog.h"
|
|
|
|
#include "palette.h"
|
1999-04-13 01:55:06 +08:00
|
|
|
#include "tool_options_ui.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "tools.h"
|
1999-04-16 04:52:36 +08:00
|
|
|
#include "gimprc.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
#include "libgimp/gimpintl.h"
|
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
/* maximum information buffer size */
|
1999-04-13 01:55:06 +08:00
|
|
|
#define MAX_INFO_BUF 8
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
/* the color picker structures */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
typedef struct _ColorPickerOptions ColorPickerOptions;
|
|
|
|
struct _ColorPickerOptions
|
|
|
|
{
|
1999-04-13 01:55:06 +08:00
|
|
|
ToolOptions tool_options;
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
gboolean sample_merged;
|
|
|
|
gboolean sample_merged_d;
|
1999-04-13 01:55:06 +08:00
|
|
|
GtkWidget *sample_merged_w;
|
1999-04-11 14:35:28 +08:00
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
gboolean sample_average;
|
|
|
|
gboolean sample_average_d;
|
1999-04-13 01:55:06 +08:00
|
|
|
GtkWidget *sample_average_w;
|
1999-04-11 14:35:28 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
gdouble average_radius;
|
|
|
|
gdouble average_radius_d;
|
1999-04-13 01:55:06 +08:00
|
|
|
GtkObject *average_radius_w;
|
1999-08-24 10:52:40 +08:00
|
|
|
|
|
|
|
gboolean update_active;
|
|
|
|
gboolean update_active_d;
|
|
|
|
GtkWidget *update_active_w;
|
1999-04-09 06:25:54 +08:00
|
|
|
};
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
typedef struct _ColorPickerTool ColorPickerTool;
|
|
|
|
struct _ColorPickerTool
|
1999-04-16 04:52:36 +08:00
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
DrawCore *core; /* Core select object */
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
gint centerx; /* starting x coord */
|
|
|
|
gint centery; /* starting y coord */
|
1999-04-16 04:52:36 +08:00
|
|
|
};
|
1999-04-13 01:55:06 +08:00
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
/* the color picker tool options */
|
|
|
|
static ColorPickerOptions * color_picker_options = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-19 05:22:41 +08:00
|
|
|
/* the color value */
|
1999-07-24 23:37:03 +08:00
|
|
|
gint col_value[5] = { 0, 0, 0, 0, 0 };
|
1999-04-19 05:22:41 +08:00
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
/* the color picker dialog */
|
1999-07-24 23:37:03 +08:00
|
|
|
static gint update_type;
|
Actually use the enum types GimpImageType, GimpImageBaseType,
* app/*.[ch]: Actually use the enum types GimpImageType,
GimpImageBaseType, LayerModeEffects, PaintApplicationMode,
BrushApplicationMode, GimpFillType and ConvertPaletteType, instead
of just int or gint. Hopefully I catched most of the places
where these should be used.
Add an enum ConvolutionType, suffix the too general constants
NORMAL, ABSOLUTE and NEGATIVE with _CONVOL. Use NORMAL_MODE
instead of NORMAL in some places (this was what was intended). Fix
some minor gccisms.
* app/apptypes.h: New file. This file contains the above
enumeration types, and some opaque struct typedefs. It was
necessary to collect these in one header that doesn't include
other headers, because when we started using the above mentioned
types in the headers, all hell broke loose because of the
spaghetti-like cross-inclusion mess between headers.
(An example: Header A includes header B, which includes header C
which includes A. B uses a type defined in A. This is not defined,
because A hasn't defined it yet at the point where it includes B,
and A included from B of course is skipped as we already are
reading A.)
1999-08-19 07:41:39 +08:00
|
|
|
static GimpImageType sample_type;
|
1999-08-24 10:52:40 +08:00
|
|
|
static InfoDialog *color_picker_info = NULL;
|
|
|
|
static ColorPanel *color_panel = NULL;
|
1999-07-24 23:37:03 +08:00
|
|
|
static gchar red_buf [MAX_INFO_BUF];
|
|
|
|
static gchar green_buf [MAX_INFO_BUF];
|
|
|
|
static gchar blue_buf [MAX_INFO_BUF];
|
|
|
|
static gchar alpha_buf [MAX_INFO_BUF];
|
|
|
|
static gchar index_buf [MAX_INFO_BUF];
|
|
|
|
static gchar gray_buf [MAX_INFO_BUF];
|
|
|
|
static gchar hex_buf [MAX_INFO_BUF];
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
|
1999-04-09 06:25:54 +08:00
|
|
|
/* local function prototypes */
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
static void color_picker_button_press (Tool *, GdkEventButton *, gpointer);
|
|
|
|
static void color_picker_button_release (Tool *, GdkEventButton *, gpointer);
|
|
|
|
static void color_picker_motion (Tool *, GdkEventMotion *, gpointer);
|
|
|
|
static void color_picker_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
|
|
|
static void color_picker_control (Tool *, ToolAction, gpointer);
|
|
|
|
|
|
|
|
static void color_picker_info_window_close_callback (GtkWidget *, gpointer);
|
|
|
|
static void color_picker_info_update (Tool *, gboolean);
|
|
|
|
|
|
|
|
static gboolean pick_color_do (GimpImage *gimage,
|
|
|
|
GimpDrawable *drawable,
|
|
|
|
gint x,
|
|
|
|
gint y,
|
|
|
|
gboolean sample_merged,
|
|
|
|
gboolean sample_average,
|
|
|
|
gdouble average_radius,
|
|
|
|
gboolean update_active,
|
|
|
|
gint final);
|
1999-04-09 06:25:54 +08:00
|
|
|
|
|
|
|
/* functions */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
static void
|
1999-04-13 01:55:06 +08:00
|
|
|
color_picker_options_reset (void)
|
1999-04-09 06:25:54 +08:00
|
|
|
{
|
|
|
|
ColorPickerOptions *options = color_picker_options;
|
|
|
|
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->sample_merged_w),
|
|
|
|
options->sample_merged_d);
|
1999-04-11 14:35:28 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->sample_average_w),
|
|
|
|
options->sample_average_d);
|
1999-04-13 01:55:06 +08:00
|
|
|
gtk_adjustment_set_value (GTK_ADJUSTMENT (options->average_radius_w),
|
|
|
|
options->average_radius_d);
|
1999-08-24 10:52:40 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->update_active_w),
|
|
|
|
options->update_active_d);
|
1999-04-09 06:25:54 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static ColorPickerOptions *
|
1999-04-13 01:55:06 +08:00
|
|
|
color_picker_options_new (void)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
ColorPickerOptions *options;
|
|
|
|
|
1999-04-13 01:55:06 +08:00
|
|
|
GtkWidget *vbox;
|
|
|
|
GtkWidget *abox;
|
|
|
|
GtkWidget *table;
|
|
|
|
GtkWidget *label;
|
|
|
|
GtkWidget *scale;
|
|
|
|
|
|
|
|
/* the new color picker tool options structure */
|
1999-07-24 23:37:03 +08:00
|
|
|
options = g_new (ColorPickerOptions, 1);
|
1999-04-13 01:55:06 +08:00
|
|
|
tool_options_init ((ToolOptions *) options,
|
1999-06-22 06:12:07 +08:00
|
|
|
_("Color Picker Options"),
|
1999-04-13 01:55:06 +08:00
|
|
|
color_picker_options_reset);
|
|
|
|
options->sample_merged = options->sample_merged_d = FALSE;
|
1999-04-11 14:35:28 +08:00
|
|
|
options->sample_average = options->sample_average_d = FALSE;
|
|
|
|
options->average_radius = options->average_radius_d = 1.0;
|
1999-08-24 10:52:40 +08:00
|
|
|
options->update_active = options->update_active_d = TRUE;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* the main vbox */
|
1999-04-13 01:55:06 +08:00
|
|
|
vbox = options->tool_options.main_vbox;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* the sample merged toggle button */
|
1999-04-09 06:25:54 +08:00
|
|
|
options->sample_merged_w =
|
|
|
|
gtk_check_button_new_with_label (_("Sample Merged"));
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->sample_merged_w),
|
|
|
|
options->sample_merged_d);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), options->sample_merged_w, FALSE, FALSE, 0);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (options->sample_merged_w), "toggled",
|
1999-04-13 01:55:06 +08:00
|
|
|
(GtkSignalFunc) tool_options_toggle_update,
|
1997-11-25 06:05:25 +08:00
|
|
|
&options->sample_merged);
|
1999-04-09 06:25:54 +08:00
|
|
|
gtk_widget_show (options->sample_merged_w);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-11 14:35:28 +08:00
|
|
|
/* the sample average options */
|
|
|
|
table = gtk_table_new (2, 2, FALSE);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
|
1999-04-11 14:35:28 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
|
|
|
|
|
|
|
|
options->sample_average_w =
|
|
|
|
gtk_check_button_new_with_label (_("Sample Average"));
|
|
|
|
gtk_table_attach (GTK_TABLE (table), options->sample_average_w, 0, 1, 0, 1,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->sample_average_w),
|
|
|
|
options->sample_average_d);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (options->sample_average_w), "toggled",
|
1999-04-13 01:55:06 +08:00
|
|
|
(GtkSignalFunc) tool_options_toggle_update,
|
1999-04-11 14:35:28 +08:00
|
|
|
&options->sample_average);
|
|
|
|
gtk_widget_show (options->sample_average_w);
|
|
|
|
|
|
|
|
label = gtk_label_new (_("Radius:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
|
|
|
/* the feather radius scale */
|
|
|
|
abox = gtk_alignment_new (0.5, 1.0, 1.0, 0.0);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), abox, 1, 2, 0, 2,
|
|
|
|
GTK_EXPAND | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
|
|
|
gtk_widget_show (abox);
|
|
|
|
|
|
|
|
options->average_radius_w =
|
|
|
|
gtk_adjustment_new (options->average_radius_d, 1.0, 15.0, 2.0, 2.0, 0.0);
|
|
|
|
scale = gtk_hscale_new (GTK_ADJUSTMENT (options->average_radius_w));
|
1999-04-16 04:52:36 +08:00
|
|
|
gtk_scale_set_digits (GTK_SCALE (scale), 0);
|
1999-04-11 14:35:28 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (abox), scale);
|
|
|
|
gtk_widget_set_sensitive (scale, options->sample_average_d);
|
|
|
|
gtk_object_set_data (GTK_OBJECT (options->sample_average_w), "set_sensitive",
|
|
|
|
scale);
|
1999-04-13 01:55:06 +08:00
|
|
|
gtk_widget_set_sensitive (label, options->sample_average_d);
|
|
|
|
gtk_object_set_data (GTK_OBJECT (scale), "set_sensitive",
|
1999-04-11 14:35:28 +08:00
|
|
|
label);
|
|
|
|
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
|
|
|
|
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (options->average_radius_w), "value_changed",
|
1999-04-13 01:55:06 +08:00
|
|
|
(GtkSignalFunc) tool_options_double_adjustment_update,
|
1999-04-11 14:35:28 +08:00
|
|
|
&options->average_radius);
|
|
|
|
gtk_widget_show (scale);
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
/* the update active color toggle button */
|
|
|
|
options->update_active_w =
|
|
|
|
gtk_check_button_new_with_label (_("Update Active Color"));
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->update_active_w),
|
|
|
|
options->update_active_d);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), options->update_active_w, FALSE, FALSE, 0);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (options->update_active_w), "toggled",
|
|
|
|
(GtkSignalFunc) tool_options_toggle_update,
|
|
|
|
&options->update_active);
|
|
|
|
gtk_widget_show (options->update_active_w);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
return options;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
color_picker_button_press (Tool *tool,
|
|
|
|
GdkEventButton *bevent,
|
|
|
|
gpointer gdisp_ptr)
|
|
|
|
{
|
|
|
|
GDisplay * gdisp;
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool *cp_tool;
|
|
|
|
gint x, y;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-13 01:55:06 +08:00
|
|
|
static ActionAreaItem action_items[] =
|
|
|
|
{
|
|
|
|
{ N_("Close"), color_picker_info_window_close_callback, NULL, NULL },
|
|
|
|
};
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
gdisp = (GDisplay *) gdisp_ptr;
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
/* Make the tool active and set it's gdisplay & drawable */
|
|
|
|
tool->gdisp_ptr = gdisp;
|
|
|
|
tool->drawable = gimage_active_drawable (gdisp->gimage);
|
|
|
|
tool->state = ACTIVE;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
/* create the info dialog if it doesn't exist */
|
|
|
|
if (! color_picker_info)
|
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
GtkWidget *hbox;
|
|
|
|
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
color_picker_info = info_dialog_new (_("Color Picker"));
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* if the gdisplay is for a color image, the dialog must have RGB */
|
1999-07-24 23:37:03 +08:00
|
|
|
switch (drawable_type (tool->drawable))
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
case RGB_GIMAGE: case RGBA_GIMAGE:
|
1999-04-03 03:46:59 +08:00
|
|
|
info_dialog_add_label (color_picker_info, _("Red:"), red_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Green:"), green_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Blue:"), blue_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Alpha:"), alpha_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Hex Triplet:"), hex_buf);
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case INDEXED_GIMAGE: case INDEXEDA_GIMAGE:
|
1999-04-03 03:46:59 +08:00
|
|
|
info_dialog_add_label (color_picker_info, _("Index:"), index_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Alpha:"), alpha_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Red:"), red_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Green:"), green_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Blue:"), blue_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Hex Triplet"), hex_buf);
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GRAY_GIMAGE: case GRAYA_GIMAGE:
|
1999-04-03 03:46:59 +08:00
|
|
|
info_dialog_add_label (color_picker_info, _("Intensity:"), gray_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Alpha:"), alpha_buf);
|
|
|
|
info_dialog_add_label (color_picker_info, _("Hex Triplet:"), hex_buf);
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default :
|
|
|
|
break;
|
|
|
|
}
|
1999-04-13 01:55:06 +08:00
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
hbox = gtk_hbox_new (FALSE, 4);
|
|
|
|
gtk_box_pack_start (GTK_BOX (color_picker_info->vbox), hbox,
|
|
|
|
FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (hbox);
|
|
|
|
|
|
|
|
gtk_widget_reparent (color_picker_info->info_table, hbox);
|
|
|
|
|
|
|
|
color_panel = color_panel_new (NULL, 48, 64);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), color_panel->color_panel_widget,
|
|
|
|
FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (color_panel->color_panel_widget);
|
|
|
|
|
1999-04-13 01:55:06 +08:00
|
|
|
/* create the action area */
|
|
|
|
action_items[0].user_data = color_picker_info;
|
|
|
|
build_action_area (GTK_DIALOG (color_picker_info->shell),
|
|
|
|
action_items, 1, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-04-16 04:52:36 +08:00
|
|
|
/* Keep the coordinates of the target */
|
|
|
|
gdisplay_untransform_coords (gdisp, bevent->x, bevent->y,
|
|
|
|
&cp_tool->centerx, &cp_tool->centery, FALSE, 1);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
|
|
|
(GDK_POINTER_MOTION_HINT_MASK |
|
|
|
|
GDK_BUTTON1_MOTION_MASK |
|
|
|
|
GDK_BUTTON_RELEASE_MASK),
|
|
|
|
NULL, NULL, bevent->time);
|
|
|
|
|
|
|
|
/* First, transform the coordinates to gimp image space */
|
1999-07-24 23:37:03 +08:00
|
|
|
gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y,
|
|
|
|
FALSE, FALSE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* if the shift key is down, create a new color.
|
|
|
|
* otherwise, modify the current color.
|
|
|
|
*/
|
|
|
|
if (bevent->state & GDK_SHIFT_MASK)
|
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
color_picker_info_update
|
|
|
|
(tool, pick_color_do (gdisp->gimage, tool->drawable, x, y,
|
|
|
|
color_picker_options->sample_merged,
|
|
|
|
color_picker_options->sample_average,
|
|
|
|
color_picker_options->average_radius,
|
|
|
|
color_picker_options->update_active,
|
|
|
|
COLOR_NEW));
|
1997-11-25 06:05:25 +08:00
|
|
|
update_type = COLOR_UPDATE_NEW;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
color_picker_info_update
|
|
|
|
(tool, pick_color_do (gdisp->gimage, tool->drawable, x, y,
|
|
|
|
color_picker_options->sample_merged,
|
|
|
|
color_picker_options->sample_average,
|
|
|
|
color_picker_options->average_radius,
|
|
|
|
color_picker_options->update_active,
|
|
|
|
COLOR_UPDATE));
|
1997-11-25 06:05:25 +08:00
|
|
|
update_type = COLOR_UPDATE;
|
|
|
|
}
|
1998-01-29 11:13:44 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
/* Start drawing the colorpicker tool */
|
1999-04-16 04:52:36 +08:00
|
|
|
draw_core_start (cp_tool->core, gdisp->canvas->window, tool);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
color_picker_button_release (Tool *tool,
|
|
|
|
GdkEventButton *bevent,
|
|
|
|
gpointer gdisp_ptr)
|
|
|
|
{
|
|
|
|
GDisplay *gdisp;
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool *cp_tool;
|
|
|
|
gint x, y;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gdk_pointer_ungrab (bevent->time);
|
|
|
|
gdk_flush ();
|
|
|
|
gdisp = (GDisplay *) gdisp_ptr;
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* First, transform the coordinates to gimp image space */
|
1999-07-24 23:37:03 +08:00
|
|
|
gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y,
|
|
|
|
FALSE, FALSE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
color_picker_info_update
|
|
|
|
(tool, pick_color_do (gdisp->gimage, tool->drawable, x, y,
|
|
|
|
color_picker_options->sample_merged,
|
|
|
|
color_picker_options->sample_average,
|
|
|
|
color_picker_options->average_radius,
|
|
|
|
color_picker_options->update_active,
|
|
|
|
update_type));
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
draw_core_stop (cp_tool->core, tool);
|
|
|
|
tool->state = INACTIVE;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
color_picker_motion (Tool *tool,
|
|
|
|
GdkEventMotion *mevent,
|
|
|
|
gpointer gdisp_ptr)
|
|
|
|
{
|
|
|
|
GDisplay *gdisp;
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool *cp_tool;
|
1999-08-24 10:52:40 +08:00
|
|
|
gint x, y;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gdisp = (GDisplay *) gdisp_ptr;
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
/* undraw the current tool */
|
|
|
|
draw_core_pause (cp_tool->core, tool);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* First, transform the coordinates to gimp image space */
|
1999-07-24 23:37:03 +08:00
|
|
|
gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y,
|
|
|
|
FALSE, FALSE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
gdisplay_untransform_coords (gdisp, mevent->x, mevent->y,
|
|
|
|
&cp_tool->centerx, &cp_tool->centery,
|
|
|
|
FALSE, TRUE);
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
color_picker_info_update
|
|
|
|
(tool, pick_color_do (gdisp->gimage, tool->drawable, x, y,
|
|
|
|
color_picker_options->sample_merged,
|
|
|
|
color_picker_options->sample_average,
|
|
|
|
color_picker_options->average_radius,
|
|
|
|
color_picker_options->update_active,
|
|
|
|
update_type));
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
/* redraw the current tool */
|
|
|
|
draw_core_resume (cp_tool->core, tool);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
color_picker_cursor_update (Tool *tool,
|
|
|
|
GdkEventMotion *mevent,
|
|
|
|
gpointer gdisp_ptr)
|
|
|
|
{
|
|
|
|
GDisplay *gdisp;
|
1999-08-24 10:52:40 +08:00
|
|
|
gint x, y;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gdisp = (GDisplay *) gdisp_ptr;
|
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y,
|
|
|
|
FALSE, FALSE);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (gimage_pick_correlate_layer (gdisp->gimage, x, y))
|
1999-05-13 19:12:32 +08:00
|
|
|
gdisplay_install_tool_cursor (gdisp, GIMP_COLOR_PICKER_CURSOR);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
|
|
|
gdisplay_install_tool_cursor (gdisp, GDK_TOP_LEFT_ARROW);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-06-22 06:12:07 +08:00
|
|
|
color_picker_control (Tool *tool,
|
|
|
|
ToolAction action,
|
|
|
|
gpointer gdisp_ptr)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool * cp_tool;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case PAUSE :
|
|
|
|
draw_core_pause (cp_tool->core, tool);
|
|
|
|
break;
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-04-16 04:52:36 +08:00
|
|
|
case RESUME :
|
|
|
|
draw_core_resume (cp_tool->core, tool);
|
|
|
|
break;
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-04-16 04:52:36 +08:00
|
|
|
case HALT :
|
|
|
|
draw_core_stop (cp_tool->core, tool);
|
1999-08-24 10:52:40 +08:00
|
|
|
info_dialog_popdown (color_picker_info);
|
1999-04-16 04:52:36 +08:00
|
|
|
break;
|
1999-06-22 06:12:07 +08:00
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
1999-04-16 04:52:36 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-04-11 14:35:28 +08:00
|
|
|
typedef guchar * (*GetColorFunc) (GtkObject *, int, int);
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
static gboolean
|
|
|
|
pick_color_do (GimpImage *gimage,
|
|
|
|
GimpDrawable *drawable,
|
|
|
|
gint x,
|
|
|
|
gint y,
|
|
|
|
gboolean sample_merged,
|
|
|
|
gboolean sample_average,
|
|
|
|
gdouble average_radius,
|
|
|
|
gboolean update_active,
|
|
|
|
gint final)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-04-11 14:35:28 +08:00
|
|
|
guchar *color;
|
1999-07-24 23:37:03 +08:00
|
|
|
gint offx, offy;
|
|
|
|
gint has_alpha;
|
|
|
|
gint is_indexed;
|
1999-04-11 14:35:28 +08:00
|
|
|
GetColorFunc get_color_func;
|
|
|
|
GtkObject *get_color_obj;
|
|
|
|
|
1998-01-22 15:02:57 +08:00
|
|
|
if (!drawable && !sample_merged)
|
|
|
|
return FALSE;
|
|
|
|
|
1999-04-11 14:35:28 +08:00
|
|
|
if (!sample_merged)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1998-01-22 15:02:57 +08:00
|
|
|
drawable_offsets (drawable, &offx, &offy);
|
1997-11-25 06:05:25 +08:00
|
|
|
x -= offx;
|
|
|
|
y -= offy;
|
1999-04-11 14:35:28 +08:00
|
|
|
|
|
|
|
sample_type = gimp_drawable_type (drawable);
|
1999-02-16 16:53:54 +08:00
|
|
|
is_indexed = gimp_drawable_indexed (drawable);
|
1999-04-11 14:35:28 +08:00
|
|
|
|
|
|
|
get_color_func = (GetColorFunc) gimp_drawable_get_color_at;
|
|
|
|
get_color_obj = GTK_OBJECT (drawable);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-04-11 14:35:28 +08:00
|
|
|
sample_type = gimp_image_composite_type (gimage);
|
1999-02-16 16:53:54 +08:00
|
|
|
is_indexed = FALSE;
|
1999-04-11 14:35:28 +08:00
|
|
|
|
|
|
|
get_color_func = (GetColorFunc) gimp_image_get_color_at;
|
|
|
|
get_color_obj = GTK_OBJECT (gimage);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-04-11 14:35:28 +08:00
|
|
|
has_alpha = TYPE_HAS_ALPHA (sample_type);
|
|
|
|
|
|
|
|
if (!(color = (*get_color_func) (get_color_obj, x, y)))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if (sample_average)
|
|
|
|
{
|
1999-07-24 23:37:03 +08:00
|
|
|
gint i, j;
|
|
|
|
gint count = 0;
|
|
|
|
gint color_avg[4] = { 0, 0, 0, 0 };
|
1999-04-11 14:35:28 +08:00
|
|
|
guchar *tmp_color;
|
1999-07-24 23:37:03 +08:00
|
|
|
gint radius = (gint) average_radius;
|
1999-04-11 14:35:28 +08:00
|
|
|
|
|
|
|
for (i = x - radius; i <= x + radius; i++)
|
|
|
|
for (j = y - radius; j <= y + radius; j++)
|
|
|
|
if ((tmp_color = (*get_color_func) (get_color_obj, i, j)))
|
|
|
|
{
|
|
|
|
count++;
|
|
|
|
|
|
|
|
color_avg[RED_PIX] += tmp_color[RED_PIX];
|
|
|
|
color_avg[GREEN_PIX] += tmp_color[GREEN_PIX];
|
|
|
|
color_avg[BLUE_PIX] += tmp_color[BLUE_PIX];
|
|
|
|
if (has_alpha)
|
|
|
|
color_avg[ALPHA_PIX] += tmp_color[3];
|
|
|
|
|
|
|
|
g_free(tmp_color);
|
|
|
|
}
|
|
|
|
|
|
|
|
color[RED_PIX] = (guchar) (color_avg[RED_PIX] / count);
|
|
|
|
color[GREEN_PIX] = (guchar) (color_avg[GREEN_PIX] / count);
|
|
|
|
color[BLUE_PIX] = (guchar) (color_avg[BLUE_PIX] / count);
|
|
|
|
if (has_alpha)
|
|
|
|
color[ALPHA_PIX] = (guchar) (color_avg[3] / count);
|
|
|
|
|
|
|
|
is_indexed = FALSE;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-02-16 16:53:54 +08:00
|
|
|
col_value[RED_PIX] = color[RED_PIX];
|
|
|
|
col_value[GREEN_PIX] = color[GREEN_PIX];
|
|
|
|
col_value[BLUE_PIX] = color[BLUE_PIX];
|
1997-11-25 06:05:25 +08:00
|
|
|
if (has_alpha)
|
1999-04-11 14:35:28 +08:00
|
|
|
col_value[ALPHA_PIX] = color[3];
|
1999-02-16 16:53:54 +08:00
|
|
|
if (is_indexed)
|
1999-04-11 14:35:28 +08:00
|
|
|
col_value[4] = color[4];
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
if (update_active)
|
|
|
|
palette_set_active_color (col_value [RED_PIX], col_value [GREEN_PIX],
|
|
|
|
col_value [BLUE_PIX], final);
|
1999-07-24 23:37:03 +08:00
|
|
|
g_free (color);
|
1997-11-25 06:05:25 +08:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
1999-08-24 10:52:40 +08:00
|
|
|
gboolean
|
|
|
|
pick_color (GimpImage *gimage,
|
|
|
|
GimpDrawable *drawable,
|
|
|
|
gint x,
|
|
|
|
gint y,
|
|
|
|
gboolean sample_merged,
|
|
|
|
gboolean sample_average,
|
|
|
|
gdouble average_radius,
|
|
|
|
gint final)
|
|
|
|
{
|
|
|
|
return pick_color_do (gimage, drawable,
|
|
|
|
x, y,
|
|
|
|
sample_merged,
|
|
|
|
sample_average,
|
|
|
|
average_radius,
|
|
|
|
TRUE,
|
|
|
|
final);
|
|
|
|
}
|
|
|
|
|
1999-04-16 04:52:36 +08:00
|
|
|
static void
|
1999-07-24 23:37:03 +08:00
|
|
|
colorpicker_draw (Tool *tool)
|
1999-04-16 04:52:36 +08:00
|
|
|
{
|
|
|
|
GDisplay * gdisp;
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool * cp_tool;
|
|
|
|
gint tx, ty;
|
|
|
|
gint radiusx, radiusy;
|
|
|
|
gint cx, cy;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
if(!color_picker_options->sample_average)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gdisp = (GDisplay *) tool->gdisp_ptr;
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
gdisplay_transform_coords (gdisp, cp_tool->centerx, cp_tool->centery,
|
1999-07-24 23:37:03 +08:00
|
|
|
&tx, &ty, TRUE);
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
radiusx = SCALEX (gdisp, color_picker_options->average_radius);
|
|
|
|
radiusy = SCALEY (gdisp, color_picker_options->average_radius);
|
|
|
|
cx = SCALEX (gdisp, 1);
|
|
|
|
cy = SCALEY (gdisp, 1);
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
/* Draw the circle around the collecting area */
|
1999-07-24 23:37:03 +08:00
|
|
|
gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0,
|
|
|
|
tx - radiusx,
|
|
|
|
ty - radiusy,
|
|
|
|
2 * radiusx + cx, 2 * radiusy + cy);
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
if(radiusx > 1 && radiusy > 1)
|
|
|
|
{
|
1999-07-24 23:37:03 +08:00
|
|
|
gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0,
|
|
|
|
tx - radiusx + 2,
|
|
|
|
ty - radiusy + 2,
|
|
|
|
2 * radiusx + cx - 4, 2 * radiusy + cy - 4);
|
1999-04-16 04:52:36 +08:00
|
|
|
}
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
static void
|
1999-07-24 23:37:03 +08:00
|
|
|
color_picker_info_update (Tool *tool,
|
|
|
|
gboolean valid)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
if (!valid)
|
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
if (GTK_WIDGET_IS_SENSITIVE (color_panel->color_panel_widget))
|
|
|
|
gtk_widget_set_sensitive (color_panel->color_panel_widget, FALSE);
|
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (red_buf, MAX_INFO_BUF, _("N/A"));
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (green_buf, MAX_INFO_BUF, _("N/A"));
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (blue_buf, MAX_INFO_BUF, _("N/A"));
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A"));
|
|
|
|
g_snprintf (index_buf, MAX_INFO_BUF, _("N/A"));
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (gray_buf, MAX_INFO_BUF, _("N/A"));
|
|
|
|
g_snprintf (hex_buf, MAX_INFO_BUF, _("N/A"));
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-08-24 10:52:40 +08:00
|
|
|
guchar col[3];
|
|
|
|
|
|
|
|
if (! GTK_WIDGET_IS_SENSITIVE (color_panel->color_panel_widget))
|
|
|
|
gtk_widget_set_sensitive (color_panel->color_panel_widget, TRUE);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
switch (sample_type)
|
|
|
|
{
|
|
|
|
case RGB_GIMAGE: case RGBA_GIMAGE:
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]);
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]);
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]);
|
1997-11-25 06:05:25 +08:00
|
|
|
if (sample_type == RGBA_GIMAGE)
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A"));
|
|
|
|
g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x",
|
|
|
|
col_value [RED_PIX],
|
|
|
|
col_value [GREEN_PIX],
|
|
|
|
col_value [BLUE_PIX]);
|
1999-08-24 10:52:40 +08:00
|
|
|
col[0] = col_value [RED_PIX];
|
|
|
|
col[1] = col_value [GREEN_PIX];
|
|
|
|
col[2] = col_value [BLUE_PIX];
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case INDEXED_GIMAGE: case INDEXEDA_GIMAGE:
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (index_buf, MAX_INFO_BUF, "%d", col_value [4]);
|
1997-11-25 06:05:25 +08:00
|
|
|
if (sample_type == INDEXEDA_GIMAGE)
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A"));
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]);
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]);
|
1999-07-24 23:37:03 +08:00
|
|
|
g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]);
|
|
|
|
g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x",
|
1998-12-26 02:22:01 +08:00
|
|
|
col_value [RED_PIX],
|
|
|
|
col_value [GREEN_PIX],
|
|
|
|
col_value [BLUE_PIX]);
|
1999-08-24 10:52:40 +08:00
|
|
|
col[0] = col_value [RED_PIX];
|
|
|
|
col[1] = col_value [GREEN_PIX];
|
|
|
|
col[2] = col_value [BLUE_PIX];
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GRAY_GIMAGE: case GRAYA_GIMAGE:
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (gray_buf, MAX_INFO_BUF, "%d", col_value [GRAY_PIX]);
|
1997-11-25 06:05:25 +08:00
|
|
|
if (sample_type == GRAYA_GIMAGE)
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
1998-12-26 02:22:01 +08:00
|
|
|
g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A"));
|
|
|
|
g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x",
|
|
|
|
col_value [GRAY_PIX],
|
|
|
|
col_value [GRAY_PIX],
|
|
|
|
col_value [GRAY_PIX]);
|
1999-08-24 10:52:40 +08:00
|
|
|
col[0] = col_value [GRAY_PIX];
|
|
|
|
col[1] = col_value [GRAY_PIX];
|
|
|
|
col[2] = col_value [GRAY_PIX];
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
}
|
1999-08-24 10:52:40 +08:00
|
|
|
|
|
|
|
color_panel_set_color (color_panel, col);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
info_dialog_update (color_picker_info);
|
|
|
|
info_dialog_popup (color_picker_info);
|
|
|
|
}
|
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
static void
|
|
|
|
color_picker_info_window_close_callback (GtkWidget *widget,
|
|
|
|
gpointer client_data)
|
|
|
|
{
|
|
|
|
info_dialog_popdown ((InfoDialog *) client_data);
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
Tool *
|
|
|
|
tools_new_color_picker ()
|
|
|
|
{
|
|
|
|
Tool * tool;
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool * private;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-13 01:55:06 +08:00
|
|
|
/* The tool options */
|
1997-11-25 06:05:25 +08:00
|
|
|
if (! color_picker_options)
|
1999-04-13 01:55:06 +08:00
|
|
|
{
|
|
|
|
color_picker_options = color_picker_options_new ();
|
|
|
|
tools_register (COLOR_PICKER, (ToolOptions *) color_picker_options);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-07-03 01:40:10 +08:00
|
|
|
tool = tools_new_tool (COLOR_PICKER);
|
1999-07-24 23:37:03 +08:00
|
|
|
private = g_new (ColorPickerTool, 1);
|
|
|
|
|
|
|
|
private->core = draw_core_new (colorpicker_draw);
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
tool->preserve = FALSE; /* Don't preserve on drawable change */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-06-26 19:16:47 +08:00
|
|
|
tool->private = (void *) private;
|
|
|
|
|
1999-07-03 01:40:10 +08:00
|
|
|
tool->button_press_func = color_picker_button_press;
|
1997-11-25 06:05:25 +08:00
|
|
|
tool->button_release_func = color_picker_button_release;
|
1999-07-03 01:40:10 +08:00
|
|
|
tool->motion_func = color_picker_motion;
|
|
|
|
tool->cursor_update_func = color_picker_cursor_update;
|
|
|
|
tool->control_func = color_picker_control;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
return tool;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
tools_free_color_picker (Tool *tool)
|
|
|
|
{
|
1999-07-24 23:37:03 +08:00
|
|
|
ColorPickerTool * cp_tool;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-07-24 23:37:03 +08:00
|
|
|
cp_tool = (ColorPickerTool *) tool->private;
|
1999-04-16 04:52:36 +08:00
|
|
|
|
|
|
|
if (tool->state == ACTIVE)
|
|
|
|
draw_core_stop (cp_tool->core, tool);
|
|
|
|
|
|
|
|
draw_core_free (cp_tool->core);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (color_picker_info)
|
|
|
|
{
|
|
|
|
info_dialog_free (color_picker_info);
|
|
|
|
color_picker_info = NULL;
|
1999-08-24 10:55:59 +08:00
|
|
|
|
|
|
|
color_panel_free (color_panel);
|
1999-08-24 10:52:40 +08:00
|
|
|
color_panel = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
1999-04-16 04:52:36 +08:00
|
|
|
|
1999-06-22 06:12:07 +08:00
|
|
|
g_free (cp_tool);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|