Fix DirectWrite subpixel antialiasing on BGR screens
On monitors where the subpixel arrangement is blue, green, red, our DirectWrite rendering would give the wrong subppixel antialiasing, causing color fringes on text. Like we do with Freetype, we determine subpixel arrangement of the primary screen and use this as the default. Pick-to: 6.8 6.9 Change-Id: I9ce7025449106a2376bd0ed02ce07b59c79438bd Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
This commit is contained in:
parent
a90d9f4823
commit
d5cef74d8d
@ -217,6 +217,12 @@ QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *di
|
||||
m_fontEngineData->directWriteFactory->AddRef();
|
||||
m_directWriteFontFace->AddRef();
|
||||
|
||||
IDWriteRenderingParams *renderingParams = nullptr;
|
||||
if (SUCCEEDED(m_fontEngineData->directWriteFactory->CreateRenderingParams(&renderingParams))) {
|
||||
m_pixelGeometry = renderingParams->GetPixelGeometry();
|
||||
renderingParams->Release();
|
||||
}
|
||||
|
||||
fontDef.pixelSize = pixelSize;
|
||||
collectMetrics();
|
||||
cache_cost = m_xHeight.toInt() * m_xHeight.toInt() * 2000;
|
||||
@ -1029,6 +1035,9 @@ void QWindowsFontEngineDirectWrite::renderGlyphRun(QImage *destination,
|
||||
float blueAlpha = a * *src++ / 255.0;
|
||||
float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0;
|
||||
|
||||
if (m_pixelGeometry == DWRITE_PIXEL_GEOMETRY_BGR)
|
||||
qSwap(redAlpha, blueAlpha);
|
||||
|
||||
QRgb currentRgb = dest[x];
|
||||
dest[x] = qRgba(qRound(qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha * r),
|
||||
qRound(qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha * g),
|
||||
@ -1052,10 +1061,14 @@ void QWindowsFontEngineDirectWrite::renderGlyphRun(QImage *destination,
|
||||
BYTE *src = alphaValues + width * 3 * y;
|
||||
|
||||
for (int x = 0; x < width; ++x) {
|
||||
dest[x] = *(src + 0) << 16
|
||||
| *(src + 1) << 8
|
||||
| *(src + 2);
|
||||
BYTE redAlpha = *(src + 0);
|
||||
BYTE greenAlpha = *(src + 1);
|
||||
BYTE blueAlpha = *(src + 2);
|
||||
|
||||
if (m_pixelGeometry == DWRITE_PIXEL_GEOMETRY_BGR)
|
||||
qSwap(redAlpha, blueAlpha);
|
||||
|
||||
dest[x] = qRgb(redAlpha, greenAlpha, blueAlpha);
|
||||
src += 3;
|
||||
}
|
||||
}
|
||||
|
@ -136,6 +136,7 @@ private:
|
||||
FaceId m_faceId;
|
||||
QString m_uniqueFamilyName;
|
||||
QList<QFontVariableAxis> m_variableAxes;
|
||||
DWRITE_PIXEL_GEOMETRY m_pixelGeometry = DWRITE_PIXEL_GEOMETRY_RGB;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
Loading…
x
Reference in New Issue
Block a user