Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ui / gfx / font_smoothing_win.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/gfx/font_smoothing_win.h"
6
7 #include "base/memory/singleton.h"
8 #include "ui/gfx/win/singleton_hwnd.h"
9
10 namespace {
11
12 // Helper class to cache font smoothing settings and listen for notifications
13 // to re-query them from the system.
14 class CachedFontSmoothingSettings : public gfx::SingletonHwnd::Observer {
15  public:
16   static CachedFontSmoothingSettings* GetInstance();
17
18   // Returns the cached Windows font smoothing settings. Queries the settings
19   // via Windows APIs and begins listening for changes when called for the
20   // first time.
21   void GetFontSmoothingSettings(bool* smoothing_enabled,
22                                 bool* cleartype_enabled);
23
24  private:
25   friend struct DefaultSingletonTraits<CachedFontSmoothingSettings>;
26
27   CachedFontSmoothingSettings();
28   virtual ~CachedFontSmoothingSettings();
29
30   // Listener for WM_SETTINGCHANGE notifications.
31   virtual void OnWndProc(HWND hwnd,
32                          UINT message,
33                          WPARAM wparam,
34                          LPARAM lparam) OVERRIDE;
35
36   // Queries the font settings from the system.
37   void QueryFontSettings();
38
39   // Indicates whether the SingletonHwnd::Observer has been registered.
40   bool observer_added_;
41
42   // Indicates whether |smoothing_enabled_| and |cleartype_enabled_| are valid
43   // or need to be re-queried from the system.
44   bool need_to_query_settings_;
45
46   // Indicates that font smoothing is enabled.
47   bool smoothing_enabled_;
48
49   // Indicates that the ClearType font smoothing is enabled.
50   bool cleartype_enabled_;
51
52   DISALLOW_COPY_AND_ASSIGN(CachedFontSmoothingSettings);
53 };
54
55 // static
56 CachedFontSmoothingSettings* CachedFontSmoothingSettings::GetInstance() {
57   return Singleton<CachedFontSmoothingSettings>::get();
58 }
59
60 void CachedFontSmoothingSettings::GetFontSmoothingSettings(
61     bool* smoothing_enabled,
62     bool* cleartype_enabled) {
63   // If cached settings are stale, query them from the OS.
64   if (need_to_query_settings_) {
65     QueryFontSettings();
66     need_to_query_settings_ = false;
67   }
68   if (!observer_added_) {
69     gfx::SingletonHwnd::GetInstance()->AddObserver(this);
70     observer_added_ = true;
71   }
72   *smoothing_enabled = smoothing_enabled_;
73   *cleartype_enabled = cleartype_enabled_;
74 }
75
76 CachedFontSmoothingSettings::CachedFontSmoothingSettings()
77     : observer_added_(false),
78       need_to_query_settings_(true),
79       smoothing_enabled_(false),
80       cleartype_enabled_(false) {
81 }
82
83 CachedFontSmoothingSettings::~CachedFontSmoothingSettings() {
84   // Can't remove the SingletonHwnd observer here since SingletonHwnd may have
85   // been destroyed already (both singletons).
86 }
87
88 void CachedFontSmoothingSettings::OnWndProc(HWND hwnd,
89                                             UINT message,
90                                             WPARAM wparam,
91                                             LPARAM lparam) {
92   if (message == WM_SETTINGCHANGE)
93     need_to_query_settings_ = true;
94 }
95
96 void CachedFontSmoothingSettings::QueryFontSettings() {
97   smoothing_enabled_ = false;
98   cleartype_enabled_ = false;
99
100   BOOL enabled = false;
101   if (SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &enabled, 0) && enabled) {
102     smoothing_enabled_ = true;
103
104     UINT smooth_type = 0;
105     if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smooth_type, 0))
106       cleartype_enabled_ = (smooth_type == FE_FONTSMOOTHINGCLEARTYPE);
107   }
108 }
109
110 }  // namespace
111
112 namespace gfx {
113
114 void GetCachedFontSmoothingSettings(bool* smoothing_enabled,
115                                     bool* cleartype_enabled) {
116   CachedFontSmoothingSettings::GetInstance()->GetFontSmoothingSettings(
117       smoothing_enabled,
118       cleartype_enabled);
119 }
120
121 }  // namespace gfx