| Index: ui/gfx/font_smoothing_win.cc
|
| ===================================================================
|
| --- ui/gfx/font_smoothing_win.cc (revision 0)
|
| +++ ui/gfx/font_smoothing_win.cc (revision 0)
|
| @@ -0,0 +1,121 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/gfx/font_smoothing_win.h"
|
| +
|
| +#include "base/memory/singleton.h"
|
| +#include "ui/base/win/singleton_hwnd.h"
|
| +
|
| +namespace {
|
| +
|
| +// Helper class to cache font smoothing settings and listen for notifications
|
| +// to re-query them from the system.
|
| +class CachedFontSmoothingSettings : public ui::SingletonHwnd::Observer {
|
| + public:
|
| + static CachedFontSmoothingSettings* GetInstance();
|
| +
|
| + // Returns the cached Windows font smoothing settings. Queries the settings
|
| + // via Windows APIs and begins listening for changes when called for the
|
| + // first time.
|
| + void GetFontSmoothingSettings(bool* smoothing_enabled,
|
| + bool* cleartype_enabled);
|
| +
|
| + private:
|
| + friend struct DefaultSingletonTraits<CachedFontSmoothingSettings>;
|
| +
|
| + CachedFontSmoothingSettings();
|
| + virtual ~CachedFontSmoothingSettings();
|
| +
|
| + // Listener for WM_SETTINGCHANGE notifications.
|
| + virtual void OnWndProc(HWND hwnd,
|
| + UINT message,
|
| + WPARAM wparam,
|
| + LPARAM lparam) OVERRIDE;
|
| +
|
| + // Queries the font settings from the system.
|
| + void QueryFontSettings();
|
| +
|
| + // Indicates whether the MessagePumpObserver has been registered.
|
| + bool observer_added_;
|
| +
|
| + // Indicates whether |smoothing_enabled_| and |cleartype_enabled_| are valid
|
| + // or need to be re-queried from the system.
|
| + bool need_to_query_settings_;
|
| +
|
| + // Indicates that font smoothing is enabled.
|
| + bool smoothing_enabled_;
|
| +
|
| + // Indicates that the ClearType font smoothing is enabled.
|
| + bool cleartype_enabled_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CachedFontSmoothingSettings);
|
| +};
|
| +
|
| +// static
|
| +CachedFontSmoothingSettings* CachedFontSmoothingSettings::GetInstance() {
|
| + return Singleton<CachedFontSmoothingSettings>::get();
|
| +}
|
| +
|
| +void CachedFontSmoothingSettings::GetFontSmoothingSettings(
|
| + bool* smoothing_enabled,
|
| + bool* cleartype_enabled) {
|
| + // If cached settings are stale, query them from the OS.
|
| + if (need_to_query_settings_) {
|
| + QueryFontSettings();
|
| + need_to_query_settings_ = false;
|
| + }
|
| + if (!observer_added_) {
|
| + ui::SingletonHwnd::GetInstance()->AddObserver(this);
|
| + observer_added_ = true;
|
| + }
|
| + *smoothing_enabled = smoothing_enabled_;
|
| + *cleartype_enabled = cleartype_enabled_;
|
| +}
|
| +
|
| +CachedFontSmoothingSettings::CachedFontSmoothingSettings()
|
| + : observer_added_(false),
|
| + need_to_query_settings_(true),
|
| + smoothing_enabled_(false),
|
| + cleartype_enabled_(false) {
|
| +}
|
| +
|
| +CachedFontSmoothingSettings::~CachedFontSmoothingSettings() {
|
| + // Can't remove the SingletonHwnd observer here since SingletonHwnd may have
|
| + // been destroyed already (both singletons).
|
| +}
|
| +
|
| +void CachedFontSmoothingSettings::OnWndProc(HWND hwnd,
|
| + UINT message,
|
| + WPARAM wparam,
|
| + LPARAM lparam) {
|
| + if (message == WM_SETTINGCHANGE)
|
| + need_to_query_settings_ = true;
|
| +}
|
| +
|
| +void CachedFontSmoothingSettings::QueryFontSettings() {
|
| + smoothing_enabled_ = false;
|
| + cleartype_enabled_ = false;
|
| +
|
| + BOOL enabled = false;
|
| + if (SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &enabled, 0) && enabled) {
|
| + smoothing_enabled_ = true;
|
| +
|
| + UINT smooth_type = 0;
|
| + if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smooth_type, 0))
|
| + cleartype_enabled_ = (smooth_type == FE_FONTSMOOTHINGCLEARTYPE);
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace gfx {
|
| +
|
| +void GetCachedFontSmoothingSettings(bool* smoothing_enabled,
|
| + bool* cleartype_enabled) {
|
| + CachedFontSmoothingSettings::GetInstance()->GetFontSmoothingSettings(
|
| + smoothing_enabled,
|
| + cleartype_enabled);
|
| +}
|
| +
|
| +} // namespace gfx
|
|
|