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
Change-Id: I9ce7025449106a2376bd0ed02ce07b59c79438bd
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
(cherry picked from commit d5cef74d8d71458500f979c0d31a7241b3fef9db)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2024-12-12 08:09:21 +01:00 committed by Qt Cherry-pick Bot
parent bfb80b7b45
commit 501f78855e
2 changed files with 17 additions and 3 deletions

View File

@ -217,6 +217,12 @@ QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *di
m_fontEngineData->directWriteFactory->AddRef(); m_fontEngineData->directWriteFactory->AddRef();
m_directWriteFontFace->AddRef(); m_directWriteFontFace->AddRef();
IDWriteRenderingParams *renderingParams = nullptr;
if (SUCCEEDED(m_fontEngineData->directWriteFactory->CreateRenderingParams(&renderingParams))) {
m_pixelGeometry = renderingParams->GetPixelGeometry();
renderingParams->Release();
}
fontDef.pixelSize = pixelSize; fontDef.pixelSize = pixelSize;
collectMetrics(); collectMetrics();
cache_cost = m_xHeight.toInt() * m_xHeight.toInt() * 2000; 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 blueAlpha = a * *src++ / 255.0;
float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0; float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0;
if (m_pixelGeometry == DWRITE_PIXEL_GEOMETRY_BGR)
qSwap(redAlpha, blueAlpha);
QRgb currentRgb = dest[x]; QRgb currentRgb = dest[x];
dest[x] = qRgba(qRound(qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha * r), dest[x] = qRgba(qRound(qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha * r),
qRound(qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha * g), qRound(qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha * g),
@ -1052,10 +1061,14 @@ void QWindowsFontEngineDirectWrite::renderGlyphRun(QImage *destination,
BYTE *src = alphaValues + width * 3 * y; BYTE *src = alphaValues + width * 3 * y;
for (int x = 0; x < width; ++x) { for (int x = 0; x < width; ++x) {
dest[x] = *(src + 0) << 16 BYTE redAlpha = *(src + 0);
| *(src + 1) << 8 BYTE greenAlpha = *(src + 1);
| *(src + 2); BYTE blueAlpha = *(src + 2);
if (m_pixelGeometry == DWRITE_PIXEL_GEOMETRY_BGR)
qSwap(redAlpha, blueAlpha);
dest[x] = qRgb(redAlpha, greenAlpha, blueAlpha);
src += 3; src += 3;
} }
} }

View File

@ -136,6 +136,7 @@ private:
FaceId m_faceId; FaceId m_faceId;
QString m_uniqueFamilyName; QString m_uniqueFamilyName;
QList<QFontVariableAxis> m_variableAxes; QList<QFontVariableAxis> m_variableAxes;
DWRITE_PIXEL_GEOMETRY m_pixelGeometry = DWRITE_PIXEL_GEOMETRY_RGB;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE