diff options
| author | Gerd Moellmann <gerd@gnu.org> | 2003-08-29 09:29:39 +0000 |
|---|---|---|
| committer | Gerd Moellmann <gerd@gnu.org> | 2003-08-29 09:29:39 +0000 |
| commit | e019878d2cb1cdd075bc717a23d661c1cdb7cdee (patch) | |
| tree | 66cd65ed21b28ce3c6d61413f3f1a97f9c90a4e3 | |
| parent | 17139abc070ed531b7caca6bdc44aa90c7ff8297 (diff) | |
| download | emacs-e019878d2cb1cdd075bc717a23d661c1cdb7cdee.tar.gz | |
(lookup_rgb_color): Handle TrueColor visuals specially.
| -rw-r--r-- | src/ChangeLog | 4 | ||||
| -rw-r--r-- | src/xfns.c | 36 |
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; |
