diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-02-11 23:58:33 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-02-11 23:58:33 +0000 |
| commit | 3147ad1a60db250b5b552a406dc33046d250cfea (patch) | |
| tree | 9278191b64a67e46e4c6f15452ec4c196881ae8c /otk/truerendercontrol.cc | |
| parent | 555facb9c737be20cd923abc15875af0281a8927 (diff) | |
start on the rendering images code
Diffstat (limited to 'otk/truerendercontrol.cc')
| -rw-r--r-- | otk/truerendercontrol.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/otk/truerendercontrol.cc b/otk/truerendercontrol.cc index 0b0e5a0b..62265d96 100644 --- a/otk/truerendercontrol.cc +++ b/otk/truerendercontrol.cc @@ -320,4 +320,62 @@ void TrueRenderControl::drawBackground(Surface& sf, drawGradientBackground(sf, texture); } + +void TrueRenderControl::drawImage(Surface &sf, int w, int h, + unsigned long *data) const +{ + pixel32 *bg = sf.pixelData(); + int startx, x, y, c; + unsigned int i, e; + x = (sf.size().width() - w) / 2; + y = (sf.size().height() - h) / 2; + + if (x < 0) x = 0; + if (y < 0) y = 0; + + // XX SCALING!@!&*(@! to make it fit on the surface + + startx = x; + + for (i = 0, c = 0, e = w*h; i < e; ++i) { + unsigned char alpha = data[i] >> 24; + unsigned char r = data[i]; + unsigned char g = data[i] >> 8; + unsigned char b = data[i] >> 16; + + // background color + unsigned char bgr = bg[i] >> default_red_shift; + unsigned char bgg = bg[i] >> default_green_shift; + unsigned char bgb = bg[i] >> default_blue_shift; + + r = bgr + (r - bgr) * alpha >> 8; + g = bgg + (g - bgg) * alpha >> 8; + b = bgb + (b - bgb) * alpha >> 8; + + bg[i] = (r << default_red_shift) & (g << default_green_shift) & + (b << default_blue_shift); + + if (++c >= w) { + ++y; + x = startx; + c = 0; + } + } + + const ScreenInfo *info = display->screenInfo(_screen); + XImage *im = XCreateImage(**display, info->visual(), info->depth(), + ZPixmap, 0, NULL, sf.size().width(), + sf.size().height(), 32, 0); + im->byte_order = endian; + + reduceDepth(sf, im); + + im->data = (char*) bg; + + sf.setPixmap(im); + + im->data = NULL; + XDestroyImage(im); +} + } |
