Issue #1788 - Inconsistency between FG color and selected color in...

...palette views despite selected color being in the currently
selected pallette

As suggested by Massimo, changing the color comparison EPSILON in
gimppalette.c from 1e-10 to 1e-6 fixes this, and is really small
enough.

Also, generally clean up color comparison epsilons:

- use a #define, not hardcoded values for all uses of
  gimp_rgb[a]_distance()
- call the #defines RGB_EPSILON and RGBA_EPSILON
- make them all 1e-6 or larger
This commit is contained in:
Michael Natterer 2019-01-02 01:45:41 +01:00
parent 8a4aacb52f
commit abd7cbfc8d
11 changed files with 47 additions and 27 deletions

View File

@ -54,6 +54,9 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-6
/* local function prototypes */ /* local function prototypes */
static void channels_new_callback (GtkWidget *dialog, static void channels_new_callback (GtkWidget *dialog,
@ -504,12 +507,12 @@ channels_edit_attributes_callback (GtkWidget *dialog,
{ {
GimpItem *item = GIMP_ITEM (channel); GimpItem *item = GIMP_ITEM (channel);
if (strcmp (channel_name, gimp_object_get_name (channel)) || if (strcmp (channel_name, gimp_object_get_name (channel)) ||
gimp_rgba_distance (channel_color, &channel->color) > 0.0001 || gimp_rgba_distance (channel_color, &channel->color) > RGBA_EPSILON ||
channel_visible != gimp_item_get_visible (item) || channel_visible != gimp_item_get_visible (item) ||
channel_linked != gimp_item_get_linked (item) || channel_linked != gimp_item_get_linked (item) ||
channel_color_tag != gimp_item_get_color_tag (item) || channel_color_tag != gimp_item_get_color_tag (item) ||
channel_lock_content != gimp_item_get_lock_content (item) || channel_lock_content != gimp_item_get_lock_content (item) ||
channel_lock_position != gimp_item_get_lock_position (item)) channel_lock_position != gimp_item_get_lock_position (item))
{ {
gimp_image_undo_group_start (image, gimp_image_undo_group_start (image,
@ -519,7 +522,7 @@ channels_edit_attributes_callback (GtkWidget *dialog,
if (strcmp (channel_name, gimp_object_get_name (channel))) if (strcmp (channel_name, gimp_object_get_name (channel)))
gimp_item_rename (GIMP_ITEM (channel), channel_name, NULL); gimp_item_rename (GIMP_ITEM (channel), channel_name, NULL);
if (gimp_rgba_distance (channel_color, &channel->color) > 0.0001) if (gimp_rgba_distance (channel_color, &channel->color) > RGBA_EPSILON)
gimp_channel_set_color (channel, channel_color, TRUE); gimp_channel_set_color (channel, channel_color, TRUE);
if (channel_visible != gimp_item_get_visible (item)) if (channel_visible != gimp_item_get_visible (item))

View File

@ -42,6 +42,9 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-6
/* local function prototypes */ /* local function prototypes */
static void quick_mask_configure_callback (GtkWidget *dialog, static void quick_mask_configure_callback (GtkWidget *dialog,
@ -167,7 +170,7 @@ quick_mask_configure_callback (GtkWidget *dialog,
gimp_image_get_quick_mask_color (image, &old_color); gimp_image_get_quick_mask_color (image, &old_color);
if (gimp_rgba_distance (&old_color, channel_color) > 0.0001) if (gimp_rgba_distance (&old_color, channel_color) > RGBA_EPSILON)
{ {
gimp_image_set_quick_mask_color (image, channel_color); gimp_image_set_quick_mask_color (image, channel_color);
gimp_image_flush (image); gimp_image_flush (image);

View File

@ -60,6 +60,8 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-6
enum enum
{ {
COLOR_CHANGED, COLOR_CHANGED,
@ -1698,7 +1700,7 @@ gimp_channel_set_color (GimpChannel *channel,
g_return_if_fail (GIMP_IS_CHANNEL (channel)); g_return_if_fail (GIMP_IS_CHANNEL (channel));
g_return_if_fail (color != NULL); g_return_if_fail (color != NULL);
if (gimp_rgba_distance (&channel->color, color) > 0.0001) if (gimp_rgba_distance (&channel->color, color) > RGBA_EPSILON)
{ {
if (push_undo && gimp_item_is_attached (GIMP_ITEM (channel))) if (push_undo && gimp_item_is_attached (GIMP_ITEM (channel)))
{ {

View File

@ -57,10 +57,11 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-10
typedef void (* GimpContextCopyPropFunc) (GimpContext *src, typedef void (* GimpContextCopyPropFunc) (GimpContext *src,
GimpContext *dest); GimpContext *dest);
#define context_find_defined(context, prop) \ #define context_find_defined(context, prop) \
while (!(((context)->defined_props) & (1 << (prop))) && (context)->parent) \ while (!(((context)->defined_props) & (1 << (prop))) && (context)->parent) \
(context) = (context)->parent (context) = (context)->parent
@ -2319,7 +2320,7 @@ static void
gimp_context_real_set_foreground (GimpContext *context, gimp_context_real_set_foreground (GimpContext *context,
const GimpRGB *color) const GimpRGB *color)
{ {
if (gimp_rgba_distance (&context->foreground, color) < 0.0001) if (gimp_rgba_distance (&context->foreground, color) < RGBA_EPSILON)
return; return;
context->foreground = *color; context->foreground = *color;
@ -2370,7 +2371,7 @@ static void
gimp_context_real_set_background (GimpContext *context, gimp_context_real_set_background (GimpContext *context,
const GimpRGB *color) const GimpRGB *color)
{ {
if (gimp_rgba_distance (&context->background, color) < 0.0001) if (gimp_rgba_distance (&context->background, color) < RGBA_EPSILON)
return; return;
context->background = *color; context->background = *color;

View File

@ -37,7 +37,9 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define EPSILON 1e-10
#define RGB_EPSILON 1e-6
/* local function prototypes */ /* local function prototypes */
@ -648,11 +650,11 @@ gimp_palette_find_entry (GimpPalette *palette,
for (list = palette->colors; list; list = g_list_next (list)) for (list = palette->colors; list; list = g_list_next (list))
{ {
entry = (GimpPaletteEntry *) list->data; entry = (GimpPaletteEntry *) list->data;
if (gimp_rgb_distance (&entry->color, color) < EPSILON) if (gimp_rgb_distance (&entry->color, color) < RGB_EPSILON)
return entry; return entry;
} }
} }
else if (gimp_rgb_distance (&start_from->color, color) < EPSILON) else if (gimp_rgb_distance (&start_from->color, color) < RGB_EPSILON)
{ {
return start_from; return start_from;
} }
@ -674,7 +676,7 @@ gimp_palette_find_entry (GimpPalette *palette,
if (next) if (next)
{ {
entry = (GimpPaletteEntry *) next->data; entry = (GimpPaletteEntry *) next->data;
if (gimp_rgb_distance (&entry->color, color) < EPSILON) if (gimp_rgb_distance (&entry->color, color) < RGB_EPSILON)
return entry; return entry;
next = next->next; next = next->next;
@ -683,7 +685,7 @@ gimp_palette_find_entry (GimpPalette *palette,
if (prev) if (prev)
{ {
entry = (GimpPaletteEntry *) prev->data; entry = (GimpPaletteEntry *) prev->data;
if (gimp_rgb_distance (&entry->color, color) < EPSILON) if (gimp_rgb_distance (&entry->color, color) < RGB_EPSILON)
return entry; return entry;
prev = prev->prev; prev = prev->prev;

View File

@ -34,6 +34,8 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-4
enum enum
{ {
COLOR_HISTORY = 1 COLOR_HISTORY = 1
@ -205,7 +207,7 @@ gimp_palette_mru_add (GimpPaletteMru *mru,
{ {
GimpPaletteEntry *entry = list->data; GimpPaletteEntry *entry = list->data;
if (gimp_rgba_distance (&entry->color, color) < 0.0001) if (gimp_rgba_distance (&entry->color, color) < RGBA_EPSILON)
{ {
found = entry; found = entry;
@ -228,7 +230,7 @@ gimp_palette_mru_add (GimpPaletteMru *mru,
GimpPaletteEntry *entry2 = list2->data; GimpPaletteEntry *entry2 = list2->data;
if (gimp_rgba_distance (&entry->color, if (gimp_rgba_distance (&entry->color,
&entry2->color) < 0.0001) &entry2->color) < RGBA_EPSILON)
{ {
found = entry2; found = entry2;

View File

@ -36,6 +36,8 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define RGBA_EPSILON 1e-6
enum enum
{ {
PROP_0, PROP_0,
@ -566,7 +568,7 @@ gimp_color_frame_set_color (GimpColorFrame *frame,
frame->sample_format == sample_format && frame->sample_format == sample_format &&
frame->x == x && frame->x == x &&
frame->y == y && frame->y == y &&
gimp_rgba_distance (&frame->color, color) < 0.0001) gimp_rgba_distance (&frame->color, color) < RGBA_EPSILON)
{ {
frame->color = *color; frame->color = *color;
return; return;

View File

@ -48,8 +48,8 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define BORDER 6 #define BORDER 6
#define EPSILON 1e-10 #define RGB_EPSILON 1e-6
#define HAVE_COLORMAP(image) \ #define HAVE_COLORMAP(image) \
(image != NULL && \ (image != NULL && \
@ -458,7 +458,7 @@ gimp_colormap_editor_get_index (GimpColormapEditor *editor,
gimp_image_get_colormap_entry (image, index, &temp); gimp_image_get_colormap_entry (image, index, &temp);
if (gimp_rgb_distance (&temp, search) > EPSILON) if (gimp_rgb_distance (&temp, search) > RGB_EPSILON)
{ {
gint n_colors = gimp_image_get_colormap_size (image); gint n_colors = gimp_image_get_colormap_size (image);
gint i; gint i;
@ -467,7 +467,7 @@ gimp_colormap_editor_get_index (GimpColormapEditor *editor,
{ {
gimp_image_get_colormap_entry (image, i, &temp); gimp_image_get_colormap_entry (image, i, &temp);
if (gimp_rgb_distance (&temp, search) < EPSILON) if (gimp_rgb_distance (&temp, search) < RGB_EPSILON)
{ {
index = i; index = i;
break; break;

View File

@ -36,6 +36,8 @@
#include "gimpcolorpanel.h" #include "gimpcolorpanel.h"
#define RGBA_EPSILON 1e-6
enum enum
{ {
RESPONSE, RESPONSE,
@ -255,7 +257,7 @@ gimp_color_panel_color_changed (GimpColorButton *button)
gimp_color_dialog_get_color (GIMP_COLOR_DIALOG (panel->color_dialog), gimp_color_dialog_get_color (GIMP_COLOR_DIALOG (panel->color_dialog),
&dialog_color); &dialog_color);
if (gimp_rgba_distance (&color, &dialog_color) > 0.00001 || if (gimp_rgba_distance (&color, &dialog_color) > RGBA_EPSILON ||
color.a != dialog_color.a) color.a != dialog_color.a)
{ {
gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (panel->color_dialog), gimp_color_dialog_set_color (GIMP_COLOR_DIALOG (panel->color_dialog),

View File

@ -53,6 +53,8 @@
#include "gimp-priorities.h" #include "gimp-priorities.h"
#define RGB_EPSILON 1e-6
enum enum
{ {
UPDATE, UPDATE,
@ -502,7 +504,7 @@ gimp_view_renderer_set_border_color (GimpViewRenderer *renderer,
g_return_if_fail (GIMP_IS_VIEW_RENDERER (renderer)); g_return_if_fail (GIMP_IS_VIEW_RENDERER (renderer));
g_return_if_fail (color != NULL); g_return_if_fail (color != NULL);
if (gimp_rgb_distance (&renderer->border_color, color)) if (gimp_rgb_distance (&renderer->border_color, color) > RGB_EPSILON)
{ {
renderer->border_color = *color; renderer->border_color = *color;

View File

@ -45,6 +45,7 @@
**/ **/
#define RGBA_EPSILON 1e-6
#define DRAG_PREVIEW_SIZE 32 #define DRAG_PREVIEW_SIZE 32
#define DRAG_ICON_OFFSET -8 #define DRAG_ICON_OFFSET -8
@ -535,7 +536,7 @@ gimp_color_area_set_color (GimpColorArea *area,
priv = GET_PRIVATE (area); priv = GET_PRIVATE (area);
if (gimp_rgba_distance (&priv->color, color) < 0.000001) if (gimp_rgba_distance (&priv->color, color) < RGBA_EPSILON)
return; return;
priv->color = *color; priv->color = *color;