summaryrefslogtreecommitdiffstats
path: root/ui/gfx
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-17 04:52:11 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-17 04:52:11 +0000
commit123f0d0432c0aead5d9a2bd1c1df3fc87fe19289 (patch)
treeabad086fa3afe42542a6fe47de7c77c10c81eb83 /ui/gfx
parent5831265ef0c06bbbbe2ee7b807b554c765e407aa (diff)
downloadchromium_src-123f0d0432c0aead5d9a2bd1c1df3fc87fe19289.zip
chromium_src-123f0d0432c0aead5d9a2bd1c1df3fc87fe19289.tar.gz
chromium_src-123f0d0432c0aead5d9a2bd1c1df3fc87fe19289.tar.bz2
Invert web content when Windows color scheme is white-on-black.
Adds a new interface to listen for changes to system color changes, which can be used in future changelists to fix other widgets that need to recompute their color schemes when the user toggles high-contrast mode on and off. NTP is currently the only place in Chrome code that uses Windows theme colors inside the web content area; update this to invert these colors if we're also inverting the whole web content area. BUG=112944 TEST=Press Alt+Shift+PrtScr on Windows to toggle high-contrast mode on/off. Review URL: https://chromiumcodereview.appspot.com/9452033 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127344 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx')
-rw-r--r--ui/gfx/color_utils.cc8
-rw-r--r--ui/gfx/color_utils.h6
-rw-r--r--ui/gfx/sys_color_change_listener.cc118
-rw-r--r--ui/gfx/sys_color_change_listener.h45
4 files changed, 176 insertions, 1 deletions
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc
index a79947c..0012b24 100644
--- a/ui/gfx/color_utils.cc
+++ b/ui/gfx/color_utils.cc
@@ -296,6 +296,14 @@ SkColor GetReadableColor(SkColor foreground, SkColor background) {
foreground : foreground2;
}
+SkColor InvertColor(SkColor color) {
+ return SkColorSetARGB(
+ SkColorGetA(color),
+ 255 - SkColorGetR(color),
+ 255 - SkColorGetG(color),
+ 255 - SkColorGetB(color));
+}
+
SkColor GetSysSkColor(int which) {
#if defined(OS_WIN)
return skia::COLORREFToSkColor(GetSysColor(which));
diff --git a/ui/gfx/color_utils.h b/ui/gfx/color_utils.h
index 8f2697b..0627d34 100644
--- a/ui/gfx/color_utils.h
+++ b/ui/gfx/color_utils.h
@@ -6,6 +6,7 @@
#define UI_GFX_COLOR_UTILS_H_
#pragma once
+#include "base/basictypes.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/ui_export.h"
@@ -20,7 +21,7 @@ struct HSL {
double l;
};
-unsigned char GetLuminanceForColor(SkColor color);
+UI_EXPORT unsigned char GetLuminanceForColor(SkColor color);
// Calculated according to http://www.w3.org/TR/WCAG20/#relativeluminancedef
UI_EXPORT double RelativeLuminance(SkColor color);
@@ -76,6 +77,9 @@ UI_EXPORT SkColor AlphaBlend(SkColor foreground, SkColor background,
// has a luma value close to the midpoint (0.5 in the HSL representation).
UI_EXPORT SkColor GetReadableColor(SkColor foreground, SkColor background);
+// Invert a color.
+UI_EXPORT SkColor InvertColor(SkColor color);
+
// Gets a Windows system color as a SkColor
UI_EXPORT SkColor GetSysSkColor(int which);
diff --git a/ui/gfx/sys_color_change_listener.cc b/ui/gfx/sys_color_change_listener.cc
new file mode 100644
index 0000000..b6e321c
--- /dev/null
+++ b/ui/gfx/sys_color_change_listener.cc
@@ -0,0 +1,118 @@
+// 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/color_utils.h"
+#include "ui/gfx/sys_color_change_listener.h"
+
+#if defined(OS_WIN)
+#include <windows.h>
+#endif
+
+#include "base/basictypes.h"
+#include "base/memory/singleton.h"
+#include "base/observer_list.h"
+#if defined(OS_WIN)
+#include "ui/base/win/singleton_hwnd.h"
+#endif
+
+namespace gfx {
+
+namespace {
+
+bool g_is_inverted_color_scheme = false;
+bool g_is_inverted_color_scheme_initialized = false;
+
+void UpdateInvertedColorScheme() {
+#if defined(OS_WIN)
+ int foreground = color_utils::GetLuminanceForColor(
+ color_utils::GetSysSkColor(COLOR_WINDOWTEXT));
+ int background = color_utils::GetLuminanceForColor(
+ color_utils::GetSysSkColor(COLOR_WINDOW));
+ HIGHCONTRAST high_contrast = {0};
+ high_contrast.cbSize = sizeof(HIGHCONTRAST);
+ g_is_inverted_color_scheme =
+ SystemParametersInfo(SPI_GETHIGHCONTRAST, 0, &high_contrast, 0) &&
+ ((high_contrast.dwFlags & HCF_HIGHCONTRASTON) != 0);
+ g_is_inverted_color_scheme_initialized = true;
+#endif
+}
+
+} // namespace
+
+bool IsInvertedColorScheme() {
+ if (!g_is_inverted_color_scheme_initialized)
+ UpdateInvertedColorScheme();
+ return g_is_inverted_color_scheme;
+}
+
+#if defined(OS_WIN)
+class SysColorChangeObserver : public ui::SingletonHwnd::Observer {
+ public:
+ static SysColorChangeObserver* GetInstance();
+
+ void AddListener(SysColorChangeListener* listener);
+ void RemoveListener(SysColorChangeListener* listener);
+
+ private:
+ friend struct DefaultSingletonTraits<SysColorChangeObserver>;
+
+ SysColorChangeObserver();
+ virtual ~SysColorChangeObserver();
+
+ virtual void OnWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam) OVERRIDE;
+
+ ObserverList<SysColorChangeListener> listeners_;
+};
+
+// static
+SysColorChangeObserver* SysColorChangeObserver::GetInstance() {
+ return Singleton<SysColorChangeObserver>::get();
+}
+
+SysColorChangeObserver::SysColorChangeObserver() {
+ ui::SingletonHwnd::GetInstance()->AddObserver(this);
+}
+
+SysColorChangeObserver::~SysColorChangeObserver() {
+ ui::SingletonHwnd::GetInstance()->RemoveObserver(this);
+}
+
+void SysColorChangeObserver::AddListener(SysColorChangeListener* listener) {
+ listeners_.AddObserver(listener);
+}
+
+void SysColorChangeObserver::RemoveListener(SysColorChangeListener* listener) {
+ listeners_.RemoveObserver(listener);
+}
+
+void SysColorChangeObserver::OnWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam) {
+ if (message == WM_SYSCOLORCHANGE ||
+ (message == WM_SETTINGCHANGE && wparam == SPI_SETHIGHCONTRAST)) {
+ UpdateInvertedColorScheme();
+ FOR_EACH_OBSERVER(SysColorChangeListener, listeners_, OnSysColorChange());
+ }
+}
+#endif
+
+ScopedSysColorChangeListener::ScopedSysColorChangeListener(
+ SysColorChangeListener* listener)
+ : listener_(listener) {
+#if defined(OS_WIN)
+ SysColorChangeObserver::GetInstance()->AddListener(listener_);
+#endif
+}
+
+ScopedSysColorChangeListener::~ScopedSysColorChangeListener() {
+#if defined(OS_WIN)
+ SysColorChangeObserver::GetInstance()->RemoveListener(listener_);
+#endif
+}
+
+} // namespace gfx
diff --git a/ui/gfx/sys_color_change_listener.h b/ui/gfx/sys_color_change_listener.h
new file mode 100644
index 0000000..6cb126c
--- /dev/null
+++ b/ui/gfx/sys_color_change_listener.h
@@ -0,0 +1,45 @@
+// 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.
+
+#ifndef UI_GFX_SYS_COLOR_CHANGE_LISTENER_H_
+#define UI_GFX_SYS_COLOR_SCHEME_LISTENER_H_
+#pragma once
+
+#include "base/basictypes.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/ui_export.h"
+
+namespace gfx {
+
+// Returns true only if Chrome should use an inverted color scheme - which is
+// only true if the system has high-contrast mode enabled and and is using a
+// light-on-dark color scheme. To be notified when this status changes, use
+// ScopedSysColorChangeListener, below.
+UI_EXPORT bool IsInvertedColorScheme();
+
+// Interface for classes that want to listen to system color changes.
+class SysColorChangeListener {
+ public:
+ virtual void OnSysColorChange() = 0;
+
+ protected:
+ virtual ~SysColorChangeListener() {}
+};
+
+// Create an instance of this class in any object that wants to listen
+// for system color changes.
+class UI_EXPORT ScopedSysColorChangeListener {
+ public:
+ explicit ScopedSysColorChangeListener(SysColorChangeListener* listener);
+ ~ScopedSysColorChangeListener();
+
+ private:
+ SysColorChangeListener* listener_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedSysColorChangeListener);
+};
+
+} // namespace gfx;
+
+#endif // UI_GFX_SYS_COLOR_CHANGE_LISTENER_