all repos — openbox @ 555facb9c737be20cd923abc15875af0281a8927

openbox fork - make it a bit more like ryudo

free the surfaces' pixeldata after rendering it
Dana Jansens danakj@orodu.net
commit

555facb9c737be20cd923abc15875af0281a8927

parent

aceea3c0814778317be7a903f63b8363d2b1b0ef

5 files changed, 31 insertions(+), 14 deletions(-)

jump to
M otk/surface.ccotk/surface.cc

@@ -26,14 +26,23 @@

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(XImage *image) { + assert(_pixel_data); assert(image->width == _size.width()); assert(image->height == _size.height());
M otk/surface.hhotk/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;

@@ -59,6 +71,10 @@

Pixmap pixmap() const { return _pixmap; } 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.
M otk/truerendercontrol.hhotk/truerendercontrol.hh

@@ -8,18 +8,6 @@ #include <vector>

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
M otk/widget.ccotk/widget.cc

@@ -508,6 +508,7 @@

// 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;
M src/frame.ccsrc/frame.cc

@@ -227,6 +227,7 @@ otk::display->renderControl(screen)->drawBackground(*s, texture);

XSetWindowBackgroundPixmap(**otk::display, win, s->pixmap()); XClearWindow(**otk::display, win); if (*surface) delete *surface; + s->freePixelData(); *surface = s; }

@@ -382,6 +383,7 @@

XSetWindowBackgroundPixmap(**otk::display, _label, s->pixmap()); XClearWindow(**otk::display, _label); if (_label_sur) delete _label_sur; + s->freePixelData(); _label_sur = s; }