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:
Michael Natterer 1999-08-23 14:19:26 +00:00 committed by Michael Natterer
parent 5f2d497b40
commit ef4cb06bb7
28 changed files with 1225 additions and 1003 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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__ */

View File

@ -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 ();
} }
} }

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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 ();
} }
} }

View File

@ -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);
}

View File

@ -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);

View File

@ -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)

View File

@ -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__ */

View File

@ -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)

View File

@ -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__ */

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);
}

View File

@ -85,6 +85,7 @@ pnm
polar polar
ps ps
psd psd
psp
randomize randomize
ripple ripple
rotate rotate