start on the rendering images code
This commit is contained in:
parent
555facb9c7
commit
3147ad1a60
7 changed files with 75 additions and 14 deletions
|
@ -41,4 +41,9 @@ void PseudoRenderControl::drawBackground(Surface& sf,
|
|||
drawSolidBackground(sf, texture);
|
||||
}
|
||||
|
||||
void PseudoRenderControl::drawImage(Surface &sf, int w, int h,
|
||||
unsigned long *data) const
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,6 +28,8 @@ public:
|
|||
virtual ~PseudoRenderControl();
|
||||
|
||||
virtual void drawBackground(Surface& sf, const RenderTexture &texture) const;
|
||||
virtual void drawImage(Surface &sf, int w, int h,
|
||||
unsigned long *data) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -214,9 +214,4 @@ void RenderControl::drawMask(Surface &sf, const RenderColor &color,
|
|||
XSetClipOrigin(**display, color.gc(), 0, 0);
|
||||
}
|
||||
|
||||
void RenderControl::drawImage(Surface &sf, int w, int h,
|
||||
unsigned long *data) const
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -88,7 +88,8 @@ public:
|
|||
The image must be specified in 32-bit packed ARGB format. The current
|
||||
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
|
||||
virtual void drawString(Surface &sf, const Font &font, int x, int y,
|
||||
|
|
|
@ -46,14 +46,11 @@ void Surface::setPixmap(const RenderColor &color)
|
|||
XFillRectangle(**display, _pixmap, color.gc(), 0, 0,
|
||||
_size.width(), _size.height());
|
||||
|
||||
pixel32 val = 0; // XXX set this from the color and shift amounts!
|
||||
for (unsigned int i = 0, s = _size.width() * _size.height(); i < s; ++i) {
|
||||
unsigned char *p = (unsigned char*)&_pixel_data[i];
|
||||
*p = (unsigned char) (val >> 24);
|
||||
*++p = (unsigned char) (val >> 16);
|
||||
*++p = (unsigned char) (val >> 8);
|
||||
*++p = (unsigned char) val;
|
||||
}
|
||||
pixel32 val = (color.red() << default_red_shift) &
|
||||
(color.green() << default_green_shift) &
|
||||
(color.blue() << default_blue_shift);
|
||||
for (unsigned int i = 0, s = _size.width() * _size.height(); i < s; ++i)
|
||||
_pixel_data[i] = val;
|
||||
}
|
||||
|
||||
void Surface::setPixmap(XImage *image)
|
||||
|
|
|
@ -320,4 +320,62 @@ void TrueRenderControl::drawBackground(Surface& sf,
|
|||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -34,6 +34,9 @@ public:
|
|||
virtual ~TrueRenderControl();
|
||||
|
||||
virtual void drawBackground(Surface& sf, const RenderTexture &texture) const;
|
||||
|
||||
virtual void drawImage(Surface &sf, int w, int h,
|
||||
unsigned long *data) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue