summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-03-14 03:05:47 +0000
committerDana Jansens <danakj@orodu.net>2007-03-14 03:05:47 +0000
commit4e19d8411d5619aa2562160de309c47c6e482129 (patch)
treec417a2d2e531ccee313b4c297eaecc68b519995d
parent2feefc2c24d5f445405e4ce7a14c55c87360b694 (diff)
add support for 8bit TrueColor visuals. Who knew these existed. Fixes vnc's 8bit mode. (bug 2878)
-rw-r--r--render/color.c37
-rw-r--r--render/render.h1
2 files changed, 28 insertions, 10 deletions
diff --git a/render/color.c b/render/color.c
index e4b02334..600fc335 100644
--- a/render/color.c
+++ b/render/color.c
@@ -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:
diff --git a/render/render.h b/render/render.h
index a327756f..979bc933 100644
--- a/render/render.h
+++ b/render/render.h
@@ -45,6 +45,7 @@ typedef struct _RrColor RrColor;
typedef guint32 RrPixel32;
typedef guint16 RrPixel16;
+typedef guchar RrPixel8;
typedef enum {
RR_RELIEF_FLAT,