# HG changeset patch # User Miles Bader # Date 974130452 0 # Node ID 41fcaa0b864b9d99cb78fad416a9c15c690079e1 # Parent 21903c0f782ccf8a1822fd1d99defa71e78ce0d2 (x_alloc_lighter_color): Include an additive component too for dark colors, because FACTOR isn't enough. (HIGHLIGHT_COLOR_DARK_BOOST, HIGHLIGHT_COLOR_DARK_BOOST_LIMIT): New macros. diff -r 21903c0f782c -r 41fcaa0b864b src/xterm.c --- a/src/xterm.c Mon Nov 13 15:03:35 2000 +0000 +++ b/src/xterm.c Mon Nov 13 15:47:32 2000 +0000 @@ -3489,6 +3489,30 @@ } + +/* Constants used by x_alloc_lighter_color. */ + +/* How much to boost the brightness of 3d highlights for dark colors. + Nominally, highlight colors for `3d' faces are calculated by + brightening an object's color by a constant factor. If + `highlight-color-dark-boost' is a floating point number between 0 and + 1, colors darker than `highlight-color-dark-boost-limit' have their + highlight factor increased: a value of 0 means no increase at all, + and greater values yield correspondingly greater increases. */ +#define HIGHLIGHT_COLOR_DARK_BOOST 0.7 + +/* Brightness beyond which a color won't have its highlight brightness + boosted. See HIGHLIGHT_COLOR_DARK_BOOST. + + The `brightness' of a color, for this purpose, is defined to be the + maximum of the color's red, green, or blue components, as returned by + `color-values'. + + The value here is set so that the default menu-bar/mode-line color + (grey75) will not have its highlights changed at all. */ +#define HIGHLIGHT_COLOR_DARK_BOOST_LIMIT 48000 + + /* Allocate a color which is lighter or darker than *PIXEL by FACTOR or DELTA. Try a color with RGB values multiplied by FACTOR first. If this produces the same color as PIXEL, try a color where all RGB @@ -3506,6 +3530,7 @@ int delta; { XColor color, new; + long bright; int success_p; /* Get RGB color values. */ @@ -3518,6 +3543,40 @@ new.green = min (0xffff, factor * color.green); new.blue = min (0xffff, factor * color.blue); + /* Use the maximum component brightness as the overall brightness + (this works quite well in practice). */ + bright = color.red; + if (color.green > bright) + bright = color.green; + if (color.blue > bright) + bright = color.blue; + + /* We only boost colors that are darker than + HIGHLIGHT_COLOR_DARK_BOOST_LIMIT. */ + if (bright < HIGHLIGHT_COLOR_DARK_BOOST_LIMIT) + /* Make an additive adjustment to NEW, because it's dark enough so + that scaling by FACTOR alone isn't enough. */ + { + /* How far below the limit this color is (0 - 1, 1 being darker). */ + double dimness = 1 - (double)bright / HIGHLIGHT_COLOR_DARK_BOOST_LIMIT; + /* The additive adjustment. */ + int min_delta = delta * dimness * HIGHLIGHT_COLOR_DARK_BOOST; + + if (factor < 1) + { + min_delta /= 2; + new.red = max (0, new.red - min_delta); + new.green = max (0, new.green - min_delta); + new.blue = max (0, new.blue - min_delta); + } + else + { + new.red = min (0xffff, min_delta + new.red); + new.green = min (0xffff, min_delta + new.green); + new.blue = min (0xffff, min_delta + new.blue); + } + } + /* Try to allocate the color. */ success_p = x_alloc_nearest_color (f, cmap, &new); if (success_p) @@ -13891,4 +13950,3 @@ } #endif /* not HAVE_X_WINDOWS */ -