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:
parent
bfb80b7b45
commit
501f78855e
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user