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 */
-