static void gimp_color_tool_real_picked (GimpColorTool *color_tool, GimpColorPickState pick_state, GimpImageType sample_type, GimpRGB *color, gint color_index) { GimpTool *tool = GIMP_TOOL (color_tool); GimpContext *context; GimpDialogFactory *dialog_factory; /* use this tool's own options here (NOT color_tool->options) */ context = GIMP_CONTEXT (gimp_tool_get_options (tool)); dialog_factory = gimp_dialog_factory_from_name ("dock"); if (color_tool->pick_mode == GIMP_COLOR_PICK_MODE_FOREGROUND || color_tool->pick_mode == GIMP_COLOR_PICK_MODE_BACKGROUND) { GimpSessionInfo *info; if (GIMP_IMAGE_TYPE_IS_INDEXED (sample_type)) { info = gimp_dialog_factory_find_session_info (dialog_factory, "gimp-indexed-palette"); if (info && info->widget) { GimpColormapEditor *editor; editor = GIMP_COLORMAP_EDITOR (gtk_bin_get_child (GTK_BIN (info->widget))); gimp_colormap_editor_set_index (editor, color_index, NULL); } } if (TRUE) { info = gimp_dialog_factory_find_session_info (dialog_factory, "gimp-palette-editor"); if (info && info->widget) { GimpPaletteEditor *editor; gint index; editor = GIMP_PALETTE_EDITOR (gtk_bin_get_child (GTK_BIN (info->widget))); index = gimp_palette_editor_get_index (editor, color); if (index != -1) gimp_palette_editor_set_index (editor, index, NULL); } } } switch (color_tool->pick_mode) { case GIMP_COLOR_PICK_MODE_NONE: break; case GIMP_COLOR_PICK_MODE_FOREGROUND: gimp_context_set_foreground (context, color); break; case GIMP_COLOR_PICK_MODE_BACKGROUND: gimp_context_set_background (context, color); break; case GIMP_COLOR_PICK_MODE_PALETTE: { GdkScreen *screen; GtkWidget *dockable; screen = gtk_widget_get_screen (tool->display->shell); dockable = gimp_dialog_factory_dialog_raise (dialog_factory, screen, "gimp-palette-editor", -1); if (dockable) { GtkWidget *palette_editor; GimpData *data; /* don't blink like mad when updating */ if (pick_state == GIMP_COLOR_PICK_STATE_UPDATE) gimp_dockable_blink_cancel (GIMP_DOCKABLE (dockable)); palette_editor = gtk_bin_get_child (GTK_BIN (dockable)); data = gimp_data_editor_get_data (GIMP_DATA_EDITOR (palette_editor)); if (! data) { data = GIMP_DATA (gimp_context_get_palette (context)); gimp_data_editor_set_data (GIMP_DATA_EDITOR (palette_editor), data); } gimp_palette_editor_pick_color (GIMP_PALETTE_EDITOR (palette_editor), color, pick_state); } } break; } }
void drawable_actions_update (GimpActionGroup *group, gpointer data) { GimpImage *image; GimpDrawable *drawable = NULL; gboolean is_rgb = FALSE; gboolean is_gray = FALSE; gboolean is_indexed = FALSE; gboolean visible = FALSE; gboolean linked = FALSE; gboolean locked = FALSE; gboolean can_lock = FALSE; gboolean writable = FALSE; gboolean children = FALSE; image = action_data_get_image (data); if (image) { drawable = gimp_image_get_active_drawable (image); if (drawable) { GimpImageType drawable_type = gimp_drawable_type (drawable); GimpItem *item; is_rgb = GIMP_IMAGE_TYPE_IS_RGB (drawable_type); is_gray = GIMP_IMAGE_TYPE_IS_GRAY (drawable_type); is_indexed = GIMP_IMAGE_TYPE_IS_INDEXED (drawable_type); if (GIMP_IS_LAYER_MASK (drawable)) item = GIMP_ITEM (gimp_layer_mask_get_layer (GIMP_LAYER_MASK (drawable))); else item = GIMP_ITEM (drawable); visible = gimp_item_get_visible (item); linked = gimp_item_get_linked (item); locked = gimp_item_get_lock_content (item); can_lock = gimp_item_can_lock_content (item); writable = ! gimp_item_is_content_locked (item); if (gimp_viewable_get_children (GIMP_VIEWABLE (drawable))) children = TRUE; } } #define SET_SENSITIVE(action,condition) \ gimp_action_group_set_action_sensitive (group, action, (condition) != 0) #define SET_ACTIVE(action,condition) \ gimp_action_group_set_action_active (group, action, (condition) != 0) SET_SENSITIVE ("drawable-equalize", writable && !children && !is_indexed); SET_SENSITIVE ("drawable-invert", writable && !children && !is_indexed); SET_SENSITIVE ("drawable-levels-stretch", writable && !children && is_rgb); SET_SENSITIVE ("drawable-offset", writable && !children); SET_SENSITIVE ("drawable-visible", drawable); SET_SENSITIVE ("drawable-linked", drawable); SET_SENSITIVE ("drawable-lock-content", can_lock); SET_ACTIVE ("drawable-visible", visible); SET_ACTIVE ("drawable-linked", linked); SET_ACTIVE ("drawable-lock-content", locked); SET_SENSITIVE ("drawable-flip-horizontal", writable); SET_SENSITIVE ("drawable-flip-vertical", writable); SET_SENSITIVE ("drawable-rotate-90", writable); SET_SENSITIVE ("drawable-rotate-180", writable); SET_SENSITIVE ("drawable-rotate-270", writable); #undef SET_SENSITIVE #undef SET_ACTIVE }
gboolean gimp_pickable_pick_color (GimpPickable *pickable, gint x, gint y, gboolean sample_average, gdouble average_radius, GimpRGB *color, gint *color_index) { GimpImage *image; GimpImageType type; guchar pixel[4]; guchar col[4]; g_return_val_if_fail (GIMP_IS_PICKABLE (pickable), FALSE); if (! gimp_pickable_get_pixel_at (pickable, x, y, pixel)) return FALSE; image = gimp_pickable_get_image (pickable); type = gimp_pickable_get_image_type (pickable); if (sample_average) { gint count = 0; gint color_avg[4] = { 0, 0, 0, 0 }; gint radius = (gint) average_radius; gint i, j; for (i = x - radius; i <= x + radius; i++) for (j = y - radius; j <= y + radius; j++) if (gimp_pickable_get_pixel_at (pickable, i, j, pixel)) { count++; gimp_image_get_color (image, type, pixel, col); color_avg[RED] += col[RED]; color_avg[GREEN] += col[GREEN]; color_avg[BLUE] += col[BLUE]; color_avg[ALPHA] += col[ALPHA]; } col[RED] = (guchar) ((color_avg[RED] + count / 2) / count); col[GREEN] = (guchar) ((color_avg[GREEN] + count / 2) / count); col[BLUE] = (guchar) ((color_avg[BLUE] + count / 2) / count); col[ALPHA] = (guchar) ((color_avg[ALPHA] + count / 2) / count); } else { gimp_image_get_color (image, type, pixel, col); } gimp_rgba_set_uchar (color, col[RED], col[GREEN], col[BLUE], col[ALPHA]); if (color_index) { if (GIMP_IMAGE_TYPE_IS_INDEXED (type) && ! sample_average) *color_index = pixel[0]; else *color_index = -1; } return TRUE; }