DirectWrite: Turn off grid-fitting for unhinted text

When QFont::PreferNoHinting is set, we disable the automatic
grid-fitting done by DirectWrite in order to get shapes as close
as possible to the original design.

[ChangeLog][Windows][Text] Automatic grid-fitting is now disabled
for fonts that set QFont::PreferNoHinting.

Change-Id: Idfd3707153799bb8aa13f0d23e4dd6f1893ce53d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2022-02-03 09:03:21 +01:00
parent 5170574532
commit b0e8ba783b

View File

@ -696,16 +696,37 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
DWRITE_MEASURING_MODE measureMode =
renderModeToMeasureMode(renderMode);
DWRITE_GRID_FIT_MODE gridFitMode = fontDef.hintingPreference == QFont::PreferNoHinting
? DWRITE_GRID_FIT_MODE_DISABLED
: DWRITE_GRID_FIT_MODE_DEFAULT;
IDWriteFactory2 *factory2 = nullptr;
HRESULT hr = m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
reinterpret_cast<void **>(&factory2));
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
&glyphRun,
1.0f,
&transform,
renderMode,
measureMode,
0.0, 0.0,
&glyphAnalysis
);
if (!SUCCEEDED(hr)) {
qErrnoWarning(hr, "%s: Failed to query IDWriteFactory2 interface.", __FUNCTION__);
hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
&glyphRun,
1.0f,
&transform,
renderMode,
measureMode,
0.0, 0.0,
&glyphAnalysis
);
} else {
hr = factory2->CreateGlyphRunAnalysis(
&glyphRun,
&transform,
renderMode,
measureMode,
gridFitMode,
DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
0.0, 0.0,
&glyphAnalysis
);
}
if (SUCCEEDED(hr)) {
RECT rect;
@ -726,10 +747,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
QImage image;
HRESULT hr = DWRITE_E_NOCOLOR;
IDWriteColorGlyphRunEnumerator *enumerator = 0;
IDWriteFactory2 *factory2 = nullptr;
if (glyphFormat == QFontEngine::Format_ARGB
&& SUCCEEDED(m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
reinterpret_cast<void **>(&factory2)))) {
if (glyphFormat == QFontEngine::Format_ARGB && factory2 != nullptr) {
hr = factory2->TranslateColorGlyphRun(0.0f,
0.0f,
&glyphRun,
@ -757,15 +775,17 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
}
IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL;
hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
&colorGlyphRun->glyphRun,
1.0f,
hr = factory2->CreateGlyphRunAnalysis(
&glyphRun,
&transform,
renderMode,
measureMode,
gridFitMode,
DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
0.0, 0.0,
&colorGlyphsAnalysis
);
if (FAILED(hr)) {
qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__);
break;
@ -1000,17 +1020,37 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph
DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(fontDef);
DWRITE_MEASURING_MODE measureMode = renderModeToMeasureMode(renderMode);
DWRITE_GRID_FIT_MODE gridFitMode = fontDef.hintingPreference == QFont::PreferNoHinting
? DWRITE_GRID_FIT_MODE_DISABLED
: DWRITE_GRID_FIT_MODE_DEFAULT;
IDWriteFactory2 *factory2 = nullptr;
HRESULT hr = m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
reinterpret_cast<void **>(&factory2));
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
&glyphRun,
1.0f,
&transform,
renderMode,
measureMode,
0.0, 0.0,
&glyphAnalysis
);
if (SUCCEEDED(hr)) {
hr = factory2->CreateGlyphRunAnalysis(
&glyphRun,
&transform,
renderMode,
measureMode,
gridFitMode,
DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
0.0, 0.0,
&glyphAnalysis
);
} else {
hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
&glyphRun,
1.0f,
&transform,
renderMode,
measureMode,
0.0, 0.0,
&glyphAnalysis
);
}
if (SUCCEEDED(hr)) {
RECT rect;