--- rxvt-unicode/src/rxvttoolkit.C 2014/11/01 10:17:55 1.143 +++ rxvt-unicode/src/rxvttoolkit.C 2014/12/13 10:47:32 1.145 @@ -492,15 +492,10 @@ #if XRENDER int major, minor; if (XRenderQueryVersion (dpy, &major, &minor)) - if (major > 0 || (major == 0 && minor >= 10)) + if (major > 0 || (major == 0 && minor >= 11)) { flags |= DISPLAY_HAS_RENDER; -#if 0 - if (major > 0 || (major == 0 && minor >= 11)) - flags |= DISPLAY_HAS_RENDER_MUL; -#endif - if (XFilters *filters = XRenderQueryFilters (dpy, root)) { for (int i = 0; i < filters->nfilter; i++) @@ -882,26 +877,34 @@ // many extra optimisations. XQueryColors (screen->dpy, screen->cmap, colors, cmap_size); - int diff = 0x7fffffffUL; - XColor *best = colors; - - for (int i = 0; i < cmap_size; i++) + while (cmap_size) { - int d = (squared_diff (color.r >> 2, colors [i].red >> 2)) - + (squared_diff (color.g >> 2, colors [i].green >> 2)) - + (squared_diff (color.b >> 2, colors [i].blue >> 2)); + int diff = 0x7fffffffUL; + XColor *best = colors; - if (d < diff) + for (int i = 0; i < cmap_size; i++) { - diff = d; - best = colors + i; + int d = (squared_diff (color.r >> 2, colors [i].red >> 2)) + + (squared_diff (color.g >> 2, colors [i].green >> 2)) + + (squared_diff (color.b >> 2, colors [i].blue >> 2)); + + if (d < diff) + { + diff = d; + best = colors + i; + } } - } - //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n", - // color.r, color.g, color.b, best->red, best->green, best->blue, diff); + //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d,%d)\n", + // color.r, color.g, color.b, best->red, best->green, best->blue, diff, best - colors); + + got = alloc (screen, rgba (best->red, best->green, best->blue)); - got = alloc (screen, rgba (best->red, best->green, best->blue)); + if (got) + break; + + *best = colors [--cmap_size]; + } delete [] colors; }