diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-02-13 10:19:25 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-02-13 10:19:25 +0000 |
| commit | 1e58c863bbaddd2f2dbebfde740ca842e8837a1c (patch) | |
| tree | dceb9a93d680da2deb0d254a9436f77db58a4f55 /otk/rendercontrol.cc | |
| parent | afd477692d3268af445c3fc27057cf35e58ab51f (diff) | |
render images properly, minus the scaling
Diffstat (limited to 'otk/rendercontrol.cc')
| -rw-r--r-- | otk/rendercontrol.cc | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/otk/rendercontrol.cc b/otk/rendercontrol.cc index 802c7f55..2e80217d 100644 --- a/otk/rendercontrol.cc +++ b/otk/rendercontrol.cc @@ -441,42 +441,44 @@ void RenderControl::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; + int x, y, c, sfw, sfh; + unsigned int i, e, bgi; + sfw = sf.size().width(); + sfh = sf.size().height(); + x = (sfw - w) / 2; + y = (sfh - h) / 2; if (x < 0) x = 0; if (y < 0) y = 0; - // XX SCALING!@!&*(@! to make it fit on the surface + // XXX SCALING!@!&*(@! to make it fit on the surface + int orgw = w; + if (w > sfw) w = sfw; + if (h > sfh) h = sfh; - startx = x; - - for (i = 0, c = 0, e = w*h; i < e; ++i) { + for (i = 0, c = 0, bgi = y * sfw + x, e = orgw*h; i < e; ++i, ++bgi) { unsigned char alpha = data[i] >> 24; unsigned char r = data[i] >> 16; unsigned char g = data[i] >> 8; unsigned char b = data[i]; // 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; + unsigned char bgr = bg[bgi] >> default_red_shift; + unsigned char bgg = bg[bgi] >> default_green_shift; + unsigned char bgb = bg[bgi] >> default_blue_shift; - r = bgr + (r - bgr) * alpha >> 8; - g = bgg + (g - bgg) * alpha >> 8; - b = bgb + (b - bgb) * alpha >> 8; + 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) | + bg[bgi] = (r << default_red_shift) | (g << default_green_shift) | (b << default_blue_shift); if (++c >= w) { - ++y; - x = startx; c = 0; - } else - ++x; + bgi += sfw - w; + i += orgw - w; + } } const ScreenInfo *info = display->screenInfo(_screen); |
