summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-02-11 22:38:29 +0000
committerDana Jansens <danakj@orodu.net>2003-02-11 22:38:29 +0000
commit555facb9c737be20cd923abc15875af0281a8927 (patch)
treefed6201d3d0993cf400a0d329b3e8d92d9dd492e
parentaceea3c0814778317be7a903f63b8363d2b1b0ef (diff)
free the surfaces' pixeldata after rendering it
-rw-r--r--otk/surface.cc14
-rw-r--r--otk/surface.hh16
-rw-r--r--otk/truerendercontrol.hh12
-rw-r--r--otk/widget.cc1
-rw-r--r--src/frame.cc2
5 files changed, 31 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;
diff --git a/src/frame.cc b/src/frame.cc
index 5f63d17c..a4188b6e 100644
--- a/src/frame.cc
+++ b/src/frame.cc
@@ -227,6 +227,7 @@ static void render(int screen, const otk::Size &size, Window win,
XSetWindowBackgroundPixmap(**otk::display, win, s->pixmap());
XClearWindow(**otk::display, win);
if (*surface) delete *surface;
+ s->freePixelData();
*surface = s;
}
@@ -382,6 +383,7 @@ void Frame::renderLabel()
XSetWindowBackgroundPixmap(**otk::display, _label, s->pixmap());
XClearWindow(**otk::display, _label);
if (_label_sur) delete _label_sur;
+ s->freePixelData();
_label_sur = s;
}