diff options
author | scottmg <scottmg@chromium.org> | 2015-03-26 15:56:49 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-26 22:58:17 +0000 |
commit | a04a4b3f43eecb49e144cf194577af0192d83b35 (patch) | |
tree | 76b77a2c2ea090e978f40c98286519fd927f0c1b | |
parent | 64359e6a42a59759b7c008e1b2ef60fb0eb5367d (diff) | |
download | chromium_src-a04a4b3f43eecb49e144cf194577af0192d83b35.zip chromium_src-a04a4b3f43eecb49e144cf194577af0192d83b35.tar.gz chromium_src-a04a4b3f43eecb49e144cf194577af0192d83b35.tar.bz2 |
Retrieve and pass subpixel lcd geometry on windows
Refactor a little to share some ui->skia converters.
BUG=468509
TEST=set HKLM\Software[\Wow6432Node]\Microsoft\Avalon.Graphics\DISPLAY1\PixelStructure to 1 or 2, zoom in and confirm RGB or BGR fringes respectively.
Review URL: https://codereview.chromium.org/1021643002
Cr-Commit-Position: refs/heads/master@{#322489}
-rw-r--r-- | chrome/browser/renderer_preferences_util.cc | 2 | ||||
-rw-r--r-- | content/public/common/renderer_preferences.h | 2 | ||||
-rw-r--r-- | content/renderer/render_view_linux.cc | 40 | ||||
-rw-r--r-- | content/renderer/render_view_win.cc | 8 | ||||
-rw-r--r-- | ui/gfx/font_render_params.cc | 37 | ||||
-rw-r--r-- | ui/gfx/font_render_params.h | 6 | ||||
-rw-r--r-- | ui/gfx/font_render_params_win.cc | 34 | ||||
-rw-r--r-- | ui/gfx/platform_font_win.cc | 12 |
8 files changed, 99 insertions, 42 deletions
diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc index 68b5f45..ce174ef 100644 --- a/chrome/browser/renderer_preferences_util.cc +++ b/chrome/browser/renderer_preferences_util.cc @@ -106,7 +106,7 @@ void UpdateFromSystemSettings(content::RendererPreferences* prefs, } #endif -#if defined(OS_LINUX) || defined(OS_ANDROID) +#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN) CR_DEFINE_STATIC_LOCAL(const gfx::FontRenderParams, params, (gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(true), NULL))); prefs->should_antialias_text = params.antialiasing; diff --git a/content/public/common/renderer_preferences.h b/content/public/common/renderer_preferences.h index b76b37b..4170932 100644 --- a/content/public/common/renderer_preferences.h +++ b/content/public/common/renderer_preferences.h @@ -54,7 +54,7 @@ struct CONTENT_EXPORT RendererPreferences { bool use_bitmaps; // The type of subpixel rendering to use for text. - // Currently only used by Linux. + // Currently only used by Linux and Windows. gfx::FontRenderParams::SubpixelRendering subpixel_rendering; // Whether subpixel positioning should be used, permitting fractional X diff --git a/content/renderer/render_view_linux.cc b/content/renderer/render_view_linux.cc index f4ef02e..7f3ab8d 100644 --- a/content/renderer/render_view_linux.cc +++ b/content/renderer/render_view_linux.cc @@ -6,6 +6,7 @@ #include "content/public/common/renderer_preferences.h" #include "third_party/WebKit/public/web/linux/WebFontRendering.h" +#include "ui/gfx/font_render_params.h" using blink::WebFontRendering; @@ -43,38 +44,6 @@ SkPaint::Hinting RendererPreferencesToSkiaHinting( } } -SkFontHost::LCDOrder RendererPreferencesToSkiaLCDOrder( - const RendererPreferences& prefs) { - switch (prefs.subpixel_rendering) { - case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: - return SkFontHost::kRGB_LCDOrder; - case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: - return SkFontHost::kBGR_LCDOrder; - default: - NOTREACHED(); - return SkFontHost::kRGB_LCDOrder; - } -} - -SkFontHost::LCDOrientation RendererPreferencesToSkiaLCDOrientation( - const RendererPreferences& prefs) { - switch (prefs.subpixel_rendering) { - case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: - return SkFontHost::kHorizontal_LCDOrientation; - case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: - case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: - return SkFontHost::kVertical_LCDOrientation; - default: - NOTREACHED(); - return SkFontHost::kHorizontal_LCDOrientation; - } -} - } // namespace void RenderViewImpl::UpdateFontRenderingFromRendererPrefs() { @@ -82,9 +51,12 @@ void RenderViewImpl::UpdateFontRenderingFromRendererPrefs() { WebFontRendering::setHinting(RendererPreferencesToSkiaHinting(prefs)); WebFontRendering::setAutoHint(prefs.use_autohinter); WebFontRendering::setUseBitmaps(prefs.use_bitmaps); - WebFontRendering::setLCDOrder(RendererPreferencesToSkiaLCDOrder(prefs)); + WebFontRendering::setLCDOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + prefs.subpixel_rendering)); WebFontRendering::setLCDOrientation( - RendererPreferencesToSkiaLCDOrientation(prefs)); + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( + prefs.subpixel_rendering)); WebFontRendering::setAntiAlias(prefs.should_antialias_text); WebFontRendering::setSubpixelRendering( prefs.subpixel_rendering != diff --git a/content/renderer/render_view_win.cc b/content/renderer/render_view_win.cc index b52d8e9..301d289 100644 --- a/content/renderer/render_view_win.cc +++ b/content/renderer/render_view_win.cc @@ -5,6 +5,7 @@ #include "content/public/common/renderer_preferences.h" #include "content/renderer/render_view_impl.h" #include "third_party/WebKit/public/web/win/WebFontRendering.h" +#include "ui/gfx/font_render_params.h" using blink::WebFontRendering; @@ -23,6 +24,13 @@ void RenderViewImpl::UpdateFontRenderingFromRendererPrefs() { blink::WebFontRendering::setStatusFontMetrics( prefs.status_font_family_name.c_str(), prefs.status_font_height); + + blink::WebFontRendering::setLCDOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + prefs.subpixel_rendering)); + blink::WebFontRendering::setLCDOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( + prefs.subpixel_rendering)); } } // namespace content diff --git a/ui/gfx/font_render_params.cc b/ui/gfx/font_render_params.cc index 7297cdc..44c6bcf 100644 --- a/ui/gfx/font_render_params.cc +++ b/ui/gfx/font_render_params.cc @@ -4,6 +4,8 @@ #include "ui/gfx/font_render_params.h" +#include "base/logging.h" + namespace gfx { FontRenderParams::FontRenderParams() @@ -17,6 +19,41 @@ FontRenderParams::FontRenderParams() FontRenderParams::~FontRenderParams() {} +// static +SkFontHost::LCDOrder FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + FontRenderParams::SubpixelRendering subpixel_rendering) { + switch (subpixel_rendering) { + case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: + return SkFontHost::kRGB_LCDOrder; + case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: + return SkFontHost::kBGR_LCDOrder; + } + + NOTREACHED(); + return SkFontHost::kRGB_LCDOrder; +} + +// static +SkFontHost::LCDOrientation +FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( + FontRenderParams::SubpixelRendering subpixel_rendering) { + switch (subpixel_rendering) { + case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: + return SkFontHost::kHorizontal_LCDOrientation; + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: + return SkFontHost::kVertical_LCDOrientation; + } + + NOTREACHED(); + return SkFontHost::kHorizontal_LCDOrientation; +} + FontRenderParamsQuery::FontRenderParamsQuery(bool for_web_contents) : for_web_contents(for_web_contents), pixel_size(0), diff --git a/ui/gfx/font_render_params.h b/ui/gfx/font_render_params.h index 977a495..0bf10d4 100644 --- a/ui/gfx/font_render_params.h +++ b/ui/gfx/font_render_params.h @@ -8,6 +8,7 @@ #include <string> #include <vector> +#include "third_party/skia/include/core/SkFontHost.h" #include "ui/gfx/gfx_export.h" namespace gfx { @@ -57,6 +58,11 @@ struct GFX_EXPORT FontRenderParams { // Whether subpixel rendering should be used or not, and if so, the display's // subpixel order. SubpixelRendering subpixel_rendering; + + static SkFontHost::LCDOrder SubpixelRenderingToSkiaLCDOrder( + SubpixelRendering subpixel_rendering); + static SkFontHost::LCDOrientation SubpixelRenderingToSkiaLCDOrientation( + SubpixelRendering subpixel_rendering); }; // A query used to determine the appropriate FontRenderParams. diff --git a/ui/gfx/font_render_params_win.cc b/ui/gfx/font_render_params_win.cc index 9f8409c..f7a0148 100644 --- a/ui/gfx/font_render_params_win.cc +++ b/ui/gfx/font_render_params_win.cc @@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ui/gfx/font_render_params.h" - +#include "base/files/file_path.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" +#include "base/win/registry.h" +#include "ui/gfx/font_render_params.h" #include "ui/gfx/win/direct_write.h" #include "ui/gfx/win/singleton_hwnd.h" @@ -13,6 +14,33 @@ namespace gfx { namespace { +FontRenderParams::SubpixelRendering GetSubpixelRenderingGeometry() { + DISPLAY_DEVICE display_device = {sizeof(DISPLAY_DEVICE), 0}; + for (int i = 0; EnumDisplayDevices(nullptr, i, &display_device, 0); ++i) { + // TODO(scottmg): We only support the primary device currently. + if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { + base::FilePath trimmed = + base::FilePath(display_device.DeviceName).BaseName(); + base::win::RegKey key( + HKEY_LOCAL_MACHINE, + (L"SOFTWARE\\Microsoft\\Avalon.Graphics\\" + trimmed.value()).c_str(), + KEY_READ); + DWORD pixel_structure; + if (key.ReadValueDW(L"PixelStructure", &pixel_structure) == + ERROR_SUCCESS) { + if (pixel_structure == 1) + return FontRenderParams::SUBPIXEL_RENDERING_RGB; + if (pixel_structure == 2) + return FontRenderParams::SUBPIXEL_RENDERING_BGR; + } + break; + } + } + + // No explicit ClearType settings, default to RGB. + return FontRenderParams::SUBPIXEL_RENDERING_RGB; +} + // Caches font render params and updates them on system notifications. class CachedFontRenderParams : public gfx::SingletonHwnd::Observer { public: @@ -41,7 +69,7 @@ class CachedFontRenderParams : public gfx::SingletonHwnd::Observer { UINT type = 0; if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &type, 0) && type == FE_FONTSMOOTHINGCLEARTYPE) { - params_->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_RGB; + params_->subpixel_rendering = GetSubpixelRenderingGeometry(); } } gfx::SingletonHwnd::GetInstance()->AddObserver(this); diff --git a/ui/gfx/platform_font_win.cc b/ui/gfx/platform_font_win.cc index 8d8702e..7d63a71 100644 --- a/ui/gfx/platform_font_win.cc +++ b/ui/gfx/platform_font_win.cc @@ -488,11 +488,17 @@ PlatformFontWin::HFontRef* PlatformFontWin::CreateHFontRefFromSkia( base::SysWideToUTF8(font_info.lfFaceName).c_str(), static_cast<SkTypeface::Style>(skia_style))); - BOOL antialiasing = TRUE; - SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &antialiasing, 0); + gfx::FontRenderParams font_params = + gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(false), nullptr); + SkFontHost::SetSubpixelOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + font_params.subpixel_rendering)); + SkFontHost::SetSubpixelOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( + font_params.subpixel_rendering)); SkPaint paint; - paint.setAntiAlias(!!antialiasing); + paint.setAntiAlias(font_params.antialiasing); paint.setTypeface(skia_face.get()); paint.setTextSize(-font_info.lfHeight); SkPaint::FontMetrics skia_metrics; |