/** * gimp_color_selection_set_show_alpha: * @selection: A #GimpColorSelection widget. * @show_alpha: The new @show_alpha setting. * * Sets the @show_alpha property of the @selection widget. **/ void gimp_color_selection_set_show_alpha (GimpColorSelection *selection, gboolean show_alpha) { g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); if (show_alpha != selection->show_alpha) { selection->show_alpha = show_alpha ? TRUE : FALSE; gimp_color_selector_set_show_alpha (GIMP_COLOR_SELECTOR (selection->notebook), selection->show_alpha); gimp_color_selector_set_show_alpha (GIMP_COLOR_SELECTOR (selection->scales), selection->show_alpha); gimp_color_area_set_type (GIMP_COLOR_AREA (selection->new_color), selection->show_alpha ? GIMP_COLOR_AREA_SMALL_CHECKS : GIMP_COLOR_AREA_FLAT); gimp_color_area_set_type (GIMP_COLOR_AREA (selection->old_color), selection->show_alpha ? GIMP_COLOR_AREA_SMALL_CHECKS : GIMP_COLOR_AREA_FLAT); } }
static void gimp_color_history_color_changed (GtkWidget *widget, gpointer data) { GimpRGB changed_color; gint color_index; GList *list; gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &changed_color); color_index = GPOINTER_TO_INT (data); color_history_set (color_index, &changed_color); for (list = color_dialogs; list; list = g_list_next (list)) { GimpColorDialog *dialog = list->data; if (dialog->history[color_index] != widget) { g_signal_handlers_block_by_func (dialog->history[color_index], gimp_color_history_color_changed, data); gimp_color_area_set_color (GIMP_COLOR_AREA (dialog->history[color_index]), &changed_color); g_signal_handlers_unblock_by_func (dialog->history[color_index], gimp_color_history_color_changed, data); } } }
/** * gimp_color_selection_set_config: * @selection: A #GimpColorSelection widget. * @config: A #GimpColorConfig object. * * Sets the color management configuration to use with this color selection. * * Since: 2.4 */ void gimp_color_selection_set_config (GimpColorSelection *selection, GimpColorConfig *config) { g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config)); gimp_color_selector_set_config (GIMP_COLOR_SELECTOR (selection->notebook), config); gimp_color_selector_set_config (GIMP_COLOR_SELECTOR (selection->scales), config); gimp_color_area_set_color_config (GIMP_COLOR_AREA (selection->old_color), config); gimp_color_area_set_color_config (GIMP_COLOR_AREA (selection->new_color), config); }
void gimp_color_frame_set_color_config (GimpColorFrame *frame, GimpColorConfig *config) { g_return_if_fail (GIMP_IS_COLOR_FRAME (frame)); g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config)); if (config != frame->config) { if (frame->config) { g_signal_handlers_disconnect_by_func (frame->config, gimp_color_frame_destroy_transform, frame); g_object_unref (frame->config); gimp_color_frame_destroy_transform (frame); } frame->config = config; if (frame->config) { g_object_ref (frame->config); g_signal_connect_swapped (frame->config, "notify", G_CALLBACK (gimp_color_frame_destroy_transform), frame); } gimp_color_area_set_color_config (GIMP_COLOR_AREA (frame->color_area), config); } }
static void hue_saturation_update_color_areas (GimpHueSaturationTool *hs_tool) { static GimpRGB default_colors[6] = { { 1.0, 0, 0, }, { 1.0, 1.0, 0, }, { 0, 1.0, 0, }, { 0, 1.0, 1.0, }, { 0, 0, 1.0, }, { 1.0, 0, 1.0, } }; gint i; for (i = 0; i < 6; i++) { GimpRGB color = default_colors[i]; gimp_operation_hue_saturation_map (hs_tool->config, &color, i + 1, &color); gimp_color_area_set_color (GIMP_COLOR_AREA (hs_tool->hue_range_color_area[i]), &color); } }
/** * gimp_color_button_has_alpha: * @button: Pointer to a #GimpColorButton. * * Checks whether the @buttons shows transparency information. * * Returns: %TRUE if the @button shows transparency information, %FALSE * otherwise. **/ gboolean gimp_color_button_has_alpha (GimpColorButton *button) { g_return_val_if_fail (GIMP_IS_COLOR_BUTTON (button), FALSE); return gimp_color_area_has_alpha (GIMP_COLOR_AREA (button->color_area)); }
static void gimp_color_area_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) { GimpColorArea *area = GIMP_COLOR_AREA (widget); GimpRGB color; guint16 *vals; if (selection_data->length < 0) return; if ((selection_data->format != 16) || (selection_data->length != 8)) { g_warning ("Received invalid color data"); return; } vals = (guint16 *)selection_data->data; gimp_rgba_set (&color, (gdouble) vals[0] / 0xffff, (gdouble) vals[1] / 0xffff, (gdouble) vals[2] / 0xffff, (gdouble) vals[3] / 0xffff); gimp_color_area_set_color (area, &color); }
static void gimp_color_area_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GimpColorArea *area = GIMP_COLOR_AREA (object); switch (property_id) { case PROP_COLOR: g_value_set_boxed (value, &area->color); break; case PROP_TYPE: g_value_set_enum (value, area->type); break; case PROP_DRAW_BORDER: g_value_set_boolean (value, area->draw_border); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static void gimp_color_area_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) { GimpColorArea *area = GIMP_COLOR_AREA (widget); const guint16 *vals; GimpRGB color; if (gtk_selection_data_get_length (selection_data) != 8 || gtk_selection_data_get_format (selection_data) != 16) { g_warning ("%s: received invalid color data", G_STRFUNC); return; } vals = (const guint16 *) gtk_selection_data_get_data (selection_data); gimp_rgba_set (&color, (gdouble) vals[0] / 0xffff, (gdouble) vals[1] / 0xffff, (gdouble) vals[2] / 0xffff, (gdouble) vals[3] / 0xffff); gimp_color_area_set_color (area, &color); }
/** * gimp_color_button_get_color: * @button: Pointer to a #GimpColorButton. * @color: Pointer to a #GimpRGB struct used to return the color. * * Retrieves the currently set color from the @button. **/ void gimp_color_button_get_color (GimpColorButton *button, GimpRGB *color) { g_return_if_fail (GIMP_IS_COLOR_BUTTON (button)); g_return_if_fail (color != NULL); gimp_color_area_get_color (GIMP_COLOR_AREA (button->color_area), color); }
/** * gimp_color_selection_get_old_color: * @selection: A #GimpColorSelection widget. * @color: Return location for the @selection's old @color. * * This function returns the #GimpColorSelection's old color. **/ void gimp_color_selection_get_old_color (GimpColorSelection *selection, GimpRGB *color) { g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); g_return_if_fail (color != NULL); gimp_color_area_get_color (GIMP_COLOR_AREA (selection->old_color), color); }
/** * gimp_color_button_set_type: * @button: Pointer to a #GimpColorButton. * @type: the new #GimpColorAreaType * * Sets the @button to the given @type. See also gimp_color_area_set_type(). **/ void gimp_color_button_set_type (GimpColorButton *button, GimpColorAreaType type) { g_return_if_fail (GIMP_IS_COLOR_BUTTON (button)); gimp_color_area_set_type (GIMP_COLOR_AREA (button->color_area), type); g_object_notify (G_OBJECT (button), "type"); }
/** * gimp_color_selection_reset: * @selection: A #GimpColorSelection widget. * * Sets the #GimpColorSelection's current color to its old color. **/ void gimp_color_selection_reset (GimpColorSelection *selection) { GimpRGB color; g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); gimp_color_area_get_color (GIMP_COLOR_AREA (selection->old_color), &color); gimp_color_selection_set_color (selection, &color); }
/** * gimp_color_button_set_color: * @button: Pointer to a #GimpColorButton. * @color: Pointer to the new #GimpRGB color. * * Sets the @button to the given @color. **/ void gimp_color_button_set_color (GimpColorButton *button, const GimpRGB *color) { g_return_if_fail (GIMP_IS_COLOR_BUTTON (button)); g_return_if_fail (color != NULL); gimp_color_area_set_color (GIMP_COLOR_AREA (button->color_area), color); g_object_notify (G_OBJECT (button), "color"); }
static void gimp_color_selection_new_color_changed (GtkWidget *widget, GimpColorSelection *selection) { gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &selection->rgb); gimp_rgb_to_hsv (&selection->rgb, &selection->hsv); gimp_color_selection_update (selection, UPDATE_NOTEBOOK | UPDATE_SCALES | UPDATE_ENTRY); gimp_color_selection_color_changed (selection); }
static void gimp_color_area_drag_begin (GtkWidget *widget, GdkDragContext *context) { GimpRGB color; GtkWidget *window; GtkWidget *frame; GtkWidget *color_area; window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DND); gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget)); gtk_widget_realize (window); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_container_add (GTK_CONTAINER (window), frame); gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &color); color_area = gimp_color_area_new (&color, GIMP_COLOR_AREA (widget)->type, 0); gtk_widget_set_size_request (color_area, DRAG_PREVIEW_SIZE, DRAG_PREVIEW_SIZE); gtk_container_add (GTK_CONTAINER (frame), color_area); gtk_widget_show (color_area); gtk_widget_show (frame); g_object_set_data_full (G_OBJECT (widget), "gimp-color-area-drag-window", window, (GDestroyNotify) gtk_widget_destroy); gtk_drag_set_icon_widget (context, window, DRAG_ICON_OFFSET, DRAG_ICON_OFFSET); }
static void gimp_color_area_state_changed (GtkWidget *widget, GtkStateType previous_state) { if (widget->state == GTK_STATE_INSENSITIVE || previous_state == GTK_STATE_INSENSITIVE) { GIMP_COLOR_AREA (widget)->needs_render = TRUE; } if (GTK_WIDGET_CLASS (parent_class)->state_changed) GTK_WIDGET_CLASS (parent_class)->state_changed (widget, previous_state); }
static void gimp_color_area_finalize (GObject *object) { GimpColorArea *area = GIMP_COLOR_AREA (object); if (area->buf) { g_free (area->buf); area->buf = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gimp_color_history_color_clicked (GtkWidget *widget, GimpColorDialog *dialog) { GimpColorArea *color_area; GimpRGB color; color_area = GIMP_COLOR_AREA (gtk_bin_get_child (GTK_BIN (widget))); gimp_color_area_get_color (color_area, &color); gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection), &color); }
static void gimp_color_history_color_clicked (GtkWidget *widget, GimpColorHistory *history) { GimpColorArea *color_area; GimpRGB color; color_area = GIMP_COLOR_AREA (gtk_bin_get_child (GTK_BIN (widget))); gimp_color_area_get_color (color_area, &color); g_signal_emit (history, history_signals[COLOR_SELECTED], 0, &color); }
static void gimp_color_history_color_changed (GtkWidget *widget, gpointer data) { GimpColorHistory *history; GimpPalette *palette; GimpRGB color; history = GIMP_COLOR_HISTORY (gtk_widget_get_ancestor (widget, GIMP_TYPE_COLOR_HISTORY)); palette = gimp_palettes_get_color_history (history->context->gimp); gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &color); gimp_palette_set_entry_color (palette, GPOINTER_TO_INT (data), &color); }
static gboolean gimp_color_area_expose (GtkWidget *widget, GdkEventExpose *event) { GimpColorArea *area = GIMP_COLOR_AREA (widget); GtkStyle *style = gtk_widget_get_style (widget); cairo_t *cr; cairo_surface_t *buffer; if (! area->buf || ! gtk_widget_is_drawable (widget)) return FALSE; if (area->needs_render) gimp_color_area_render (area); cr = gdk_cairo_create (gtk_widget_get_window (widget)); gdk_cairo_region (cr, event->region); cairo_clip (cr); buffer = cairo_image_surface_create_for_data (area->buf, CAIRO_FORMAT_RGB24, area->width, area->height, area->rowstride); cairo_set_source_surface (cr, buffer, 0.0, 0.0); cairo_surface_destroy (buffer); cairo_paint (cr); if (area->draw_border) { cairo_set_line_width (cr, 1.0); gdk_cairo_set_source_color (cr, &style->fg[gtk_widget_get_state (widget)]); cairo_rectangle (cr, 0.5, 0.5, area->width - 1, area->height - 1); cairo_stroke (cr); } cairo_destroy (cr); return FALSE; }
static void gimp_color_history_add_clicked (GtkWidget *widget, GimpColorDialog *dialog) { GimpRGB color; gint shift_begin; gint i; gimp_color_selection_get_color (GIMP_COLOR_SELECTION (dialog->selection), &color); shift_begin = color_history_add (&color); for (i = shift_begin; i >= 0; i--) { color_history_get (i, &color); gimp_color_area_set_color (GIMP_COLOR_AREA (dialog->history[i]), &color); } }
static void gimp_color_picker_tool_info_update (GimpColorPickerTool *picker_tool, GimpImageType sample_type, const GimpRGB *color, gint color_index) { gimp_color_area_set_color (GIMP_COLOR_AREA (picker_tool->color_area), color); gimp_color_frame_set_color (GIMP_COLOR_FRAME (picker_tool->color_frame1), sample_type, color, color_index); gimp_color_frame_set_color (GIMP_COLOR_FRAME (picker_tool->color_frame2), sample_type, color, color_index); /* don't use gtk_window_present() because it would focus the dialog */ if (gtk_widget_get_visible (picker_tool->dialog)) gdk_window_show (gtk_widget_get_window (picker_tool->dialog)); else gtk_widget_show (picker_tool->dialog); }
static WidgetInfo * create_color_area (void) { GtkWidget *vbox; GtkWidget *area; GtkWidget *align; GimpRGB color; color_init (&color); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); align = gtk_alignment_new (0.5, 0.5, 0.5, 1.0); area = gimp_color_area_new (&color, GIMP_COLOR_AREA_SMALL_CHECKS, 0); gimp_color_area_set_draw_border (GIMP_COLOR_AREA (area), TRUE); gtk_widget_set_size_request (area, -1, 25); gtk_container_add (GTK_CONTAINER (align), area); gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Color Area"), FALSE, FALSE, 0); return new_widget_info ("gimp-widget-color-area", vbox, SMALL); }
static void gimp_color_area_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GimpColorArea *area = GIMP_COLOR_AREA (object); GdkModifierType drag_mask; switch (property_id) { case PROP_COLOR: gimp_color_area_set_color (area, g_value_get_boxed (value)); break; case PROP_TYPE: gimp_color_area_set_type (area, g_value_get_enum (value)); break; case PROP_DRAG_MASK: drag_mask = g_value_get_flags (value) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK); if (drag_mask) gtk_drag_source_set (GTK_WIDGET (area), drag_mask, &target, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); break; case PROP_DRAW_BORDER: gimp_color_area_set_draw_border (area, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
static void gimp_color_button_selection_changed (GtkWidget *selection, GimpColorButton *button) { if (button->continuous_update) { GimpRGB color; gimp_color_selection_get_color (GIMP_COLOR_SELECTION (selection), &color); g_signal_handlers_block_by_func (button->color_area, gimp_color_button_area_changed, button); gimp_color_area_set_color (GIMP_COLOR_AREA (button->color_area), &color); g_signal_handlers_unblock_by_func (button->color_area, gimp_color_button_area_changed, button); g_signal_emit (button, gimp_color_button_signals[COLOR_CHANGED], 0); } }
static void gimp_color_history_palette_dirty (GimpPalette *palette, GimpColorHistory *history) { gint i; for (i = 0; i < history->history_size; i++) { GimpPaletteEntry *entry = gimp_palette_get_entry (palette, i); GimpRGB black = { 0.0, 0.0, 0.0, 1.0 }; g_signal_handlers_block_by_func (history->color_areas[i], gimp_color_history_color_changed, GINT_TO_POINTER (i)); gimp_color_area_set_color (GIMP_COLOR_AREA (history->color_areas[i]), entry ? &entry->color : &black); g_signal_handlers_unblock_by_func (history->color_areas[i], gimp_color_history_color_changed, GINT_TO_POINTER (i)); } }
static void gimp_color_area_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GimpColorArea *area = GIMP_COLOR_AREA (widget); if (GTK_WIDGET_CLASS (parent_class)->size_allocate) GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); if (widget->allocation.width != area->width || widget->allocation.height != area->height) { area->width = widget->allocation.width; area->height = widget->allocation.height; area->rowstride = (area->width * 3 + 3) & ~0x3; g_free (area->buf); area->buf = g_new (guchar, area->rowstride * area->height); area->needs_render = TRUE; } }
static void gimp_color_area_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time) { GimpColorArea *area = GIMP_COLOR_AREA (widget); guint16 vals[4]; vals[0] = area->color.r * 0xffff; vals[1] = area->color.g * 0xffff; vals[2] = area->color.b * 0xffff; if (area->type == GIMP_COLOR_AREA_FLAT) vals[3] = 0xffff; else vals[3] = area->color.a * 0xffff; gtk_selection_data_set (selection_data, gdk_atom_intern ("application/x-color", FALSE), 16, (guchar *) vals, 8); }