diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-01-18 07:23:28 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-01-18 07:23:28 +0000 |
| commit | 9b6e5f9cf49df78be25720f9c4b33a733b856c9b (patch) | |
| tree | 0da395f661151ce079d09483594f221c89e5d196 /otk/surface.cc | |
| parent | a4dd208a7955e25bca710d4bcf355de7e608b9e1 (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.cc | 63 |
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(); } } |
