From d4e4e25e2841d3aefc5dc13bab551d77b63590ea Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Thu, 23 Jan 2003 18:47:47 +0000 Subject: [PATCH] Added color reduction for 16bpp displays --- otk/truerendercontrol.cc | 43 +++++++++++++++++++++++++++++++++------- otk/truerendercontrol.hh | 3 +++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/otk/truerendercontrol.cc b/otk/truerendercontrol.cc index cc46ebd9..99fa74f3 100644 --- a/otk/truerendercontrol.cc +++ b/otk/truerendercontrol.cc @@ -156,19 +156,19 @@ void TrueRenderControl::drawGradientBackground( if (texture.bevel() == RenderTexture::Bevel1) { for (off = 1, x = 1; x < w - 1; ++x, off++) highlight(data + off, - data + off + (h-1) * w, - texture.relief()==RenderTexture::Raised); + data + off + (h-1) * w, + texture.relief()==RenderTexture::Raised); for (off = 0, x = 0; x < h; ++x, off++) highlight(data + off * w, - data + off * w + w - 1, - texture.relief()==RenderTexture::Raised); + data + off * w + w - 1, + texture.relief()==RenderTexture::Raised); } if (texture.bevel() == RenderTexture::Bevel2) { for (off = 2, x = 2; x < w - 2; ++x, off++) highlight(data + off + w, - data + off + (h-2) * w, - texture.relief()==RenderTexture::Raised); + data + off + (h-2) * w, + texture.relief()==RenderTexture::Raised); for (off = 1, x = 1; x < h-1; ++x, off++) highlight(data + off * w + 1, data + off * w + w - 2, @@ -176,7 +176,8 @@ void TrueRenderControl::drawGradientBackground( } } -//XXX: any dithering should be done now + reduceDepth(im, data); + im->data = (char*) data; sf.setPixmap(im); @@ -186,6 +187,34 @@ void TrueRenderControl::drawGradientBackground( XDestroyImage(im); } +void TrueRenderControl::reduceDepth(XImage *im, pixel32 *data) const +{ + int r, g, b; + int x,y; + pixel16 *p = (pixel16 *)data; + switch (im->bits_per_pixel) { + case 32: + return; + case 16: + for (y = 0; y < im->height; y++) { + for (x = 0; x < im->width; x++) { + r = (data[x] >> 16) & 0xFF; + r = r >> _red_shift; + g = (data[x] >> 8) & 0xFF; + g = g >> _green_shift; + b = data[x] & 0xFF; + b = b >> _blue_shift; + p[x] = (r << _red_offset) + (g << _green_offset) + (b << _blue_offset); + } + data += im->width; + p += im->bytes_per_line/2; + } + break; + default: + printf("your bit depth is currently unhandled\n"); + } +} + void TrueRenderControl::highlight(pixel32 *x, pixel32 *y, bool raised) const { int r, g, b; diff --git a/otk/truerendercontrol.hh b/otk/truerendercontrol.hh index a4735c8f..7da6f8be 100644 --- a/otk/truerendercontrol.hh +++ b/otk/truerendercontrol.hh @@ -22,8 +22,10 @@ namespace otk { #ifdef HAVE_STDINT_H typedef uint32_t pixel32; +typedef uint16_t pixel16; #else typedef u_int32_t pixel32; +typedef u_int16_t pixel16; #endif class TrueRenderControl : public RenderControl { @@ -48,6 +50,7 @@ public: const RenderTexture &texture) const; inline void highlight(pixel32 *x, pixel32 *y, bool raised) const; + void reduceDepth(XImage *im, pixel32 *data) const; }; } -- 2.45.2