Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

qwt_paint_buffer.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
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         // We need a painter to find out if
00150         // there is a painter redirection for d_device.
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 } 

Generated on Sun Sep 26 23:24:36 2004 for Qwt User's Guide by doxygen 1.3.6