| Index: ui/gfx/dpi.cc
|
| diff --git a/ui/gfx/win/dpi.cc b/ui/gfx/dpi.cc
|
| similarity index 88%
|
| rename from ui/gfx/win/dpi.cc
|
| rename to ui/gfx/dpi.cc
|
| index 2777f7cb01235bb838de9c8e7b42343a1f5f2499..38a740b4604c7cf18467560c592d11c0ddc414fc 100644
|
| --- a/ui/gfx/win/dpi.cc
|
| +++ b/ui/gfx/dpi.cc
|
| @@ -2,33 +2,28 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "ui/gfx/win/dpi.h"
|
| +#include "ui/gfx/dpi.h"
|
|
|
| -#include <windows.h>
|
| -#include "base/win/scoped_hdc.h"
|
| -#include "base/win/windows_version.h"
|
| -#include "base/win/registry.h"
|
| +#include "base/logging.h"
|
| #include "ui/gfx/display.h"
|
| #include "ui/gfx/point_conversions.h"
|
| #include "ui/gfx/rect_conversions.h"
|
| #include "ui/gfx/size_conversions.h"
|
|
|
| -namespace {
|
| +#if defined(OS_WIN)
|
| +#include <windows.h>
|
| +#include "base/win/registry.h"
|
| +#include "base/win/scoped_hdc.h"
|
| +#include "base/win/windows_version.h"
|
| +#endif
|
|
|
| -int kDefaultDPIX = 96;
|
| -int kDefaultDPIY = 96;
|
| +#if defined(OS_LINUX)
|
| +#include "ui/gfx/linux_font_delegate.h"
|
| +#endif
|
|
|
| -bool force_highdpi_for_testing = false;
|
| +namespace {
|
|
|
| -BOOL IsProcessDPIAwareWrapper() {
|
| - typedef BOOL(WINAPI *IsProcessDPIAwarePtr)(VOID);
|
| - IsProcessDPIAwarePtr is_process_dpi_aware_func =
|
| - reinterpret_cast<IsProcessDPIAwarePtr>(
|
| - GetProcAddress(GetModuleHandleA("user32.dll"), "IsProcessDPIAware"));
|
| - if (is_process_dpi_aware_func)
|
| - return is_process_dpi_aware_func();
|
| - return FALSE;
|
| -}
|
| +int kDefaultDPI = 96;
|
|
|
| float g_device_scale_factor = 0.0f;
|
|
|
| @@ -40,55 +35,10 @@ float GetUnforcedDeviceScaleFactor() {
|
| if (g_device_scale_factor)
|
| return g_device_scale_factor;
|
| return static_cast<float>(gfx::GetDPI().width()) /
|
| - static_cast<float>(kDefaultDPIX);
|
| -}
|
| -
|
| -// Duplicated from Win8.1 SDK ShellScalingApi.h
|
| -typedef enum PROCESS_DPI_AWARENESS {
|
| - PROCESS_DPI_UNAWARE = 0,
|
| - PROCESS_SYSTEM_DPI_AWARE = 1,
|
| - PROCESS_PER_MONITOR_DPI_AWARE = 2
|
| -} PROCESS_DPI_AWARENESS;
|
| -
|
| -typedef enum MONITOR_DPI_TYPE {
|
| - MDT_EFFECTIVE_DPI = 0,
|
| - MDT_ANGULAR_DPI = 1,
|
| - MDT_RAW_DPI = 2,
|
| - MDT_DEFAULT = MDT_EFFECTIVE_DPI
|
| -} MONITOR_DPI_TYPE;
|
| -
|
| -// Win8.1 supports monitor-specific DPI scaling.
|
| -bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
|
| - typedef BOOL(WINAPI *SetProcessDpiAwarenessPtr)(PROCESS_DPI_AWARENESS);
|
| - SetProcessDpiAwarenessPtr set_process_dpi_awareness_func =
|
| - reinterpret_cast<SetProcessDpiAwarenessPtr>(
|
| - GetProcAddress(GetModuleHandleA("user32.dll"),
|
| - "SetProcessDpiAwarenessInternal"));
|
| - if (set_process_dpi_awareness_func) {
|
| - HRESULT hr = set_process_dpi_awareness_func(value);
|
| - if (SUCCEEDED(hr)) {
|
| - VLOG(1) << "SetProcessDpiAwareness succeeded.";
|
| - return true;
|
| - } else if (hr == E_ACCESSDENIED) {
|
| - LOG(ERROR) << "Access denied error from SetProcessDpiAwareness. "
|
| - "Function called twice, or manifest was used.";
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// This function works for Windows Vista through Win8. Win8.1 must use
|
| -// SetProcessDpiAwareness[Wrapper]
|
| -BOOL SetProcessDPIAwareWrapper() {
|
| - typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
|
| - SetProcessDPIAwarePtr set_process_dpi_aware_func =
|
| - reinterpret_cast<SetProcessDPIAwarePtr>(
|
| - GetProcAddress(GetModuleHandleA("user32.dll"),
|
| - "SetProcessDPIAware"));
|
| - return set_process_dpi_aware_func &&
|
| - set_process_dpi_aware_func();
|
| + static_cast<float>(kDefaultDPI);
|
| }
|
|
|
| +#if defined(OS_WIN)
|
| DWORD ReadRegistryValue(HKEY root,
|
| const wchar_t* base_key,
|
| const wchar_t* value_name,
|
| @@ -103,9 +53,11 @@ DWORD ReadRegistryValue(HKEY root,
|
| }
|
| return default_value;
|
| }
|
| +#endif
|
|
|
| } // namespace
|
|
|
| +
|
| namespace gfx {
|
|
|
| void InitDeviceScaleFactor(float scale) {
|
| @@ -113,6 +65,23 @@ void InitDeviceScaleFactor(float scale) {
|
| g_device_scale_factor = scale;
|
| }
|
|
|
| +float GetDeviceScaleFactor() {
|
| + DCHECK_NE(0.0f, g_device_scale_factor);
|
| + return g_device_scale_factor;
|
| +}
|
| +
|
| +bool IsDeviceScaleFactorSet() {
|
| + return g_device_scale_factor != 0.0f;
|
| +}
|
| +
|
| +void ForceHighDPISupportForTesting(float scale) {
|
| + g_device_scale_factor = scale;
|
| +}
|
| +
|
| +bool IsInHighDPIMode() {
|
| + return GetDPIScale() > 1.0;
|
| +}
|
| +
|
| Size GetDPI() {
|
| static int dpi_x = 0;
|
| static int dpi_y = 0;
|
| @@ -120,12 +89,21 @@ Size GetDPI() {
|
|
|
| if (should_initialize) {
|
| should_initialize = false;
|
| +#if defined(OS_WIN)
|
| base::win::ScopedGetDC screen_dc(NULL);
|
| // This value is safe to cache for the life time of the app since the
|
| // user must logout to change the DPI setting. This value also applies
|
| // to all screens.
|
| dpi_x = GetDeviceCaps(screen_dc, LOGPIXELSX);
|
| dpi_y = GetDeviceCaps(screen_dc, LOGPIXELSY);
|
| +#else
|
| + const gfx::LinuxFontDelegate* delegate = gfx::LinuxFontDelegate::instance();
|
| + if (delegate)
|
| + dpi_x = delegate->GetFontDPI();
|
| + if (dpi_x <= 0)
|
| + dpi_x = 96;
|
| + dpi_y = dpi_x;
|
| +#endif
|
| }
|
| return Size(dpi_x, dpi_y);
|
| }
|
| @@ -145,42 +123,6 @@ float GetDPIScale() {
|
| return 1.0;
|
| }
|
|
|
| -void ForceHighDPISupportForTesting(float scale) {
|
| - g_device_scale_factor = scale;
|
| -}
|
| -
|
| -bool IsHighDPIEnabled() {
|
| - // Flag stored in HKEY_CURRENT_USER\SOFTWARE\\Google\\Chrome\\Profile,
|
| - // under the DWORD value high-dpi-support.
|
| - // Default is disabled.
|
| - static DWORD value = ReadRegistryValue(
|
| - HKEY_CURRENT_USER, gfx::win::kRegistryProfilePath,
|
| - gfx::win::kHighDPISupportW, TRUE);
|
| - return value != 0;
|
| -}
|
| -
|
| -bool IsInHighDPIMode() {
|
| - return GetDPIScale() > 1.0;
|
| -}
|
| -
|
| -void EnableHighDPISupport() {
|
| - if (IsHighDPIEnabled() &&
|
| - !SetProcessDpiAwarenessWrapper(PROCESS_SYSTEM_DPI_AWARE)) {
|
| - SetProcessDPIAwareWrapper();
|
| - }
|
| -}
|
| -
|
| -namespace win {
|
| -
|
| -GFX_EXPORT const wchar_t kRegistryProfilePath[] =
|
| - L"Software\\Google\\Chrome\\Profile";
|
| -GFX_EXPORT const wchar_t kHighDPISupportW[] = L"high-dpi-support";
|
| -
|
| -float GetDeviceScaleFactor() {
|
| - DCHECK_NE(0.0f, g_device_scale_factor);
|
| - return g_device_scale_factor;
|
| -}
|
| -
|
| Point ScreenToDIPPoint(const Point& pixel_point) {
|
| return ToFlooredPoint(ScalePoint(pixel_point,
|
| 1.0f / GetDeviceScaleFactor()));
|
| @@ -217,14 +159,92 @@ Size DIPToScreenSize(const Size& dip_size) {
|
| return ToCeiledSize(ScaleSize(dip_size, GetDeviceScaleFactor()));
|
| }
|
|
|
| +bool IsHighDPIEnabled() {
|
| +#if defined(OS_WIN)
|
| + static const wchar_t kRegistryProfilePath[] =
|
| + L"Software\\Google\\Chrome\\Profile";
|
| + static const wchar_t kHighDPISupportW[] = L"high-dpi-support";
|
| +
|
| + // Flag stored in HKEY_CURRENT_USER\SOFTWARE\\Google\\Chrome\\Profile,
|
| + // under the DWORD value high-dpi-support.
|
| + // Default is disabled.
|
| + static DWORD value = ReadRegistryValue(
|
| + HKEY_CURRENT_USER, kRegistryProfilePath, kHighDPISupportW, TRUE);
|
| + return value != 0;
|
| +#elif defined(OS_LINUX)
|
| + return true;
|
| +#endif
|
| +}
|
| +
|
| +
|
| +#if defined(OS_WIN)
|
| +
|
| +namespace win {
|
| +
|
| +namespace {
|
| +
|
| +// Duplicated from Win8.1 SDK ShellScalingApi.h
|
| +typedef enum PROCESS_DPI_AWARENESS {
|
| + PROCESS_DPI_UNAWARE = 0,
|
| + PROCESS_SYSTEM_DPI_AWARE = 1,
|
| + PROCESS_PER_MONITOR_DPI_AWARE = 2
|
| +} PROCESS_DPI_AWARENESS;
|
| +
|
| +typedef enum MONITOR_DPI_TYPE {
|
| + MDT_EFFECTIVE_DPI = 0,
|
| + MDT_ANGULAR_DPI = 1,
|
| + MDT_RAW_DPI = 2,
|
| + MDT_DEFAULT = MDT_EFFECTIVE_DPI
|
| +} MONITOR_DPI_TYPE;
|
| +
|
| +// Win8.1 supports monitor-specific DPI scaling.
|
| +bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
|
| + typedef BOOL(WINAPI *SetProcessDpiAwarenessPtr)(PROCESS_DPI_AWARENESS);
|
| + SetProcessDpiAwarenessPtr set_process_dpi_awareness_func =
|
| + reinterpret_cast<SetProcessDpiAwarenessPtr>(
|
| + GetProcAddress(GetModuleHandleA("user32.dll"),
|
| + "SetProcessDpiAwarenessInternal"));
|
| + if (set_process_dpi_awareness_func) {
|
| + HRESULT hr = set_process_dpi_awareness_func(value);
|
| + if (SUCCEEDED(hr)) {
|
| + VLOG(1) << "SetProcessDpiAwareness succeeded.";
|
| + return true;
|
| + } else if (hr == E_ACCESSDENIED) {
|
| + LOG(ERROR) << "Access denied error from SetProcessDpiAwareness. "
|
| + "Function called twice, or manifest was used.";
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// This function works for Windows Vista through Win8. Win8.1 must use
|
| +// SetProcessDpiAwareness[Wrapper]
|
| +BOOL SetProcessDPIAwareWrapper() {
|
| + typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
|
| + SetProcessDPIAwarePtr set_process_dpi_aware_func =
|
| + reinterpret_cast<SetProcessDPIAwarePtr>(
|
| + GetProcAddress(GetModuleHandleA("user32.dll"),
|
| + "SetProcessDPIAware"));
|
| + return set_process_dpi_aware_func &&
|
| + set_process_dpi_aware_func();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void EnableHighDPISupport() {
|
| + if (IsHighDPIEnabled() &&
|
| + !SetProcessDpiAwarenessWrapper(PROCESS_SYSTEM_DPI_AWARE)) {
|
| + SetProcessDPIAwareWrapper();
|
| + }
|
| +}
|
| +
|
| int GetSystemMetricsInDIP(int metric) {
|
| return static_cast<int>(GetSystemMetrics(metric) /
|
| GetDeviceScaleFactor() + 0.5);
|
| }
|
|
|
| -bool IsDeviceScaleFactorSet() {
|
| - return g_device_scale_factor != 0.0f;
|
| -}
|
| -
|
| } // namespace win
|
| +
|
| +#endif // OS_WIN
|
| +
|
| } // namespace gfx
|
|
|