]> Dogcows Code - chaz/openbox/commitdiff
Added color reduction for 16bpp displays
authorDerek Foreman <manmower@gmail.com>
Thu, 23 Jan 2003 18:47:47 +0000 (18:47 +0000)
committerDerek Foreman <manmower@gmail.com>
Thu, 23 Jan 2003 18:47:47 +0000 (18:47 +0000)
otk/truerendercontrol.cc
otk/truerendercontrol.hh

index cc46ebd9794e64774a14289ac46ca62372b2bf0c..99fa74f3117d2ba824ffa46fea8cf9f86a63557a 100644 (file)
@@ -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;
index a4735c8fbdb0b54728cbea7b8b6937c256d4f546..7da6f8be3671b708d26be19bcd533ae67d3f3edf 100644 (file)
@@ -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;
 };
 
 }
This page took 0.024471 seconds and 4 git commands to generate.