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.

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>
(cherry picked from commit 501f78855e9a2212cd8c9a9f50c1728e9e945f2c)
bb10
Eskil Abrahamsen Blomfeldt 2024-12-12 08:09:21 +01:00
parent cc7574cba7
commit 37c3340b14
2 changed files with 17 additions and 3 deletions

View File

@ -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;
@ -968,6 +974,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),
@ -991,10 +1000,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;
}
}

View File

@ -133,6 +133,7 @@ private:
QFixed m_maxAdvanceWidth;
FaceId m_faceId;
QString m_uniqueFamilyName;
DWRITE_PIXEL_GEOMETRY m_pixelGeometry = DWRITE_PIXEL_GEOMETRY_RGB;
};
QT_END_NAMESPACE