summaryrefslogtreecommitdiff
path: root/otk/surface.cc
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-18 07:23:28 +0000
committerDana Jansens <danakj@orodu.net>2003-01-18 07:23:28 +0000
commit9b6e5f9cf49df78be25720f9c4b33a733b856c9b (patch)
tree0da395f661151ce079d09483594f221c89e5d196 /otk/surface.cc
parenta4dd208a7955e25bca710d4bcf355de7e608b9e1 (diff)
provide RenderControls to all otk from the display class. initialize them all there. try use bitshifts instead of color tables in the TrueRenderControl class for finding correct rgbs. Move the image/pixmap/xftdraw into the surface class, and it maintains them, recreating them when it resizes.
Diffstat (limited to 'otk/surface.cc')
-rw-r--r--otk/surface.cc63
1 files changed, 56 insertions, 7 deletions
diff --git a/otk/surface.cc b/otk/surface.cc
index cea793f2..c02526f3 100644
--- a/otk/surface.cc
+++ b/otk/surface.cc
@@ -6,29 +6,78 @@
#include "surface.hh"
#include "display.hh"
+#include "screeninfo.hh"
+
+extern "C" {
+#include <X11/Xutil.h>
+}
namespace otk {
-Surface::Surface()
- : _size(1, 1),
- _pm(None)
+Surface::Surface(int screen)
+ : _screen(screen),
+ _size(1, 1),
+ _im(0),
+ _pm(None),
+ _xftdraw(0)
{
+ createObjects();
}
-Surface::Surface(const Point &size)
- : _size(size),
- _pm(None)
+Surface::Surface(int screen, const Point &size)
+ : _screen(screen),
+ _size(size),
+ _im(0),
+ _pm(None),
+ _xftdraw(0)
{
+ createObjects();
}
Surface::~Surface()
{
- if (_pm != None) XFreePixmap(**display, _pm);
+ destroyObjects();
+}
+
+void Surface::createObjects()
+{
+ assert(!_im); assert(_pm == None); assert(!_xftdraw);
+
+ const ScreenInfo *info = display->screenInfo(_screen);
+
+ _im = XCreateImage(**display, info->visual(), info->depth(),
+ ZPixmap, 0, NULL, _size.x(), _size.y(), 32, 0);
+
+ _pm = XCreatePixmap(**display, info->rootWindow(), _size.x(), _size.y(),
+ info->depth());
+
+ _xftdraw = XftDrawCreate(**display, _pm, info->visual(), info->colormap());
+}
+
+void Surface::destroyObjects()
+{
+ assert(_im); assert(_pm != None); assert(_xftdraw);
+
+ // do the delete ourselves cuz we alloc it with new not malloc
+ delete [] _im->data;
+ _im->data = NULL;
+ XDestroyImage(_im);
+ _im = 0;
+
+ XFreePixmap(**display, _pm);
+ _pm = None;
+
+ XftDrawDestroy(_xftdraw);
+ _xftdraw = 0;
}
void Surface::setSize(int w, int h)
{
+ if (w == _size.x() && h == _size.y()) return; // no change
+
_size.setPoint(w, h);
+ destroyObjects();
+ createObjects();
}
}