while (! (green_mask & 1)) { _green_offset++; green_mask >>= 1; }
while (! (blue_mask & 1)) { _blue_offset++; blue_mask >>= 1; }
- // use the mask to determine the number of bits for each shade of color
- // so, best case, red_mask == 0xff (255), with each bit as a different
- // shade!
+ // scale available colorspace to match our 256x256x256 cube
_red_bits = 255 / red_mask;
_green_bits = 255 / green_mask;
_blue_bits = 255 / blue_mask;
- // compute color tables, based on the number of bits for each shade
for (int i = 0; i < 256; i++) {
_red_color_table[i] = i / _red_bits;
_green_color_table[i] = i / _green_bits;
}
-static inline
-void assignPixel(unsigned int bit_depth, unsigned char **data, unsigned long pixel) {
- unsigned char *pixel_data = *data;
- switch (bit_depth) {
- case 8: // 8bpp
- *pixel_data++ = pixel;
- break;
-
- case 16: // 16bpp LSB
- *pixel_data++ = pixel;
- *pixel_data++ = pixel >> 8;
- break;
-
- case 17: // 16bpp MSB
- *pixel_data++ = pixel >> 8;
- *pixel_data++ = pixel;
- break;
-
- case 24: // 24bpp LSB
- *pixel_data++ = pixel;
- *pixel_data++ = pixel >> 8;
- *pixel_data++ = pixel >> 16;
- break;
-
- case 25: // 24bpp MSB
- *pixel_data++ = pixel >> 16;
- *pixel_data++ = pixel >> 8;
- *pixel_data++ = pixel;
- break;
-
- case 32: // 32bpp LSB
- *pixel_data++ = pixel;
- *pixel_data++ = pixel >> 8;
- *pixel_data++ = pixel >> 16;
- *pixel_data++ = pixel >> 24;
- break;
-
- case 33: // 32bpp MSB
- *pixel_data++ = pixel >> 24;
- *pixel_data++ = pixel >> 16;
- *pixel_data++ = pixel >> 8;
- *pixel_data++ = pixel;
- break;
- }
- *data = pixel_data; // assign back so we don't lose our place
-}
-
-void renderPixel(XImage *im, unsigned char *dp, unsigned long pixel)
+static inline void renderPixel(XImage *im, unsigned char *dp,
+ unsigned long pixel)
{
unsigned int bpp = im->bits_per_pixel + (im->byte_order == MSBFirst) ? 1 : 0;
*dp++ = pixel >> 8;
*dp++ = pixel;
break;
+ default:
+ assert(false); // wtf?
}
}
//GC gc = XCreateGC(**display, _screen->rootWindow(), GCCapStyle, &gcv);
// XXX + 1?
- unsigned char *data = new unsigned char[im->bytes_per_line * (h + 1)];
+ unsigned char *data = new unsigned char[im->bytes_per_line * h];
unsigned char *dp = data;
for (int x = 0; x < w; ++x, dp += im->bits_per_pixel/8)
for (int x = 0; x < w; ++x, dp += im->bits_per_pixel/8)
renderPixel(im, dp, _blue_color_table[x] << _blue_offset);
- printf("\nDone\n");
+ printf("\nDone %d %d\n", im->bytes_per_line * h, dp - data);
im->data = (char*) data;