render images properly, minus the scaling

This commit is contained in:
Dana Jansens 2003-02-13 10:19:25 +00:00
parent afd477692d
commit 1e58c863bb

View file

@ -441,42 +441,44 @@ void RenderControl::drawImage(Surface &sf, int w, int h,
unsigned long *data) const unsigned long *data) const
{ {
pixel32 *bg = sf.pixelData(); pixel32 *bg = sf.pixelData();
int startx, x, y, c; int x, y, c, sfw, sfh;
unsigned int i, e; unsigned int i, e, bgi;
x = (sf.size().width() - w) / 2; sfw = sf.size().width();
y = (sf.size().height() - h) / 2; sfh = sf.size().height();
x = (sfw - w) / 2;
y = (sfh - h) / 2;
if (x < 0) x = 0; if (x < 0) x = 0;
if (y < 0) y = 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, bgi = y * sfw + x, e = orgw*h; i < e; ++i, ++bgi) {
for (i = 0, c = 0, e = w*h; i < e; ++i) {
unsigned char alpha = data[i] >> 24; unsigned char alpha = data[i] >> 24;
unsigned char r = data[i] >> 16; unsigned char r = data[i] >> 16;
unsigned char g = data[i] >> 8; unsigned char g = data[i] >> 8;
unsigned char b = data[i]; unsigned char b = data[i];
// background color // background color
unsigned char bgr = bg[i] >> default_red_shift; unsigned char bgr = bg[bgi] >> default_red_shift;
unsigned char bgg = bg[i] >> default_green_shift; unsigned char bgg = bg[bgi] >> default_green_shift;
unsigned char bgb = bg[i] >> default_blue_shift; unsigned char bgb = bg[bgi] >> default_blue_shift;
r = bgr + (r - bgr) * alpha >> 8; r = bgr + (((r - bgr) * alpha) >> 8);
g = bgg + (g - bgg) * alpha >> 8; g = bgg + (((g - bgg) * alpha) >> 8);
b = bgb + (b - bgb) * 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); (b << default_blue_shift);
if (++c >= w) { if (++c >= w) {
++y;
x = startx;
c = 0; c = 0;
} else bgi += sfw - w;
++x; i += orgw - w;
}
} }
const ScreenInfo *info = display->screenInfo(_screen); const ScreenInfo *info = display->screenInfo(_screen);