summaryrefslogtreecommitdiff
path: root/otk
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-02-11 23:58:33 +0000
committerDana Jansens <danakj@orodu.net>2003-02-11 23:58:33 +0000
commit3147ad1a60db250b5b552a406dc33046d250cfea (patch)
tree9278191b64a67e46e4c6f15452ec4c196881ae8c /otk
parent555facb9c737be20cd923abc15875af0281a8927 (diff)
start on the rendering images code
Diffstat (limited to 'otk')
-rw-r--r--otk/pseudorendercontrol.cc5
-rw-r--r--otk/pseudorendercontrol.hh2
-rw-r--r--otk/rendercontrol.cc5
-rw-r--r--otk/rendercontrol.hh3
-rw-r--r--otk/surface.cc13
-rw-r--r--otk/truerendercontrol.cc58
-rw-r--r--otk/truerendercontrol.hh3
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;
};
}