[gimp] app: draw border around FG/BG-editor color areas
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: draw border around FG/BG-editor color areas
- Date: Sat, 22 Feb 2020 15:17:39 +0000 (UTC)
commit fb1c0860974fa7b3734e162afb193040d11f9678
Author: Ell <ell_se yahoo com>
Date: Sat Feb 22 15:32:54 2020 +0200
app: draw border around FG/BG-editor color areas
In GimpFgBgEditor, we currently use gtk_render_frame() in master,
and gtk_paint_shadow() in gimp-2-10, to draw a border around the
color FG/BG color areas. However, the former is relatively
subtle, especially with dark themes, and the latter is a NOP with
the pixmap engine, which is what our built-in themes use.
Instead, draw the border ourselves as a pair of black and white
rectangles, similarly to Photoshop.
Move the entire color-frame drawing functionality to a separate
function, to avoid code duplication between the FG and BG frames.
app/widgets/gimpfgbgeditor.c | 267 ++++++++++++++++++++-----------------------
1 file changed, 125 insertions(+), 142 deletions(-)
---
diff --git a/app/widgets/gimpfgbgeditor.c b/app/widgets/gimpfgbgeditor.c
index 4c340e8a70..6c20547ddb 100644
--- a/app/widgets/gimpfgbgeditor.c
+++ b/app/widgets/gimpfgbgeditor.c
@@ -113,6 +113,16 @@ static void gimp_fg_bg_editor_destroy_transform (GimpFgBgEditor *editor);
static void gimp_fg_bg_editor_image_changed (GimpFgBgEditor *editor,
GimpImage *image);
+static void gimp_fg_bg_editor_draw_color_frame (GimpFgBgEditor *editor,
+ cairo_t *cr,
+ const GimpRGB *color,
+ gint x,
+ gint y,
+ gint width,
+ gint height,
+ gint corner_dx,
+ gint corner_dy);
+
G_DEFINE_TYPE (GimpFgBgEditor, gimp_fg_bg_editor, GTK_TYPE_EVENT_BOX)
#define parent_class gimp_fg_bg_editor_parent_class
@@ -289,19 +299,16 @@ static gboolean
gimp_fg_bg_editor_draw (GtkWidget *widget,
cairo_t *cr)
{
- GimpFgBgEditor *editor = GIMP_FG_BG_EDITOR (widget);
- GtkStyleContext *style = gtk_widget_get_style_context (widget);
- GimpPalette *colormap_palette = NULL;
- GtkBorder border;
- GtkBorder padding;
- GdkRectangle rect;
- gint scale_factor;
- gint width, height;
- gint default_w, default_h;
- gint swap_w, swap_h;
- GimpRGB color;
- GimpRGB transformed_color;
- GimpImageBaseType base_type = GIMP_RGB;
+ GimpFgBgEditor *editor = GIMP_FG_BG_EDITOR (widget);
+ GtkStyleContext *style = gtk_widget_get_style_context (widget);
+ GtkBorder border;
+ GtkBorder padding;
+ GdkRectangle rect;
+ gint scale_factor;
+ gint width, height;
+ gint default_w, default_h;
+ gint swap_w, swap_h;
+ GimpRGB color;
gtk_style_context_save (style);
@@ -382,144 +389,30 @@ gimp_fg_bg_editor_draw (GtkWidget *widget,
editor->rect_width = rect.width;
editor->rect_height = rect.height;
-
if (! editor->transform)
gimp_fg_bg_editor_create_transform (editor);
- if (editor->active_image)
- {
- base_type = gimp_image_get_base_type (editor->active_image);
-
- if (base_type == GIMP_INDEXED)
- colormap_palette = gimp_image_get_colormap_palette (editor->active_image);
- }
-
- /* draw the background area */
-
- rect.x = width - rect.width - border.right;
- rect.y = height - rect.height - border.bottom;
-
if (editor->context)
{
+ /* draw the background frame */
gimp_context_get_background (editor->context, &color);
-
- if (editor->transform)
- gimp_color_transform_process_pixels (editor->transform,
- babl_format ("R'G'B'A double"),
- &color,
- babl_format ("R'G'B'A double"),
- &transformed_color,
- 1);
- else
- transformed_color = color;
-
- gimp_cairo_set_source_rgb (cr, &transformed_color);
-
- cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
- cairo_fill (cr);
-
-
- if (editor->color_config &&
- /* Common out-of-gamut case */
- ((color.r < 0.0 || color.r > 1.0 ||
- color.g < 0.0 || color.g > 1.0 ||
- color.b < 0.0 || color.b > 1.0) ||
- /* Indexed images */
- (colormap_palette && ! gimp_palette_find_entry (colormap_palette, &color, NULL)) ||
- /* Grayscale images */
- (base_type == GIMP_GRAY &&
- (ABS (color.r - color.g) > CHANNEL_EPSILON ||
- ABS (color.r - color.b) > CHANNEL_EPSILON ||
- ABS (color.g - color.b) > CHANNEL_EPSILON))))
- {
- GimpRGB color;
- gint side = MIN (rect.width, rect.height) * 2 / 3;
- gint corner_x = rect.x + rect.width;
- gint corner_y = rect.y + rect.height;
-
- cairo_move_to (cr, corner_x, corner_y);
- cairo_line_to (cr, corner_x - side, corner_y);
- cairo_line_to (cr, corner_x, corner_y - side);
- cairo_close_path (cr);
-
- gimp_color_config_get_out_of_gamut_color (editor->color_config,
- &color);
- gimp_cairo_set_source_rgb (cr, &color);
- cairo_fill (cr);
- }
- }
-
- gtk_style_context_set_state (style,
- editor->active_color ==
- GIMP_ACTIVE_COLOR_FOREGROUND ?
- 0 : GTK_STATE_FLAG_ACTIVE);
-
- gtk_style_context_add_class (style, GTK_STYLE_CLASS_FRAME);
-
- gtk_render_frame (style, cr, rect.x, rect.y, rect.width, rect.height);
-
-
- /* draw the foreground area */
-
- rect.x = border.left;
- rect.y = border.top;
-
- if (editor->context)
- {
+ rect.x = width - rect.width - border.right;
+ rect.y = height - rect.height - border.bottom;
+ gimp_fg_bg_editor_draw_color_frame (editor, cr, &color,
+ rect.x, rect.y,
+ rect.width, rect.height,
+ +1, +1);
+
+ /* draw the foreground frame */
gimp_context_get_foreground (editor->context, &color);
-
- if (editor->transform)
- gimp_color_transform_process_pixels (editor->transform,
- babl_format ("R'G'B'A double"),
- &color,
- babl_format ("R'G'B'A double"),
- &transformed_color,
- 1);
- else
- transformed_color = color;
-
- gimp_cairo_set_source_rgb (cr, &transformed_color);
-
- cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
- cairo_fill (cr);
-
- if (editor->color_config &&
- /* Common out-of-gamut case */
- ((color.r < 0.0 || color.r > 1.0 ||
- color.g < 0.0 || color.g > 1.0 ||
- color.b < 0.0 || color.b > 1.0) ||
- /* Indexed images */
- (colormap_palette && ! gimp_palette_find_entry (colormap_palette, &color, NULL)) ||
- /* Grayscale images */
- (base_type == GIMP_GRAY &&
- (ABS (color.r - color.g) > CHANNEL_EPSILON ||
- ABS (color.r - color.b) > CHANNEL_EPSILON ||
- ABS (color.g - color.b) > CHANNEL_EPSILON))))
- {
- GimpRGB color;
- gint side = MIN (rect.width, rect.height) * 2 / 3;
- gint corner_x = rect.x;
- gint corner_y = rect.y;
-
- cairo_move_to (cr, corner_x, corner_y);
- cairo_line_to (cr, corner_x + side, corner_y);
- cairo_line_to (cr, corner_x, corner_y + side);
- cairo_close_path (cr);
-
- gimp_color_config_get_out_of_gamut_color (editor->color_config,
- &color);
- gimp_cairo_set_source_rgb (cr, &color);
- cairo_fill (cr);
- }
+ rect.x = border.left;
+ rect.y = border.top;
+ gimp_fg_bg_editor_draw_color_frame (editor, cr, &color,
+ rect.x, rect.y,
+ rect.width, rect.height,
+ +1, +1);
}
- gtk_style_context_set_state (style,
- editor->active_color ==
- GIMP_ACTIVE_COLOR_BACKGROUND ?
- 0 : GTK_STATE_FLAG_ACTIVE);
-
- gtk_render_frame (style, cr, rect.x, rect.y, rect.width, rect.height);
-
gtk_style_context_restore (style);
return TRUE;
@@ -918,3 +811,93 @@ gimp_fg_bg_editor_image_changed (GimpFgBgEditor *editor,
}
}
}
+
+static void
+gimp_fg_bg_editor_draw_color_frame (GimpFgBgEditor *editor,
+ cairo_t *cr,
+ const GimpRGB *color,
+ gint x,
+ gint y,
+ gint width,
+ gint height,
+ gint corner_dx,
+ gint corner_dy)
+{
+ GimpPalette *colormap_palette = NULL;
+ GimpImageBaseType base_type = GIMP_RGB;
+ GimpRGB transformed_color;
+
+ if (editor->active_image)
+ {
+ base_type = gimp_image_get_base_type (editor->active_image);
+
+ if (base_type == GIMP_INDEXED)
+ {
+ colormap_palette = gimp_image_get_colormap_palette (
+ editor->active_image);
+ }
+ }
+
+ if (editor->transform)
+ {
+ gimp_color_transform_process_pixels (editor->transform,
+ babl_format ("R'G'B'A double"),
+ color,
+ babl_format ("R'G'B'A double"),
+ &transformed_color,
+ 1);
+ }
+ else
+ {
+ transformed_color = *color;
+ }
+
+ cairo_save (cr);
+
+ gimp_cairo_set_source_rgb (cr, &transformed_color);
+
+ cairo_rectangle (cr, x, y, width, height);
+ cairo_fill (cr);
+
+ if (editor->color_config &&
+ /* Common out-of-gamut case */
+ ((color->r < 0.0 || color->r > 1.0 ||
+ color->g < 0.0 || color->g > 1.0 ||
+ color->b < 0.0 || color->b > 1.0) ||
+ /* Indexed images */
+ (colormap_palette &&
+ ! gimp_palette_find_entry (colormap_palette, color, NULL)) ||
+ /* Grayscale images */
+ (base_type == GIMP_GRAY &&
+ (ABS (color->r - color->g) > CHANNEL_EPSILON ||
+ ABS (color->r - color->b) > CHANNEL_EPSILON ||
+ ABS (color->g - color->b) > CHANNEL_EPSILON))))
+ {
+ gint corner_x = x + 0.5 * (1.0 + corner_dx) * width;
+ gint corner_y = y + 0.5 * (1.0 + corner_dy) * height;
+ gint side = MIN (width, height) * 2 / 3;
+ GimpRGB out_of_gamut_color;
+
+ cairo_move_to (cr, corner_x, corner_y);
+ cairo_line_to (cr, corner_x + side * corner_dx, corner_y);
+ cairo_line_to (cr, corner_x, corner_y + side * corner_dy);
+ cairo_close_path (cr);
+
+ gimp_color_config_get_out_of_gamut_color (editor->color_config,
+ &out_of_gamut_color);
+ gimp_cairo_set_source_rgb (cr, &out_of_gamut_color);
+ cairo_fill (cr);
+ }
+
+ cairo_set_line_width (cr, 1.0);
+
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_rectangle (cr, x + 0.5, y + 0.5, width - 1.0, height - 1.0);
+ cairo_stroke (cr);
+
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_rectangle (cr, x + 1.5, y + 1.5, width - 3.0, height - 3.0);
+ cairo_stroke (cr);
+
+ cairo_restore (cr);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]