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:
Eskil Abrahamsen Blomfeldt 2024-12-12 08:09:21 +01:00
parent a90d9f4823
commit d5cef74d8d
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;
@ -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;
}
}

View File

@ -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