]> Dogcows Code - chaz/openbox/commitdiff
add support for 8bit TrueColor visuals. Who knew these existed. Fixes vnc's 8bit...
authorDana Jansens <danakj@orodu.net>
Wed, 14 Mar 2007 03:05:47 +0000 (03:05 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 14 Mar 2007 03:05:47 +0000 (03:05 +0000)
render/color.c
render/render.h

index e4b023342c4582660e1de4cb1bf2058ed98a8b4e..600fc335553299ab8f6efdb0d38a489d60ea9e8a 100644 (file)
@@ -123,7 +123,7 @@ void RrReduceDepth(const RrInstance *inst, RrPixel32 *data, XImage *im)
     gint x,y;
     RrPixel32 *p32 = (RrPixel32 *) im->data;
     RrPixel16 *p16 = (RrPixel16 *) im->data;
-    guchar *p8 = (guchar *)im->data;
+    RrPixel8  *p8  = (RrPixel8 *)  im->data;
     switch (im->bits_per_pixel) {
     case 32:
         if ((RrRedOffset(inst) != RrDefaultRedOffset) ||
@@ -161,16 +161,33 @@ void RrReduceDepth(const RrInstance *inst, RrPixel32 *data, XImage *im)
         }
         break;
     case 8:
-        g_assert(RrVisual(inst)->class != TrueColor);
-        for (y = 0; y < im->height; y++) {
-            for (x = 0; x < im->width; x++) {
-                p8[x] = RrPickColor(inst,
-                                    data[x] >> RrDefaultRedOffset,
-                                    data[x] >> RrDefaultGreenOffset,
-                                    data[x] >> RrDefaultBlueOffset)->pixel;
+        if (RrVisual(inst)->class == TrueColor) {
+            for (y = 0; y < im->height; y++) {
+                for (x = 0; x < im->width; x++) {
+                    r = (data[x] >> RrDefaultRedOffset) & 0xFF;
+                    r = r >> RrRedShift(inst);
+                    g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
+                    g = g >> RrGreenShift(inst);
+                    b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
+                    b = b >> RrBlueShift(inst);
+                    p8[x] = (r << RrRedOffset(inst))
+                        + (g << RrGreenOffset(inst))
+                        + (b << RrBlueOffset(inst));
+                }
+                data += im->width;
+                p8 += im->bytes_per_line;
+            }
+        } else {
+            for (y = 0; y < im->height; y++) {
+                for (x = 0; x < im->width; x++) {
+                    p8[x] = RrPickColor(inst,
+                                        data[x] >> RrDefaultRedOffset,
+                                        data[x] >> RrDefaultGreenOffset,
+                                        data[x] >> RrDefaultBlueOffset)->pixel;
+                }
+                data += im->width;
+                p8 += im->bytes_per_line;
             }
-            data += im->width;
-            p8 += im->bytes_per_line;
         }
         break;
     default:
index a327756f7c6275bbcc89419a1ee3596a60910a7b..979bc9331043ec0da2f7d50a7f002d642ee853f4 100644 (file)
@@ -45,6 +45,7 @@ typedef struct _RrColor            RrColor;
 
 typedef guint32 RrPixel32;
 typedef guint16 RrPixel16;
+typedef guchar  RrPixel8;
 
 typedef enum {
     RR_RELIEF_FLAT,
This page took 0.029621 seconds and 4 git commands to generate.