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 d_pixBuffer.resize(d_rect.size());
00112
00113 d_painter = new QPainter();
00114 if ( d_device->devType() == QInternal::Widget )
00115 {
00116 QWidget *w = (QWidget *)d_device;
00117 d_pixBuffer.fill(w, d_rect.topLeft());
00118 d_painter->begin(&d_pixBuffer, w);
00119 d_painter->translate(-d_rect.x(), -d_rect.y());
00120 }
00121 else
00122 {
00123 d_painter->begin(&d_pixBuffer);
00124 }
00125 }
00126 else
00127 {
00128 if ( d_devicePainter )
00129 d_painter = d_devicePainter;
00130 else
00131 d_painter = new QPainter(d_device);
00132
00133 if ( d_device->devType() == QInternal::Widget )
00134 {
00135 QWidget *w = (QWidget *)d_device;
00136 if ( w->testWFlags( Qt::WRepaintNoErase | Qt::WResizeNoErase) )
00137 d_painter->eraseRect(d_rect);
00138 }
00139 }
00140 }
00141
00145 void QwtPaintBuffer::flush()
00146 {
00147 if ( d_enabled && d_device != 0 && d_rect.isValid())
00148 {
00149
00150
00151
00152 QPainter *p;
00153 if ( d_devicePainter == 0 )
00154 p = new QPainter(d_device);
00155 else
00156 p = d_devicePainter;
00157
00158 QPaintDevice *device = p->device();
00159 if ( device->isExtDev() )
00160 d_devicePainter->drawPixmap(d_rect.topLeft(), d_pixBuffer);
00161 else
00162 bitBlt(device, d_rect.topLeft(), &d_pixBuffer );
00163
00164 if ( d_devicePainter == 0 )
00165 delete p;
00166 }
00167 }
00168
00172 void QwtPaintBuffer::close()
00173 {
00174 flush();
00175
00176 if ( d_painter )
00177 {
00178 if ( d_painter->isActive() )
00179 d_painter->end();
00180
00181 if ( d_painter != d_devicePainter )
00182 delete d_painter;
00183 }
00184
00185 if ( !d_pixBuffer.isNull() )
00186 d_pixBuffer = QPixmap();
00187
00188 d_device = 0;
00189 d_painter = 0;
00190 d_devicePainter = 0;
00191 }