mirror of https://github.com/GNOME/gimp.git
export bucket_fill_region().
1999-08-23 Michael Natterer <mitschel@cs.tu-berlin.de> * app/bucket_fill.[ch]: export bucket_fill_region(). * app/channels_dialog.c: enabled dropping a color to a channel. * app/color_area.c * app/color_panel.c * app/gimpdnd.[ch]: the whole color dnd is now done in a generic function in gimpdnd.c (dnd of other types is still hacked in at various places but will go to generic functions and callbacks as well). * app/disp_callbacks.[ch] * app/interface.c: drop a color to the display to bucket fill the selected region.
This commit is contained in:
parent
5f2d497b40
commit
ef4cb06bb7
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
||||||
|
1999-08-23 Michael Natterer <mitschel@cs.tu-berlin.de>
|
||||||
|
|
||||||
|
* app/bucket_fill.[ch]: export bucket_fill_region().
|
||||||
|
|
||||||
|
* app/channels_dialog.c: enabled dropping a color to a channel.
|
||||||
|
|
||||||
|
* app/color_area.c
|
||||||
|
* app/color_panel.c
|
||||||
|
* app/gimpdnd.[ch]: the whole color dnd is now done in a generic
|
||||||
|
function in gimpdnd.c (dnd of other types is still hacked in at
|
||||||
|
various places but will go to generic functions and callbacks as
|
||||||
|
well).
|
||||||
|
|
||||||
|
* app/disp_callbacks.[ch]
|
||||||
|
* app/interface.c: drop a color to the display to bucket fill the
|
||||||
|
selected region.
|
||||||
|
|
||||||
Mon Aug 23 02:19:12 1999 Jay Cox (jaycox@earthlink.net)
|
Mon Aug 23 02:19:12 1999 Jay Cox (jaycox@earthlink.net)
|
||||||
|
|
||||||
* app/paint_funcs.c: fixed a couple of bugs in the scale_region code.
|
* app/paint_funcs.c: fixed a couple of bugs in the scale_region code.
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
typedef struct _BucketTool BucketTool;
|
typedef struct _BucketTool BucketTool;
|
||||||
struct _BucketTool
|
struct _BucketTool
|
||||||
{
|
{
|
||||||
int target_x; /* starting x coord */
|
gint target_x; /* starting x coord */
|
||||||
int target_y; /* starting y coord */
|
gint target_y; /* starting y coord */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _BucketOptions BucketOptions;
|
typedef struct _BucketOptions BucketOptions;
|
||||||
|
@ -51,12 +51,12 @@ struct _BucketOptions
|
||||||
{
|
{
|
||||||
PaintOptions paint_options;
|
PaintOptions paint_options;
|
||||||
|
|
||||||
double threshold;
|
gdouble threshold;
|
||||||
double threshold_d;
|
gdouble threshold_d;
|
||||||
GtkObject *threshold_w;
|
GtkObject *threshold_w;
|
||||||
|
|
||||||
int sample_merged;
|
gboolean sample_merged;
|
||||||
int sample_merged_d;
|
gboolean sample_merged_d;
|
||||||
GtkWidget *sample_merged_w;
|
GtkWidget *sample_merged_w;
|
||||||
|
|
||||||
BucketFillMode fill_mode;
|
BucketFillMode fill_mode;
|
||||||
|
@ -75,13 +75,10 @@ static void bucket_fill_button_press (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
||||||
|
|
||||||
static void bucket_fill_region (BucketFillMode, PixelRegion *,
|
static void bucket_fill_line_color (guchar *, guchar *, guchar *,
|
||||||
PixelRegion *, unsigned char *,
|
gboolean, gint, gint);
|
||||||
TempBuf *, int, int, int);
|
static void bucket_fill_line_pattern (guchar *, guchar *, TempBuf *,
|
||||||
static void bucket_fill_line_color (unsigned char *, unsigned char *,
|
gboolean, gint, gint, gint, gint);
|
||||||
unsigned char *, int, int, int);
|
|
||||||
static void bucket_fill_line_pattern (unsigned char *, unsigned char *,
|
|
||||||
TempBuf *, int, int, int, int, int);
|
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
|
@ -163,10 +160,10 @@ bucket_options_new (void)
|
||||||
/* fill type */
|
/* fill type */
|
||||||
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
||||||
&options->fill_mode,
|
&options->fill_mode,
|
||||||
options->fill_mode_w,
|
options->fill_mode_w,
|
||||||
fill_mode_label,
|
fill_mode_label,
|
||||||
fill_mode_value,
|
fill_mode_value,
|
||||||
3);
|
3);
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||||
gtk_widget_show (frame);
|
gtk_widget_show (frame);
|
||||||
|
@ -183,7 +180,7 @@ bucket_fill_button_press (Tool *tool,
|
||||||
{
|
{
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
int use_offsets;
|
gboolean use_offsets;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -196,7 +193,9 @@ bucket_fill_button_press (Tool *tool,
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
||||||
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
GDK_POINTER_MOTION_HINT_MASK |
|
||||||
|
GDK_BUTTON1_MOTION_MASK |
|
||||||
|
GDK_BUTTON_RELEASE_MASK,
|
||||||
NULL, NULL, bevent->time);
|
NULL, NULL, bevent->time);
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
|
@ -212,7 +211,7 @@ bucket_fill_button_release (Tool *tool,
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
Argument *return_vals;
|
Argument *return_vals;
|
||||||
int nreturn_vals;
|
gint nreturn_vals;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -255,8 +254,8 @@ bucket_fill_cursor_update (Tool *tool,
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
Layer *layer;
|
Layer *layer;
|
||||||
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
||||||
int x, y;
|
gint x, y;
|
||||||
int off_x, off_y;
|
gint off_x, off_y;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
|
|
||||||
|
@ -311,23 +310,24 @@ void
|
||||||
bucket_fill (GimpImage *gimage,
|
bucket_fill (GimpImage *gimage,
|
||||||
GimpDrawable *drawable,
|
GimpDrawable *drawable,
|
||||||
BucketFillMode fill_mode,
|
BucketFillMode fill_mode,
|
||||||
int paint_mode,
|
gint paint_mode,
|
||||||
double opacity,
|
gdouble opacity,
|
||||||
double threshold,
|
gdouble threshold,
|
||||||
int sample_merged,
|
gboolean sample_merged,
|
||||||
double x,
|
gdouble x,
|
||||||
double y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
TileManager *buf_tiles;
|
TileManager *buf_tiles;
|
||||||
PixelRegion bufPR, maskPR;
|
PixelRegion bufPR, maskPR;
|
||||||
Channel * mask = NULL;
|
Channel *mask = NULL;
|
||||||
int bytes, has_alpha;
|
gint bytes;
|
||||||
int x1, y1, x2, y2;
|
gboolean has_alpha;
|
||||||
unsigned char col [MAX_CHANNELS];
|
gint x1, y1, x2, y2;
|
||||||
unsigned char *d1, *d2;
|
guchar col [MAX_CHANNELS];
|
||||||
GPatternP pattern;
|
guchar *d1, *d2;
|
||||||
TempBuf * pat_buf;
|
GPatternP pattern;
|
||||||
int new_buf = 0;
|
TempBuf *pat_buf;
|
||||||
|
gboolean new_buf = FALSE;
|
||||||
|
|
||||||
pat_buf = NULL;
|
pat_buf = NULL;
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
d2 += pat_buf->bytes;
|
d2 += pat_buf->bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buf = 1;
|
new_buf = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pat_buf = pattern->mask;
|
pat_buf = pattern->mask;
|
||||||
|
@ -423,7 +423,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
if (! has_alpha)
|
if (! has_alpha)
|
||||||
{
|
{
|
||||||
bytes ++;
|
bytes ++;
|
||||||
has_alpha = 1;
|
has_alpha = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,16 +455,15 @@ bucket_fill (GimpImage *gimage,
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_color (unsigned char *buf,
|
bucket_fill_line_color (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
|
|
||||||
alpha = (has_alpha) ? bytes - 1 : bytes;
|
alpha = (has_alpha) ? bytes - 1 : bytes;
|
||||||
while (width--)
|
while (width--)
|
||||||
|
@ -484,20 +483,19 @@ bucket_fill_line_color (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_pattern (unsigned char *buf,
|
bucket_fill_line_pattern (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int x,
|
gint x,
|
||||||
int y,
|
gint y,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
unsigned char *pat, *p;
|
guchar *pat, *p;
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
int i;
|
gint i;
|
||||||
|
|
||||||
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
||||||
pat = temp_buf_data (pattern) +
|
pat = temp_buf_data (pattern) +
|
||||||
|
@ -523,22 +521,23 @@ bucket_fill_line_pattern (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
static void
|
|
||||||
bucket_fill_region (BucketFillMode fill_mode,
|
bucket_fill_region (BucketFillMode fill_mode,
|
||||||
PixelRegion *bufPR,
|
PixelRegion *bufPR,
|
||||||
PixelRegion *maskPR,
|
PixelRegion *maskPR,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int off_x,
|
gint off_x,
|
||||||
int off_y,
|
gint off_y,
|
||||||
int has_alpha)
|
gboolean has_alpha)
|
||||||
{
|
{
|
||||||
unsigned char *s, *m;
|
guchar *s, *m;
|
||||||
int y;
|
gint y;
|
||||||
void *pr;
|
void *pr;
|
||||||
|
|
||||||
for (pr = pixel_regions_register (2, bufPR, maskPR); pr != NULL; pr = pixel_regions_process (pr))
|
for (pr = pixel_regions_register (2, bufPR, maskPR);
|
||||||
|
pr != NULL;
|
||||||
|
pr = pixel_regions_process (pr))
|
||||||
{
|
{
|
||||||
s = bufPR->data;
|
s = bufPR->data;
|
||||||
if (maskPR)
|
if (maskPR)
|
||||||
|
|
|
@ -29,10 +29,26 @@ typedef enum
|
||||||
PATTERN_BUCKET_FILL
|
PATTERN_BUCKET_FILL
|
||||||
} BucketFillMode;
|
} BucketFillMode;
|
||||||
|
|
||||||
void bucket_fill (GimpImage *, GimpDrawable *, BucketFillMode, int,
|
void bucket_fill (GimpImage *gimage,
|
||||||
double, double, int, double, double);
|
GimpDrawable *drawable,
|
||||||
|
BucketFillMode fill_mode,
|
||||||
|
gint paint_mode,
|
||||||
|
gdouble opacity,
|
||||||
|
gdouble threshold,
|
||||||
|
gboolean sample_merged,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y);
|
||||||
|
|
||||||
|
void bucket_fill_region (BucketFillMode fill_mode,
|
||||||
|
PixelRegion *bufPR,
|
||||||
|
PixelRegion *maskPR,
|
||||||
|
guchar *col,
|
||||||
|
TempBuf *pattern,
|
||||||
|
gint off_x,
|
||||||
|
gint off_y,
|
||||||
|
gboolean has_alpha);
|
||||||
|
|
||||||
Tool * tools_new_bucket_fill (void);
|
Tool * tools_new_bucket_fill (void);
|
||||||
void tools_free_bucket_fill (Tool *);
|
void tools_free_bucket_fill (Tool *tool);
|
||||||
|
|
||||||
#endif /* __BUCKET_FILL_H__ */
|
#endif /* __BUCKET_FILL_H__ */
|
||||||
|
|
|
@ -156,6 +156,8 @@ static void channel_widget_drag_leave_callback (GtkWidget *,
|
||||||
guint);
|
guint);
|
||||||
static void channel_widget_drag_indicator_callback (GtkWidget *, gpointer);
|
static void channel_widget_drag_indicator_callback (GtkWidget *, gpointer);
|
||||||
|
|
||||||
|
static void channel_widget_set_color (gpointer,
|
||||||
|
guchar, guchar, guchar);
|
||||||
static void channel_widget_draw_drop_indicator (ChannelWidget *, GimpDropType);
|
static void channel_widget_draw_drop_indicator (ChannelWidget *, GimpDropType);
|
||||||
static void channel_widget_delete (ChannelWidget *);
|
static void channel_widget_delete (ChannelWidget *);
|
||||||
static void channel_widget_select_update (GtkWidget *, gpointer);
|
static void channel_widget_select_update (GtkWidget *, gpointer);
|
||||||
|
@ -214,6 +216,14 @@ static OpsButton channels_ops_buttons[] =
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd structures */
|
||||||
|
|
||||||
|
static GtkTargetEntry channel_color_target_table[] =
|
||||||
|
{
|
||||||
|
GIMP_TARGET_CHANNEL,
|
||||||
|
GIMP_TARGET_COLOR
|
||||||
|
};
|
||||||
|
static guint n_channel_color_targets = (sizeof (channel_color_target_table) /
|
||||||
|
sizeof (channel_color_target_table[0]));
|
||||||
|
|
||||||
static GtkTargetEntry channel_target_table[] =
|
static GtkTargetEntry channel_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_CHANNEL
|
GIMP_TARGET_CHANNEL
|
||||||
|
@ -829,10 +839,10 @@ static gint
|
||||||
channel_list_events (GtkWidget *widget,
|
channel_list_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
|
ChannelWidget *channel_widget;
|
||||||
GdkEventKey *kevent;
|
GdkEventKey *kevent;
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
GtkWidget *event_widget;
|
GtkWidget *event_widget;
|
||||||
ChannelWidget *channel_widget;
|
|
||||||
|
|
||||||
event_widget = gtk_get_event_widget (event);
|
event_widget = gtk_get_event_widget (event);
|
||||||
|
|
||||||
|
@ -843,9 +853,13 @@ channel_list_events (GtkWidget *widget,
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
|
case GDK_2BUTTON_PRESS:
|
||||||
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
|
channels_dialog_edit_channel_query (channel_widget);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
bevent = (GdkEventButton *) event;
|
bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
if (bevent->button == 3 || bevent->button == 2)
|
if (bevent->button == 3 || bevent->button == 2)
|
||||||
{
|
{
|
||||||
gtk_menu_popup (GTK_MENU (channelsD->ops_menu),
|
gtk_menu_popup (GTK_MENU (channelsD->ops_menu),
|
||||||
|
@ -855,11 +869,6 @@ channel_list_events (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_2BUTTON_PRESS:
|
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
|
||||||
channels_dialog_edit_channel_query (channel_widget);
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case GDK_KEY_PRESS:
|
case GDK_KEY_PRESS:
|
||||||
kevent = (GdkEventKey *) event;
|
kevent = (GdkEventKey *) event;
|
||||||
switch (kevent->keyval)
|
switch (kevent->keyval)
|
||||||
|
@ -1283,7 +1292,7 @@ channel_widget_create (GImage *gimage,
|
||||||
channel_widget->channel_pixmap = NULL;
|
channel_widget->channel_pixmap = NULL;
|
||||||
channel_widget->type = type;
|
channel_widget->type = type;
|
||||||
channel_widget->ID = ((type == AUXILLARY_CHANNEL) ?
|
channel_widget->ID = ((type == AUXILLARY_CHANNEL) ?
|
||||||
GIMP_DRAWABLE(channel)->ID :
|
GIMP_DRAWABLE (channel)->ID :
|
||||||
(COMPONENT_BASE_ID + type));
|
(COMPONENT_BASE_ID + type));
|
||||||
channel_widget->list_item = list_item;
|
channel_widget->list_item = list_item;
|
||||||
channel_widget->width = -1;
|
channel_widget->width = -1;
|
||||||
|
@ -1375,8 +1384,11 @@ channel_widget_create (GImage *gimage,
|
||||||
/* dnd destination */
|
/* dnd destination */
|
||||||
gtk_drag_dest_set (list_item,
|
gtk_drag_dest_set (list_item,
|
||||||
GTK_DEST_DEFAULT_ALL,
|
GTK_DEST_DEFAULT_ALL,
|
||||||
channel_target_table, n_channel_targets,
|
channel_color_target_table, n_channel_color_targets,
|
||||||
GDK_ACTION_MOVE);
|
GDK_ACTION_MOVE | GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (list_item,
|
||||||
|
channel_widget_set_color,
|
||||||
|
(gpointer) channel_widget);
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave",
|
gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave",
|
||||||
GTK_SIGNAL_FUNC (channel_widget_drag_leave_callback),
|
GTK_SIGNAL_FUNC (channel_widget_drag_leave_callback),
|
||||||
|
@ -1489,6 +1501,13 @@ channel_widget_drag_motion_callback (GtkWidget *widget,
|
||||||
drop_type = GIMP_DROP_NONE;
|
drop_type = GIMP_DROP_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (gtk_object_get_data (GTK_OBJECT (src_widget),
|
||||||
|
"gimp_dnd_get_color_func"))
|
||||||
|
{
|
||||||
|
drag_action = GDK_ACTION_COPY;
|
||||||
|
return_val = TRUE;
|
||||||
|
drop_type = GIMP_DROP_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdk_drag_status (context, drag_action, time);
|
gdk_drag_status (context, drag_action, time);
|
||||||
|
@ -1610,6 +1629,30 @@ channel_widget_drag_indicator_callback (GtkWidget *widget,
|
||||||
channel_widget_draw_drop_indicator (channel_widget, channel_widget->drop_type);
|
channel_widget_draw_drop_indicator (channel_widget, channel_widget->drop_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
channel_widget_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b)
|
||||||
|
{
|
||||||
|
ChannelWidget *channel_widget = (ChannelWidget *) data;
|
||||||
|
Channel *channel = channel_widget->channel;
|
||||||
|
|
||||||
|
if (r != channel->col[0] ||
|
||||||
|
g != channel->col[1] ||
|
||||||
|
b != channel->col[2])
|
||||||
|
{
|
||||||
|
channel->col[0] = r;
|
||||||
|
channel->col[1] = g;
|
||||||
|
channel->col[2] = b;
|
||||||
|
|
||||||
|
drawable_update (GIMP_DRAWABLE (channel), 0, 0,
|
||||||
|
GIMP_DRAWABLE (channel)->width,
|
||||||
|
GIMP_DRAWABLE (channel)->height);
|
||||||
|
gdisplays_flush ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
channel_widget_draw_drop_indicator (ChannelWidget *channel_widget,
|
channel_widget_draw_drop_indicator (ChannelWidget *channel_widget,
|
||||||
GimpDropType drop_type)
|
GimpDropType drop_type)
|
||||||
|
@ -1696,16 +1739,17 @@ static gint
|
||||||
channel_widget_button_events (GtkWidget *widget,
|
channel_widget_button_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
static int button_down = 0;
|
ChannelWidget *channel_widget;
|
||||||
static GtkWidget *click_widget = NULL;
|
GtkWidget *event_widget;
|
||||||
static int old_state;
|
|
||||||
static int exclusive;
|
|
||||||
ChannelWidget *channel_widget;
|
|
||||||
GtkWidget *event_widget;
|
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
gint return_val;
|
gint return_val;
|
||||||
int visible;
|
gint visible;
|
||||||
int width, height;
|
gint width, height;
|
||||||
|
|
||||||
|
static gboolean button_down = FALSE;
|
||||||
|
static GtkWidget *click_widget = NULL;
|
||||||
|
static gint old_state;
|
||||||
|
static gint exclusive;
|
||||||
|
|
||||||
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
||||||
|
|
||||||
|
@ -1745,7 +1789,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
button_down = 1;
|
button_down = TRUE;
|
||||||
click_widget = widget;
|
click_widget = widget;
|
||||||
gtk_grab_add (click_widget);
|
gtk_grab_add (click_widget);
|
||||||
|
|
||||||
|
@ -1763,7 +1807,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
exclusive = FALSE;
|
exclusive = FALSE;
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
GIMP_DRAWABLE(channel_widget->channel)->visible = !visible;
|
GIMP_DRAWABLE (channel_widget->channel)->visible = !visible;
|
||||||
else
|
else
|
||||||
gimage_set_component_visible (channel_widget->gimage,
|
gimage_set_component_visible (channel_widget->gimage,
|
||||||
channel_widget->type, !visible);
|
channel_widget->type, !visible);
|
||||||
|
@ -1775,7 +1819,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
case GDK_BUTTON_RELEASE:
|
case GDK_BUTTON_RELEASE:
|
||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
|
|
||||||
button_down = 0;
|
button_down = FALSE;
|
||||||
gtk_grab_remove (click_widget);
|
gtk_grab_remove (click_widget);
|
||||||
|
|
||||||
if (widget == channel_widget->eye_widget)
|
if (widget == channel_widget->eye_widget)
|
||||||
|
@ -1808,7 +1852,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
GIMP_DRAWABLE(channel_widget->channel)->visible = !visible;
|
GIMP_DRAWABLE (channel_widget->channel)->visible = !visible;
|
||||||
else
|
else
|
||||||
gimage_set_component_visible (channel_widget->gimage,
|
gimage_set_component_visible (channel_widget->gimage,
|
||||||
channel_widget->type, !visible);
|
channel_widget->type, !visible);
|
||||||
|
@ -1829,10 +1873,10 @@ static gint
|
||||||
channel_widget_preview_events (GtkWidget *widget,
|
channel_widget_preview_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
|
ChannelWidget *channel_widget;
|
||||||
GdkEventExpose *eevent;
|
GdkEventExpose *eevent;
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
ChannelWidget *channel_widget;
|
gboolean valid;
|
||||||
int valid;
|
|
||||||
|
|
||||||
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
||||||
|
|
||||||
|
@ -1858,7 +1902,7 @@ channel_widget_preview_events (GtkWidget *widget,
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
valid = GIMP_DRAWABLE(channel_widget->channel)->preview_valid;
|
valid = GIMP_DRAWABLE (channel_widget->channel)->preview_valid;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
valid = gimage_preview_valid (channel_widget->gimage,
|
valid = gimage_preview_valid (channel_widget->gimage,
|
||||||
|
@ -1902,8 +1946,8 @@ static void
|
||||||
channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
||||||
{
|
{
|
||||||
TempBuf * preview_buf;
|
TempBuf * preview_buf;
|
||||||
int width, height;
|
gint width, height;
|
||||||
int channel;
|
gint channel;
|
||||||
|
|
||||||
/* allocate the channel widget pixmap */
|
/* allocate the channel widget pixmap */
|
||||||
if (! channel_widget->channel_pixmap)
|
if (! channel_widget->channel_pixmap)
|
||||||
|
@ -1917,8 +1961,8 @@ channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
width = GIMP_DRAWABLE(channel_widget->channel)->width;
|
width = GIMP_DRAWABLE (channel_widget->channel)->width;
|
||||||
height = GIMP_DRAWABLE(channel_widget->channel)->height;
|
height = GIMP_DRAWABLE (channel_widget->channel)->height;
|
||||||
channel_widget->width = (int) (channelsD->ratio * width);
|
channel_widget->width = (int) (channelsD->ratio * width);
|
||||||
channel_widget->height = (int) (channelsD->ratio * height);
|
channel_widget->height = (int) (channelsD->ratio * height);
|
||||||
preview_buf = channel_preview (channel_widget->channel,
|
preview_buf = channel_preview (channel_widget->channel,
|
||||||
|
@ -2040,7 +2084,7 @@ channel_widget_eye_redraw (ChannelWidget *channel_widget)
|
||||||
GdkPixmap *pixmap;
|
GdkPixmap *pixmap;
|
||||||
GdkColor *color;
|
GdkColor *color;
|
||||||
GtkStateType state;
|
GtkStateType state;
|
||||||
int visible;
|
gboolean visible;
|
||||||
|
|
||||||
state = channel_widget->list_item->state;
|
state = channel_widget->list_item->state;
|
||||||
|
|
||||||
|
@ -2059,10 +2103,11 @@ channel_widget_eye_redraw (ChannelWidget *channel_widget)
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
visible = GIMP_DRAWABLE(channel_widget->channel)->visible;
|
visible = GIMP_DRAWABLE (channel_widget->channel)->visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
visible = gimage_get_component_visible (channel_widget->gimage, channel_widget->type);
|
visible = gimage_get_component_visible (channel_widget->gimage,
|
||||||
|
channel_widget->type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2112,7 +2157,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
{
|
{
|
||||||
GSList *list;
|
GSList *list;
|
||||||
ChannelWidget *cw;
|
ChannelWidget *cw;
|
||||||
int visible = FALSE;
|
gboolean visible = FALSE;
|
||||||
|
|
||||||
if (!channelsD)
|
if (!channelsD)
|
||||||
return;
|
return;
|
||||||
|
@ -2127,7 +2172,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
visible |= GIMP_DRAWABLE(cw->channel)->visible;
|
visible |= GIMP_DRAWABLE (cw->channel)->visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
visible |= gimage_get_component_visible (cw->gimage, cw->type);
|
visible |= gimage_get_component_visible (cw->gimage, cw->type);
|
||||||
|
@ -2147,7 +2192,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
GIMP_DRAWABLE(cw->channel)->visible = !visible;
|
GIMP_DRAWABLE (cw->channel)->visible = !visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gimage_set_component_visible (cw->gimage, cw->type, !visible);
|
gimage_set_component_visible (cw->gimage, cw->type, !visible);
|
||||||
|
@ -2157,7 +2202,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
GIMP_DRAWABLE(cw->channel)->visible = TRUE;
|
GIMP_DRAWABLE (cw->channel)->visible = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gimage_set_component_visible (cw->gimage, cw->type, TRUE);
|
gimage_set_component_visible (cw->gimage, cw->type, TRUE);
|
||||||
|
@ -2237,7 +2282,7 @@ channel_widget_channel_flush (GtkWidget *widget,
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
update_preview = !GIMP_DRAWABLE(channel_widget->channel)->preview_valid;
|
update_preview = !GIMP_DRAWABLE (channel_widget->channel)->preview_valid;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
update_preview = !gimage_preview_valid (channel_widget->gimage,
|
update_preview = !gimage_preview_valid (channel_widget->gimage,
|
||||||
|
@ -2286,7 +2331,8 @@ new_channel_query_ok_callback (GtkWidget *widget,
|
||||||
if ((gimage = options->gimage))
|
if ((gimage = options->gimage))
|
||||||
{
|
{
|
||||||
new_channel = channel_new (gimage, gimage->width, gimage->height,
|
new_channel = channel_new (gimage, gimage->width, gimage->height,
|
||||||
channel_name, (int) (255 * options->opacity) / 100,
|
channel_name,
|
||||||
|
(gint) (255 * options->opacity) / 100,
|
||||||
options->color_panel->color);
|
options->color_panel->color);
|
||||||
drawable_fill (GIMP_DRAWABLE (new_channel), TRANSPARENT_FILL);
|
drawable_fill (GIMP_DRAWABLE (new_channel), TRANSPARENT_FILL);
|
||||||
|
|
||||||
|
@ -2485,9 +2531,9 @@ edit_channel_query_ok_callback (GtkWidget *widget,
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
drawable_update (GIMP_DRAWABLE(channel), 0, 0,
|
drawable_update (GIMP_DRAWABLE (channel), 0, 0,
|
||||||
GIMP_DRAWABLE(channel)->width,
|
GIMP_DRAWABLE (channel)->width,
|
||||||
GIMP_DRAWABLE(channel)->height);
|
GIMP_DRAWABLE (channel)->height);
|
||||||
gdisplays_flush ();
|
gdisplays_flush ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
212
app/color_area.c
212
app/color_area.c
|
@ -35,25 +35,11 @@ typedef enum
|
||||||
} ColorAreaTarget;
|
} ColorAreaTarget;
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static void color_area_drag_begin (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_set_color (gpointer, guchar, guchar, guchar);
|
||||||
static void color_area_drag_end (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_get_color (gpointer, guchar *, guchar *, guchar *);
|
||||||
static void color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
static void color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
gint active_color = 0;
|
gint active_color = FOREGROUND;
|
||||||
|
|
||||||
/* Static variables */
|
/* Static variables */
|
||||||
static GdkGC *color_area_gc = NULL;
|
static GdkGC *color_area_gc = NULL;
|
||||||
|
@ -67,7 +53,7 @@ static gint edit_color;
|
||||||
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
||||||
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd stuff */
|
||||||
static GtkTargetEntry color_area_target_table[] =
|
static GtkTargetEntry color_area_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_COLOR
|
GIMP_TARGET_COLOR
|
||||||
|
@ -268,16 +254,13 @@ color_area_edit (void)
|
||||||
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
||||||
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
{
|
palette_get_foreground (&r, &g, &b);
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
edit_color = FOREGROUND;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
palette_get_background (&r, &g, &b);
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
edit_color = BACKGROUND;
|
edit_color = active_color;
|
||||||
}
|
|
||||||
|
|
||||||
if (! color_notebook)
|
if (! color_notebook)
|
||||||
{
|
{
|
||||||
|
@ -333,7 +316,36 @@ color_area_events (GtkWidget *widget,
|
||||||
bevent = (GdkEventButton *) event;
|
bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
if (bevent->button == 1)
|
if (bevent->button == 1)
|
||||||
press_target = color_area_target (bevent->x, bevent->y);
|
{
|
||||||
|
target = color_area_target (bevent->x, bevent->y);
|
||||||
|
press_target = INVALID_AREA;
|
||||||
|
|
||||||
|
switch (target)
|
||||||
|
{
|
||||||
|
case FORE_AREA:
|
||||||
|
case BACK_AREA:
|
||||||
|
if (target != active_color)
|
||||||
|
{
|
||||||
|
active_color = target;
|
||||||
|
color_area_draw ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
press_target = target;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SWAP_AREA:
|
||||||
|
palette_swap_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
case DEF_AREA:
|
||||||
|
palette_set_default_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_RELEASE:
|
case GDK_BUTTON_RELEASE:
|
||||||
|
@ -349,23 +361,7 @@ color_area_events (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
case FORE_AREA:
|
case FORE_AREA:
|
||||||
case BACK_AREA:
|
case BACK_AREA:
|
||||||
if (target == active_color)
|
color_area_edit ();
|
||||||
{
|
|
||||||
color_area_edit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
active_color = target;
|
|
||||||
color_area_draw ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SWAP_AREA:
|
|
||||||
palette_swap_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
|
||||||
case DEF_AREA:
|
|
||||||
palette_set_default_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -405,34 +401,19 @@ color_area_create (gint width,
|
||||||
swap_pixmap = swap_pmap;
|
swap_pixmap = swap_pmap;
|
||||||
|
|
||||||
/* dnd stuff */
|
/* dnd stuff */
|
||||||
|
gtk_drag_source_set (color_area,
|
||||||
|
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||||
|
color_area_target_table, n_color_area_targets,
|
||||||
|
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||||
|
gimp_dnd_color_source_set (color_area, color_area_get_color, NULL);
|
||||||
|
|
||||||
gtk_drag_dest_set (color_area,
|
gtk_drag_dest_set (color_area,
|
||||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||||
GTK_DEST_DEFAULT_MOTION |
|
GTK_DEST_DEFAULT_MOTION |
|
||||||
GTK_DEST_DEFAULT_DROP,
|
GTK_DEST_DEFAULT_DROP,
|
||||||
color_area_target_table, n_color_area_targets,
|
color_area_target_table, n_color_area_targets,
|
||||||
GDK_ACTION_COPY);
|
GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (color_area, color_area_set_color, NULL);
|
||||||
gtk_drag_source_set (color_area,
|
|
||||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
|
||||||
color_area_target_table, n_color_area_targets,
|
|
||||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_begin",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_begin),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_end",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_end),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_get",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_handle),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_received",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drop_handle),
|
|
||||||
color_area);
|
|
||||||
|
|
||||||
return color_area;
|
return color_area;
|
||||||
}
|
}
|
||||||
|
@ -444,76 +425,23 @@ color_area_update ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_begin (GtkWidget *widget,
|
color_area_get_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar *r,
|
||||||
gpointer data)
|
guchar *g,
|
||||||
|
guchar *b)
|
||||||
{
|
{
|
||||||
GtkWidget *window;
|
|
||||||
GdkColor bg;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
|
||||||
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
|
||||||
gtk_widget_set_usize (window, 48, 32);
|
|
||||||
gtk_widget_realize (window);
|
|
||||||
gtk_object_set_data_full (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window",
|
|
||||||
window,
|
|
||||||
(GtkDestroyNotify) gtk_widget_destroy);
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
palette_get_foreground (&r, &g, &b);
|
palette_get_foreground (r, g, b);
|
||||||
else
|
else
|
||||||
palette_get_background (&r, &g, &b);
|
palette_get_background (r, g, b);
|
||||||
|
|
||||||
bg.red = 0xff * r;
|
|
||||||
bg.green = 0xff * g;
|
|
||||||
bg.blue = 0xff * b;
|
|
||||||
|
|
||||||
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
|
||||||
gdk_window_set_background (window->window, &bg);
|
|
||||||
|
|
||||||
gtk_drag_set_icon_widget (context, window, -2, -2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_end (GtkWidget *widget,
|
color_area_set_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar r,
|
||||||
gpointer data)
|
guchar g,
|
||||||
|
guchar b)
|
||||||
{
|
{
|
||||||
gtk_object_set_data (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 *vals;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (selection_data->length < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((selection_data->format != 16) ||
|
|
||||||
(selection_data->length != 8))
|
|
||||||
{
|
|
||||||
g_warning ("Received invalid color data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = (guint16 *) selection_data->data;
|
|
||||||
|
|
||||||
r = vals[0] / 0xff;
|
|
||||||
g = vals[1] / 0xff;
|
|
||||||
b = vals[2] / 0xff;
|
|
||||||
|
|
||||||
if (color_notebook_active &&
|
if (color_notebook_active &&
|
||||||
active_color == edit_color)
|
active_color == edit_color)
|
||||||
{
|
{
|
||||||
|
@ -527,29 +455,3 @@ color_area_drop_handle (GtkWidget *widget,
|
||||||
palette_set_background (r, g, b);
|
palette_set_background (r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 vals[4];
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
else
|
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
|
|
||||||
vals[0] = r * 0xff;
|
|
||||||
vals[1] = g * 0xff;
|
|
||||||
vals[2] = b * 0xff;
|
|
||||||
vals[3] = 0xffff;
|
|
||||||
|
|
||||||
gtk_selection_data_set (selection_data,
|
|
||||||
gdk_atom_intern ("application/x-color", FALSE),
|
|
||||||
16, (guchar *) vals, 8);
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,24 +46,10 @@ static gint color_panel_events (GtkWidget *, GdkEvent *);
|
||||||
static void color_panel_select_callback (gint, gint, gint,
|
static void color_panel_select_callback (gint, gint, gint,
|
||||||
ColorNotebookState, void *);
|
ColorNotebookState, void *);
|
||||||
|
|
||||||
static void color_panel_drag_begin (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_panel_get_color (gpointer, guchar *, guchar *, guchar *);
|
||||||
static void color_panel_drag_end (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_panel_set_color (gpointer, guchar, guchar, guchar);
|
||||||
static void color_panel_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
static void color_panel_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd stuff */
|
||||||
static GtkTargetEntry color_panel_target_table[] =
|
static GtkTargetEntry color_panel_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_COLOR
|
GIMP_TARGET_COLOR
|
||||||
|
@ -71,6 +57,8 @@ static GtkTargetEntry color_panel_target_table[] =
|
||||||
static guint n_color_panel_targets = (sizeof (color_panel_target_table) /
|
static guint n_color_panel_targets = (sizeof (color_panel_target_table) /
|
||||||
sizeof (color_panel_target_table[0]));
|
sizeof (color_panel_target_table[0]));
|
||||||
|
|
||||||
|
/* public functions */
|
||||||
|
|
||||||
ColorPanel *
|
ColorPanel *
|
||||||
color_panel_new (guchar *initial,
|
color_panel_new (guchar *initial,
|
||||||
gint width,
|
gint width,
|
||||||
|
@ -111,34 +99,21 @@ color_panel_new (guchar *initial,
|
||||||
gtk_widget_show (private->drawing_area);
|
gtk_widget_show (private->drawing_area);
|
||||||
|
|
||||||
/* dnd stuff */
|
/* dnd stuff */
|
||||||
|
gtk_drag_source_set (private->drawing_area,
|
||||||
|
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||||
|
color_panel_target_table, n_color_panel_targets,
|
||||||
|
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||||
|
gimp_dnd_color_source_set (private->drawing_area,
|
||||||
|
color_panel_get_color, color_panel);
|
||||||
|
|
||||||
gtk_drag_dest_set (private->drawing_area,
|
gtk_drag_dest_set (private->drawing_area,
|
||||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||||
GTK_DEST_DEFAULT_MOTION |
|
GTK_DEST_DEFAULT_MOTION |
|
||||||
GTK_DEST_DEFAULT_DROP,
|
GTK_DEST_DEFAULT_DROP,
|
||||||
color_panel_target_table, n_color_panel_targets,
|
color_panel_target_table, n_color_panel_targets,
|
||||||
GDK_ACTION_COPY);
|
GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (private->drawing_area,
|
||||||
gtk_drag_source_set (private->drawing_area,
|
color_panel_set_color, color_panel);
|
||||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
|
||||||
color_panel_target_table, n_color_panel_targets,
|
|
||||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_begin",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_begin),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_end",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_end),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_data_get",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_handle),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_data_received",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drop_handle),
|
|
||||||
color_panel);
|
|
||||||
|
|
||||||
return color_panel;
|
return color_panel;
|
||||||
}
|
}
|
||||||
|
@ -163,6 +138,8 @@ color_panel_free (ColorPanel *color_panel)
|
||||||
g_free (color_panel);
|
g_free (color_panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* private functions */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_draw (ColorPanel *color_panel)
|
color_panel_draw (ColorPanel *color_panel)
|
||||||
{
|
{
|
||||||
|
@ -289,99 +266,33 @@ color_panel_select_callback (gint r,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_drag_begin (GtkWidget *widget,
|
color_panel_get_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar *r,
|
||||||
gpointer data)
|
guchar *g,
|
||||||
|
guchar *b)
|
||||||
{
|
{
|
||||||
ColorPanel *color_panel = data;
|
ColorPanel *color_panel = data;
|
||||||
GtkWidget *window;
|
|
||||||
GdkColor bg;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
*r = color_panel->color[0];
|
||||||
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
*g = color_panel->color[1];
|
||||||
gtk_widget_set_usize (window, 48, 32);
|
*b = color_panel->color[2];
|
||||||
gtk_widget_realize (window);
|
|
||||||
gtk_object_set_data_full (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-panel-drag-window",
|
|
||||||
window,
|
|
||||||
(GtkDestroyNotify) gtk_widget_destroy);
|
|
||||||
|
|
||||||
bg.red = 0xff * color_panel->color[0];
|
|
||||||
bg.green = 0xff * color_panel->color[1];
|
|
||||||
bg.blue = 0xff * color_panel->color[2];
|
|
||||||
|
|
||||||
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
|
||||||
gdk_window_set_background (window->window, &bg);
|
|
||||||
|
|
||||||
gtk_drag_set_icon_widget (context, window, -2, -2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_drag_end (GtkWidget *widget,
|
color_panel_set_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar r,
|
||||||
gpointer data)
|
guchar g,
|
||||||
{
|
guchar b)
|
||||||
gtk_object_set_data (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-panel-drag-window", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
color_panel_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
ColorPanel *color_panel = data;
|
ColorPanel *color_panel = data;
|
||||||
ColorPanelPrivate *private = (ColorPanelPrivate *) color_panel->private_part;
|
ColorPanelPrivate *private = (ColorPanelPrivate *) color_panel->private_part;
|
||||||
guint16 *vals;
|
|
||||||
|
|
||||||
if (selection_data->length < 0)
|
color_panel->color[0] = r;
|
||||||
return;
|
color_panel->color[1] = g;
|
||||||
|
color_panel->color[2] = b;
|
||||||
if ((selection_data->format != 16) ||
|
|
||||||
(selection_data->length != 8))
|
|
||||||
{
|
|
||||||
g_warning ("Received invalid color data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = (guint16 *) selection_data->data;
|
|
||||||
|
|
||||||
color_panel->color[0] = vals[0] / 0xff;
|
|
||||||
color_panel->color[1] = vals[1] / 0xff;
|
|
||||||
color_panel->color[2] = vals[2] / 0xff;
|
|
||||||
|
|
||||||
if (private->color_notebook_active)
|
if (private->color_notebook_active)
|
||||||
color_notebook_set_color (private->color_notebook,
|
color_notebook_set_color (private->color_notebook, r, g, b, TRUE);
|
||||||
color_panel->color[0],
|
|
||||||
color_panel->color[1],
|
|
||||||
color_panel->color[2],
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
color_panel_draw (color_panel);
|
color_panel_draw (color_panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
color_panel_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
ColorPanel *color_panel = data;
|
|
||||||
guint16 vals[4];
|
|
||||||
|
|
||||||
vals[0] = color_panel->color[0] * 0xff;
|
|
||||||
vals[1] = color_panel->color[1] * 0xff;
|
|
||||||
vals[2] = color_panel->color[2] * 0xff;
|
|
||||||
vals[3] = 0xffff;
|
|
||||||
|
|
||||||
gtk_selection_data_set (selection_data,
|
|
||||||
gdk_atom_intern ("application/x-color", FALSE),
|
|
||||||
16, (guchar *) vals, 8);
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "gdk/gdkkeysyms.h"
|
#include "gdk/gdkkeysyms.h"
|
||||||
#include "appenv.h"
|
#include "appenv.h"
|
||||||
|
#include "bucket_fill.h"
|
||||||
#include "colormaps.h"
|
#include "colormaps.h"
|
||||||
#include "cursorutil.h"
|
#include "cursorutil.h"
|
||||||
#include "devices.h"
|
#include "devices.h"
|
||||||
|
@ -751,3 +752,61 @@ gdisplay_drag_drop (GtkWidget *widget,
|
||||||
|
|
||||||
return return_val;
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b)
|
||||||
|
{
|
||||||
|
GimpImage *gimage;
|
||||||
|
GimpDrawable *drawable;
|
||||||
|
TileManager *buf_tiles;
|
||||||
|
PixelRegion bufPR;
|
||||||
|
GimpContext *context;
|
||||||
|
gint x1, x2, y1, y2;
|
||||||
|
gint bytes;
|
||||||
|
gboolean has_alpha;
|
||||||
|
guchar col[3];
|
||||||
|
|
||||||
|
gimage = ((GDisplay *) data)->gimage;
|
||||||
|
drawable = gimage_active_drawable (gimage);
|
||||||
|
|
||||||
|
gimp_add_busy_cursors ();
|
||||||
|
|
||||||
|
/* Get the fill parameters */
|
||||||
|
if (gimp_context_get_current () == gimp_context_get_user () &&
|
||||||
|
! global_paint_options)
|
||||||
|
context = tool_info[BUCKET_FILL].tool_context;
|
||||||
|
else
|
||||||
|
context = gimp_context_get_current ();
|
||||||
|
|
||||||
|
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
|
||||||
|
|
||||||
|
bytes = drawable_bytes (drawable);
|
||||||
|
has_alpha = drawable_has_alpha (drawable);
|
||||||
|
|
||||||
|
col[0] = r;
|
||||||
|
col[1] = g;
|
||||||
|
col[2] = b;
|
||||||
|
|
||||||
|
/* Fill the region */
|
||||||
|
buf_tiles = tile_manager_new ((x2 - x1), (y2 - y1), bytes);
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), TRUE);
|
||||||
|
bucket_fill_region (FG_BUCKET_FILL, &bufPR, NULL,
|
||||||
|
col, NULL, x1, y1, has_alpha);
|
||||||
|
|
||||||
|
/* Apply it to the image */
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
|
||||||
|
gimage_apply_image (gimage, drawable, &bufPR, TRUE,
|
||||||
|
gimp_context_get_opacity (context) * 255,
|
||||||
|
gimp_context_get_paint_mode (context),
|
||||||
|
NULL, x1, y1);
|
||||||
|
tile_manager_destroy (buf_tiles);
|
||||||
|
|
||||||
|
/* Update the displays */
|
||||||
|
drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
|
||||||
|
gdisplays_flush ();
|
||||||
|
|
||||||
|
gimp_remove_busy_cursors (NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -38,5 +38,9 @@ gboolean gdisplay_drag_drop (GtkWidget *widget,
|
||||||
gint y,
|
gint y,
|
||||||
guint time,
|
guint time,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
void gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b);
|
||||||
|
|
||||||
#endif /* __DISP_CALLBACKS_H__ */
|
#endif /* __DISP_CALLBACKS_H__ */
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "gdk/gdkkeysyms.h"
|
#include "gdk/gdkkeysyms.h"
|
||||||
#include "appenv.h"
|
#include "appenv.h"
|
||||||
|
#include "bucket_fill.h"
|
||||||
#include "colormaps.h"
|
#include "colormaps.h"
|
||||||
#include "cursorutil.h"
|
#include "cursorutil.h"
|
||||||
#include "devices.h"
|
#include "devices.h"
|
||||||
|
@ -751,3 +752,61 @@ gdisplay_drag_drop (GtkWidget *widget,
|
||||||
|
|
||||||
return return_val;
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b)
|
||||||
|
{
|
||||||
|
GimpImage *gimage;
|
||||||
|
GimpDrawable *drawable;
|
||||||
|
TileManager *buf_tiles;
|
||||||
|
PixelRegion bufPR;
|
||||||
|
GimpContext *context;
|
||||||
|
gint x1, x2, y1, y2;
|
||||||
|
gint bytes;
|
||||||
|
gboolean has_alpha;
|
||||||
|
guchar col[3];
|
||||||
|
|
||||||
|
gimage = ((GDisplay *) data)->gimage;
|
||||||
|
drawable = gimage_active_drawable (gimage);
|
||||||
|
|
||||||
|
gimp_add_busy_cursors ();
|
||||||
|
|
||||||
|
/* Get the fill parameters */
|
||||||
|
if (gimp_context_get_current () == gimp_context_get_user () &&
|
||||||
|
! global_paint_options)
|
||||||
|
context = tool_info[BUCKET_FILL].tool_context;
|
||||||
|
else
|
||||||
|
context = gimp_context_get_current ();
|
||||||
|
|
||||||
|
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
|
||||||
|
|
||||||
|
bytes = drawable_bytes (drawable);
|
||||||
|
has_alpha = drawable_has_alpha (drawable);
|
||||||
|
|
||||||
|
col[0] = r;
|
||||||
|
col[1] = g;
|
||||||
|
col[2] = b;
|
||||||
|
|
||||||
|
/* Fill the region */
|
||||||
|
buf_tiles = tile_manager_new ((x2 - x1), (y2 - y1), bytes);
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), TRUE);
|
||||||
|
bucket_fill_region (FG_BUCKET_FILL, &bufPR, NULL,
|
||||||
|
col, NULL, x1, y1, has_alpha);
|
||||||
|
|
||||||
|
/* Apply it to the image */
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
|
||||||
|
gimage_apply_image (gimage, drawable, &bufPR, TRUE,
|
||||||
|
gimp_context_get_opacity (context) * 255,
|
||||||
|
gimp_context_get_paint_mode (context),
|
||||||
|
NULL, x1, y1);
|
||||||
|
tile_manager_destroy (buf_tiles);
|
||||||
|
|
||||||
|
/* Update the displays */
|
||||||
|
drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
|
||||||
|
gdisplays_flush ();
|
||||||
|
|
||||||
|
gimp_remove_busy_cursors (NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -38,5 +38,9 @@ gboolean gdisplay_drag_drop (GtkWidget *widget,
|
||||||
gint y,
|
gint y,
|
||||||
guint time,
|
guint time,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
void gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b);
|
||||||
|
|
||||||
#endif /* __DISP_CALLBACKS_H__ */
|
#endif /* __DISP_CALLBACKS_H__ */
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "gdk/gdkkeysyms.h"
|
#include "gdk/gdkkeysyms.h"
|
||||||
#include "appenv.h"
|
#include "appenv.h"
|
||||||
|
#include "bucket_fill.h"
|
||||||
#include "colormaps.h"
|
#include "colormaps.h"
|
||||||
#include "cursorutil.h"
|
#include "cursorutil.h"
|
||||||
#include "devices.h"
|
#include "devices.h"
|
||||||
|
@ -751,3 +752,61 @@ gdisplay_drag_drop (GtkWidget *widget,
|
||||||
|
|
||||||
return return_val;
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b)
|
||||||
|
{
|
||||||
|
GimpImage *gimage;
|
||||||
|
GimpDrawable *drawable;
|
||||||
|
TileManager *buf_tiles;
|
||||||
|
PixelRegion bufPR;
|
||||||
|
GimpContext *context;
|
||||||
|
gint x1, x2, y1, y2;
|
||||||
|
gint bytes;
|
||||||
|
gboolean has_alpha;
|
||||||
|
guchar col[3];
|
||||||
|
|
||||||
|
gimage = ((GDisplay *) data)->gimage;
|
||||||
|
drawable = gimage_active_drawable (gimage);
|
||||||
|
|
||||||
|
gimp_add_busy_cursors ();
|
||||||
|
|
||||||
|
/* Get the fill parameters */
|
||||||
|
if (gimp_context_get_current () == gimp_context_get_user () &&
|
||||||
|
! global_paint_options)
|
||||||
|
context = tool_info[BUCKET_FILL].tool_context;
|
||||||
|
else
|
||||||
|
context = gimp_context_get_current ();
|
||||||
|
|
||||||
|
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
|
||||||
|
|
||||||
|
bytes = drawable_bytes (drawable);
|
||||||
|
has_alpha = drawable_has_alpha (drawable);
|
||||||
|
|
||||||
|
col[0] = r;
|
||||||
|
col[1] = g;
|
||||||
|
col[2] = b;
|
||||||
|
|
||||||
|
/* Fill the region */
|
||||||
|
buf_tiles = tile_manager_new ((x2 - x1), (y2 - y1), bytes);
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), TRUE);
|
||||||
|
bucket_fill_region (FG_BUCKET_FILL, &bufPR, NULL,
|
||||||
|
col, NULL, x1, y1, has_alpha);
|
||||||
|
|
||||||
|
/* Apply it to the image */
|
||||||
|
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
|
||||||
|
gimage_apply_image (gimage, drawable, &bufPR, TRUE,
|
||||||
|
gimp_context_get_opacity (context) * 255,
|
||||||
|
gimp_context_get_paint_mode (context),
|
||||||
|
NULL, x1, y1);
|
||||||
|
tile_manager_destroy (buf_tiles);
|
||||||
|
|
||||||
|
/* Update the displays */
|
||||||
|
drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
|
||||||
|
gdisplays_flush ();
|
||||||
|
|
||||||
|
gimp_remove_busy_cursors (NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -38,5 +38,9 @@ gboolean gdisplay_drag_drop (GtkWidget *widget,
|
||||||
gint y,
|
gint y,
|
||||||
guint time,
|
guint time,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
void gdisplay_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b);
|
||||||
|
|
||||||
#endif /* __DISP_CALLBACKS_H__ */
|
#endif /* __DISP_CALLBACKS_H__ */
|
||||||
|
|
|
@ -132,7 +132,8 @@ static GtkTargetEntry display_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_LAYER,
|
GIMP_TARGET_LAYER,
|
||||||
GIMP_TARGET_CHANNEL,
|
GIMP_TARGET_CHANNEL,
|
||||||
GIMP_TARGET_LAYER_MASK
|
GIMP_TARGET_LAYER_MASK,
|
||||||
|
GIMP_TARGET_COLOR
|
||||||
};
|
};
|
||||||
static guint display_n_targets = (sizeof (display_target_table) /
|
static guint display_n_targets = (sizeof (display_target_table) /
|
||||||
sizeof (display_target_table[0]));
|
sizeof (display_target_table[0]));
|
||||||
|
@ -711,6 +712,7 @@ create_display_shell (GDisplay* gdisp,
|
||||||
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
||||||
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
||||||
gdisp);
|
gdisp);
|
||||||
|
gimp_dnd_color_dest_set (gdisp->shell, gdisplay_set_color, gdisp);
|
||||||
|
|
||||||
/* the vbox, table containing all widgets */
|
/* the vbox, table containing all widgets */
|
||||||
vbox = gtk_vbox_new (FALSE, 2);
|
vbox = gtk_vbox_new (FALSE, 2);
|
||||||
|
|
|
@ -132,7 +132,8 @@ static GtkTargetEntry display_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_LAYER,
|
GIMP_TARGET_LAYER,
|
||||||
GIMP_TARGET_CHANNEL,
|
GIMP_TARGET_CHANNEL,
|
||||||
GIMP_TARGET_LAYER_MASK
|
GIMP_TARGET_LAYER_MASK,
|
||||||
|
GIMP_TARGET_COLOR
|
||||||
};
|
};
|
||||||
static guint display_n_targets = (sizeof (display_target_table) /
|
static guint display_n_targets = (sizeof (display_target_table) /
|
||||||
sizeof (display_target_table[0]));
|
sizeof (display_target_table[0]));
|
||||||
|
@ -711,6 +712,7 @@ create_display_shell (GDisplay* gdisp,
|
||||||
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
||||||
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
||||||
gdisp);
|
gdisp);
|
||||||
|
gimp_dnd_color_dest_set (gdisp->shell, gdisplay_set_color, gdisp);
|
||||||
|
|
||||||
/* the vbox, table containing all widgets */
|
/* the vbox, table containing all widgets */
|
||||||
vbox = gtk_vbox_new (FALSE, 2);
|
vbox = gtk_vbox_new (FALSE, 2);
|
||||||
|
|
157
app/gimpdnd.c
157
app/gimpdnd.c
|
@ -19,6 +19,10 @@
|
||||||
#include "gimpdnd.h"
|
#include "gimpdnd.h"
|
||||||
#include "gimprc.h"
|
#include "gimprc.h"
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* drawable dnd functions */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
#define GRAD_CHECK_SIZE_SM 4
|
#define GRAD_CHECK_SIZE_SM 4
|
||||||
|
|
||||||
#define GRAD_CHECK_DARK (1.0 / 3.0)
|
#define GRAD_CHECK_DARK (1.0 / 3.0)
|
||||||
|
@ -214,3 +218,156 @@ gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
||||||
|
|
||||||
gdk_pixmap_unref (drag_pixmap);
|
gdk_pixmap_unref (drag_pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************/
|
||||||
|
/* color dnd functions */
|
||||||
|
/*************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_begin (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkWidget *window;
|
||||||
|
GdkColor bg;
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndGetColorFunc get_color_func;
|
||||||
|
|
||||||
|
get_color_func =
|
||||||
|
(GimpDndGetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_get_color_func");
|
||||||
|
|
||||||
|
if (! get_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window = gtk_window_new (GTK_WINDOW_POPUP);
|
||||||
|
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
||||||
|
gtk_widget_set_usize (window, 48, 32);
|
||||||
|
gtk_widget_realize (window);
|
||||||
|
gtk_object_set_data_full (GTK_OBJECT (widget),
|
||||||
|
"gimp-color-drag-window",
|
||||||
|
window,
|
||||||
|
(GtkDestroyNotify) gtk_widget_destroy);
|
||||||
|
|
||||||
|
(* get_color_func) (data, &r, &g, &b);
|
||||||
|
|
||||||
|
bg.red = 0xff * r;
|
||||||
|
bg.green = 0xff * g;
|
||||||
|
bg.blue = 0xff * b;
|
||||||
|
|
||||||
|
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
||||||
|
gdk_window_set_background (window->window, &bg);
|
||||||
|
|
||||||
|
gtk_drag_set_icon_widget (context, window, -2, -2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_end (GtkWidget *widget,
|
||||||
|
GdkDragContext *context)
|
||||||
|
{
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget),
|
||||||
|
"gimp-color-drag-window", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_handle (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
GtkSelectionData *selection_data,
|
||||||
|
guint info,
|
||||||
|
guint time,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
guint16 vals[4];
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndGetColorFunc get_color_func;
|
||||||
|
|
||||||
|
get_color_func =
|
||||||
|
(GimpDndGetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_get_color_func");
|
||||||
|
|
||||||
|
if (! get_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
(* get_color_func) (data, &r, &g, &b);
|
||||||
|
|
||||||
|
vals[0] = r * 0xff;
|
||||||
|
vals[1] = g * 0xff;
|
||||||
|
vals[2] = b * 0xff;
|
||||||
|
vals[3] = 0xffff;
|
||||||
|
|
||||||
|
gtk_selection_data_set (selection_data,
|
||||||
|
gdk_atom_intern ("application/x-color", FALSE),
|
||||||
|
16, (guchar *) vals, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drop_handle (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
GtkSelectionData *selection_data,
|
||||||
|
guint info,
|
||||||
|
guint time,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
guint16 *vals;
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndSetColorFunc set_color_func;
|
||||||
|
|
||||||
|
set_color_func =
|
||||||
|
(GimpDndSetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_set_color_func");
|
||||||
|
|
||||||
|
if (! set_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (selection_data->length < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((selection_data->format != 16) ||
|
||||||
|
(selection_data->length != 8))
|
||||||
|
{
|
||||||
|
g_warning ("Received invalid color data\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vals = (guint16 *) selection_data->data;
|
||||||
|
|
||||||
|
r = vals[0] / 0xff;
|
||||||
|
g = vals[1] / 0xff;
|
||||||
|
b = vals[2] / 0xff;
|
||||||
|
|
||||||
|
(* set_color_func) (data, r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_dnd_color_source_set (GtkWidget *widget,
|
||||||
|
GimpDndGetColorFunc get_color_func,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_begin",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_begin),
|
||||||
|
data);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_end",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_end),
|
||||||
|
data);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_data_get",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_handle),
|
||||||
|
data);
|
||||||
|
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget), "gimp_dnd_get_color_func",
|
||||||
|
(gpointer) get_color_func);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_dnd_color_dest_set (GtkWidget *widget,
|
||||||
|
GimpDndSetColorFunc set_color_func,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_data_received",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drop_handle),
|
||||||
|
data);
|
||||||
|
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget), "gimp_dnd_set_color_func",
|
||||||
|
(gpointer) set_color_func);
|
||||||
|
}
|
||||||
|
|
|
@ -73,9 +73,24 @@ typedef enum
|
||||||
GIMP_DROP_BELOW
|
GIMP_DROP_BELOW
|
||||||
} GimpDropType;
|
} GimpDropType;
|
||||||
|
|
||||||
|
/* drawable dnd functions */
|
||||||
|
|
||||||
void gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
void gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
||||||
GdkDragContext *context,
|
GdkDragContext *context,
|
||||||
GimpDrawable *drawable,
|
GimpDrawable *drawable,
|
||||||
GdkGC *gc);
|
GdkGC *gc);
|
||||||
|
|
||||||
|
/* color dnd functions */
|
||||||
|
|
||||||
|
typedef void (*GimpDndSetColorFunc) (gpointer, guchar, guchar, guchar);
|
||||||
|
typedef void (*GimpDndGetColorFunc) (gpointer, guchar *, guchar *, guchar *);
|
||||||
|
|
||||||
|
void gimp_dnd_color_source_set (GtkWidget *widget,
|
||||||
|
GimpDndGetColorFunc get_color_func,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
|
void gimp_dnd_color_dest_set (GtkWidget *widget,
|
||||||
|
GimpDndSetColorFunc set_color_func,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
#endif /* __GIMP_DND_H__ */
|
#endif /* __GIMP_DND_H__ */
|
||||||
|
|
|
@ -156,6 +156,8 @@ static void channel_widget_drag_leave_callback (GtkWidget *,
|
||||||
guint);
|
guint);
|
||||||
static void channel_widget_drag_indicator_callback (GtkWidget *, gpointer);
|
static void channel_widget_drag_indicator_callback (GtkWidget *, gpointer);
|
||||||
|
|
||||||
|
static void channel_widget_set_color (gpointer,
|
||||||
|
guchar, guchar, guchar);
|
||||||
static void channel_widget_draw_drop_indicator (ChannelWidget *, GimpDropType);
|
static void channel_widget_draw_drop_indicator (ChannelWidget *, GimpDropType);
|
||||||
static void channel_widget_delete (ChannelWidget *);
|
static void channel_widget_delete (ChannelWidget *);
|
||||||
static void channel_widget_select_update (GtkWidget *, gpointer);
|
static void channel_widget_select_update (GtkWidget *, gpointer);
|
||||||
|
@ -214,6 +216,14 @@ static OpsButton channels_ops_buttons[] =
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd structures */
|
||||||
|
|
||||||
|
static GtkTargetEntry channel_color_target_table[] =
|
||||||
|
{
|
||||||
|
GIMP_TARGET_CHANNEL,
|
||||||
|
GIMP_TARGET_COLOR
|
||||||
|
};
|
||||||
|
static guint n_channel_color_targets = (sizeof (channel_color_target_table) /
|
||||||
|
sizeof (channel_color_target_table[0]));
|
||||||
|
|
||||||
static GtkTargetEntry channel_target_table[] =
|
static GtkTargetEntry channel_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_CHANNEL
|
GIMP_TARGET_CHANNEL
|
||||||
|
@ -829,10 +839,10 @@ static gint
|
||||||
channel_list_events (GtkWidget *widget,
|
channel_list_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
|
ChannelWidget *channel_widget;
|
||||||
GdkEventKey *kevent;
|
GdkEventKey *kevent;
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
GtkWidget *event_widget;
|
GtkWidget *event_widget;
|
||||||
ChannelWidget *channel_widget;
|
|
||||||
|
|
||||||
event_widget = gtk_get_event_widget (event);
|
event_widget = gtk_get_event_widget (event);
|
||||||
|
|
||||||
|
@ -843,9 +853,13 @@ channel_list_events (GtkWidget *widget,
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
|
case GDK_2BUTTON_PRESS:
|
||||||
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
|
channels_dialog_edit_channel_query (channel_widget);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
bevent = (GdkEventButton *) event;
|
bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
if (bevent->button == 3 || bevent->button == 2)
|
if (bevent->button == 3 || bevent->button == 2)
|
||||||
{
|
{
|
||||||
gtk_menu_popup (GTK_MENU (channelsD->ops_menu),
|
gtk_menu_popup (GTK_MENU (channelsD->ops_menu),
|
||||||
|
@ -855,11 +869,6 @@ channel_list_events (GtkWidget *widget,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_2BUTTON_PRESS:
|
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
|
||||||
channels_dialog_edit_channel_query (channel_widget);
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case GDK_KEY_PRESS:
|
case GDK_KEY_PRESS:
|
||||||
kevent = (GdkEventKey *) event;
|
kevent = (GdkEventKey *) event;
|
||||||
switch (kevent->keyval)
|
switch (kevent->keyval)
|
||||||
|
@ -1283,7 +1292,7 @@ channel_widget_create (GImage *gimage,
|
||||||
channel_widget->channel_pixmap = NULL;
|
channel_widget->channel_pixmap = NULL;
|
||||||
channel_widget->type = type;
|
channel_widget->type = type;
|
||||||
channel_widget->ID = ((type == AUXILLARY_CHANNEL) ?
|
channel_widget->ID = ((type == AUXILLARY_CHANNEL) ?
|
||||||
GIMP_DRAWABLE(channel)->ID :
|
GIMP_DRAWABLE (channel)->ID :
|
||||||
(COMPONENT_BASE_ID + type));
|
(COMPONENT_BASE_ID + type));
|
||||||
channel_widget->list_item = list_item;
|
channel_widget->list_item = list_item;
|
||||||
channel_widget->width = -1;
|
channel_widget->width = -1;
|
||||||
|
@ -1375,8 +1384,11 @@ channel_widget_create (GImage *gimage,
|
||||||
/* dnd destination */
|
/* dnd destination */
|
||||||
gtk_drag_dest_set (list_item,
|
gtk_drag_dest_set (list_item,
|
||||||
GTK_DEST_DEFAULT_ALL,
|
GTK_DEST_DEFAULT_ALL,
|
||||||
channel_target_table, n_channel_targets,
|
channel_color_target_table, n_channel_color_targets,
|
||||||
GDK_ACTION_MOVE);
|
GDK_ACTION_MOVE | GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (list_item,
|
||||||
|
channel_widget_set_color,
|
||||||
|
(gpointer) channel_widget);
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave",
|
gtk_signal_connect (GTK_OBJECT (list_item), "drag_leave",
|
||||||
GTK_SIGNAL_FUNC (channel_widget_drag_leave_callback),
|
GTK_SIGNAL_FUNC (channel_widget_drag_leave_callback),
|
||||||
|
@ -1489,6 +1501,13 @@ channel_widget_drag_motion_callback (GtkWidget *widget,
|
||||||
drop_type = GIMP_DROP_NONE;
|
drop_type = GIMP_DROP_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (gtk_object_get_data (GTK_OBJECT (src_widget),
|
||||||
|
"gimp_dnd_get_color_func"))
|
||||||
|
{
|
||||||
|
drag_action = GDK_ACTION_COPY;
|
||||||
|
return_val = TRUE;
|
||||||
|
drop_type = GIMP_DROP_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdk_drag_status (context, drag_action, time);
|
gdk_drag_status (context, drag_action, time);
|
||||||
|
@ -1610,6 +1629,30 @@ channel_widget_drag_indicator_callback (GtkWidget *widget,
|
||||||
channel_widget_draw_drop_indicator (channel_widget, channel_widget->drop_type);
|
channel_widget_draw_drop_indicator (channel_widget, channel_widget->drop_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
channel_widget_set_color (gpointer data,
|
||||||
|
guchar r,
|
||||||
|
guchar g,
|
||||||
|
guchar b)
|
||||||
|
{
|
||||||
|
ChannelWidget *channel_widget = (ChannelWidget *) data;
|
||||||
|
Channel *channel = channel_widget->channel;
|
||||||
|
|
||||||
|
if (r != channel->col[0] ||
|
||||||
|
g != channel->col[1] ||
|
||||||
|
b != channel->col[2])
|
||||||
|
{
|
||||||
|
channel->col[0] = r;
|
||||||
|
channel->col[1] = g;
|
||||||
|
channel->col[2] = b;
|
||||||
|
|
||||||
|
drawable_update (GIMP_DRAWABLE (channel), 0, 0,
|
||||||
|
GIMP_DRAWABLE (channel)->width,
|
||||||
|
GIMP_DRAWABLE (channel)->height);
|
||||||
|
gdisplays_flush ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
channel_widget_draw_drop_indicator (ChannelWidget *channel_widget,
|
channel_widget_draw_drop_indicator (ChannelWidget *channel_widget,
|
||||||
GimpDropType drop_type)
|
GimpDropType drop_type)
|
||||||
|
@ -1696,16 +1739,17 @@ static gint
|
||||||
channel_widget_button_events (GtkWidget *widget,
|
channel_widget_button_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
static int button_down = 0;
|
ChannelWidget *channel_widget;
|
||||||
static GtkWidget *click_widget = NULL;
|
GtkWidget *event_widget;
|
||||||
static int old_state;
|
|
||||||
static int exclusive;
|
|
||||||
ChannelWidget *channel_widget;
|
|
||||||
GtkWidget *event_widget;
|
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
gint return_val;
|
gint return_val;
|
||||||
int visible;
|
gint visible;
|
||||||
int width, height;
|
gint width, height;
|
||||||
|
|
||||||
|
static gboolean button_down = FALSE;
|
||||||
|
static GtkWidget *click_widget = NULL;
|
||||||
|
static gint old_state;
|
||||||
|
static gint exclusive;
|
||||||
|
|
||||||
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
||||||
|
|
||||||
|
@ -1745,7 +1789,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
button_down = 1;
|
button_down = TRUE;
|
||||||
click_widget = widget;
|
click_widget = widget;
|
||||||
gtk_grab_add (click_widget);
|
gtk_grab_add (click_widget);
|
||||||
|
|
||||||
|
@ -1763,7 +1807,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
exclusive = FALSE;
|
exclusive = FALSE;
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
GIMP_DRAWABLE(channel_widget->channel)->visible = !visible;
|
GIMP_DRAWABLE (channel_widget->channel)->visible = !visible;
|
||||||
else
|
else
|
||||||
gimage_set_component_visible (channel_widget->gimage,
|
gimage_set_component_visible (channel_widget->gimage,
|
||||||
channel_widget->type, !visible);
|
channel_widget->type, !visible);
|
||||||
|
@ -1775,7 +1819,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
case GDK_BUTTON_RELEASE:
|
case GDK_BUTTON_RELEASE:
|
||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
|
|
||||||
button_down = 0;
|
button_down = FALSE;
|
||||||
gtk_grab_remove (click_widget);
|
gtk_grab_remove (click_widget);
|
||||||
|
|
||||||
if (widget == channel_widget->eye_widget)
|
if (widget == channel_widget->eye_widget)
|
||||||
|
@ -1808,7 +1852,7 @@ channel_widget_button_events (GtkWidget *widget,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (channel_widget->type == AUXILLARY_CHANNEL)
|
if (channel_widget->type == AUXILLARY_CHANNEL)
|
||||||
GIMP_DRAWABLE(channel_widget->channel)->visible = !visible;
|
GIMP_DRAWABLE (channel_widget->channel)->visible = !visible;
|
||||||
else
|
else
|
||||||
gimage_set_component_visible (channel_widget->gimage,
|
gimage_set_component_visible (channel_widget->gimage,
|
||||||
channel_widget->type, !visible);
|
channel_widget->type, !visible);
|
||||||
|
@ -1829,10 +1873,10 @@ static gint
|
||||||
channel_widget_preview_events (GtkWidget *widget,
|
channel_widget_preview_events (GtkWidget *widget,
|
||||||
GdkEvent *event)
|
GdkEvent *event)
|
||||||
{
|
{
|
||||||
|
ChannelWidget *channel_widget;
|
||||||
GdkEventExpose *eevent;
|
GdkEventExpose *eevent;
|
||||||
GdkEventButton *bevent;
|
GdkEventButton *bevent;
|
||||||
ChannelWidget *channel_widget;
|
gboolean valid;
|
||||||
int valid;
|
|
||||||
|
|
||||||
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
channel_widget = (ChannelWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
|
||||||
|
|
||||||
|
@ -1858,7 +1902,7 @@ channel_widget_preview_events (GtkWidget *widget,
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
valid = GIMP_DRAWABLE(channel_widget->channel)->preview_valid;
|
valid = GIMP_DRAWABLE (channel_widget->channel)->preview_valid;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
valid = gimage_preview_valid (channel_widget->gimage,
|
valid = gimage_preview_valid (channel_widget->gimage,
|
||||||
|
@ -1902,8 +1946,8 @@ static void
|
||||||
channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
||||||
{
|
{
|
||||||
TempBuf * preview_buf;
|
TempBuf * preview_buf;
|
||||||
int width, height;
|
gint width, height;
|
||||||
int channel;
|
gint channel;
|
||||||
|
|
||||||
/* allocate the channel widget pixmap */
|
/* allocate the channel widget pixmap */
|
||||||
if (! channel_widget->channel_pixmap)
|
if (! channel_widget->channel_pixmap)
|
||||||
|
@ -1917,8 +1961,8 @@ channel_widget_preview_redraw (ChannelWidget *channel_widget)
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
width = GIMP_DRAWABLE(channel_widget->channel)->width;
|
width = GIMP_DRAWABLE (channel_widget->channel)->width;
|
||||||
height = GIMP_DRAWABLE(channel_widget->channel)->height;
|
height = GIMP_DRAWABLE (channel_widget->channel)->height;
|
||||||
channel_widget->width = (int) (channelsD->ratio * width);
|
channel_widget->width = (int) (channelsD->ratio * width);
|
||||||
channel_widget->height = (int) (channelsD->ratio * height);
|
channel_widget->height = (int) (channelsD->ratio * height);
|
||||||
preview_buf = channel_preview (channel_widget->channel,
|
preview_buf = channel_preview (channel_widget->channel,
|
||||||
|
@ -2040,7 +2084,7 @@ channel_widget_eye_redraw (ChannelWidget *channel_widget)
|
||||||
GdkPixmap *pixmap;
|
GdkPixmap *pixmap;
|
||||||
GdkColor *color;
|
GdkColor *color;
|
||||||
GtkStateType state;
|
GtkStateType state;
|
||||||
int visible;
|
gboolean visible;
|
||||||
|
|
||||||
state = channel_widget->list_item->state;
|
state = channel_widget->list_item->state;
|
||||||
|
|
||||||
|
@ -2059,10 +2103,11 @@ channel_widget_eye_redraw (ChannelWidget *channel_widget)
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
visible = GIMP_DRAWABLE(channel_widget->channel)->visible;
|
visible = GIMP_DRAWABLE (channel_widget->channel)->visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
visible = gimage_get_component_visible (channel_widget->gimage, channel_widget->type);
|
visible = gimage_get_component_visible (channel_widget->gimage,
|
||||||
|
channel_widget->type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2112,7 +2157,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
{
|
{
|
||||||
GSList *list;
|
GSList *list;
|
||||||
ChannelWidget *cw;
|
ChannelWidget *cw;
|
||||||
int visible = FALSE;
|
gboolean visible = FALSE;
|
||||||
|
|
||||||
if (!channelsD)
|
if (!channelsD)
|
||||||
return;
|
return;
|
||||||
|
@ -2127,7 +2172,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
visible |= GIMP_DRAWABLE(cw->channel)->visible;
|
visible |= GIMP_DRAWABLE (cw->channel)->visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
visible |= gimage_get_component_visible (cw->gimage, cw->type);
|
visible |= gimage_get_component_visible (cw->gimage, cw->type);
|
||||||
|
@ -2147,7 +2192,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
GIMP_DRAWABLE(cw->channel)->visible = !visible;
|
GIMP_DRAWABLE (cw->channel)->visible = !visible;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gimage_set_component_visible (cw->gimage, cw->type, !visible);
|
gimage_set_component_visible (cw->gimage, cw->type, !visible);
|
||||||
|
@ -2157,7 +2202,7 @@ channel_widget_exclusive_visible (ChannelWidget *channel_widget)
|
||||||
switch (cw->type)
|
switch (cw->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
GIMP_DRAWABLE(cw->channel)->visible = TRUE;
|
GIMP_DRAWABLE (cw->channel)->visible = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gimage_set_component_visible (cw->gimage, cw->type, TRUE);
|
gimage_set_component_visible (cw->gimage, cw->type, TRUE);
|
||||||
|
@ -2237,7 +2282,7 @@ channel_widget_channel_flush (GtkWidget *widget,
|
||||||
switch (channel_widget->type)
|
switch (channel_widget->type)
|
||||||
{
|
{
|
||||||
case AUXILLARY_CHANNEL:
|
case AUXILLARY_CHANNEL:
|
||||||
update_preview = !GIMP_DRAWABLE(channel_widget->channel)->preview_valid;
|
update_preview = !GIMP_DRAWABLE (channel_widget->channel)->preview_valid;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
update_preview = !gimage_preview_valid (channel_widget->gimage,
|
update_preview = !gimage_preview_valid (channel_widget->gimage,
|
||||||
|
@ -2286,7 +2331,8 @@ new_channel_query_ok_callback (GtkWidget *widget,
|
||||||
if ((gimage = options->gimage))
|
if ((gimage = options->gimage))
|
||||||
{
|
{
|
||||||
new_channel = channel_new (gimage, gimage->width, gimage->height,
|
new_channel = channel_new (gimage, gimage->width, gimage->height,
|
||||||
channel_name, (int) (255 * options->opacity) / 100,
|
channel_name,
|
||||||
|
(gint) (255 * options->opacity) / 100,
|
||||||
options->color_panel->color);
|
options->color_panel->color);
|
||||||
drawable_fill (GIMP_DRAWABLE (new_channel), TRANSPARENT_FILL);
|
drawable_fill (GIMP_DRAWABLE (new_channel), TRANSPARENT_FILL);
|
||||||
|
|
||||||
|
@ -2485,9 +2531,9 @@ edit_channel_query_ok_callback (GtkWidget *widget,
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
drawable_update (GIMP_DRAWABLE(channel), 0, 0,
|
drawable_update (GIMP_DRAWABLE (channel), 0, 0,
|
||||||
GIMP_DRAWABLE(channel)->width,
|
GIMP_DRAWABLE (channel)->width,
|
||||||
GIMP_DRAWABLE(channel)->height);
|
GIMP_DRAWABLE (channel)->height);
|
||||||
gdisplays_flush ();
|
gdisplays_flush ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,25 +35,11 @@ typedef enum
|
||||||
} ColorAreaTarget;
|
} ColorAreaTarget;
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static void color_area_drag_begin (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_set_color (gpointer, guchar, guchar, guchar);
|
||||||
static void color_area_drag_end (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_get_color (gpointer, guchar *, guchar *, guchar *);
|
||||||
static void color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
static void color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
gint active_color = 0;
|
gint active_color = FOREGROUND;
|
||||||
|
|
||||||
/* Static variables */
|
/* Static variables */
|
||||||
static GdkGC *color_area_gc = NULL;
|
static GdkGC *color_area_gc = NULL;
|
||||||
|
@ -67,7 +53,7 @@ static gint edit_color;
|
||||||
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
||||||
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd stuff */
|
||||||
static GtkTargetEntry color_area_target_table[] =
|
static GtkTargetEntry color_area_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_COLOR
|
GIMP_TARGET_COLOR
|
||||||
|
@ -268,16 +254,13 @@ color_area_edit (void)
|
||||||
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
||||||
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
{
|
palette_get_foreground (&r, &g, &b);
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
edit_color = FOREGROUND;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
palette_get_background (&r, &g, &b);
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
edit_color = BACKGROUND;
|
edit_color = active_color;
|
||||||
}
|
|
||||||
|
|
||||||
if (! color_notebook)
|
if (! color_notebook)
|
||||||
{
|
{
|
||||||
|
@ -333,7 +316,36 @@ color_area_events (GtkWidget *widget,
|
||||||
bevent = (GdkEventButton *) event;
|
bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
if (bevent->button == 1)
|
if (bevent->button == 1)
|
||||||
press_target = color_area_target (bevent->x, bevent->y);
|
{
|
||||||
|
target = color_area_target (bevent->x, bevent->y);
|
||||||
|
press_target = INVALID_AREA;
|
||||||
|
|
||||||
|
switch (target)
|
||||||
|
{
|
||||||
|
case FORE_AREA:
|
||||||
|
case BACK_AREA:
|
||||||
|
if (target != active_color)
|
||||||
|
{
|
||||||
|
active_color = target;
|
||||||
|
color_area_draw ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
press_target = target;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SWAP_AREA:
|
||||||
|
palette_swap_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
case DEF_AREA:
|
||||||
|
palette_set_default_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_RELEASE:
|
case GDK_BUTTON_RELEASE:
|
||||||
|
@ -349,23 +361,7 @@ color_area_events (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
case FORE_AREA:
|
case FORE_AREA:
|
||||||
case BACK_AREA:
|
case BACK_AREA:
|
||||||
if (target == active_color)
|
color_area_edit ();
|
||||||
{
|
|
||||||
color_area_edit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
active_color = target;
|
|
||||||
color_area_draw ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SWAP_AREA:
|
|
||||||
palette_swap_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
|
||||||
case DEF_AREA:
|
|
||||||
palette_set_default_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -405,34 +401,19 @@ color_area_create (gint width,
|
||||||
swap_pixmap = swap_pmap;
|
swap_pixmap = swap_pmap;
|
||||||
|
|
||||||
/* dnd stuff */
|
/* dnd stuff */
|
||||||
|
gtk_drag_source_set (color_area,
|
||||||
|
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||||
|
color_area_target_table, n_color_area_targets,
|
||||||
|
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||||
|
gimp_dnd_color_source_set (color_area, color_area_get_color, NULL);
|
||||||
|
|
||||||
gtk_drag_dest_set (color_area,
|
gtk_drag_dest_set (color_area,
|
||||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||||
GTK_DEST_DEFAULT_MOTION |
|
GTK_DEST_DEFAULT_MOTION |
|
||||||
GTK_DEST_DEFAULT_DROP,
|
GTK_DEST_DEFAULT_DROP,
|
||||||
color_area_target_table, n_color_area_targets,
|
color_area_target_table, n_color_area_targets,
|
||||||
GDK_ACTION_COPY);
|
GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (color_area, color_area_set_color, NULL);
|
||||||
gtk_drag_source_set (color_area,
|
|
||||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
|
||||||
color_area_target_table, n_color_area_targets,
|
|
||||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_begin",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_begin),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_end",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_end),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_get",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_handle),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_received",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drop_handle),
|
|
||||||
color_area);
|
|
||||||
|
|
||||||
return color_area;
|
return color_area;
|
||||||
}
|
}
|
||||||
|
@ -444,76 +425,23 @@ color_area_update ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_begin (GtkWidget *widget,
|
color_area_get_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar *r,
|
||||||
gpointer data)
|
guchar *g,
|
||||||
|
guchar *b)
|
||||||
{
|
{
|
||||||
GtkWidget *window;
|
|
||||||
GdkColor bg;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
|
||||||
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
|
||||||
gtk_widget_set_usize (window, 48, 32);
|
|
||||||
gtk_widget_realize (window);
|
|
||||||
gtk_object_set_data_full (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window",
|
|
||||||
window,
|
|
||||||
(GtkDestroyNotify) gtk_widget_destroy);
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
palette_get_foreground (&r, &g, &b);
|
palette_get_foreground (r, g, b);
|
||||||
else
|
else
|
||||||
palette_get_background (&r, &g, &b);
|
palette_get_background (r, g, b);
|
||||||
|
|
||||||
bg.red = 0xff * r;
|
|
||||||
bg.green = 0xff * g;
|
|
||||||
bg.blue = 0xff * b;
|
|
||||||
|
|
||||||
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
|
||||||
gdk_window_set_background (window->window, &bg);
|
|
||||||
|
|
||||||
gtk_drag_set_icon_widget (context, window, -2, -2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_end (GtkWidget *widget,
|
color_area_set_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar r,
|
||||||
gpointer data)
|
guchar g,
|
||||||
|
guchar b)
|
||||||
{
|
{
|
||||||
gtk_object_set_data (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 *vals;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (selection_data->length < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((selection_data->format != 16) ||
|
|
||||||
(selection_data->length != 8))
|
|
||||||
{
|
|
||||||
g_warning ("Received invalid color data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = (guint16 *) selection_data->data;
|
|
||||||
|
|
||||||
r = vals[0] / 0xff;
|
|
||||||
g = vals[1] / 0xff;
|
|
||||||
b = vals[2] / 0xff;
|
|
||||||
|
|
||||||
if (color_notebook_active &&
|
if (color_notebook_active &&
|
||||||
active_color == edit_color)
|
active_color == edit_color)
|
||||||
{
|
{
|
||||||
|
@ -527,29 +455,3 @@ color_area_drop_handle (GtkWidget *widget,
|
||||||
palette_set_background (r, g, b);
|
palette_set_background (r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 vals[4];
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
else
|
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
|
|
||||||
vals[0] = r * 0xff;
|
|
||||||
vals[1] = g * 0xff;
|
|
||||||
vals[2] = b * 0xff;
|
|
||||||
vals[3] = 0xffff;
|
|
||||||
|
|
||||||
gtk_selection_data_set (selection_data,
|
|
||||||
gdk_atom_intern ("application/x-color", FALSE),
|
|
||||||
16, (guchar *) vals, 8);
|
|
||||||
}
|
|
||||||
|
|
|
@ -132,7 +132,8 @@ static GtkTargetEntry display_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_LAYER,
|
GIMP_TARGET_LAYER,
|
||||||
GIMP_TARGET_CHANNEL,
|
GIMP_TARGET_CHANNEL,
|
||||||
GIMP_TARGET_LAYER_MASK
|
GIMP_TARGET_LAYER_MASK,
|
||||||
|
GIMP_TARGET_COLOR
|
||||||
};
|
};
|
||||||
static guint display_n_targets = (sizeof (display_target_table) /
|
static guint display_n_targets = (sizeof (display_target_table) /
|
||||||
sizeof (display_target_table[0]));
|
sizeof (display_target_table[0]));
|
||||||
|
@ -711,6 +712,7 @@ create_display_shell (GDisplay* gdisp,
|
||||||
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "drag_drop",
|
||||||
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
GTK_SIGNAL_FUNC (gdisplay_drag_drop),
|
||||||
gdisp);
|
gdisp);
|
||||||
|
gimp_dnd_color_dest_set (gdisp->shell, gdisplay_set_color, gdisp);
|
||||||
|
|
||||||
/* the vbox, table containing all widgets */
|
/* the vbox, table containing all widgets */
|
||||||
vbox = gtk_vbox_new (FALSE, 2);
|
vbox = gtk_vbox_new (FALSE, 2);
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
typedef struct _BucketTool BucketTool;
|
typedef struct _BucketTool BucketTool;
|
||||||
struct _BucketTool
|
struct _BucketTool
|
||||||
{
|
{
|
||||||
int target_x; /* starting x coord */
|
gint target_x; /* starting x coord */
|
||||||
int target_y; /* starting y coord */
|
gint target_y; /* starting y coord */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _BucketOptions BucketOptions;
|
typedef struct _BucketOptions BucketOptions;
|
||||||
|
@ -51,12 +51,12 @@ struct _BucketOptions
|
||||||
{
|
{
|
||||||
PaintOptions paint_options;
|
PaintOptions paint_options;
|
||||||
|
|
||||||
double threshold;
|
gdouble threshold;
|
||||||
double threshold_d;
|
gdouble threshold_d;
|
||||||
GtkObject *threshold_w;
|
GtkObject *threshold_w;
|
||||||
|
|
||||||
int sample_merged;
|
gboolean sample_merged;
|
||||||
int sample_merged_d;
|
gboolean sample_merged_d;
|
||||||
GtkWidget *sample_merged_w;
|
GtkWidget *sample_merged_w;
|
||||||
|
|
||||||
BucketFillMode fill_mode;
|
BucketFillMode fill_mode;
|
||||||
|
@ -75,13 +75,10 @@ static void bucket_fill_button_press (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
||||||
|
|
||||||
static void bucket_fill_region (BucketFillMode, PixelRegion *,
|
static void bucket_fill_line_color (guchar *, guchar *, guchar *,
|
||||||
PixelRegion *, unsigned char *,
|
gboolean, gint, gint);
|
||||||
TempBuf *, int, int, int);
|
static void bucket_fill_line_pattern (guchar *, guchar *, TempBuf *,
|
||||||
static void bucket_fill_line_color (unsigned char *, unsigned char *,
|
gboolean, gint, gint, gint, gint);
|
||||||
unsigned char *, int, int, int);
|
|
||||||
static void bucket_fill_line_pattern (unsigned char *, unsigned char *,
|
|
||||||
TempBuf *, int, int, int, int, int);
|
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
|
@ -163,10 +160,10 @@ bucket_options_new (void)
|
||||||
/* fill type */
|
/* fill type */
|
||||||
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
||||||
&options->fill_mode,
|
&options->fill_mode,
|
||||||
options->fill_mode_w,
|
options->fill_mode_w,
|
||||||
fill_mode_label,
|
fill_mode_label,
|
||||||
fill_mode_value,
|
fill_mode_value,
|
||||||
3);
|
3);
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||||
gtk_widget_show (frame);
|
gtk_widget_show (frame);
|
||||||
|
@ -183,7 +180,7 @@ bucket_fill_button_press (Tool *tool,
|
||||||
{
|
{
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
int use_offsets;
|
gboolean use_offsets;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -196,7 +193,9 @@ bucket_fill_button_press (Tool *tool,
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
||||||
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
GDK_POINTER_MOTION_HINT_MASK |
|
||||||
|
GDK_BUTTON1_MOTION_MASK |
|
||||||
|
GDK_BUTTON_RELEASE_MASK,
|
||||||
NULL, NULL, bevent->time);
|
NULL, NULL, bevent->time);
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
|
@ -212,7 +211,7 @@ bucket_fill_button_release (Tool *tool,
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
Argument *return_vals;
|
Argument *return_vals;
|
||||||
int nreturn_vals;
|
gint nreturn_vals;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -255,8 +254,8 @@ bucket_fill_cursor_update (Tool *tool,
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
Layer *layer;
|
Layer *layer;
|
||||||
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
||||||
int x, y;
|
gint x, y;
|
||||||
int off_x, off_y;
|
gint off_x, off_y;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
|
|
||||||
|
@ -311,23 +310,24 @@ void
|
||||||
bucket_fill (GimpImage *gimage,
|
bucket_fill (GimpImage *gimage,
|
||||||
GimpDrawable *drawable,
|
GimpDrawable *drawable,
|
||||||
BucketFillMode fill_mode,
|
BucketFillMode fill_mode,
|
||||||
int paint_mode,
|
gint paint_mode,
|
||||||
double opacity,
|
gdouble opacity,
|
||||||
double threshold,
|
gdouble threshold,
|
||||||
int sample_merged,
|
gboolean sample_merged,
|
||||||
double x,
|
gdouble x,
|
||||||
double y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
TileManager *buf_tiles;
|
TileManager *buf_tiles;
|
||||||
PixelRegion bufPR, maskPR;
|
PixelRegion bufPR, maskPR;
|
||||||
Channel * mask = NULL;
|
Channel *mask = NULL;
|
||||||
int bytes, has_alpha;
|
gint bytes;
|
||||||
int x1, y1, x2, y2;
|
gboolean has_alpha;
|
||||||
unsigned char col [MAX_CHANNELS];
|
gint x1, y1, x2, y2;
|
||||||
unsigned char *d1, *d2;
|
guchar col [MAX_CHANNELS];
|
||||||
GPatternP pattern;
|
guchar *d1, *d2;
|
||||||
TempBuf * pat_buf;
|
GPatternP pattern;
|
||||||
int new_buf = 0;
|
TempBuf *pat_buf;
|
||||||
|
gboolean new_buf = FALSE;
|
||||||
|
|
||||||
pat_buf = NULL;
|
pat_buf = NULL;
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
d2 += pat_buf->bytes;
|
d2 += pat_buf->bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buf = 1;
|
new_buf = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pat_buf = pattern->mask;
|
pat_buf = pattern->mask;
|
||||||
|
@ -423,7 +423,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
if (! has_alpha)
|
if (! has_alpha)
|
||||||
{
|
{
|
||||||
bytes ++;
|
bytes ++;
|
||||||
has_alpha = 1;
|
has_alpha = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,16 +455,15 @@ bucket_fill (GimpImage *gimage,
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_color (unsigned char *buf,
|
bucket_fill_line_color (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
|
|
||||||
alpha = (has_alpha) ? bytes - 1 : bytes;
|
alpha = (has_alpha) ? bytes - 1 : bytes;
|
||||||
while (width--)
|
while (width--)
|
||||||
|
@ -484,20 +483,19 @@ bucket_fill_line_color (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_pattern (unsigned char *buf,
|
bucket_fill_line_pattern (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int x,
|
gint x,
|
||||||
int y,
|
gint y,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
unsigned char *pat, *p;
|
guchar *pat, *p;
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
int i;
|
gint i;
|
||||||
|
|
||||||
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
||||||
pat = temp_buf_data (pattern) +
|
pat = temp_buf_data (pattern) +
|
||||||
|
@ -523,22 +521,23 @@ bucket_fill_line_pattern (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
static void
|
|
||||||
bucket_fill_region (BucketFillMode fill_mode,
|
bucket_fill_region (BucketFillMode fill_mode,
|
||||||
PixelRegion *bufPR,
|
PixelRegion *bufPR,
|
||||||
PixelRegion *maskPR,
|
PixelRegion *maskPR,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int off_x,
|
gint off_x,
|
||||||
int off_y,
|
gint off_y,
|
||||||
int has_alpha)
|
gboolean has_alpha)
|
||||||
{
|
{
|
||||||
unsigned char *s, *m;
|
guchar *s, *m;
|
||||||
int y;
|
gint y;
|
||||||
void *pr;
|
void *pr;
|
||||||
|
|
||||||
for (pr = pixel_regions_register (2, bufPR, maskPR); pr != NULL; pr = pixel_regions_process (pr))
|
for (pr = pixel_regions_register (2, bufPR, maskPR);
|
||||||
|
pr != NULL;
|
||||||
|
pr = pixel_regions_process (pr))
|
||||||
{
|
{
|
||||||
s = bufPR->data;
|
s = bufPR->data;
|
||||||
if (maskPR)
|
if (maskPR)
|
||||||
|
|
|
@ -29,10 +29,26 @@ typedef enum
|
||||||
PATTERN_BUCKET_FILL
|
PATTERN_BUCKET_FILL
|
||||||
} BucketFillMode;
|
} BucketFillMode;
|
||||||
|
|
||||||
void bucket_fill (GimpImage *, GimpDrawable *, BucketFillMode, int,
|
void bucket_fill (GimpImage *gimage,
|
||||||
double, double, int, double, double);
|
GimpDrawable *drawable,
|
||||||
|
BucketFillMode fill_mode,
|
||||||
|
gint paint_mode,
|
||||||
|
gdouble opacity,
|
||||||
|
gdouble threshold,
|
||||||
|
gboolean sample_merged,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y);
|
||||||
|
|
||||||
|
void bucket_fill_region (BucketFillMode fill_mode,
|
||||||
|
PixelRegion *bufPR,
|
||||||
|
PixelRegion *maskPR,
|
||||||
|
guchar *col,
|
||||||
|
TempBuf *pattern,
|
||||||
|
gint off_x,
|
||||||
|
gint off_y,
|
||||||
|
gboolean has_alpha);
|
||||||
|
|
||||||
Tool * tools_new_bucket_fill (void);
|
Tool * tools_new_bucket_fill (void);
|
||||||
void tools_free_bucket_fill (Tool *);
|
void tools_free_bucket_fill (Tool *tool);
|
||||||
|
|
||||||
#endif /* __BUCKET_FILL_H__ */
|
#endif /* __BUCKET_FILL_H__ */
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
typedef struct _BucketTool BucketTool;
|
typedef struct _BucketTool BucketTool;
|
||||||
struct _BucketTool
|
struct _BucketTool
|
||||||
{
|
{
|
||||||
int target_x; /* starting x coord */
|
gint target_x; /* starting x coord */
|
||||||
int target_y; /* starting y coord */
|
gint target_y; /* starting y coord */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _BucketOptions BucketOptions;
|
typedef struct _BucketOptions BucketOptions;
|
||||||
|
@ -51,12 +51,12 @@ struct _BucketOptions
|
||||||
{
|
{
|
||||||
PaintOptions paint_options;
|
PaintOptions paint_options;
|
||||||
|
|
||||||
double threshold;
|
gdouble threshold;
|
||||||
double threshold_d;
|
gdouble threshold_d;
|
||||||
GtkObject *threshold_w;
|
GtkObject *threshold_w;
|
||||||
|
|
||||||
int sample_merged;
|
gboolean sample_merged;
|
||||||
int sample_merged_d;
|
gboolean sample_merged_d;
|
||||||
GtkWidget *sample_merged_w;
|
GtkWidget *sample_merged_w;
|
||||||
|
|
||||||
BucketFillMode fill_mode;
|
BucketFillMode fill_mode;
|
||||||
|
@ -75,13 +75,10 @@ static void bucket_fill_button_press (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
static void bucket_fill_button_release (Tool *, GdkEventButton *, gpointer);
|
||||||
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
static void bucket_fill_cursor_update (Tool *, GdkEventMotion *, gpointer);
|
||||||
|
|
||||||
static void bucket_fill_region (BucketFillMode, PixelRegion *,
|
static void bucket_fill_line_color (guchar *, guchar *, guchar *,
|
||||||
PixelRegion *, unsigned char *,
|
gboolean, gint, gint);
|
||||||
TempBuf *, int, int, int);
|
static void bucket_fill_line_pattern (guchar *, guchar *, TempBuf *,
|
||||||
static void bucket_fill_line_color (unsigned char *, unsigned char *,
|
gboolean, gint, gint, gint, gint);
|
||||||
unsigned char *, int, int, int);
|
|
||||||
static void bucket_fill_line_pattern (unsigned char *, unsigned char *,
|
|
||||||
TempBuf *, int, int, int, int, int);
|
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
|
@ -163,10 +160,10 @@ bucket_options_new (void)
|
||||||
/* fill type */
|
/* fill type */
|
||||||
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
frame = tool_options_radio_buttons_new (_("Fill Type"),
|
||||||
&options->fill_mode,
|
&options->fill_mode,
|
||||||
options->fill_mode_w,
|
options->fill_mode_w,
|
||||||
fill_mode_label,
|
fill_mode_label,
|
||||||
fill_mode_value,
|
fill_mode_value,
|
||||||
3);
|
3);
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (options->fill_mode_w[options->fill_mode_d]), TRUE);
|
||||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||||
gtk_widget_show (frame);
|
gtk_widget_show (frame);
|
||||||
|
@ -183,7 +180,7 @@ bucket_fill_button_press (Tool *tool,
|
||||||
{
|
{
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
int use_offsets;
|
gboolean use_offsets;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -196,7 +193,9 @@ bucket_fill_button_press (Tool *tool,
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
gdk_pointer_grab (gdisp->canvas->window, FALSE,
|
||||||
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
GDK_POINTER_MOTION_HINT_MASK |
|
||||||
|
GDK_BUTTON1_MOTION_MASK |
|
||||||
|
GDK_BUTTON_RELEASE_MASK,
|
||||||
NULL, NULL, bevent->time);
|
NULL, NULL, bevent->time);
|
||||||
|
|
||||||
/* Make the tool active and set the gdisplay which owns it */
|
/* Make the tool active and set the gdisplay which owns it */
|
||||||
|
@ -212,7 +211,7 @@ bucket_fill_button_release (Tool *tool,
|
||||||
GDisplay * gdisp;
|
GDisplay * gdisp;
|
||||||
BucketTool * bucket_tool;
|
BucketTool * bucket_tool;
|
||||||
Argument *return_vals;
|
Argument *return_vals;
|
||||||
int nreturn_vals;
|
gint nreturn_vals;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
bucket_tool = (BucketTool *) tool->private;
|
bucket_tool = (BucketTool *) tool->private;
|
||||||
|
@ -255,8 +254,8 @@ bucket_fill_cursor_update (Tool *tool,
|
||||||
GDisplay *gdisp;
|
GDisplay *gdisp;
|
||||||
Layer *layer;
|
Layer *layer;
|
||||||
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
||||||
int x, y;
|
gint x, y;
|
||||||
int off_x, off_y;
|
gint off_x, off_y;
|
||||||
|
|
||||||
gdisp = (GDisplay *) gdisp_ptr;
|
gdisp = (GDisplay *) gdisp_ptr;
|
||||||
|
|
||||||
|
@ -311,23 +310,24 @@ void
|
||||||
bucket_fill (GimpImage *gimage,
|
bucket_fill (GimpImage *gimage,
|
||||||
GimpDrawable *drawable,
|
GimpDrawable *drawable,
|
||||||
BucketFillMode fill_mode,
|
BucketFillMode fill_mode,
|
||||||
int paint_mode,
|
gint paint_mode,
|
||||||
double opacity,
|
gdouble opacity,
|
||||||
double threshold,
|
gdouble threshold,
|
||||||
int sample_merged,
|
gboolean sample_merged,
|
||||||
double x,
|
gdouble x,
|
||||||
double y)
|
gdouble y)
|
||||||
{
|
{
|
||||||
TileManager *buf_tiles;
|
TileManager *buf_tiles;
|
||||||
PixelRegion bufPR, maskPR;
|
PixelRegion bufPR, maskPR;
|
||||||
Channel * mask = NULL;
|
Channel *mask = NULL;
|
||||||
int bytes, has_alpha;
|
gint bytes;
|
||||||
int x1, y1, x2, y2;
|
gboolean has_alpha;
|
||||||
unsigned char col [MAX_CHANNELS];
|
gint x1, y1, x2, y2;
|
||||||
unsigned char *d1, *d2;
|
guchar col [MAX_CHANNELS];
|
||||||
GPatternP pattern;
|
guchar *d1, *d2;
|
||||||
TempBuf * pat_buf;
|
GPatternP pattern;
|
||||||
int new_buf = 0;
|
TempBuf *pat_buf;
|
||||||
|
gboolean new_buf = FALSE;
|
||||||
|
|
||||||
pat_buf = NULL;
|
pat_buf = NULL;
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
d2 += pat_buf->bytes;
|
d2 += pat_buf->bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buf = 1;
|
new_buf = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pat_buf = pattern->mask;
|
pat_buf = pattern->mask;
|
||||||
|
@ -423,7 +423,7 @@ bucket_fill (GimpImage *gimage,
|
||||||
if (! has_alpha)
|
if (! has_alpha)
|
||||||
{
|
{
|
||||||
bytes ++;
|
bytes ++;
|
||||||
has_alpha = 1;
|
has_alpha = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,16 +455,15 @@ bucket_fill (GimpImage *gimage,
|
||||||
gimp_remove_busy_cursors (NULL);
|
gimp_remove_busy_cursors (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_color (unsigned char *buf,
|
bucket_fill_line_color (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
|
|
||||||
alpha = (has_alpha) ? bytes - 1 : bytes;
|
alpha = (has_alpha) ? bytes - 1 : bytes;
|
||||||
while (width--)
|
while (width--)
|
||||||
|
@ -484,20 +483,19 @@ bucket_fill_line_color (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bucket_fill_line_pattern (unsigned char *buf,
|
bucket_fill_line_pattern (guchar *buf,
|
||||||
unsigned char *mask,
|
guchar *mask,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int has_alpha,
|
gboolean has_alpha,
|
||||||
int bytes,
|
gint bytes,
|
||||||
int x,
|
gint x,
|
||||||
int y,
|
gint y,
|
||||||
int width)
|
gint width)
|
||||||
{
|
{
|
||||||
unsigned char *pat, *p;
|
guchar *pat, *p;
|
||||||
int alpha, b;
|
gint alpha, b;
|
||||||
int i;
|
gint i;
|
||||||
|
|
||||||
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
/* Get a pointer to the appropriate scanline of the pattern buffer */
|
||||||
pat = temp_buf_data (pattern) +
|
pat = temp_buf_data (pattern) +
|
||||||
|
@ -523,22 +521,23 @@ bucket_fill_line_pattern (unsigned char *buf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
static void
|
|
||||||
bucket_fill_region (BucketFillMode fill_mode,
|
bucket_fill_region (BucketFillMode fill_mode,
|
||||||
PixelRegion *bufPR,
|
PixelRegion *bufPR,
|
||||||
PixelRegion *maskPR,
|
PixelRegion *maskPR,
|
||||||
unsigned char *col,
|
guchar *col,
|
||||||
TempBuf *pattern,
|
TempBuf *pattern,
|
||||||
int off_x,
|
gint off_x,
|
||||||
int off_y,
|
gint off_y,
|
||||||
int has_alpha)
|
gboolean has_alpha)
|
||||||
{
|
{
|
||||||
unsigned char *s, *m;
|
guchar *s, *m;
|
||||||
int y;
|
gint y;
|
||||||
void *pr;
|
void *pr;
|
||||||
|
|
||||||
for (pr = pixel_regions_register (2, bufPR, maskPR); pr != NULL; pr = pixel_regions_process (pr))
|
for (pr = pixel_regions_register (2, bufPR, maskPR);
|
||||||
|
pr != NULL;
|
||||||
|
pr = pixel_regions_process (pr))
|
||||||
{
|
{
|
||||||
s = bufPR->data;
|
s = bufPR->data;
|
||||||
if (maskPR)
|
if (maskPR)
|
||||||
|
|
|
@ -29,10 +29,26 @@ typedef enum
|
||||||
PATTERN_BUCKET_FILL
|
PATTERN_BUCKET_FILL
|
||||||
} BucketFillMode;
|
} BucketFillMode;
|
||||||
|
|
||||||
void bucket_fill (GimpImage *, GimpDrawable *, BucketFillMode, int,
|
void bucket_fill (GimpImage *gimage,
|
||||||
double, double, int, double, double);
|
GimpDrawable *drawable,
|
||||||
|
BucketFillMode fill_mode,
|
||||||
|
gint paint_mode,
|
||||||
|
gdouble opacity,
|
||||||
|
gdouble threshold,
|
||||||
|
gboolean sample_merged,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y);
|
||||||
|
|
||||||
|
void bucket_fill_region (BucketFillMode fill_mode,
|
||||||
|
PixelRegion *bufPR,
|
||||||
|
PixelRegion *maskPR,
|
||||||
|
guchar *col,
|
||||||
|
TempBuf *pattern,
|
||||||
|
gint off_x,
|
||||||
|
gint off_y,
|
||||||
|
gboolean has_alpha);
|
||||||
|
|
||||||
Tool * tools_new_bucket_fill (void);
|
Tool * tools_new_bucket_fill (void);
|
||||||
void tools_free_bucket_fill (Tool *);
|
void tools_free_bucket_fill (Tool *tool);
|
||||||
|
|
||||||
#endif /* __BUCKET_FILL_H__ */
|
#endif /* __BUCKET_FILL_H__ */
|
||||||
|
|
|
@ -46,24 +46,10 @@ static gint color_panel_events (GtkWidget *, GdkEvent *);
|
||||||
static void color_panel_select_callback (gint, gint, gint,
|
static void color_panel_select_callback (gint, gint, gint,
|
||||||
ColorNotebookState, void *);
|
ColorNotebookState, void *);
|
||||||
|
|
||||||
static void color_panel_drag_begin (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_panel_get_color (gpointer, guchar *, guchar *, guchar *);
|
||||||
static void color_panel_drag_end (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_panel_set_color (gpointer, guchar, guchar, guchar);
|
||||||
static void color_panel_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
static void color_panel_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd stuff */
|
||||||
static GtkTargetEntry color_panel_target_table[] =
|
static GtkTargetEntry color_panel_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_COLOR
|
GIMP_TARGET_COLOR
|
||||||
|
@ -71,6 +57,8 @@ static GtkTargetEntry color_panel_target_table[] =
|
||||||
static guint n_color_panel_targets = (sizeof (color_panel_target_table) /
|
static guint n_color_panel_targets = (sizeof (color_panel_target_table) /
|
||||||
sizeof (color_panel_target_table[0]));
|
sizeof (color_panel_target_table[0]));
|
||||||
|
|
||||||
|
/* public functions */
|
||||||
|
|
||||||
ColorPanel *
|
ColorPanel *
|
||||||
color_panel_new (guchar *initial,
|
color_panel_new (guchar *initial,
|
||||||
gint width,
|
gint width,
|
||||||
|
@ -111,34 +99,21 @@ color_panel_new (guchar *initial,
|
||||||
gtk_widget_show (private->drawing_area);
|
gtk_widget_show (private->drawing_area);
|
||||||
|
|
||||||
/* dnd stuff */
|
/* dnd stuff */
|
||||||
|
gtk_drag_source_set (private->drawing_area,
|
||||||
|
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||||
|
color_panel_target_table, n_color_panel_targets,
|
||||||
|
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||||
|
gimp_dnd_color_source_set (private->drawing_area,
|
||||||
|
color_panel_get_color, color_panel);
|
||||||
|
|
||||||
gtk_drag_dest_set (private->drawing_area,
|
gtk_drag_dest_set (private->drawing_area,
|
||||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||||
GTK_DEST_DEFAULT_MOTION |
|
GTK_DEST_DEFAULT_MOTION |
|
||||||
GTK_DEST_DEFAULT_DROP,
|
GTK_DEST_DEFAULT_DROP,
|
||||||
color_panel_target_table, n_color_panel_targets,
|
color_panel_target_table, n_color_panel_targets,
|
||||||
GDK_ACTION_COPY);
|
GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (private->drawing_area,
|
||||||
gtk_drag_source_set (private->drawing_area,
|
color_panel_set_color, color_panel);
|
||||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
|
||||||
color_panel_target_table, n_color_panel_targets,
|
|
||||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_begin",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_begin),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_end",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_end),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_data_get",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drag_handle),
|
|
||||||
color_panel);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (private->drawing_area),
|
|
||||||
"drag_data_received",
|
|
||||||
GTK_SIGNAL_FUNC (color_panel_drop_handle),
|
|
||||||
color_panel);
|
|
||||||
|
|
||||||
return color_panel;
|
return color_panel;
|
||||||
}
|
}
|
||||||
|
@ -163,6 +138,8 @@ color_panel_free (ColorPanel *color_panel)
|
||||||
g_free (color_panel);
|
g_free (color_panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* private functions */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_draw (ColorPanel *color_panel)
|
color_panel_draw (ColorPanel *color_panel)
|
||||||
{
|
{
|
||||||
|
@ -289,99 +266,33 @@ color_panel_select_callback (gint r,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_drag_begin (GtkWidget *widget,
|
color_panel_get_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar *r,
|
||||||
gpointer data)
|
guchar *g,
|
||||||
|
guchar *b)
|
||||||
{
|
{
|
||||||
ColorPanel *color_panel = data;
|
ColorPanel *color_panel = data;
|
||||||
GtkWidget *window;
|
|
||||||
GdkColor bg;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
*r = color_panel->color[0];
|
||||||
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
*g = color_panel->color[1];
|
||||||
gtk_widget_set_usize (window, 48, 32);
|
*b = color_panel->color[2];
|
||||||
gtk_widget_realize (window);
|
|
||||||
gtk_object_set_data_full (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-panel-drag-window",
|
|
||||||
window,
|
|
||||||
(GtkDestroyNotify) gtk_widget_destroy);
|
|
||||||
|
|
||||||
bg.red = 0xff * color_panel->color[0];
|
|
||||||
bg.green = 0xff * color_panel->color[1];
|
|
||||||
bg.blue = 0xff * color_panel->color[2];
|
|
||||||
|
|
||||||
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
|
||||||
gdk_window_set_background (window->window, &bg);
|
|
||||||
|
|
||||||
gtk_drag_set_icon_widget (context, window, -2, -2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_panel_drag_end (GtkWidget *widget,
|
color_panel_set_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar r,
|
||||||
gpointer data)
|
guchar g,
|
||||||
{
|
guchar b)
|
||||||
gtk_object_set_data (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-panel-drag-window", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
color_panel_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
ColorPanel *color_panel = data;
|
ColorPanel *color_panel = data;
|
||||||
ColorPanelPrivate *private = (ColorPanelPrivate *) color_panel->private_part;
|
ColorPanelPrivate *private = (ColorPanelPrivate *) color_panel->private_part;
|
||||||
guint16 *vals;
|
|
||||||
|
|
||||||
if (selection_data->length < 0)
|
color_panel->color[0] = r;
|
||||||
return;
|
color_panel->color[1] = g;
|
||||||
|
color_panel->color[2] = b;
|
||||||
if ((selection_data->format != 16) ||
|
|
||||||
(selection_data->length != 8))
|
|
||||||
{
|
|
||||||
g_warning ("Received invalid color data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = (guint16 *) selection_data->data;
|
|
||||||
|
|
||||||
color_panel->color[0] = vals[0] / 0xff;
|
|
||||||
color_panel->color[1] = vals[1] / 0xff;
|
|
||||||
color_panel->color[2] = vals[2] / 0xff;
|
|
||||||
|
|
||||||
if (private->color_notebook_active)
|
if (private->color_notebook_active)
|
||||||
color_notebook_set_color (private->color_notebook,
|
color_notebook_set_color (private->color_notebook, r, g, b, TRUE);
|
||||||
color_panel->color[0],
|
|
||||||
color_panel->color[1],
|
|
||||||
color_panel->color[2],
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
color_panel_draw (color_panel);
|
color_panel_draw (color_panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
color_panel_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
ColorPanel *color_panel = data;
|
|
||||||
guint16 vals[4];
|
|
||||||
|
|
||||||
vals[0] = color_panel->color[0] * 0xff;
|
|
||||||
vals[1] = color_panel->color[1] * 0xff;
|
|
||||||
vals[2] = color_panel->color[2] * 0xff;
|
|
||||||
vals[3] = 0xffff;
|
|
||||||
|
|
||||||
gtk_selection_data_set (selection_data,
|
|
||||||
gdk_atom_intern ("application/x-color", FALSE),
|
|
||||||
16, (guchar *) vals, 8);
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
#include "gimpdnd.h"
|
#include "gimpdnd.h"
|
||||||
#include "gimprc.h"
|
#include "gimprc.h"
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* drawable dnd functions */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
#define GRAD_CHECK_SIZE_SM 4
|
#define GRAD_CHECK_SIZE_SM 4
|
||||||
|
|
||||||
#define GRAD_CHECK_DARK (1.0 / 3.0)
|
#define GRAD_CHECK_DARK (1.0 / 3.0)
|
||||||
|
@ -214,3 +218,156 @@ gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
||||||
|
|
||||||
gdk_pixmap_unref (drag_pixmap);
|
gdk_pixmap_unref (drag_pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************/
|
||||||
|
/* color dnd functions */
|
||||||
|
/*************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_begin (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkWidget *window;
|
||||||
|
GdkColor bg;
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndGetColorFunc get_color_func;
|
||||||
|
|
||||||
|
get_color_func =
|
||||||
|
(GimpDndGetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_get_color_func");
|
||||||
|
|
||||||
|
if (! get_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window = gtk_window_new (GTK_WINDOW_POPUP);
|
||||||
|
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
||||||
|
gtk_widget_set_usize (window, 48, 32);
|
||||||
|
gtk_widget_realize (window);
|
||||||
|
gtk_object_set_data_full (GTK_OBJECT (widget),
|
||||||
|
"gimp-color-drag-window",
|
||||||
|
window,
|
||||||
|
(GtkDestroyNotify) gtk_widget_destroy);
|
||||||
|
|
||||||
|
(* get_color_func) (data, &r, &g, &b);
|
||||||
|
|
||||||
|
bg.red = 0xff * r;
|
||||||
|
bg.green = 0xff * g;
|
||||||
|
bg.blue = 0xff * b;
|
||||||
|
|
||||||
|
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
||||||
|
gdk_window_set_background (window->window, &bg);
|
||||||
|
|
||||||
|
gtk_drag_set_icon_widget (context, window, -2, -2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_end (GtkWidget *widget,
|
||||||
|
GdkDragContext *context)
|
||||||
|
{
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget),
|
||||||
|
"gimp-color-drag-window", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drag_handle (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
GtkSelectionData *selection_data,
|
||||||
|
guint info,
|
||||||
|
guint time,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
guint16 vals[4];
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndGetColorFunc get_color_func;
|
||||||
|
|
||||||
|
get_color_func =
|
||||||
|
(GimpDndGetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_get_color_func");
|
||||||
|
|
||||||
|
if (! get_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
(* get_color_func) (data, &r, &g, &b);
|
||||||
|
|
||||||
|
vals[0] = r * 0xff;
|
||||||
|
vals[1] = g * 0xff;
|
||||||
|
vals[2] = b * 0xff;
|
||||||
|
vals[3] = 0xffff;
|
||||||
|
|
||||||
|
gtk_selection_data_set (selection_data,
|
||||||
|
gdk_atom_intern ("application/x-color", FALSE),
|
||||||
|
16, (guchar *) vals, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_dnd_color_drop_handle (GtkWidget *widget,
|
||||||
|
GdkDragContext *context,
|
||||||
|
gint x,
|
||||||
|
gint y,
|
||||||
|
GtkSelectionData *selection_data,
|
||||||
|
guint info,
|
||||||
|
guint time,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
guint16 *vals;
|
||||||
|
guchar r, g, b;
|
||||||
|
GimpDndSetColorFunc set_color_func;
|
||||||
|
|
||||||
|
set_color_func =
|
||||||
|
(GimpDndSetColorFunc) gtk_object_get_data (GTK_OBJECT (widget),
|
||||||
|
"gimp_dnd_set_color_func");
|
||||||
|
|
||||||
|
if (! set_color_func)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (selection_data->length < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((selection_data->format != 16) ||
|
||||||
|
(selection_data->length != 8))
|
||||||
|
{
|
||||||
|
g_warning ("Received invalid color data\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vals = (guint16 *) selection_data->data;
|
||||||
|
|
||||||
|
r = vals[0] / 0xff;
|
||||||
|
g = vals[1] / 0xff;
|
||||||
|
b = vals[2] / 0xff;
|
||||||
|
|
||||||
|
(* set_color_func) (data, r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_dnd_color_source_set (GtkWidget *widget,
|
||||||
|
GimpDndGetColorFunc get_color_func,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_begin",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_begin),
|
||||||
|
data);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_end",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_end),
|
||||||
|
data);
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_data_get",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drag_handle),
|
||||||
|
data);
|
||||||
|
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget), "gimp_dnd_get_color_func",
|
||||||
|
(gpointer) get_color_func);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_dnd_color_dest_set (GtkWidget *widget,
|
||||||
|
GimpDndSetColorFunc set_color_func,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gtk_signal_connect (GTK_OBJECT (widget), "drag_data_received",
|
||||||
|
GTK_SIGNAL_FUNC (gimp_dnd_color_drop_handle),
|
||||||
|
data);
|
||||||
|
|
||||||
|
gtk_object_set_data (GTK_OBJECT (widget), "gimp_dnd_set_color_func",
|
||||||
|
(gpointer) set_color_func);
|
||||||
|
}
|
||||||
|
|
|
@ -73,9 +73,24 @@ typedef enum
|
||||||
GIMP_DROP_BELOW
|
GIMP_DROP_BELOW
|
||||||
} GimpDropType;
|
} GimpDropType;
|
||||||
|
|
||||||
|
/* drawable dnd functions */
|
||||||
|
|
||||||
void gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
void gimp_dnd_set_drawable_preview_icon (GtkWidget *widget,
|
||||||
GdkDragContext *context,
|
GdkDragContext *context,
|
||||||
GimpDrawable *drawable,
|
GimpDrawable *drawable,
|
||||||
GdkGC *gc);
|
GdkGC *gc);
|
||||||
|
|
||||||
|
/* color dnd functions */
|
||||||
|
|
||||||
|
typedef void (*GimpDndSetColorFunc) (gpointer, guchar, guchar, guchar);
|
||||||
|
typedef void (*GimpDndGetColorFunc) (gpointer, guchar *, guchar *, guchar *);
|
||||||
|
|
||||||
|
void gimp_dnd_color_source_set (GtkWidget *widget,
|
||||||
|
GimpDndGetColorFunc get_color_func,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
|
void gimp_dnd_color_dest_set (GtkWidget *widget,
|
||||||
|
GimpDndSetColorFunc set_color_func,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
#endif /* __GIMP_DND_H__ */
|
#endif /* __GIMP_DND_H__ */
|
||||||
|
|
|
@ -35,25 +35,11 @@ typedef enum
|
||||||
} ColorAreaTarget;
|
} ColorAreaTarget;
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static void color_area_drag_begin (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_set_color (gpointer, guchar, guchar, guchar);
|
||||||
static void color_area_drag_end (GtkWidget *, GdkDragContext *, gpointer);
|
static void color_area_get_color (gpointer, guchar *, guchar *, guchar *);
|
||||||
static void color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
static void color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
gint active_color = 0;
|
gint active_color = FOREGROUND;
|
||||||
|
|
||||||
/* Static variables */
|
/* Static variables */
|
||||||
static GdkGC *color_area_gc = NULL;
|
static GdkGC *color_area_gc = NULL;
|
||||||
|
@ -67,7 +53,7 @@ static gint edit_color;
|
||||||
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
static guchar revert_fg_r, revert_fg_g, revert_fg_b;
|
||||||
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
static guchar revert_bg_r, revert_bg_g, revert_bg_b;
|
||||||
|
|
||||||
/* dnd structures */
|
/* dnd stuff */
|
||||||
static GtkTargetEntry color_area_target_table[] =
|
static GtkTargetEntry color_area_target_table[] =
|
||||||
{
|
{
|
||||||
GIMP_TARGET_COLOR
|
GIMP_TARGET_COLOR
|
||||||
|
@ -268,16 +254,13 @@ color_area_edit (void)
|
||||||
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
palette_get_foreground (&revert_fg_r, &revert_fg_g, &revert_fg_b);
|
||||||
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
palette_get_background (&revert_bg_r, &revert_bg_g, &revert_bg_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
{
|
palette_get_foreground (&r, &g, &b);
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
edit_color = FOREGROUND;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
palette_get_background (&r, &g, &b);
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
edit_color = BACKGROUND;
|
edit_color = active_color;
|
||||||
}
|
|
||||||
|
|
||||||
if (! color_notebook)
|
if (! color_notebook)
|
||||||
{
|
{
|
||||||
|
@ -333,7 +316,36 @@ color_area_events (GtkWidget *widget,
|
||||||
bevent = (GdkEventButton *) event;
|
bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
if (bevent->button == 1)
|
if (bevent->button == 1)
|
||||||
press_target = color_area_target (bevent->x, bevent->y);
|
{
|
||||||
|
target = color_area_target (bevent->x, bevent->y);
|
||||||
|
press_target = INVALID_AREA;
|
||||||
|
|
||||||
|
switch (target)
|
||||||
|
{
|
||||||
|
case FORE_AREA:
|
||||||
|
case BACK_AREA:
|
||||||
|
if (target != active_color)
|
||||||
|
{
|
||||||
|
active_color = target;
|
||||||
|
color_area_draw ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
press_target = target;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SWAP_AREA:
|
||||||
|
palette_swap_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
case DEF_AREA:
|
||||||
|
palette_set_default_colors ();
|
||||||
|
color_area_draw ();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_BUTTON_RELEASE:
|
case GDK_BUTTON_RELEASE:
|
||||||
|
@ -349,23 +361,7 @@ color_area_events (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
case FORE_AREA:
|
case FORE_AREA:
|
||||||
case BACK_AREA:
|
case BACK_AREA:
|
||||||
if (target == active_color)
|
color_area_edit ();
|
||||||
{
|
|
||||||
color_area_edit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
active_color = target;
|
|
||||||
color_area_draw ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SWAP_AREA:
|
|
||||||
palette_swap_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
|
||||||
case DEF_AREA:
|
|
||||||
palette_set_default_colors();
|
|
||||||
color_area_draw ();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -405,34 +401,19 @@ color_area_create (gint width,
|
||||||
swap_pixmap = swap_pmap;
|
swap_pixmap = swap_pmap;
|
||||||
|
|
||||||
/* dnd stuff */
|
/* dnd stuff */
|
||||||
|
gtk_drag_source_set (color_area,
|
||||||
|
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
||||||
|
color_area_target_table, n_color_area_targets,
|
||||||
|
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
||||||
|
gimp_dnd_color_source_set (color_area, color_area_get_color, NULL);
|
||||||
|
|
||||||
gtk_drag_dest_set (color_area,
|
gtk_drag_dest_set (color_area,
|
||||||
GTK_DEST_DEFAULT_HIGHLIGHT |
|
GTK_DEST_DEFAULT_HIGHLIGHT |
|
||||||
GTK_DEST_DEFAULT_MOTION |
|
GTK_DEST_DEFAULT_MOTION |
|
||||||
GTK_DEST_DEFAULT_DROP,
|
GTK_DEST_DEFAULT_DROP,
|
||||||
color_area_target_table, n_color_area_targets,
|
color_area_target_table, n_color_area_targets,
|
||||||
GDK_ACTION_COPY);
|
GDK_ACTION_COPY);
|
||||||
|
gimp_dnd_color_dest_set (color_area, color_area_set_color, NULL);
|
||||||
gtk_drag_source_set (color_area,
|
|
||||||
GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
|
|
||||||
color_area_target_table, n_color_area_targets,
|
|
||||||
GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
||||||
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_begin",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_begin),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_end",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_end),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_get",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drag_handle),
|
|
||||||
color_area);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (color_area),
|
|
||||||
"drag_data_received",
|
|
||||||
GTK_SIGNAL_FUNC (color_area_drop_handle),
|
|
||||||
color_area);
|
|
||||||
|
|
||||||
return color_area;
|
return color_area;
|
||||||
}
|
}
|
||||||
|
@ -444,76 +425,23 @@ color_area_update ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_begin (GtkWidget *widget,
|
color_area_get_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar *r,
|
||||||
gpointer data)
|
guchar *g,
|
||||||
|
guchar *b)
|
||||||
{
|
{
|
||||||
GtkWidget *window;
|
|
||||||
GdkColor bg;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
|
||||||
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
|
|
||||||
gtk_widget_set_usize (window, 48, 32);
|
|
||||||
gtk_widget_realize (window);
|
|
||||||
gtk_object_set_data_full (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window",
|
|
||||||
window,
|
|
||||||
(GtkDestroyNotify) gtk_widget_destroy);
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
if (active_color == FOREGROUND)
|
||||||
palette_get_foreground (&r, &g, &b);
|
palette_get_foreground (r, g, b);
|
||||||
else
|
else
|
||||||
palette_get_background (&r, &g, &b);
|
palette_get_background (r, g, b);
|
||||||
|
|
||||||
bg.red = 0xff * r;
|
|
||||||
bg.green = 0xff * g;
|
|
||||||
bg.blue = 0xff * b;
|
|
||||||
|
|
||||||
gdk_color_alloc (gtk_widget_get_colormap (window), &bg);
|
|
||||||
gdk_window_set_background (window->window, &bg);
|
|
||||||
|
|
||||||
gtk_drag_set_icon_widget (context, window, -2, -2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
color_area_drag_end (GtkWidget *widget,
|
color_area_set_color (gpointer data,
|
||||||
GdkDragContext *context,
|
guchar r,
|
||||||
gpointer data)
|
guchar g,
|
||||||
|
guchar b)
|
||||||
{
|
{
|
||||||
gtk_object_set_data (GTK_OBJECT (widget),
|
|
||||||
"gimp-color-area-drag-window", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drop_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
gint x,
|
|
||||||
gint y,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 *vals;
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (selection_data->length < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((selection_data->format != 16) ||
|
|
||||||
(selection_data->length != 8))
|
|
||||||
{
|
|
||||||
g_warning ("Received invalid color data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = (guint16 *) selection_data->data;
|
|
||||||
|
|
||||||
r = vals[0] / 0xff;
|
|
||||||
g = vals[1] / 0xff;
|
|
||||||
b = vals[2] / 0xff;
|
|
||||||
|
|
||||||
if (color_notebook_active &&
|
if (color_notebook_active &&
|
||||||
active_color == edit_color)
|
active_color == edit_color)
|
||||||
{
|
{
|
||||||
|
@ -527,29 +455,3 @@ color_area_drop_handle (GtkWidget *widget,
|
||||||
palette_set_background (r, g, b);
|
palette_set_background (r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
color_area_drag_handle (GtkWidget *widget,
|
|
||||||
GdkDragContext *context,
|
|
||||||
GtkSelectionData *selection_data,
|
|
||||||
guint info,
|
|
||||||
guint time,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
guint16 vals[4];
|
|
||||||
guchar r, g, b;
|
|
||||||
|
|
||||||
if (active_color == FOREGROUND)
|
|
||||||
palette_get_foreground (&r, &g, &b);
|
|
||||||
else
|
|
||||||
palette_get_background (&r, &g, &b);
|
|
||||||
|
|
||||||
vals[0] = r * 0xff;
|
|
||||||
vals[1] = g * 0xff;
|
|
||||||
vals[2] = b * 0xff;
|
|
||||||
vals[3] = 0xffff;
|
|
||||||
|
|
||||||
gtk_selection_data_set (selection_data,
|
|
||||||
gdk_atom_intern ("application/x-color", FALSE),
|
|
||||||
16, (guchar *) vals, 8);
|
|
||||||
}
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ pnm
|
||||||
polar
|
polar
|
||||||
ps
|
ps
|
||||||
psd
|
psd
|
||||||
|
psp
|
||||||
randomize
|
randomize
|
||||||
ripple
|
ripple
|
||||||
rotate
|
rotate
|
||||||
|
|
Loading…
Reference in New Issue