From 3147ad1a60db250b5b552a406dc33046d250cfea Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 11 Feb 2003 23:58:33 +0000 Subject: [PATCH] start on the rendering images code --- otk/pseudorendercontrol.cc | 5 ++++ otk/pseudorendercontrol.hh | 2 ++ otk/rendercontrol.cc | 5 ---- otk/rendercontrol.hh | 3 +- otk/surface.cc | 13 ++++----- otk/truerendercontrol.cc | 58 ++++++++++++++++++++++++++++++++++++++ otk/truerendercontrol.hh | 3 ++ 7 files changed, 75 insertions(+), 14 deletions(-) diff --git a/otk/pseudorendercontrol.cc b/otk/pseudorendercontrol.cc index e239a4f0..1d55ee64 100644 --- a/otk/pseudorendercontrol.cc +++ b/otk/pseudorendercontrol.cc @@ -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 +{ +} + } diff --git a/otk/pseudorendercontrol.hh b/otk/pseudorendercontrol.hh index a1a12a81..d834d5d7 100644 --- a/otk/pseudorendercontrol.hh +++ b/otk/pseudorendercontrol.hh @@ -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; }; } diff --git a/otk/rendercontrol.cc b/otk/rendercontrol.cc index ef02230e..edf4a470 100644 --- a/otk/rendercontrol.cc +++ b/otk/rendercontrol.cc @@ -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 -{ -} - } diff --git a/otk/rendercontrol.hh b/otk/rendercontrol.hh index 49395c58..253e6530 100644 --- a/otk/rendercontrol.hh +++ b/otk/rendercontrol.hh @@ -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, diff --git a/otk/surface.cc b/otk/surface.cc index 9fff018c..b7aadd0f 100644 --- a/otk/surface.cc +++ b/otk/surface.cc @@ -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) diff --git a/otk/truerendercontrol.cc b/otk/truerendercontrol.cc index 0b0e5a0b..62265d96 100644 --- a/otk/truerendercontrol.cc +++ b/otk/truerendercontrol.cc @@ -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); +} + } diff --git a/otk/truerendercontrol.hh b/otk/truerendercontrol.hh index a1bc47dc..71b94e62 100644 --- a/otk/truerendercontrol.hh +++ b/otk/truerendercontrol.hh @@ -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; }; } -- 2.39.2