You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.4 KiB
192 lines
4.4 KiB
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** |
|
* Qwt Widget Library |
|
* Copyright (C) 1997 Josef Wilgen |
|
* Copyright (C) 2002 Uwe Rathmann |
|
* |
|
* This library is free software; you can redistribute it and/or |
|
* modify it under the terms of the Qwt License, Version 1.0 |
|
*****************************************************************************/ |
|
|
|
|
|
#include <qglobal.h> |
|
#if QT_VERSION < 0x040000 |
|
|
|
#include <qwidget.h> |
|
#include <qpainter.h> |
|
#include "qwt_paint_buffer.h" |
|
|
|
bool QwtPaintBuffer::d_enabled = true; |
|
|
|
//! Default constructor |
|
QwtPaintBuffer::QwtPaintBuffer(): |
|
d_device(0), |
|
d_painter(0), |
|
d_devicePainter(0) |
|
{ |
|
} |
|
|
|
/*! |
|
Create an open paint buffer |
|
\param device Device to paint on |
|
\param rect Rect to paint on |
|
\param painter Painter to paint on device. In case of 0 |
|
QwtPaintBuffer uses an internal painter |
|
|
|
\sa open() |
|
*/ |
|
|
|
QwtPaintBuffer::QwtPaintBuffer(QPaintDevice *device, |
|
const QRect &rect, QPainter *painter): |
|
d_device(0), |
|
d_painter(0), |
|
d_devicePainter(0) |
|
{ |
|
open(device, rect, painter); |
|
} |
|
|
|
/*! |
|
Closes the buffer |
|
\sa close() |
|
*/ |
|
QwtPaintBuffer::~QwtPaintBuffer() |
|
{ |
|
close(); |
|
} |
|
|
|
/*! |
|
\return Depending on isEnabled() the painter |
|
connected to an internal pixmap buffer |
|
otherwise the painter connected to the device. |
|
*/ |
|
|
|
QPainter *QwtPaintBuffer::painter() |
|
{ |
|
return d_painter; |
|
} |
|
|
|
/*! |
|
\return Device to paint on |
|
*/ |
|
const QPaintDevice *QwtPaintBuffer::device() |
|
{ |
|
return d_device; |
|
} |
|
|
|
/*! |
|
Enable/Disable double buffering. Please note that |
|
this is a global switch for all QwtPaintBuffers, but |
|
won't change opened buffers. |
|
*/ |
|
void QwtPaintBuffer::setEnabled(bool enable) |
|
{ |
|
d_enabled = enable; |
|
} |
|
|
|
/*! |
|
\return true if double buffering is enabled, false otherwise. |
|
*/ |
|
bool QwtPaintBuffer::isEnabled() |
|
{ |
|
return d_enabled; |
|
} |
|
|
|
/*! |
|
Open the buffer |
|
\param device Device to paint on |
|
\param rect Rect to paint on |
|
\param painter Painter to paint on device. In case of 0 |
|
QwtPaintBuffer uses an internal painter |
|
*/ |
|
|
|
void QwtPaintBuffer::open(QPaintDevice *device, |
|
const QRect &rect, QPainter *painter) |
|
{ |
|
close(); |
|
|
|
if ( device == 0 || !rect.isValid() ) |
|
return; |
|
|
|
d_device = device; |
|
d_devicePainter = painter; |
|
d_rect = rect; |
|
|
|
if ( isEnabled() ) { |
|
#ifdef Q_WS_X11 |
|
if ( d_pixBuffer.x11Screen() != d_device->x11Screen() ) |
|
d_pixBuffer.x11SetScreen(d_device->x11Screen()); |
|
#endif |
|
d_pixBuffer.resize(d_rect.size()); |
|
|
|
d_painter = new QPainter(); |
|
if ( d_device->devType() == QInternal::Widget ) { |
|
QWidget *w = (QWidget *)d_device; |
|
d_pixBuffer.fill(w, d_rect.topLeft()); |
|
d_painter->begin(&d_pixBuffer, w); |
|
d_painter->translate(-d_rect.x(), -d_rect.y()); |
|
} else { |
|
d_painter->begin(&d_pixBuffer); |
|
} |
|
} else { |
|
if ( d_devicePainter ) |
|
d_painter = d_devicePainter; |
|
else |
|
d_painter = new QPainter(d_device); |
|
|
|
if ( d_device->devType() == QInternal::Widget ) { |
|
QWidget *w = (QWidget *)d_device; |
|
if ( w->testWFlags( Qt::WNoAutoErase ) ) |
|
d_painter->eraseRect(d_rect); |
|
} |
|
} |
|
} |
|
|
|
/*! |
|
Flush the internal pixmap buffer to the device. |
|
*/ |
|
void QwtPaintBuffer::flush() |
|
{ |
|
if ( d_enabled && d_device != 0 && d_rect.isValid()) { |
|
// We need a painter to find out if |
|
// there is a painter redirection for d_device. |
|
|
|
QPainter *p; |
|
if ( d_devicePainter == 0 ) |
|
p = new QPainter(d_device); |
|
else |
|
p = d_devicePainter; |
|
|
|
QPaintDevice *device = p->device(); |
|
if ( device->isExtDev() ) |
|
d_devicePainter->drawPixmap(d_rect.topLeft(), d_pixBuffer); |
|
else |
|
bitBlt(device, d_rect.topLeft(), &d_pixBuffer ); |
|
|
|
if ( d_devicePainter == 0 ) |
|
delete p; |
|
} |
|
} |
|
|
|
/*! |
|
Flush the internal pixmap buffer to the device and close the buffer. |
|
*/ |
|
void QwtPaintBuffer::close() |
|
{ |
|
flush(); |
|
|
|
if ( d_painter ) { |
|
if ( d_painter->isActive() ) |
|
d_painter->end(); |
|
|
|
if ( d_painter != d_devicePainter ) |
|
delete d_painter; |
|
} |
|
|
|
if ( !d_pixBuffer.isNull() ) |
|
d_pixBuffer = QPixmap(); |
|
|
|
d_device = 0; |
|
d_painter = 0; |
|
d_devicePainter = 0; |
|
} |
|
|
|
#endif // QT_VERSION < 0x040000
|
|
|