diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-02-11 22:38:29 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-02-11 22:38:29 +0000 |
| commit | 555facb9c737be20cd923abc15875af0281a8927 (patch) | |
| tree | fed6201d3d0993cf400a0d329b3e8d92d9dd492e /otk | |
| parent | aceea3c0814778317be7a903f63b8363d2b1b0ef (diff) | |
free the surfaces' pixeldata after rendering it
Diffstat (limited to 'otk')
| -rw-r--r-- | otk/surface.cc | 14 | ||||
| -rw-r--r-- | otk/surface.hh | 16 | ||||
| -rw-r--r-- | otk/truerendercontrol.hh | 12 | ||||
| -rw-r--r-- | otk/widget.cc | 1 |
4 files changed, 29 insertions, 14 deletions
diff --git a/otk/surface.cc b/otk/surface.cc index 3f5624d7..9fff018c 100644 --- a/otk/surface.cc +++ b/otk/surface.cc @@ -26,14 +26,23 @@ Surface::Surface(int screen, const Size &size) Surface::~Surface() { destroyObjects(); - delete [] _pixel_data; + freePixelData(); +} + +void Surface::freePixelData() +{ + if (_pixel_data) { + delete [] _pixel_data; + _pixel_data = 0; + } } void Surface::setPixmap(const RenderColor &color) { + assert(_pixel_data); if (_pixmap == None) createObjects(); - + XFillRectangle(**display, _pixmap, color.gc(), 0, 0, _size.width(), _size.height()); @@ -49,6 +58,7 @@ void Surface::setPixmap(const RenderColor &color) void Surface::setPixmap(XImage *image) { + assert(_pixel_data); assert(image->width == _size.width()); assert(image->height == _size.height()); diff --git a/otk/surface.hh b/otk/surface.hh index 40dfbf84..a44b9049 100644 --- a/otk/surface.hh +++ b/otk/surface.hh @@ -34,6 +34,18 @@ typedef u_int32_t pixel32; typedef u_int16_t pixel16; #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 { int _screen; Size _size; @@ -60,6 +72,10 @@ public: 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 // to it. Noone else needs them tho, so they are private. friend class RenderControl; diff --git a/otk/truerendercontrol.hh b/otk/truerendercontrol.hh index e0a0b31b..a1bc47dc 100644 --- a/otk/truerendercontrol.hh +++ b/otk/truerendercontrol.hh @@ -8,18 +8,6 @@ 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 { private: // the number of bits to shift a color value (from 0-255) to the right, to diff --git a/otk/widget.cc b/otk/widget.cc index eccbb521..690224d8 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -508,6 +508,7 @@ void Widget::render() // delete the old surface *after* its pixmap isn't in use anymore if (_surface) delete _surface; + s->freePixelData(); // done rendering with this surface _surface = s; _dirty = false; |
