From: Paul Eggert Date: Mon, 13 Jun 2011 07:53:14 +0000 (-0700) Subject: * xterm.c (x_alloc_nearest_color_1): Use a more-precise algorithm X-Git-Tag: emacs-pretest-24.0.90~104^2~548^2~22 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5efd304be978e2c0b3b1ac0c39b303b8d094ab66;p=emacs.git * xterm.c (x_alloc_nearest_color_1): Use a more-precise algorithm for nearest color, one that neither overflows nor relies on unsigned arithmetic. --- 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) {