Mercurial > emacs
changeset 33449:41fcaa0b864b
(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.
author | Miles Bader <miles@gnu.org> |
---|---|
date | Mon, 13 Nov 2000 15:47:32 +0000 |
parents | 21903c0f782c |
children | a4ceced5c784 |
files | src/xterm.c |
diffstat | 1 files changed, 59 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 */ -