summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2003-08-29 09:29:39 +0000
committerGerd Moellmann <gerd@gnu.org>2003-08-29 09:29:39 +0000
commite019878d2cb1cdd075bc717a23d661c1cdb7cdee (patch)
tree66cd65ed21b28ce3c6d61413f3f1a97f9c90a4e3
parent17139abc070ed531b7caca6bdc44aa90c7ff8297 (diff)
downloademacs-e019878d2cb1cdd075bc717a23d661c1cdb7cdee.tar.gz
(lookup_rgb_color): Handle TrueColor visuals specially.
-rw-r--r--src/ChangeLog4
-rw-r--r--src/xfns.c36
2 files changed, 40 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 21bd69c7a7e..be2974332dc 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2003-08-29 Gerd Moellmann <gerd@gnu.org>
+
+ * xfns.c (lookup_rgb_color): Handle TrueColor visuals specially.
+
2003-08-28 David Abrahams <dave@boost-consulting.com> (tiny change)
* coding.c (decode_coding_iso2022): Initialized local variable c2.
diff --git a/src/xfns.c b/src/xfns.c
index 65747dbe1b9..0a87cc5950e 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -6755,7 +6755,43 @@ lookup_rgb_color (f, r, g, b)
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;