From 3cede847c39269374c52dcf156dc982d7a51f29c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Wed, 28 May 2014 11:21:29 +0200 Subject: WIP: Add PdmDevicePixelRatioScaled. Work around QPainDevice::metric's int return type by adding a new metric that returns a scaled devicePixelRatio. Choose a scale factor that gives us more than enough range. The QPainDevice::devicePixelRatio() convenience accessor is public API and can unfortunately not be changed to return a qreal. Add devicePixelRatioF() which returns the (unscaled) devicePixelRatio. Change all call sites of QPainDevice::devicePixelRatio() to use QPainDevice::devicePixelRatioF(). Task-number: QTBUG-38858 Change-Id: Ia97c24e1c7b10241d6425fab2fa513702bb750b8 --- src/gui/painting/qpaintdevice.cpp | 9 +++++++++ src/gui/painting/qpaintdevice.h | 8 ++++++-- src/gui/painting/qpainter.cpp | 2 +- src/gui/painting/qpainter_p.h | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qpaintdevice.cpp b/src/gui/painting/qpaintdevice.cpp index 36e0bbe223..4ee3d91ea3 100644 --- a/src/gui/painting/qpaintdevice.cpp +++ b/src/gui/painting/qpaintdevice.cpp @@ -41,6 +41,8 @@ QPaintDevice::QPaintDevice() painters = 0; } +qreal QPaintDevice::devicePixelRatioFScale = 10000000.0; + QPaintDevice::~QPaintDevice() { if (paintingActive()) @@ -79,7 +81,13 @@ Q_GUI_EXPORT int qt_paint_device_metric(const QPaintDevice *device, QPaintDevice int QPaintDevice::metric(PaintDeviceMetric m) const { + // Fallback: A subclass has not implemented PdmDevicePixelRatioScaled but might + // have implemented PdmDevicePixelRatio. + if (m == PdmDevicePixelRatioScaled) + return this->metric(PdmDevicePixelRatio) * devicePixelRatioFScale; + qWarning("QPaintDevice::metrics: Device has no metric information"); + if (m == PdmDpiX) { return 72; } else if (m == PdmDpiY) { @@ -95,4 +103,5 @@ int QPaintDevice::metric(PaintDeviceMetric m) const } } + QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintdevice.h b/src/gui/painting/qpaintdevice.h index 7c756c66de..819116c585 100644 --- a/src/gui/painting/qpaintdevice.h +++ b/src/gui/painting/qpaintdevice.h @@ -58,7 +58,8 @@ public: PdmDpiY, PdmPhysicalDpiX, PdmPhysicalDpiY, - PdmDevicePixelRatio + PdmDevicePixelRatio, + PdmDevicePixelRatioScaled }; virtual ~QPaintDevice(); @@ -76,9 +77,13 @@ public: int physicalDpiX() const { return metric(PdmPhysicalDpiX); } int physicalDpiY() const { return metric(PdmPhysicalDpiY); } int devicePixelRatio() const { return metric(PdmDevicePixelRatio); } + qreal devicePixelRatioF() const { return metric(PdmDevicePixelRatioScaled) / devicePixelRatioFScale; } int colorCount() const { return metric(PdmNumColors); } int depth() const { return metric(PdmDepth); } + // ### Classes that are not QPaintDevice subclasses are implementing metric() + // ### There needs to be some kind of (semi)-public API. + static qreal devicePixelRatioFScale; protected: QPaintDevice(); virtual int metric(PaintDeviceMetric metric) const; @@ -87,7 +92,6 @@ protected: virtual QPainter *sharedPainter() const; ushort painters; // refcount - private: Q_DISABLE_COPY(QPaintDevice) diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 6f00abfc5f..69cbb42923 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -219,7 +219,7 @@ QTransform QPainterPrivate::viewTransform() const return QTransform(); } -int QPainterPrivate::effectiveDevicePixelRatio() const +qreal QPainterPrivate::effectiveDevicePixelRatio() const { // Special cases for devices that does not support PdmDevicePixelRatio go here: if (device->devType() == QInternal::Printer) diff --git a/src/gui/painting/qpainter_p.h b/src/gui/painting/qpainter_p.h index 7c32dc1694..fdad8e2460 100644 --- a/src/gui/painting/qpainter_p.h +++ b/src/gui/painting/qpainter_p.h @@ -241,7 +241,7 @@ public: } QTransform viewTransform() const; - int effectiveDevicePixelRatio() const; + qreal effectiveDevicePixelRatio() const; QTransform hidpiScaleTransform() const; static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev); void detachPainterPrivate(QPainter *q); -- cgit v1.2.3