]> Dogcows Code - chaz/openbox/commitdiff
free the surfaces' pixeldata after rendering it
authorDana Jansens <danakj@orodu.net>
Tue, 11 Feb 2003 22:38:29 +0000 (22:38 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 11 Feb 2003 22:38:29 +0000 (22:38 +0000)
otk/surface.cc
otk/surface.hh
otk/truerendercontrol.hh
otk/widget.cc
src/frame.cc

index 3f5624d7f089192d8ca8e15581d3942570ab01c4..9fff018c3a67d79060d70ae269b6ec6b65cfd8f4 100644 (file)
@@ -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());
   
index 40dfbf84cee43747b433e1ebbc7604978a116a63..a44b9049740820e098fa5fb39cdf6deb9decabbc 100644 (file)
@@ -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;
index e0a0b31bc8fe75d45fc80280430914093dc85237..a1bc47dcc2e8c467d0113da2e6f9780a5f5f106b 100644 (file)
@@ -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
index eccbb5212392079238fb5894610ec5fa4a8a6d2a..690224d897d7c13124cda435d717503ff1724fe0 100644 (file)
@@ -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;
index 5f63d17cf1f22f79a798651eeef7307561e8cbe2..a4188b6ee44b93111beb9f0d3e84f2c9cd52f798 100644 (file)
@@ -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;
 }
 
This page took 0.029875 seconds and 4 git commands to generate.