+
+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);
+}
+