00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <qwidget.h>
00011 #include <qpainter.h>
00012 #include "qwt_paint_buffer.h"
00013
00014 bool QwtPaintBuffer::d_enabled = TRUE;
00015
00017 QwtPaintBuffer::QwtPaintBuffer():
00018 d_device(0),
00019 d_painter(0),
00020 d_devicePainter(0)
00021 {
00022 }
00023
00034 QwtPaintBuffer::QwtPaintBuffer(QPaintDevice *device,
00035 const QRect &rect, QPainter *painter):
00036 d_device(0),
00037 d_painter(0),
00038 d_devicePainter(0)
00039 {
00040 open(device, rect, painter);
00041 }
00042
00047 QwtPaintBuffer::~QwtPaintBuffer()
00048 {
00049 close();
00050 }
00051
00058 QPainter *QwtPaintBuffer::painter()
00059 {
00060 return d_painter;
00061 }
00062
00066 const QPaintDevice *QwtPaintBuffer::device()
00067 {
00068 return d_device;
00069 }
00070
00076 void QwtPaintBuffer::setEnabled(bool enable)
00077 {
00078 d_enabled = enable;
00079 }
00080
00084 bool QwtPaintBuffer::isEnabled()
00085 {
00086 return d_enabled;
00087 }
00088
00097 void QwtPaintBuffer::open(QPaintDevice *device,
00098 const QRect &rect, QPainter *painter)
00099 {
00100 close();
00101
00102 if ( device == 0 || !rect.isValid() )
00103 return;
00104
00105 d_device = device;
00106 d_devicePainter = painter;
00107 d_rect = rect;
00108
00109 if ( isEnabled() )
00110 {
00111 #if QT_VERSION >= 300
00112 #ifdef Q_WS_X11
00113 if ( d_pixBuffer.x11Screen() != d_device->x11Screen() )
00114 d_pixBuffer.x11SetScreen(d_device->x11Screen());
00115 #endif
00116 #endif
00117 d_pixBuffer.resize(d_rect.size());
00118
00119 d_painter = new QPainter();
00120 if ( d_device->devType() == QInternal::Widget )
00121 {
00122 QWidget *w = (QWidget *)d_device;
00123 d_pixBuffer.fill(w, d_rect.topLeft());
00124 d_painter->begin(&d_pixBuffer, w);
00125 d_painter->translate(-d_rect.x(), -d_rect.y());
00126 }
00127 else
00128 {
00129 d_painter->begin(&d_pixBuffer);
00130 }
00131 }
00132 else
00133 {
00134 if ( d_devicePainter )
00135 d_painter = d_devicePainter;
00136 else
00137 d_painter = new QPainter(d_device);
00138
00139 if ( d_device->devType() == QInternal::Widget )
00140 {
00141 QWidget *w = (QWidget *)d_device;
00142 if ( w->testWFlags( Qt::WRepaintNoErase | Qt::WResizeNoErase) )
00143 d_painter->eraseRect(d_rect);
00144 }
00145 }
00146 }
00147
00151 void QwtPaintBuffer::flush()
00152 {
00153 if ( d_enabled && d_device != 0 && d_rect.isValid())
00154 {
00155
00156
00157
00158 QPainter *p;
00159 if ( d_devicePainter == 0 )
00160 p = new QPainter(d_device);
00161 else
00162 p = d_devicePainter;
00163
00164 QPaintDevice *device = p->device();
00165 if ( device->isExtDev() )
00166 d_devicePainter->drawPixmap(d_rect.topLeft(), d_pixBuffer);
00167 else
00168 bitBlt(device, d_rect.topLeft(), &d_pixBuffer );
00169
00170 if ( d_devicePainter == 0 )
00171 delete p;
00172 }
00173 }
00174
00178 void QwtPaintBuffer::close()
00179 {
00180 flush();
00181
00182 if ( d_painter )
00183 {
00184 if ( d_painter->isActive() )
00185 d_painter->end();
00186
00187 if ( d_painter != d_devicePainter )
00188 delete d_painter;
00189 }
00190
00191 if ( !d_pixBuffer.isNull() )
00192 d_pixBuffer = QPixmap();
00193
00194 d_device = 0;
00195 d_painter = 0;
00196 d_devicePainter = 0;
00197 }