Bug 1345222 - Fix user-set ClearType params detection. r?mchang
Also making SetupClearTypeParams more robust:
* Using W functions instead of A functions.
* Checking the value range again after taking the enhancedContrast value from the registry.
* Adding error checks after CreateCustomRenderingParams calls.
MozReview-Commit-ID: I7Lr6SCqiRz
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -1128,18 +1128,20 @@ gfxWindowsPlatform::FontsPrefsChanged(co
if (clearTextFontCaches) {
gfxFontCache *fc = gfxFontCache::GetCache();
if (fc) {
fc->Flush();
}
}
}
-#define ENHANCED_CONTRAST_REGISTRY_KEY \
- HKEY_CURRENT_USER, "Software\\Microsoft\\Avalon.Graphics\\DISPLAY1\\EnhancedContrastLevel"
+#define DISPLAY1_REGISTRY_KEY \
+ HKEY_CURRENT_USER, L"Software\\Microsoft\\Avalon.Graphics\\DISPLAY1"
+
+#define ENHANCED_CONTRAST_VALUE_NAME L"EnhancedContrastLevel"
void
gfxWindowsPlatform::SetupClearTypeParams()
{
if (GetDWriteFactory()) {
// any missing prefs will default to invalid (-1) and be ignored;
// out-of-range values will also be ignored
FLOAT gamma = -1.0;
@@ -1192,26 +1194,30 @@ gfxWindowsPlatform::SetupClearTypeParams
mMeasuringMode = DWRITE_MEASURING_MODE_NATURAL;
break;
}
RefPtr<IDWriteRenderingParams> defaultRenderingParams;
GetDWriteFactory()->CreateRenderingParams(getter_AddRefs(defaultRenderingParams));
// For EnhancedContrast, we override the default if the user has not set it
// in the registry (by using the ClearType Tuner).
- if (contrast >= 0.0 && contrast <= 10.0) {
- contrast = contrast;
- } else {
+ if (contrast < 0.0 || contrast > 10.0) {
HKEY hKey;
- if (RegOpenKeyExA(ENHANCED_CONTRAST_REGISTRY_KEY,
- 0, KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- contrast = defaultRenderingParams->GetEnhancedContrast();
+ LONG res = RegOpenKeyExW(DISPLAY1_REGISTRY_KEY,
+ 0, KEY_READ, &hKey);
+ if (res == ERROR_SUCCESS) {
+ res = RegQueryValueExW(hKey, ENHANCED_CONTRAST_VALUE_NAME,
+ nullptr, nullptr, nullptr, nullptr);
+ if (res == ERROR_SUCCESS) {
+ contrast = defaultRenderingParams->GetEnhancedContrast();
+ }
RegCloseKey(hKey);
- } else {
+ }
+
+ if (contrast < 0.0 || contrast > 10.0) {
contrast = 1.0;
}
}
// For parameters that have not been explicitly set,
// we copy values from default params (or our overridden value for contrast)
if (gamma < 1.0 || gamma > 2.2) {
gamma = defaultRenderingParams->GetGamma();
@@ -1233,23 +1239,31 @@ gfxWindowsPlatform::SetupClearTypeParams
if (renderMode < DWRITE_RENDERING_MODE_DEFAULT ||
renderMode > DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC) {
renderMode = defaultRenderingParams->GetRenderingMode();
}
mRenderingParams[TEXT_RENDERING_NO_CLEARTYPE] = defaultRenderingParams;
- GetDWriteFactory()->CreateCustomRenderingParams(gamma, contrast, level,
- dwriteGeometry, renderMode,
+ HRESULT hr = GetDWriteFactory()->CreateCustomRenderingParams(
+ gamma, contrast, level, dwriteGeometry, renderMode,
getter_AddRefs(mRenderingParams[TEXT_RENDERING_NORMAL]));
+ if (FAILED(hr) || !mRenderingParams[TEXT_RENDERING_NORMAL]) {
+ mRenderingParams[TEXT_RENDERING_NORMAL] = defaultRenderingParams;
+ }
- GetDWriteFactory()->CreateCustomRenderingParams(gamma, contrast, level,
+ hr = GetDWriteFactory()->CreateCustomRenderingParams(
+ gamma, contrast, level,
dwriteGeometry, DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
getter_AddRefs(mRenderingParams[TEXT_RENDERING_GDI_CLASSIC]));
+ if (FAILED(hr) || !mRenderingParams[TEXT_RENDERING_GDI_CLASSIC]) {
+ mRenderingParams[TEXT_RENDERING_GDI_CLASSIC] =
+ defaultRenderingParams;
+ }
}
}
ReadbackManagerD3D11*
gfxWindowsPlatform::GetReadbackManager()
{
if (!mD3D11ReadbackManager) {
mD3D11ReadbackManager = new ReadbackManagerD3D11();