store the pixel32 data in the surface so it can be reused

This commit is contained in:
Dana Jansens 2003-02-11 21:50:06 +00:00
parent e429ce39de
commit 58847af218
6 changed files with 60 additions and 49 deletions

View file

@ -7,10 +7,11 @@ extern "C" {
#include <X11/Xutil.h> #include <X11/Xutil.h>
} }
#include "surface.hh"
namespace otk { namespace otk {
class ScreenInfo; class ScreenInfo;
class Surface;
class RenderTexture; class RenderTexture;
class Font; class Font;
class RenderColor; class RenderColor;

View file

@ -54,8 +54,8 @@ RenderStyle::RenderStyle(int screen, const std::string &stylefile)
_file(stylefile) _file(stylefile)
{ {
// pick one.. // pick one..
//#define FIERON #define FIERON
#define MERRY //#define MERRY
#ifdef FIERON #ifdef FIERON
_root_color = new RenderColor(_screen, 0x272a2f); _root_color = new RenderColor(_screen, 0x272a2f);

View file

@ -9,6 +9,7 @@
extern "C" { extern "C" {
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include <cstring>
} }
namespace otk { namespace otk {
@ -16,6 +17,7 @@ namespace otk {
Surface::Surface(int screen, const Size &size) Surface::Surface(int screen, const Size &size)
: _screen(screen), : _screen(screen),
_size(size), _size(size),
_pixel_data(new pixel32[size.width()*size.height()]),
_pixmap(None), _pixmap(None),
_xftdraw(0) _xftdraw(0)
{ {
@ -24,6 +26,7 @@ Surface::Surface(int screen, const Size &size)
Surface::~Surface() Surface::~Surface()
{ {
destroyObjects(); destroyObjects();
delete [] _pixel_data;
} }
void Surface::setPixmap(const RenderColor &color) void Surface::setPixmap(const RenderColor &color)
@ -33,6 +36,15 @@ 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!
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;
}
} }
void Surface::setPixmap(XImage *image) void Surface::setPixmap(XImage *image)

View file

@ -3,23 +3,41 @@
#define __surface_hh #define __surface_hh
#include "size.hh" #include "size.hh"
#include "truerendercontrol.hh"
#include "pseudorendercontrol.hh"
extern "C" { extern "C" {
#include <X11/Xlib.h> #include <X11/Xlib.h>
#define _XFT_NO_COMPAT_ // no Xft 1 API #define _XFT_NO_COMPAT_ // no Xft 1 API
#include <X11/Xft/Xft.h> #include <X11/Xft/Xft.h>
#ifdef HAVE_STDINT_H
# include <stdint.h>
#else
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
#endif
} }
namespace otk { namespace otk {
class ScreenInfo; class ScreenInfo;
class RenderColor; class RenderColor;
class RenderControl;
class TrueRenderControl;
class PseudoRenderControl;
#ifdef HAVE_STDINT_H
typedef uint32_t pixel32;
typedef uint16_t pixel16;
#else
typedef u_int32_t pixel32;
typedef u_int16_t pixel16;
#endif /* HAVE_STDINT_H */
class Surface { class Surface {
int _screen; int _screen;
Size _size; Size _size;
pixel32 *_pixel_data;
Pixmap _pixmap; Pixmap _pixmap;
XftDraw *_xftdraw; XftDraw *_xftdraw;
@ -36,9 +54,11 @@ public:
inline int screen(void) const { return _screen; } inline int screen(void) const { return _screen; }
virtual const Size& size() const { return _size; } const Size& size() const { return _size; }
virtual Pixmap pixmap() const { return _pixmap; } Pixmap pixmap() const { return _pixmap; }
pixel32 *pixelData() { return _pixel_data; }
// The RenderControl classes use the internal objects in this class to render // The RenderControl classes use the internal objects in this class to render
// to it. Noone else needs them tho, so they are private. // to it. Noone else needs them tho, so they are private.

View file

@ -64,23 +64,24 @@ void TrueRenderControl::drawGradientBackground(
XImage *im = XCreateImage(**display, info->visual(), info->depth(), XImage *im = XCreateImage(**display, info->visual(), info->depth(),
ZPixmap, 0, NULL, w, h, 32, 0); ZPixmap, 0, NULL, w, h, 32, 0);
im->byte_order = endian; im->byte_order = endian;
pixel32 *data = new pixel32[h*w];
pixel32 current;
switch (texture.gradient()) { switch (texture.gradient()) {
case RenderTexture::Vertical: case RenderTexture::Vertical:
verticalGradient(sf, texture, data); verticalGradient(sf, texture);
break; break;
case RenderTexture::Diagonal: case RenderTexture::Diagonal:
diagonalGradient(sf, texture, data); diagonalGradient(sf, texture);
break; break;
case RenderTexture::CrossDiagonal: case RenderTexture::CrossDiagonal:
crossDiagonalGradient(sf, texture, data); crossDiagonalGradient(sf, texture);
break; break;
default: default:
printf("unhandled gradient\n"); printf("unhandled gradient\n");
} }
pixel32 *data = sf.pixelData();
pixel32 current;
if (texture.relief() == RenderTexture::Flat && texture.border()) { if (texture.relief() == RenderTexture::Flat && texture.border()) {
r = texture.borderColor().red(); r = texture.borderColor().red();
g = texture.borderColor().green(); g = texture.borderColor().green();
@ -122,21 +123,20 @@ void TrueRenderControl::drawGradientBackground(
} }
} }
reduceDepth(im, data); reduceDepth(sf, im);
im->data = (char*) data; im->data = (char*) data;
sf.setPixmap(im); sf.setPixmap(im);
delete [] im->data;
im->data = NULL; im->data = NULL;
XDestroyImage(im); XDestroyImage(im);
} }
void TrueRenderControl::verticalGradient(Surface &sf, void TrueRenderControl::verticalGradient(Surface &sf,
const RenderTexture &texture, const RenderTexture &texture) const
pixel32 *data) const
{ {
pixel32 *data = sf.pixelData();
pixel32 current; pixel32 current;
float dr, dg, db; float dr, dg, db;
unsigned int r,g,b; unsigned int r,g,b;
@ -164,9 +164,9 @@ void TrueRenderControl::verticalGradient(Surface &sf,
} }
void TrueRenderControl::diagonalGradient(Surface &sf, void TrueRenderControl::diagonalGradient(Surface &sf,
const RenderTexture &texture, const RenderTexture &texture) const
pixel32 *data) const
{ {
pixel32 *data = sf.pixelData();
pixel32 current; pixel32 current;
float drx, dgx, dbx, dry, dgy, dby; float drx, dgx, dbx, dry, dgy, dby;
unsigned int r,g,b; unsigned int r,g,b;
@ -196,10 +196,10 @@ void TrueRenderControl::diagonalGradient(Surface &sf,
} }
} }
void TrueRenderControl::crossDiagonalGradient(Surface &sf, void TrueRenderControl::crossDiagonalGradient(
const RenderTexture &texture, Surface &sf, const RenderTexture &texture) const
pixel32 *data) const
{ {
pixel32 *data = sf.pixelData();
pixel32 current; pixel32 current;
float drx, dgx, dbx, dry, dgy, dby; float drx, dgx, dbx, dry, dgy, dby;
unsigned int r,g,b; unsigned int r,g,b;
@ -229,11 +229,12 @@ void TrueRenderControl::crossDiagonalGradient(Surface &sf,
} }
} }
void TrueRenderControl::reduceDepth(XImage *im, pixel32 *data) const void TrueRenderControl::reduceDepth(Surface &sf, XImage *im) const
{ {
// since pixel32 is the largest possible pixel size, we can share the array // since pixel32 is the largest possible pixel size, we can share the array
int r, g, b; int r, g, b;
int x,y; int x,y;
pixel32 *data = sf.pixelData();
pixel16 *p = (pixel16*) data; pixel16 *p = (pixel16*) data;
switch (im->bits_per_pixel) { switch (im->bits_per_pixel) {
case 32: case 32:

View file

@ -4,30 +4,10 @@
#include "rendercontrol.hh" #include "rendercontrol.hh"
extern "C" {
#ifdef HAVE_STDINT_H
# include <stdint.h>
#else
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
#endif
}
#include <vector> #include <vector>
namespace otk { namespace otk {
#ifdef HAVE_STDINT_H
typedef uint32_t pixel32;
typedef uint16_t pixel16;
#else
typedef u_int32_t pixel32;
typedef u_int16_t pixel16;
#endif /* HAVE_STDINT_H */
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
const int default_red_shift=0; const int default_red_shift=0;
const int default_green_shift=8; const int default_green_shift=8;
@ -54,13 +34,10 @@ private:
int _blue_offset; int _blue_offset;
inline void highlight(pixel32 *x, pixel32 *y, bool raised) const; inline void highlight(pixel32 *x, pixel32 *y, bool raised) const;
void reduceDepth(XImage *im, pixel32 *data) const; void reduceDepth(Surface &sf, XImage *im) const;
void verticalGradient(Surface &sf, const RenderTexture &texture, void verticalGradient(Surface &sf, const RenderTexture &texture) const;
pixel32 *data) const; void diagonalGradient(Surface &sf, const RenderTexture &texture) const;
void diagonalGradient(Surface &sf, const RenderTexture &texture, void crossDiagonalGradient(Surface &sf, const RenderTexture &texture) const;
pixel32 *data) const;
void crossDiagonalGradient(Surface &sf, const RenderTexture &texture,
pixel32 *data) const;
virtual void drawGradientBackground(Surface &sf, virtual void drawGradientBackground(Surface &sf,
const RenderTexture &texture) const; const RenderTexture &texture) const;