mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-06 00:07:29 -04:00
* require qwt >=6.2 (and fallback to internal 6.3 if system's qwt doesn't suffice) * debian doesn't have qwt for Qt6 and won't have it for trixie
612 lines
14 KiB
C++
612 lines
14 KiB
C++
/******************************************************************************
|
|
* 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 "qwt_null_paintdevice.h"
|
|
#include <qpaintengine.h>
|
|
#include <qpainterpath.h>
|
|
|
|
class QwtNullPaintDevice::PrivateData
|
|
{
|
|
public:
|
|
PrivateData():
|
|
mode( QwtNullPaintDevice::NormalMode )
|
|
{
|
|
}
|
|
|
|
QwtNullPaintDevice::Mode mode;
|
|
};
|
|
|
|
class QwtNullPaintDevice::PaintEngine QWT_FINAL : public QPaintEngine
|
|
{
|
|
public:
|
|
PaintEngine();
|
|
|
|
virtual bool begin( QPaintDevice* ) QWT_OVERRIDE;
|
|
virtual bool end() QWT_OVERRIDE;
|
|
|
|
virtual Type type () const QWT_OVERRIDE;
|
|
virtual void updateState(const QPaintEngineState&) QWT_OVERRIDE;
|
|
|
|
virtual void drawRects(const QRect*, int ) QWT_OVERRIDE;
|
|
virtual void drawRects(const QRectF*, int ) QWT_OVERRIDE;
|
|
|
|
virtual void drawLines(const QLine*, int ) QWT_OVERRIDE;
|
|
virtual void drawLines(const QLineF*, int ) QWT_OVERRIDE;
|
|
|
|
virtual void drawEllipse(const QRectF&) QWT_OVERRIDE;
|
|
virtual void drawEllipse(const QRect&) QWT_OVERRIDE;
|
|
|
|
virtual void drawPath(const QPainterPath&) QWT_OVERRIDE;
|
|
|
|
virtual void drawPoints(const QPointF*, int ) QWT_OVERRIDE;
|
|
virtual void drawPoints(const QPoint*, int ) QWT_OVERRIDE;
|
|
|
|
virtual void drawPolygon(
|
|
const QPointF*, int, PolygonDrawMode ) QWT_OVERRIDE;
|
|
|
|
virtual void drawPolygon(
|
|
const QPoint*, int, PolygonDrawMode ) QWT_OVERRIDE;
|
|
|
|
virtual void drawPixmap(const QRectF&,
|
|
const QPixmap&, const QRectF&) QWT_OVERRIDE;
|
|
|
|
virtual void drawTextItem(
|
|
const QPointF&, const QTextItem&) QWT_OVERRIDE;
|
|
|
|
virtual void drawTiledPixmap(const QRectF&,
|
|
const QPixmap&, const QPointF& s) QWT_OVERRIDE;
|
|
|
|
virtual void drawImage(const QRectF&, const QImage&,
|
|
const QRectF&, Qt::ImageConversionFlags ) QWT_OVERRIDE;
|
|
|
|
private:
|
|
QwtNullPaintDevice* nullDevice();
|
|
};
|
|
|
|
QwtNullPaintDevice::PaintEngine::PaintEngine()
|
|
: QPaintEngine( QPaintEngine::AllFeatures )
|
|
{
|
|
}
|
|
|
|
bool QwtNullPaintDevice::PaintEngine::begin( QPaintDevice* )
|
|
{
|
|
setActive( true );
|
|
return true;
|
|
}
|
|
|
|
bool QwtNullPaintDevice::PaintEngine::end()
|
|
{
|
|
setActive( false );
|
|
return true;
|
|
}
|
|
|
|
QPaintEngine::Type QwtNullPaintDevice::PaintEngine::type() const
|
|
{
|
|
/*
|
|
How to avoid conflicts with other 3rd party pain engines ?
|
|
At least we don't use QPaintEngine::User what is known to
|
|
be the value of some print engines
|
|
*/
|
|
return static_cast< QPaintEngine::Type >( QPaintEngine::MaxUser - 2 );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawRects(
|
|
const QRect* rects, int rectCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawRects( rects, rectCount );
|
|
return;
|
|
}
|
|
|
|
device->drawRects( rects, rectCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawRects(
|
|
const QRectF* rects, int rectCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawRects( rects, rectCount );
|
|
return;
|
|
}
|
|
|
|
device->drawRects( rects, rectCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawLines(
|
|
const QLine* lines, int lineCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawLines( lines, lineCount );
|
|
return;
|
|
}
|
|
|
|
device->drawLines( lines, lineCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawLines(
|
|
const QLineF* lines, int lineCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawLines( lines, lineCount );
|
|
return;
|
|
}
|
|
|
|
device->drawLines( lines, lineCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawEllipse(
|
|
const QRectF& rect)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawEllipse( rect );
|
|
return;
|
|
}
|
|
|
|
device->drawEllipse( rect );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawEllipse(
|
|
const QRect& rect)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawEllipse( rect );
|
|
return;
|
|
}
|
|
|
|
device->drawEllipse( rect );
|
|
}
|
|
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPath(
|
|
const QPainterPath& path)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
device->drawPath( path );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPoints(
|
|
const QPointF* points, int pointCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawPoints( points, pointCount );
|
|
return;
|
|
}
|
|
|
|
device->drawPoints( points, pointCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPoints(
|
|
const QPoint* points, int pointCount)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawPoints( points, pointCount );
|
|
return;
|
|
}
|
|
|
|
device->drawPoints( points, pointCount );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPolygon(
|
|
const QPointF* points, int pointCount, PolygonDrawMode mode)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() == QwtNullPaintDevice::PathMode )
|
|
{
|
|
QPainterPath path;
|
|
|
|
if ( pointCount > 0 )
|
|
{
|
|
path.moveTo( points[0] );
|
|
for ( int i = 1; i < pointCount; i++ )
|
|
path.lineTo( points[i] );
|
|
|
|
if ( mode != PolylineMode )
|
|
path.closeSubpath();
|
|
}
|
|
|
|
device->drawPath( path );
|
|
return;
|
|
}
|
|
|
|
device->drawPolygon( points, pointCount, mode );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPolygon(
|
|
const QPoint* points, int pointCount, PolygonDrawMode mode)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() == QwtNullPaintDevice::PathMode )
|
|
{
|
|
QPainterPath path;
|
|
|
|
if ( pointCount > 0 )
|
|
{
|
|
path.moveTo( points[0] );
|
|
for ( int i = 1; i < pointCount; i++ )
|
|
path.lineTo( points[i] );
|
|
|
|
if ( mode != PolylineMode )
|
|
path.closeSubpath();
|
|
}
|
|
|
|
device->drawPath( path );
|
|
return;
|
|
}
|
|
|
|
device->drawPolygon( points, pointCount, mode );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawPixmap(
|
|
const QRectF& rect, const QPixmap& pm, const QRectF& subRect )
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
device->drawPixmap( rect, pm, subRect );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawTextItem(
|
|
const QPointF& pos, const QTextItem& textItem)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawTextItem( pos, textItem );
|
|
return;
|
|
}
|
|
|
|
device->drawTextItem( pos, textItem );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawTiledPixmap(
|
|
const QRectF& rect, const QPixmap& pixmap,
|
|
const QPointF& subRect)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
if ( device->mode() != QwtNullPaintDevice::NormalMode )
|
|
{
|
|
QPaintEngine::drawTiledPixmap( rect, pixmap, subRect );
|
|
return;
|
|
}
|
|
|
|
device->drawTiledPixmap( rect, pixmap, subRect );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::drawImage(
|
|
const QRectF& rect, const QImage& image,
|
|
const QRectF& subRect, Qt::ImageConversionFlags flags)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
device->drawImage( rect, image, subRect, flags );
|
|
}
|
|
|
|
void QwtNullPaintDevice::PaintEngine::updateState(
|
|
const QPaintEngineState& engineState)
|
|
{
|
|
QwtNullPaintDevice* device = nullDevice();
|
|
if ( device == NULL )
|
|
return;
|
|
|
|
device->updateState( engineState );
|
|
}
|
|
|
|
inline QwtNullPaintDevice* QwtNullPaintDevice::PaintEngine::nullDevice()
|
|
{
|
|
if ( !isActive() )
|
|
return NULL;
|
|
|
|
return static_cast< QwtNullPaintDevice* >( paintDevice() );
|
|
}
|
|
|
|
//! Constructor
|
|
QwtNullPaintDevice::QwtNullPaintDevice():
|
|
m_engine( NULL )
|
|
{
|
|
m_data = new PrivateData;
|
|
}
|
|
|
|
//! Destructor
|
|
QwtNullPaintDevice::~QwtNullPaintDevice()
|
|
{
|
|
delete m_engine;
|
|
delete m_data;
|
|
}
|
|
|
|
/*!
|
|
Set the render mode
|
|
|
|
\param mode New mode
|
|
\sa mode()
|
|
*/
|
|
void QwtNullPaintDevice::setMode( Mode mode )
|
|
{
|
|
m_data->mode = mode;
|
|
}
|
|
|
|
/*!
|
|
\return Render mode
|
|
\sa setMode()
|
|
*/
|
|
QwtNullPaintDevice::Mode QwtNullPaintDevice::mode() const
|
|
{
|
|
return m_data->mode;
|
|
}
|
|
|
|
//! See QPaintDevice::paintEngine()
|
|
QPaintEngine* QwtNullPaintDevice::paintEngine() const
|
|
{
|
|
if ( m_engine == NULL )
|
|
{
|
|
QwtNullPaintDevice* that =
|
|
const_cast< QwtNullPaintDevice* >( this );
|
|
|
|
that->m_engine = new PaintEngine();
|
|
}
|
|
|
|
return m_engine;
|
|
}
|
|
|
|
/*!
|
|
See QPaintDevice::metric()
|
|
|
|
\param deviceMetric Type of metric
|
|
\return Metric information for the given paint device metric.
|
|
|
|
\sa sizeMetrics()
|
|
*/
|
|
int QwtNullPaintDevice::metric( PaintDeviceMetric deviceMetric ) const
|
|
{
|
|
int value;
|
|
|
|
switch ( deviceMetric )
|
|
{
|
|
case PdmWidth:
|
|
{
|
|
value = sizeMetrics().width();
|
|
break;
|
|
}
|
|
case PdmHeight:
|
|
{
|
|
value = sizeMetrics().height();
|
|
break;
|
|
}
|
|
case PdmNumColors:
|
|
{
|
|
value = 0xffffffff;
|
|
break;
|
|
}
|
|
case PdmDepth:
|
|
{
|
|
value = 32;
|
|
break;
|
|
}
|
|
case PdmPhysicalDpiX:
|
|
case PdmPhysicalDpiY:
|
|
case PdmDpiY:
|
|
case PdmDpiX:
|
|
{
|
|
value = 72;
|
|
break;
|
|
}
|
|
case PdmWidthMM:
|
|
{
|
|
value = qRound( metric( PdmWidth ) * 25.4 / metric( PdmDpiX ) );
|
|
break;
|
|
}
|
|
case PdmHeightMM:
|
|
{
|
|
value = qRound( metric( PdmHeight ) * 25.4 / metric( PdmDpiY ) );
|
|
break;
|
|
}
|
|
#if QT_VERSION >= 0x050100
|
|
case PdmDevicePixelRatio:
|
|
{
|
|
value = 1.0;
|
|
break;
|
|
}
|
|
#endif
|
|
default:
|
|
{
|
|
value = QPaintDevice::metric( deviceMetric );
|
|
}
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
//! See QPaintEngine::drawRects()
|
|
void QwtNullPaintDevice::drawRects(
|
|
const QRect* rects, int rectCount)
|
|
{
|
|
Q_UNUSED(rects);
|
|
Q_UNUSED(rectCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawRects()
|
|
void QwtNullPaintDevice::drawRects(
|
|
const QRectF* rects, int rectCount)
|
|
{
|
|
Q_UNUSED(rects);
|
|
Q_UNUSED(rectCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawLines()
|
|
void QwtNullPaintDevice::drawLines(
|
|
const QLine* lines, int lineCount)
|
|
{
|
|
Q_UNUSED(lines);
|
|
Q_UNUSED(lineCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawLines()
|
|
void QwtNullPaintDevice::drawLines(
|
|
const QLineF* lines, int lineCount)
|
|
{
|
|
Q_UNUSED(lines);
|
|
Q_UNUSED(lineCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawEllipse()
|
|
void QwtNullPaintDevice::drawEllipse( const QRectF& rect )
|
|
{
|
|
Q_UNUSED(rect);
|
|
}
|
|
|
|
//! See QPaintEngine::drawEllipse()
|
|
void QwtNullPaintDevice::drawEllipse( const QRect& rect )
|
|
{
|
|
Q_UNUSED(rect);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPath()
|
|
void QwtNullPaintDevice::drawPath( const QPainterPath& path )
|
|
{
|
|
Q_UNUSED(path);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPoints()
|
|
void QwtNullPaintDevice::drawPoints(
|
|
const QPointF* points, int pointCount)
|
|
{
|
|
Q_UNUSED(points);
|
|
Q_UNUSED(pointCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPoints()
|
|
void QwtNullPaintDevice::drawPoints(
|
|
const QPoint* points, int pointCount)
|
|
{
|
|
Q_UNUSED(points);
|
|
Q_UNUSED(pointCount);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPolygon()
|
|
void QwtNullPaintDevice::drawPolygon(
|
|
const QPointF* points, int pointCount,
|
|
QPaintEngine::PolygonDrawMode mode)
|
|
{
|
|
Q_UNUSED(points);
|
|
Q_UNUSED(pointCount);
|
|
Q_UNUSED(mode);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPolygon()
|
|
void QwtNullPaintDevice::drawPolygon(
|
|
const QPoint* points, int pointCount,
|
|
QPaintEngine::PolygonDrawMode mode)
|
|
{
|
|
Q_UNUSED(points);
|
|
Q_UNUSED(pointCount);
|
|
Q_UNUSED(mode);
|
|
}
|
|
|
|
//! See QPaintEngine::drawPixmap()
|
|
void QwtNullPaintDevice::drawPixmap( const QRectF& rect,
|
|
const QPixmap& pm, const QRectF& subRect )
|
|
{
|
|
Q_UNUSED(rect);
|
|
Q_UNUSED(pm);
|
|
Q_UNUSED(subRect);
|
|
}
|
|
|
|
//! See QPaintEngine::drawTextItem()
|
|
void QwtNullPaintDevice::drawTextItem(
|
|
const QPointF& pos, const QTextItem& textItem)
|
|
{
|
|
Q_UNUSED(pos);
|
|
Q_UNUSED(textItem);
|
|
}
|
|
|
|
//! See QPaintEngine::drawTiledPixmap()
|
|
void QwtNullPaintDevice::drawTiledPixmap(
|
|
const QRectF& rect, const QPixmap& pixmap,
|
|
const QPointF& subRect)
|
|
{
|
|
Q_UNUSED(rect);
|
|
Q_UNUSED(pixmap);
|
|
Q_UNUSED(subRect);
|
|
}
|
|
|
|
//! See QPaintEngine::drawImage()
|
|
void QwtNullPaintDevice::drawImage(
|
|
const QRectF& rect, const QImage& image,
|
|
const QRectF& subRect, Qt::ImageConversionFlags flags)
|
|
{
|
|
Q_UNUSED(rect);
|
|
Q_UNUSED(image);
|
|
Q_UNUSED(subRect);
|
|
Q_UNUSED(flags);
|
|
}
|
|
|
|
//! See QPaintEngine::updateState()
|
|
void QwtNullPaintDevice::updateState(
|
|
const QPaintEngineState& state )
|
|
{
|
|
Q_UNUSED(state);
|
|
}
|