free the surfaces' pixeldata after rendering it
This commit is contained in:
parent
aceea3c081
commit
555facb9c7
5 changed files with 31 additions and 14 deletions
|
@ -26,11 +26,20 @@ Surface::Surface(int screen, const Size &size)
|
||||||
Surface::~Surface()
|
Surface::~Surface()
|
||||||
{
|
{
|
||||||
destroyObjects();
|
destroyObjects();
|
||||||
|
freePixelData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Surface::freePixelData()
|
||||||
|
{
|
||||||
|
if (_pixel_data) {
|
||||||
delete [] _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();
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue