changeset 52360:abd824b88c14

(lookup_rgb_color): Handle TrueColor visuals specially.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 29 Aug 2003 09:29:16 +0000
parents 57f71e75a609
children 77ca9d1eec0b
files src/xfns.c
diffstat 1 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfns.c	Thu Aug 28 15:12:10 2003 +0000
+++ b/src/xfns.c	Fri Aug 29 09:29:16 2003 +0000
@@ -6755,7 +6755,43 @@
   unsigned hash = CT_HASH_RGB (r, g, b);
   int i = hash % CT_SIZE;
   struct ct_color *p;
-
+  Visual *visual;
+
+  /* Handle TrueColor visuals specially, which improves performance by
+     two orders of magnitude.  Freeing colors on TrueColor visuals is
+     a nop, and pixel colors specify RGB values directly.  See also
+     the Xlib spec, chapter 3.1.  */
+  visual = FRAME_X_DISPLAY_INFO (f)->visual;
+  if (visual->class == TrueColor)
+    {
+      int bits = visual->bits_per_rgb;
+      unsigned long pr, pg, pb;
+
+      /* Apply gamma-correction like normal color allocation does.  */
+      if (f->gamma)
+	{
+	  XColor color;
+	  color.red = r, color.green = g, color.blue = b;
+	  gamma_correct (f, &color);
+	  r = color.red, g = color.green, b = color.blue;
+	}
+
+      /* Scale down RGB values to the visual's bits per RGB, and shift
+	 them to the right position in the pixel color.  Note that the
+	 original RGB values are 16-bit values, as usual in X.  */
+      pr = (r >> (16 - bits)) << 2 * bits;
+      pg = (g >> (16 - bits)) << 1 * bits;
+      pb = (b >> (16 - bits)) << 0 * bits;
+
+      /* Apply RGB masks of the visual.  */
+      pr &= visual->red_mask;
+      pg &= visual->green_mask;
+      pb &= visual->blue_mask;
+
+      /* Assemble the pixel color.  */
+      return pr | pg | pb;
+    }
+  
   for (p = ct_table[i]; p; p = p->next)
     if (p->r == r && p->g == g && p->b == b)
       break;