From 5efd304be978e2c0b3b1ac0c39b303b8d094ab66 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 13 Jun 2011 00:53:14 -0700 Subject: [PATCH] * xterm.c (x_alloc_nearest_color_1): Use a more-precise algorithm for nearest color, one that neither overflows nor relies on unsigned arithmetic. --- src/ChangeLog | 4 ++++ src/xterm.c | 12 +++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index ff6945d8656..125028297d1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2011-06-13 Paul Eggert + * xterm.c (x_alloc_nearest_color_1): Use a more-precise algorithm + for nearest color, one that neither overflows nor relies on unsigned + arithmetic. + Remove unnecessary casts. * xterm.c (x_term_init): * xfns.c (x_set_border_pixel): diff --git a/src/xterm.c b/src/xterm.c index 85c19ed16af..1c1c8e3f107 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -1693,16 +1693,18 @@ x_alloc_nearest_color_1 (Display *dpy, Colormap cmap, XColor *color) a least-squares matching, which is what X uses for closest color matching with StaticColor visuals. */ int nearest, i; - unsigned long nearest_delta = ~ (unsigned long) 0; + int max_color_delta = (1 << (16 - 2)) - 1; + int max_delta = 3 * max_color_delta; + int nearest_delta = max_delta + 1; int ncells; const XColor *cells = x_color_cells (dpy, &ncells); for (nearest = i = 0; i < ncells; ++i) { - long dred = (color->red >> 8) - (cells[i].red >> 8); - long dgreen = (color->green >> 8) - (cells[i].green >> 8); - long dblue = (color->blue >> 8) - (cells[i].blue >> 8); - unsigned long delta = dred * dred + dgreen * dgreen + dblue * dblue; + int dred = (color->red >> 2) - (cells[i].red >> 2); + int dgreen = (color->green >> 2) - (cells[i].green >> 2); + int dblue = (color->blue >> 2) - (cells[i].blue >> 2); + int delta = dred * dred + dgreen * dgreen + dblue * dblue; if (delta < nearest_delta) { -- 2.11.4.GIT