free the surfaces' pixeldata after rendering it

This commit is contained in:
Dana Jansens 2003-02-11 22:38:29 +00:00
parent aceea3c081
commit 555facb9c7
5 changed files with 31 additions and 14 deletions

View file

@ -26,14 +26,23 @@ Surface::Surface(int screen, const Size &size)
Surface::~Surface() Surface::~Surface()
{ {
destroyObjects(); destroyObjects();
delete [] _pixel_data; freePixelData();
}
void Surface::freePixelData()
{
if (_pixel_data) {
delete [] _pixel_data;
_pixel_data = 0;
}
} }
void Surface::setPixmap(const RenderColor &color) void Surface::setPixmap(const RenderColor &color)
{ {
assert(_pixel_data);
if (_pixmap == None) if (_pixmap == None)
createObjects(); createObjects();
XFillRectangle(**display, _pixmap, color.gc(), 0, 0, XFillRectangle(**display, _pixmap, color.gc(), 0, 0,
_size.width(), _size.height()); _size.width(), _size.height());
@ -49,6 +58,7 @@ void Surface::setPixmap(const RenderColor &color)
void Surface::setPixmap(XImage *image) void Surface::setPixmap(XImage *image)
{ {
assert(_pixel_data);
assert(image->width == _size.width()); assert(image->width == _size.width());
assert(image->height == _size.height()); assert(image->height == _size.height());

View file

@ -34,6 +34,18 @@ typedef u_int32_t pixel32;
typedef u_int16_t pixel16; typedef u_int16_t pixel16;
#endif /* HAVE_STDINT_H */ #endif /* HAVE_STDINT_H */
#ifdef WORDS_BIGENDIAN
const int default_red_shift=0;
const int default_green_shift=8;
const int default_blue_shift=16;
const int endian=MSBFirst;
#else
const int default_red_shift=16;
const int default_green_shift=8;
const int default_blue_shift=0;
const int endian=LSBFirst;
#endif /* WORDS_BIGENDIAN */
class Surface { class Surface {
int _screen; int _screen;
Size _size; Size _size;
@ -60,6 +72,10 @@ public:
pixel32 *pixelData() { return _pixel_data; } pixel32 *pixelData() { return _pixel_data; }
//! Frees the pixel data when it will no longer be needed. Only do this once
//! you have completed rendering onto the surface.
void freePixelData();
// 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.
friend class RenderControl; friend class RenderControl;

View file

@ -8,18 +8,6 @@
namespace otk { namespace otk {
#ifdef WORDS_BIGENDIAN
const int default_red_shift=0;
const int default_green_shift=8;
const int default_blue_shift=16;
const int endian=MSBFirst;
#else
const int default_red_shift=16;
const int default_green_shift=8;
const int default_blue_shift=0;
const int endian=LSBFirst;
#endif /* WORDS_BIGENDIAN */
class TrueRenderControl : public RenderControl { class TrueRenderControl : public RenderControl {
private: private:
// the number of bits to shift a color value (from 0-255) to the right, to // the number of bits to shift a color value (from 0-255) to the right, to

View file

@ -508,6 +508,7 @@ void Widget::render()
// delete the old surface *after* its pixmap isn't in use anymore // delete the old surface *after* its pixmap isn't in use anymore
if (_surface) delete _surface; if (_surface) delete _surface;
s->freePixelData(); // done rendering with this surface
_surface = s; _surface = s;
_dirty = false; _dirty = false;

View file

@ -227,6 +227,7 @@ static void render(int screen, const otk::Size &size, Window win,
XSetWindowBackgroundPixmap(**otk::display, win, s->pixmap()); XSetWindowBackgroundPixmap(**otk::display, win, s->pixmap());
XClearWindow(**otk::display, win); XClearWindow(**otk::display, win);
if (*surface) delete *surface; if (*surface) delete *surface;
s->freePixelData();
*surface = s; *surface = s;
} }
@ -382,6 +383,7 @@ void Frame::renderLabel()
XSetWindowBackgroundPixmap(**otk::display, _label, s->pixmap()); XSetWindowBackgroundPixmap(**otk::display, _label, s->pixmap());
XClearWindow(**otk::display, _label); XClearWindow(**otk::display, _label);
if (_label_sur) delete _label_sur; if (_label_sur) delete _label_sur;
s->freePixelData();
_label_sur = s; _label_sur = s;
} }