00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <qapplication.h>
00011 #include <qpainter.h>
00012 #include <qpaintdevicemetrics.h>
00013 #include <qsimplerichtext.h>
00014 #if QT_VERSION >= 300
00015 #include <qdesktopwidget.h>
00016 #endif
00017 #include "qwt_layout_metrics.h"
00018
00019 QwtMetricsMap::QwtMetricsMap()
00020 {
00021 d_screenToLayoutX = d_screenToLayoutY =
00022 d_deviceToLayoutX = d_deviceToLayoutY = 1.0;
00023 }
00024
00025 void QwtMetricsMap::setMetrics(const QPaintDeviceMetrics &layoutMetrics,
00026 const QPaintDeviceMetrics &deviceMetrics)
00027 {
00028 const QPaintDeviceMetrics screenMetrics(QApplication::desktop());
00029
00030 d_screenToLayoutX = double(layoutMetrics.logicalDpiX()) /
00031 double(screenMetrics.logicalDpiX());
00032 d_screenToLayoutY = double(layoutMetrics.logicalDpiY()) /
00033 double(screenMetrics.logicalDpiY());
00034
00035 d_deviceToLayoutX = double(layoutMetrics.logicalDpiX()) /
00036 double(deviceMetrics.logicalDpiX());
00037 d_deviceToLayoutY = double(layoutMetrics.logicalDpiY()) /
00038 double(deviceMetrics.logicalDpiY());
00039 }
00040
00041 #ifndef QT_NO_TRANSFORMATIONS
00042 QPoint QwtMetricsMap::layoutToDevice(const QPoint &point,
00043 const QPainter *painter) const
00044 #else
00045 QPoint QwtMetricsMap::layoutToDevice(const QPoint &point,
00046 const QPainter *) const
00047 #endif
00048 {
00049 if ( isIdentity() )
00050 return point;
00051
00052 QPoint mappedPoint(point);
00053
00054 #ifndef QT_NO_TRANSFORMATIONS
00055 if ( painter )
00056 mappedPoint = painter->worldMatrix().map(mappedPoint);
00057 #endif
00058
00059 mappedPoint.setX(layoutToDeviceX(mappedPoint.x()));
00060 mappedPoint.setY(layoutToDeviceY(mappedPoint.y()));
00061
00062 #ifndef QT_NO_TRANSFORMATIONS
00063 if ( painter )
00064 mappedPoint = painter->worldMatrix().invert().map(mappedPoint);
00065 #endif
00066
00067 return mappedPoint;
00068 }
00069
00070 #ifndef QT_NO_TRANSFORMATIONS
00071 QPoint QwtMetricsMap::deviceToLayout(const QPoint &point,
00072 const QPainter *painter) const
00073 #else
00074 QPoint QwtMetricsMap::deviceToLayout(const QPoint &point,
00075 const QPainter *) const
00076 #endif
00077 {
00078 if ( isIdentity() )
00079 return point;
00080
00081 QPoint mappedPoint(point);
00082
00083 #ifndef QT_NO_TRANSFORMATIONS
00084 if ( painter )
00085 mappedPoint = painter->worldMatrix().map(mappedPoint);
00086 #endif
00087
00088 mappedPoint.setX(deviceToLayoutX(mappedPoint.x()));
00089 mappedPoint.setY(deviceToLayoutY(mappedPoint.y()));
00090
00091 #ifndef QT_NO_TRANSFORMATIONS
00092 if ( painter )
00093 mappedPoint = painter->worldMatrix().invert().map(mappedPoint);
00094 #endif
00095
00096 return mappedPoint;
00097 }
00098
00099 QPoint QwtMetricsMap::screenToLayout(const QPoint &point) const
00100 {
00101 if ( d_screenToLayoutX == 1.0 && d_screenToLayoutY == 1.0 )
00102 return point;
00103
00104 return QPoint(screenToLayoutX(point.x()), screenToLayoutY(point.y()));
00105 }
00106
00107 #ifndef QT_NO_TRANSFORMATIONS
00108 QRect QwtMetricsMap::layoutToDevice(const QRect &rect,
00109 const QPainter *painter) const
00110 #else
00111 QRect QwtMetricsMap::layoutToDevice(const QRect &rect,
00112 const QPainter *) const
00113 #endif
00114 {
00115 if ( isIdentity() )
00116 return rect;
00117
00118 QRect mappedRect(rect);
00119 #ifndef QT_NO_TRANSFORMATIONS
00120 if ( painter )
00121 mappedRect = translate(painter->worldMatrix(), mappedRect);
00122 #endif
00123
00124 mappedRect = QRect(
00125 layoutToDeviceX(mappedRect.x()),
00126 layoutToDeviceY(mappedRect.y()),
00127 layoutToDeviceX(mappedRect.width()),
00128 layoutToDeviceY(mappedRect.height())
00129 );
00130
00131 #ifndef QT_NO_TRANSFORMATIONS
00132 if ( painter )
00133 mappedRect = translate(painter->worldMatrix().invert(), mappedRect);
00134 #endif
00135
00136 return mappedRect;
00137 }
00138
00139 #ifndef QT_NO_TRANSFORMATIONS
00140 QRect QwtMetricsMap::deviceToLayout(const QRect &rect,
00141 const QPainter *painter) const
00142 #else
00143 QRect QwtMetricsMap::deviceToLayout(const QRect &rect,
00144 const QPainter *) const
00145 #endif
00146 {
00147 if ( isIdentity() )
00148 return rect;
00149
00150 QRect mappedRect(rect);
00151 #ifndef QT_NO_TRANSFORMATIONS
00152 if ( painter )
00153 mappedRect = translate(painter->worldMatrix(), mappedRect);
00154 #endif
00155
00156 mappedRect = QRect(
00157 deviceToLayoutX(mappedRect.x()),
00158 deviceToLayoutY(mappedRect.y()),
00159 deviceToLayoutX(mappedRect.width()),
00160 deviceToLayoutY(mappedRect.height())
00161 );
00162
00163 #ifndef QT_NO_TRANSFORMATIONS
00164 if ( painter )
00165 mappedRect = translate(painter->worldMatrix().invert(), mappedRect);
00166 #endif
00167
00168 return mappedRect;
00169 }
00170
00171 QRect QwtMetricsMap::screenToLayout(const QRect &rect) const
00172 {
00173 if ( d_deviceToLayoutX == 1.0 && d_deviceToLayoutY == 1.0 )
00174 return rect;
00175
00176 return QRect(screenToLayoutX(rect.x()), screenToLayoutY(rect.y()),
00177 screenToLayoutX(rect.width()), screenToLayoutY(rect.height()));
00178 }
00179
00180 #ifndef QT_NO_TRANSFORMATIONS
00181 QPointArray QwtMetricsMap::layoutToDevice(const QPointArray &pa,
00182 const QPainter *painter) const
00183 #else
00184 QPointArray QwtMetricsMap::layoutToDevice(const QPointArray &pa,
00185 const QPainter *) const
00186 #endif
00187 {
00188 if ( isIdentity() )
00189 return pa;
00190
00191 QPointArray mappedPa(pa);
00192
00193 #ifndef QT_NO_TRANSFORMATIONS
00194 if ( painter )
00195 mappedPa = translate(painter->worldMatrix(), mappedPa);
00196 #endif
00197
00198 QWMatrix m;
00199 m.scale(1.0 / d_deviceToLayoutX, 1.0 / d_deviceToLayoutY);
00200 mappedPa = translate(m, mappedPa);
00201
00202 #ifndef QT_NO_TRANSFORMATIONS
00203 if ( painter )
00204 mappedPa = translate(painter->worldMatrix().invert(), mappedPa);
00205 #endif
00206
00207 return mappedPa;
00208
00209 }
00210
00211 #ifndef QT_NO_TRANSFORMATIONS
00212 QPointArray QwtMetricsMap::deviceToLayout(const QPointArray &pa,
00213 const QPainter *painter) const
00214 #else
00215 QPointArray QwtMetricsMap::deviceToLayout(const QPointArray &pa,
00216 const QPainter *) const
00217 #endif
00218 {
00219 if ( isIdentity() )
00220 return pa;
00221
00222 QPointArray mappedPa(pa);
00223
00224 #ifndef QT_NO_TRANSFORMATIONS
00225 if ( painter )
00226 mappedPa = translate(painter->worldMatrix(), mappedPa);
00227 #endif
00228
00229 QWMatrix m;
00230 m.scale(d_deviceToLayoutX, d_deviceToLayoutY);
00231 mappedPa = translate(m, mappedPa);
00232
00233 #ifndef QT_NO_TRANSFORMATIONS
00234 if ( painter )
00235 mappedPa = translate(painter->worldMatrix().invert(), mappedPa);
00236 #endif
00237
00238 return mappedPa;
00239 }
00240
00245 QRect QwtMetricsMap::translate(
00246 const QWMatrix &m, const QRect &rect)
00247 {
00248 #if QT_VERSION < 300
00249 return m.map(rect.normalize());
00250 #else
00251 return m.mapRect(rect);
00252 #endif
00253 }
00254
00260 QPointArray QwtMetricsMap::translate(
00261 const QWMatrix &m, const QPointArray &pa)
00262 {
00263 #if QT_VERSION < 300
00264 return m.map(pa);
00265 #elif QT_VERSION < 400
00266 return m * pa;
00267 #else
00268 return m.map(pa);
00269 #endif
00270 }
00271
00272 QwtLayoutMetrics::QwtLayoutMetrics()
00273 {
00274 }
00275
00276 QwtLayoutMetrics::QwtLayoutMetrics(const QwtMetricsMap &map):
00277 d_map(map)
00278 {
00279 }
00280
00281 void QwtLayoutMetrics::setMap(const QwtMetricsMap &map)
00282 {
00283 d_map = map;
00284 }
00285
00286 int QwtLayoutMetrics::heightForWidth(const QString &text,
00287 int width, int flags, const QFontMetrics &fm) const
00288 {
00289 const QRect rect = fm.boundingRect(
00290 0, 0, d_map.layoutToScreenX(width), QCOORD_MAX, flags, text);
00291 return d_map.screenToLayoutY(rect.height());
00292 }
00293
00294 int QwtLayoutMetrics::heightForWidth(const QString &text,
00295 int width, int flags, QPainter *painter) const
00296 {
00297 const QRect rect = painter->boundingRect(
00298 0, 0, d_map.layoutToDeviceX(width), QCOORD_MAX, flags, text);
00299
00300 return d_map.deviceToLayoutY(rect.height());
00301 }
00302
00303 QRect QwtLayoutMetrics::boundingRect(const QString &text,
00304 int flags, QPainter *painter) const
00305 {
00306 const QRect rect = painter->boundingRect(
00307 0, 0, 0, 0, flags, text);
00308
00309 return d_map.deviceToLayout(rect);
00310 }
00311
00312 QRect QwtLayoutMetrics::boundingRect(const QString &text,
00313 int flags, const QFontMetrics &fm) const
00314 {
00315 QRect rect = fm.boundingRect(
00316 0, 0, QCOORD_MAX, QCOORD_MAX, flags, text);
00317
00318 return d_map.screenToLayout(rect);
00319 }
00320
00321 #ifndef QT_NO_RICHTEXT
00322
00323 int QwtLayoutMetrics::heightForWidth(QSimpleRichText &text, int width) const
00324 {
00325 text.setWidth(d_map.layoutToScreenX(width));
00326 return d_map.screenToLayoutY(text.height());
00327 }
00328
00329 QRect QwtLayoutMetrics::boundingRect(
00330 const QSimpleRichText &text, int flags, QPainter *painter) const
00331 {
00332 const int tw = text.width();
00333
00334 int w, h;
00335 if ( painter )
00336 {
00337 ((QSimpleRichText &)text).setWidth(painter, QCOORD_MAX);
00338 w = d_map.deviceToLayoutX(text.widthUsed());
00339 h = d_map.deviceToLayoutY(text.height());
00340 }
00341 else
00342 {
00343 ((QSimpleRichText &)text).setWidth(QCOORD_MAX);
00344 w = d_map.screenToLayoutX(text.widthUsed());
00345 h = d_map.screenToLayoutY(text.height());
00346 }
00347
00348 ((QSimpleRichText &)text).setWidth(tw);
00349
00350 int x = 0;
00351 int y = 0;
00352 if (flags & Qt::AlignHCenter)
00353 x -= w/2;
00354 else if (flags & Qt::AlignRight)
00355 x -= w;
00356
00357 if (flags & Qt::AlignVCenter)
00358 y -= h/2;
00359 else if (flags & Qt::AlignBottom)
00360 y -= h;
00361
00362 return QRect(x, y, w, h);
00363 }
00364
00365 #endif // !QT_NO_RICHTEXT