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>bb10
parent
bdb30abcd2
commit
20ea0cbaba
|
|
@ -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))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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++);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue