diff options
author | Andrew Knight <andrew.knight@digia.com> | 2014-09-03 10:34:28 +0300 |
---|---|---|
committer | Andrew Knight <andrew.knight@digia.com> | 2014-09-03 17:50:11 +0200 |
commit | 20ea0cbaba8fe38e1ab8c8240c3917af85f929f5 (patch) | |
tree | c5668798cb6ec7420d540be14d0472dc90658304 /src/plugins | |
parent | bdb30abcd274d4fb1958e17ba8790e415a2ffe85 (diff) |
direct2d: Work around ClearType rendering bug in translucent mode
This switches the font rendering to use gray scale antialiasing when in
translucent rendering mode. It does so by adding a flags argument to the
paint engine, allowing for future expansion in communicating render hints
from the device to the engine.
Task-number: QTBUG-41002
Change-Id: I0265154716a12060e851b603a109e9c693f5e843
Reviewed-by: Louai Al-Khanji <louai.al-khanji@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/plugins')
7 files changed, 36 insertions, 15 deletions
diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.cpp index f5f4923b2f..4bbe74b642 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.cpp @@ -53,8 +53,9 @@ QT_BEGIN_NAMESPACE class QWindowsDirect2DPaintDevicePrivate { public: - QWindowsDirect2DPaintDevicePrivate(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags f) - : engine(new QWindowsDirect2DPaintEngine(bitmap)) + QWindowsDirect2DPaintDevicePrivate(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags f, + QWindowsDirect2DPaintEngine::Flags paintFlags) + : engine(new QWindowsDirect2DPaintEngine(bitmap, paintFlags)) , bitmap(bitmap) , flags(f) {} @@ -64,8 +65,9 @@ public: QInternal::PaintDeviceFlags flags; }; -QWindowsDirect2DPaintDevice::QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags flags) - : d_ptr(new QWindowsDirect2DPaintDevicePrivate(bitmap, flags)) +QWindowsDirect2DPaintDevice::QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags flags, + QWindowsDirect2DPaintEngine::Flags paintFlags) + : d_ptr(new QWindowsDirect2DPaintDevicePrivate(bitmap, flags, paintFlags)) { } diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.h b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.h index c9d8607497..33cc536b6d 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.h +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintdevice.h @@ -44,6 +44,7 @@ #include <QtCore/QScopedPointer> #include <QtGui/QPaintDevice> +#include "qwindowsdirect2dpaintengine.h" QT_BEGIN_NAMESPACE @@ -55,7 +56,8 @@ class QWindowsDirect2DPaintDevice : public QPaintDevice Q_DECLARE_PRIVATE(QWindowsDirect2DPaintDevice) public: - QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags flags); + QWindowsDirect2DPaintDevice(QWindowsDirect2DBitmap *bitmap, QInternal::PaintDeviceFlags flags, + QWindowsDirect2DPaintEngine::Flags paintFlags = QWindowsDirect2DPaintEngine::NoFlag); QPaintEngine *paintEngine() const Q_DECL_OVERRIDE; int devType() const Q_DECL_OVERRIDE; diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp index a4e75f6571..1d28befe41 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp @@ -233,9 +233,10 @@ class QWindowsDirect2DPaintEnginePrivate : public QPaintEngineExPrivate { Q_DECLARE_PUBLIC(QWindowsDirect2DPaintEngine) public: - QWindowsDirect2DPaintEnginePrivate(QWindowsDirect2DBitmap *bm) + QWindowsDirect2DPaintEnginePrivate(QWindowsDirect2DBitmap *bm, QWindowsDirect2DPaintEngine::Flags flags) : bitmap(bm) , clipFlags(0) + , flags(flags) { pen.reset(); brush.reset(); @@ -247,6 +248,7 @@ public: unsigned int clipFlags; QStack<ClipType> pushedClips; + QWindowsDirect2DPaintEngine::Flags flags; QPointF currentBrushOrigin; @@ -868,8 +870,9 @@ public: const bool antiAlias = bool((q->state()->renderHints & QPainter::TextAntialiasing) && !(fontDef.styleStrategy & QFont::NoAntialias)); - dc()->SetTextAntialiasMode(antiAlias ? D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE - : D2D1_TEXT_ANTIALIAS_MODE_ALIASED); + const D2D1_TEXT_ANTIALIAS_MODE antialiasMode = (flags & QWindowsDirect2DPaintEngine::UseGrayscaleAntialiasing) + ? D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE : D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE; + dc()->SetTextAntialiasMode(antiAlias ? antialiasMode : D2D1_TEXT_ANTIALIAS_MODE_ALIASED); dc()->DrawGlyphRun(pos, &glyphRun, @@ -913,8 +916,8 @@ public: } }; -QWindowsDirect2DPaintEngine::QWindowsDirect2DPaintEngine(QWindowsDirect2DBitmap *bitmap) - : QPaintEngineEx(*(new QWindowsDirect2DPaintEnginePrivate(bitmap))) +QWindowsDirect2DPaintEngine::QWindowsDirect2DPaintEngine(QWindowsDirect2DBitmap *bitmap, Flags flags) + : QPaintEngineEx(*(new QWindowsDirect2DPaintEnginePrivate(bitmap, flags))) { QPaintEngine::PaintEngineFeatures unsupported = // As of 1.1 Direct2D does not natively support complex composition modes diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.h b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.h index 1469d32876..4ed817b75f 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.h +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.h @@ -59,7 +59,13 @@ class QWindowsDirect2DPaintEngine : public QPaintEngineEx Q_DECLARE_PRIVATE(QWindowsDirect2DPaintEngine) public: - QWindowsDirect2DPaintEngine(QWindowsDirect2DBitmap *bitmap); + enum Flag { + NoFlag = 0, + UseGrayscaleAntialiasing = 1, + }; + Q_DECLARE_FLAGS(Flags, Flag) + + QWindowsDirect2DPaintEngine(QWindowsDirect2DBitmap *bitmap, Flags flags); bool begin(QPaintDevice *pdev) Q_DECL_OVERRIDE; bool end() Q_DECL_OVERRIDE; @@ -119,6 +125,7 @@ private: void adjustForAliasing(QRectF *rect); void adjustForAliasing(QPointF *point); }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QWindowsDirect2DPaintEngine::Flags) QT_END_NAMESPACE diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.cpp index d9f7c595ca..88b440f857 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.cpp @@ -62,10 +62,11 @@ public: , devicePixelRatio(1.0) {} - QWindowsDirect2DPlatformPixmapPrivate(QWindowsDirect2DBitmap *bitmap) + QWindowsDirect2DPlatformPixmapPrivate(QWindowsDirect2DBitmap *bitmap, + QWindowsDirect2DPaintEngine::Flags flags) : owns_bitmap(false) , bitmap(bitmap) - , device(new QWindowsDirect2DPaintDevice(bitmap, QInternal::Pixmap)) + , device(new QWindowsDirect2DPaintDevice(bitmap, QInternal::Pixmap, flags)) , devicePixelRatio(1.0) {} @@ -91,9 +92,10 @@ QWindowsDirect2DPlatformPixmap::QWindowsDirect2DPlatformPixmap(PixelType pixelTy } QWindowsDirect2DPlatformPixmap::QWindowsDirect2DPlatformPixmap(QPlatformPixmap::PixelType pixelType, + QWindowsDirect2DPaintEngine::Flags flags, QWindowsDirect2DBitmap *bitmap) : QPlatformPixmap(pixelType, Direct2DClass) - , d_ptr(new QWindowsDirect2DPlatformPixmapPrivate(bitmap)) + , d_ptr(new QWindowsDirect2DPlatformPixmapPrivate(bitmap, flags)) { setSerialNumber(qt_d2dpixmap_serno++); diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.h b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.h index 702ef7af92..69243abb1d 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.h +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dplatformpixmap.h @@ -42,6 +42,7 @@ #ifndef QWINDOWSDIRECT2DPLATFORMPIXMAP_H #define QWINDOWSDIRECT2DPLATFORMPIXMAP_H +#include "qwindowsdirect2dpaintengine.h" #include <QtGui/qpa/qplatformpixmap.h> #include <QtCore/QScopedPointer> @@ -57,7 +58,7 @@ public: QWindowsDirect2DPlatformPixmap(PixelType pixelType); // We do NOT take ownership of the bitmap through this constructor! - QWindowsDirect2DPlatformPixmap(PixelType pixelType, QWindowsDirect2DBitmap *bitmap); + QWindowsDirect2DPlatformPixmap(PixelType pixelType, QWindowsDirect2DPaintEngine::Flags flags, QWindowsDirect2DBitmap *bitmap); ~QWindowsDirect2DPlatformPixmap(); void resize(int width, int height) Q_DECL_OVERRIDE; diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dwindow.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dwindow.cpp index 37987931b3..f739493c1a 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dwindow.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dwindow.cpp @@ -308,7 +308,11 @@ void QWindowsDirect2DWindow::setupBitmap() m_bitmap.reset(new QWindowsDirect2DBitmap(backBufferBitmap.Get(), m_deviceContext.Get())); + QWindowsDirect2DPaintEngine::Flags flags = QWindowsDirect2DPaintEngine::NoFlag; + if (!m_directRendering) + flags |= QWindowsDirect2DPaintEngine::UseGrayscaleAntialiasing; QWindowsDirect2DPlatformPixmap *pp = new QWindowsDirect2DPlatformPixmap(QPlatformPixmap::PixmapType, + flags, m_bitmap.data()); m_pixmap.reset(new QPixmap(pp)); } |