summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscottmg <scottmg@chromium.org>2015-03-26 15:56:49 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-26 22:58:17 +0000
commita04a4b3f43eecb49e144cf194577af0192d83b35 (patch)
tree76b77a2c2ea090e978f40c98286519fd927f0c1b
parent64359e6a42a59759b7c008e1b2ef60fb0eb5367d (diff)
downloadchromium_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.cc2
-rw-r--r--content/public/common/renderer_preferences.h2
-rw-r--r--content/renderer/render_view_linux.cc40
-rw-r--r--content/renderer/render_view_win.cc8
-rw-r--r--ui/gfx/font_render_params.cc37
-rw-r--r--ui/gfx/font_render_params.h6
-rw-r--r--ui/gfx/font_render_params_win.cc34
-rw-r--r--ui/gfx/platform_font_win.cc12
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;