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:
parent
5170574532
commit
b0e8ba783b
@ -696,16 +696,37 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
|
|||||||
DWRITE_MEASURING_MODE measureMode =
|
DWRITE_MEASURING_MODE measureMode =
|
||||||
renderModeToMeasureMode(renderMode);
|
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;
|
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
|
||||||
HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
|
if (!SUCCEEDED(hr)) {
|
||||||
&glyphRun,
|
qErrnoWarning(hr, "%s: Failed to query IDWriteFactory2 interface.", __FUNCTION__);
|
||||||
1.0f,
|
hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
|
||||||
&transform,
|
&glyphRun,
|
||||||
renderMode,
|
1.0f,
|
||||||
measureMode,
|
&transform,
|
||||||
0.0, 0.0,
|
renderMode,
|
||||||
&glyphAnalysis
|
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)) {
|
if (SUCCEEDED(hr)) {
|
||||||
RECT rect;
|
RECT rect;
|
||||||
@ -726,10 +747,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
|
|||||||
QImage image;
|
QImage image;
|
||||||
HRESULT hr = DWRITE_E_NOCOLOR;
|
HRESULT hr = DWRITE_E_NOCOLOR;
|
||||||
IDWriteColorGlyphRunEnumerator *enumerator = 0;
|
IDWriteColorGlyphRunEnumerator *enumerator = 0;
|
||||||
IDWriteFactory2 *factory2 = nullptr;
|
if (glyphFormat == QFontEngine::Format_ARGB && factory2 != nullptr) {
|
||||||
if (glyphFormat == QFontEngine::Format_ARGB
|
|
||||||
&& SUCCEEDED(m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2),
|
|
||||||
reinterpret_cast<void **>(&factory2)))) {
|
|
||||||
hr = factory2->TranslateColorGlyphRun(0.0f,
|
hr = factory2->TranslateColorGlyphRun(0.0f,
|
||||||
0.0f,
|
0.0f,
|
||||||
&glyphRun,
|
&glyphRun,
|
||||||
@ -757,15 +775,17 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL;
|
IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL;
|
||||||
hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
|
hr = factory2->CreateGlyphRunAnalysis(
|
||||||
&colorGlyphRun->glyphRun,
|
&glyphRun,
|
||||||
1.0f,
|
|
||||||
&transform,
|
&transform,
|
||||||
renderMode,
|
renderMode,
|
||||||
measureMode,
|
measureMode,
|
||||||
|
gridFitMode,
|
||||||
|
DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE,
|
||||||
0.0, 0.0,
|
0.0, 0.0,
|
||||||
&colorGlyphsAnalysis
|
&colorGlyphsAnalysis
|
||||||
);
|
);
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__);
|
qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__);
|
||||||
break;
|
break;
|
||||||
@ -1000,17 +1020,37 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph
|
|||||||
|
|
||||||
DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(fontDef);
|
DWRITE_RENDERING_MODE renderMode = hintingPreferenceToRenderingMode(fontDef);
|
||||||
DWRITE_MEASURING_MODE measureMode = renderModeToMeasureMode(renderMode);
|
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;
|
IDWriteGlyphRunAnalysis *glyphAnalysis = NULL;
|
||||||
HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis(
|
if (SUCCEEDED(hr)) {
|
||||||
&glyphRun,
|
hr = factory2->CreateGlyphRunAnalysis(
|
||||||
1.0f,
|
&glyphRun,
|
||||||
&transform,
|
&transform,
|
||||||
renderMode,
|
renderMode,
|
||||||
measureMode,
|
measureMode,
|
||||||
0.0, 0.0,
|
gridFitMode,
|
||||||
&glyphAnalysis
|
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)) {
|
if (SUCCEEDED(hr)) {
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user