start on the rendering images code

This commit is contained in:
Dana Jansens 2003-02-11 23:58:33 +00:00
parent 555facb9c7
commit 3147ad1a60
7 changed files with 75 additions and 14 deletions

View file

@ -41,4 +41,9 @@ void PseudoRenderControl::drawBackground(Surface& sf,
drawSolidBackground(sf, texture); drawSolidBackground(sf, texture);
} }
void PseudoRenderControl::drawImage(Surface &sf, int w, int h,
unsigned long *data) const
{
}
} }

View file

@ -28,6 +28,8 @@ public:
virtual ~PseudoRenderControl(); virtual ~PseudoRenderControl();
virtual void drawBackground(Surface& sf, const RenderTexture &texture) const; virtual void drawBackground(Surface& sf, const RenderTexture &texture) const;
virtual void drawImage(Surface &sf, int w, int h,
unsigned long *data) const;
}; };
} }

View file

@ -214,9 +214,4 @@ void RenderControl::drawMask(Surface &sf, const RenderColor &color,
XSetClipOrigin(**display, color.gc(), 0, 0); XSetClipOrigin(**display, color.gc(), 0, 0);
} }
void RenderControl::drawImage(Surface &sf, int w, int h,
unsigned long *data) const
{
}
} }

View file

@ -88,7 +88,8 @@ public:
The image must be specified in 32-bit packed ARGB format. The current The image must be specified in 32-bit packed ARGB format. The current
background will be used for applying the alpha. background will be used for applying the alpha.
*/ */
virtual void drawImage(Surface &sf, int w, int h, unsigned long *data) const; virtual void drawImage(Surface &sf, int w, int h,
unsigned long *data) const = 0;
//! Draws a string onto a Surface //! Draws a string onto a Surface
virtual void drawString(Surface &sf, const Font &font, int x, int y, virtual void drawString(Surface &sf, const Font &font, int x, int y,

View file

@ -46,14 +46,11 @@ void Surface::setPixmap(const RenderColor &color)
XFillRectangle(**display, _pixmap, color.gc(), 0, 0, XFillRectangle(**display, _pixmap, color.gc(), 0, 0,
_size.width(), _size.height()); _size.width(), _size.height());
pixel32 val = 0; // XXX set this from the color and shift amounts! pixel32 val = (color.red() << default_red_shift) &
for (unsigned int i = 0, s = _size.width() * _size.height(); i < s; ++i) { (color.green() << default_green_shift) &
unsigned char *p = (unsigned char*)&_pixel_data[i]; (color.blue() << default_blue_shift);
*p = (unsigned char) (val >> 24); for (unsigned int i = 0, s = _size.width() * _size.height(); i < s; ++i)
*++p = (unsigned char) (val >> 16); _pixel_data[i] = val;
*++p = (unsigned char) (val >> 8);
*++p = (unsigned char) val;
}
} }
void Surface::setPixmap(XImage *image) void Surface::setPixmap(XImage *image)

View file

@ -320,4 +320,62 @@ void TrueRenderControl::drawBackground(Surface& sf,
drawGradientBackground(sf, texture); 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);
}
} }

View file

@ -34,6 +34,9 @@ public:
virtual ~TrueRenderControl(); virtual ~TrueRenderControl();
virtual void drawBackground(Surface& sf, const RenderTexture &texture) const; virtual void drawBackground(Surface& sf, const RenderTexture &texture) const;
virtual void drawImage(Surface &sf, int w, int h,
unsigned long *data) const;
}; };
} }