地面站终端 App
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.

326 lines
8.2 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 <qapplication.h>
#include <qpainter.h>
#if QT_VERSION < 0x040000
#include <qpaintdevicemetrics.h>
#include <qwmatrix.h>
#define QwtMatrix QWMatrix
#else
#include <qmatrix.h>
#define QwtMatrix QMatrix
#endif
#include <qpaintdevice.h>
#include <qdesktopwidget.h>
#include "qwt_math.h"
#include "qwt_polygon.h"
#include "qwt_layout_metrics.h"
static QSize deviceDpi(const QPaintDevice *device)
{
QSize dpi;
#if QT_VERSION < 0x040000
const QPaintDeviceMetrics metrics(device);
dpi.setWidth(metrics.logicalDpiX());
dpi.setHeight(metrics.logicalDpiY());
#else
dpi.setWidth(device->logicalDpiX());
dpi.setHeight(device->logicalDpiY());
#endif
return dpi;
}
#if QT_VERSION < 0x040000
inline static const QWMatrix &matrix(const QPainter *painter)
{
return painter->worldMatrix();
}
inline static QWMatrix invMatrix(const QPainter *painter)
{
return painter->worldMatrix().invert();
}
#else // QT_VERSION >= 0x040000
inline static const QMatrix &matrix(const QPainter *painter)
{
return painter->matrix();
}
inline static QMatrix invMatrix(const QPainter *painter)
{
return painter->matrix().inverted();
}
#endif
QwtMetricsMap::QwtMetricsMap()
{
d_screenToLayoutX = d_screenToLayoutY =
d_deviceToLayoutX = d_deviceToLayoutY = 1.0;
}
void QwtMetricsMap::setMetrics(const QPaintDevice *layoutDevice,
const QPaintDevice *paintDevice)
{
const QSize screenDpi = deviceDpi(QApplication::desktop());
const QSize layoutDpi = deviceDpi(layoutDevice);
const QSize paintDpi = deviceDpi(paintDevice);
d_screenToLayoutX = double(layoutDpi.width()) /
double(screenDpi.width());
d_screenToLayoutY = double(layoutDpi.height()) /
double(screenDpi.height());
d_deviceToLayoutX = double(layoutDpi.width()) /
double(paintDpi.width());
d_deviceToLayoutY = double(layoutDpi.height()) /
double(paintDpi.height());
}
#ifndef QT_NO_TRANSFORMATIONS
QPoint QwtMetricsMap::layoutToDevice(const QPoint &point,
const QPainter *painter) const
#else
QPoint QwtMetricsMap::layoutToDevice(const QPoint &point,
const QPainter *) const
#endif
{
if ( isIdentity() )
return point;
QPoint mappedPoint(point);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPoint = matrix(painter).map(mappedPoint);
#endif
mappedPoint.setX(layoutToDeviceX(mappedPoint.x()));
mappedPoint.setY(layoutToDeviceY(mappedPoint.y()));
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPoint = invMatrix(painter).map(mappedPoint);
#endif
return mappedPoint;
}
#ifndef QT_NO_TRANSFORMATIONS
QPoint QwtMetricsMap::deviceToLayout(const QPoint &point,
const QPainter *painter) const
#else
QPoint QwtMetricsMap::deviceToLayout(const QPoint &point,
const QPainter *) const
#endif
{
if ( isIdentity() )
return point;
QPoint mappedPoint(point);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPoint = matrix(painter).map(mappedPoint);
#endif
mappedPoint.setX(deviceToLayoutX(mappedPoint.x()));
mappedPoint.setY(deviceToLayoutY(mappedPoint.y()));
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPoint = invMatrix(painter).map(mappedPoint);
#endif
return mappedPoint;
}
QPoint QwtMetricsMap::screenToLayout(const QPoint &point) const
{
if ( d_screenToLayoutX == 1.0 && d_screenToLayoutY == 1.0 )
return point;
return QPoint(screenToLayoutX(point.x()), screenToLayoutY(point.y()));
}
QPoint QwtMetricsMap::layoutToScreen(const QPoint &point) const
{
if ( d_screenToLayoutX == 1.0 && d_screenToLayoutY == 1.0 )
return point;
return QPoint(layoutToScreenX(point.x()), layoutToScreenY(point.y()));
}
#ifndef QT_NO_TRANSFORMATIONS
QRect QwtMetricsMap::layoutToDevice(const QRect &rect,
const QPainter *painter) const
#else
QRect QwtMetricsMap::layoutToDevice(const QRect &rect,
const QPainter *) const
#endif
{
if ( isIdentity() )
return rect;
QRect mappedRect(rect);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedRect = translate(matrix(painter), mappedRect);
#endif
mappedRect = QRect(
layoutToDevice(mappedRect.topLeft()),
layoutToDevice(mappedRect.bottomRight())
);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedRect = translate(invMatrix(painter), mappedRect);
#endif
return mappedRect;
}
#ifndef QT_NO_TRANSFORMATIONS
QRect QwtMetricsMap::deviceToLayout(const QRect &rect,
const QPainter *painter) const
#else
QRect QwtMetricsMap::deviceToLayout(const QRect &rect,
const QPainter *) const
#endif
{
if ( isIdentity() )
return rect;
QRect mappedRect(rect);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedRect = translate(matrix(painter), mappedRect);
#endif
mappedRect = QRect(
deviceToLayout(mappedRect.topLeft()),
deviceToLayout(mappedRect.bottomRight())
);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedRect = translate(invMatrix(painter), mappedRect);
#endif
return mappedRect;
}
QRect QwtMetricsMap::screenToLayout(const QRect &rect) const
{
if ( d_screenToLayoutX == 1.0 && d_screenToLayoutY == 1.0 )
return rect;
return QRect(screenToLayoutX(rect.x()), screenToLayoutY(rect.y()),
screenToLayoutX(rect.width()), screenToLayoutY(rect.height()));
}
QRect QwtMetricsMap::layoutToScreen(const QRect &rect) const
{
if ( d_screenToLayoutX == 1.0 && d_screenToLayoutY == 1.0 )
return rect;
return QRect(layoutToScreenX(rect.x()), layoutToScreenY(rect.y()),
layoutToScreenX(rect.width()), layoutToScreenY(rect.height()));
}
#ifndef QT_NO_TRANSFORMATIONS
QwtPolygon QwtMetricsMap::layoutToDevice(const QwtPolygon &pa,
const QPainter *painter) const
#else
QwtPolygon QwtMetricsMap::layoutToDevice(const QwtPolygon &pa,
const QPainter *) const
#endif
{
if ( isIdentity() )
return pa;
QwtPolygon mappedPa(pa);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPa = translate(matrix(painter), mappedPa);
#endif
QwtMatrix m;
m.scale(1.0 / d_deviceToLayoutX, 1.0 / d_deviceToLayoutY);
mappedPa = translate(m, mappedPa);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPa = translate(invMatrix(painter), mappedPa);
#endif
return mappedPa;
}
#ifndef QT_NO_TRANSFORMATIONS
QwtPolygon QwtMetricsMap::deviceToLayout(const QwtPolygon &pa,
const QPainter *painter) const
#else
QwtPolygon QwtMetricsMap::deviceToLayout(const QwtPolygon &pa,
const QPainter *) const
#endif
{
if ( isIdentity() )
return pa;
QwtPolygon mappedPa(pa);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPa = translate(matrix(painter), mappedPa);
#endif
QwtMatrix m;
m.scale(d_deviceToLayoutX, d_deviceToLayoutY);
mappedPa = translate(m, mappedPa);
#ifndef QT_NO_TRANSFORMATIONS
if ( painter )
mappedPa = translate(invMatrix(painter), mappedPa);
#endif
return mappedPa;
}
/*!
Wrapper for QMatrix::mapRect.
\param m Matrix
\param rect Rectangle to translate
\return Translated rectangle
*/
QRect QwtMetricsMap::translate(
const QwtMatrix &m, const QRect &rect)
{
return m.mapRect(rect);
}
/*!
Wrapper for QMatrix::map.
\param m Matrix
\param pa Polygon to translate
\return Translated polygon
*/
QwtPolygon QwtMetricsMap::translate(
const QwtMatrix &m, const QwtPolygon &pa)
{
return m.map(pa);
}