}
+
+/* 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
int delta;
{
XColor color, new;
+ long bright;
int success_p;
/* Get RGB color values. */
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)
}
#endif /* not HAVE_X_WINDOWS */
-