From d4e4e25e2841d3aefc5dc13bab551d77b63590ea Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Thu, 23 Jan 2003 18:47:47 +0000 Subject: Added color reduction for 16bpp displays --- otk/truerendercontrol.cc | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'otk/truerendercontrol.cc') 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; -- cgit v1.2.3