otk/truerendercontrol.cc (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #ifdef HAVE_CONFIG_H # include "../config.h" #endif // HAVE_CONFIG_H #include "truerendercontrol.hh" #include "display.hh" #include "screeninfo.hh" #include "surface.hh" #include "rendertexture.hh" extern "C" { #ifdef HAVE_STDLIB_H # include <stdlib.h> #endif // HAVE_STDLIB_H #include "gettext.h" #define _(str) gettext(str) } namespace otk { TrueRenderControl::TrueRenderControl(int screen) : RenderControl(screen), _red_offset(0), _green_offset(0), _blue_offset(0) { printf("Initializing TrueColor RenderControl\n"); Visual *visual = display->screenInfo(_screen)->visual(); unsigned long red_mask, green_mask, blue_mask; // find the offsets for each color in the visual's masks red_mask = visual->red_mask; green_mask = visual->green_mask; blue_mask = visual->blue_mask; while (! (red_mask & 1)) { _red_offset++; red_mask >>= 1; } while (! (green_mask & 1)) { _green_offset++; green_mask >>= 1; } while (! (blue_mask & 1)) { _blue_offset++; blue_mask >>= 1; } _red_shift = _green_shift = _blue_shift = 8; while (red_mask) { red_mask >>= 1; _red_shift--; } while (green_mask) { green_mask >>= 1; _green_shift--; } while (blue_mask) { blue_mask >>= 1; _blue_shift--; } } TrueRenderControl::~TrueRenderControl() { printf("Destroying TrueColor RenderControl\n"); } 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); switch (bpp) { case 8: // 8bpp *dp++ = pixel; break; case 16: // 16bpp LSB *dp++ = pixel; *dp++ = pixel >> 8; break; case 17: // 16bpp MSB *dp++ = pixel >> 8; *dp++ = pixel; break; case 24: // 24bpp LSB *dp++ = pixel; *dp++ = pixel >> 8; *dp++ = pixel >> 16; break; case 25: // 24bpp MSB *dp++ = pixel >> 16; *dp++ = pixel >> 8; *dp++ = pixel; break; case 32: // 32bpp LSB *dp++ = pixel; *dp++ = pixel >> 8; *dp++ = pixel >> 16; *dp++ = pixel >> 24; break; case 33: // 32bpp MSB *dp++ = pixel >> 24; *dp++ = pixel >> 16; *dp++ = pixel >> 8; *dp++ = pixel; break; default: assert(false); // wtf? } } void TrueRenderControl::drawBackground(Surface& sf, const RenderTexture &texture) const { assert(sf._screen == _screen); int w = sf.width(), h = sf.height(); const ScreenInfo *info = display->screenInfo(_screen); XImage *im = XCreateImage(**display, info->visual(), info->depth(), ZPixmap, 0, NULL, w, h, 32, 0); unsigned char *data = new unsigned char[im->bytes_per_line * h]; unsigned char *dp = data; unsigned int bytes_per_pixel = im->bits_per_pixel/8; for (int y = 0; y < h/3; ++y) for (int x = 0; x < w; ++x, dp += bytes_per_pixel) renderPixel(im, dp, (255*x/w) >> _red_shift << _red_offset); for (int y = 0; y < h/3; ++y) for (int x = 0; x < w; ++x, dp += bytes_per_pixel) renderPixel(im, dp, (255*x/w) >> _green_shift << _green_offset); for (int y = 0; y < h/3; ++y) for (int x = 0; x < w; ++x, dp += bytes_per_pixel) renderPixel(im, dp, (255*x/w) >> _blue_shift << _blue_offset); im->data = (char*) data; // sf.setPixmap(im); sf.setPixmap(texture.color()); // sf.setPixmap(RenderColor(_screen, 0xff, 0xff, 0)); delete [] im->data; im->data = NULL; XDestroyImage(im);} } |