emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xfns.c


From: Gerd Moellmann
Subject: [Emacs-diffs] Changes to emacs/src/xfns.c
Date: Fri, 29 Aug 2003 05:29:17 -0400

Index: emacs/src/xfns.c
diff -c emacs/src/xfns.c:1.592 emacs/src/xfns.c:1.593
*** emacs/src/xfns.c:1.592      Tue Aug 26 04:44:35 2003
--- emacs/src/xfns.c    Fri Aug 29 05:29:16 2003
***************
*** 6755,6761 ****
--- 6755,6797 ----
    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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]