X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Frendercontrol.cc;h=90f99632426efb8db566ce2c58252ae45beeb1ae;hb=50002f2ceb4234145f3977bb14752dc930ada26c;hp=802c7f55aee4f64d7256f73eeffe0d3e73ed2402;hpb=72ff846dbb56ec36231fb761b864da09885d3690;p=chaz%2Fopenbox diff --git a/otk/rendercontrol.cc b/otk/rendercontrol.cc index 802c7f55..90f99632 100644 --- a/otk/rendercontrol.cc +++ b/otk/rendercontrol.cc @@ -441,42 +441,63 @@ 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 oldw = w, oldh = h; + unsigned long *olddata = data; + if (w > sfw) w = sfw; + if (h > sfh) h = sfh; + unsigned long newdata[w*h]; + if (w < oldw || h < oldh) { + double dx = oldw / (double)w; + double dy = oldh / (double)h; + double px = 0.0; + double py = 0.0; + int iy = 0; + for (i = 0, c = 0, e = w*h; i < e; ++i) { + newdata[i] = olddata[(int)px + iy]; + if (++c >= w) { + c = 0; + px = 0; + py += dy; + iy = (int)py * oldw; + } else + px += dx; + } + data = newdata; + } - startx = x; - - for (i = 0, c = 0, e = w*h; i < e; ++i) { + for (i = 0, c = 0, bgi = y * sfw + x, e = w*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; + } } const ScreenInfo *info = display->screenInfo(_screen);