X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fui%2Fgfx%2Fwin%2Fdpi.cc;h=6ea9ba829688f2c9d03cdc1a24bd9fa581f1139d;hb=1afa4dd80ef85af7c90efaea6959db1d92330844;hp=88766ce2d4f6da8b12cf5a6e9c2298230dda9fd0;hpb=90762837333c13ccf56f2ad88e4481fc71e8d281;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/ui/gfx/win/dpi.cc b/src/ui/gfx/win/dpi.cc index 88766ce..6ea9ba8 100644 --- a/src/ui/gfx/win/dpi.cc +++ b/src/ui/gfx/win/dpi.cc @@ -5,12 +5,8 @@ #include "ui/gfx/win/dpi.h" #include -#include "base/command_line.h" #include "base/win/scoped_hdc.h" -#include "base/win/windows_version.h" -#include "base/win/registry.h" #include "ui/gfx/display.h" -#include "ui/gfx/switches.h" #include "ui/gfx/point_conversions.h" #include "ui/gfx/rect_conversions.h" #include "ui/gfx/size_conversions.h" @@ -22,90 +18,17 @@ int kDefaultDPIY = 96; bool force_highdpi_for_testing = false; -BOOL IsProcessDPIAwareWrapper() { - typedef BOOL(WINAPI *IsProcessDPIAwarePtr)(VOID); - IsProcessDPIAwarePtr is_process_dpi_aware_func = - reinterpret_cast( - GetProcAddress(GetModuleHandleA("user32.dll"), "IsProcessDPIAware")); - if (is_process_dpi_aware_func) - return is_process_dpi_aware_func(); - return FALSE; -} - float g_device_scale_factor = 0.0f; float GetUnforcedDeviceScaleFactor() { // If the global device scale factor is initialized use it. This is to ensure - // we use the same scale factor across all callsites. We don't use the - // GetDeviceScaleFactor function here because it fires a DCHECK if the - // g_device_scale_factor global is 0. + // we use the same scale factor across all callsites. if (g_device_scale_factor) return g_device_scale_factor; return static_cast(gfx::GetDPI().width()) / static_cast(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( - 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( - GetProcAddress(GetModuleHandleA("user32.dll"), - "SetProcessDPIAware")); - return set_process_dpi_aware_func && - set_process_dpi_aware_func(); -} - -DWORD ReadRegistryValue(HKEY root, - const wchar_t* base_key, - const wchar_t* value_name, - DWORD default_value) { - base::win::RegKey reg_key(HKEY_CURRENT_USER, - base_key, - KEY_QUERY_VALUE); - DWORD value; - if (reg_key.Valid() && - reg_key.ReadValueDW(value_name, &value) == ERROR_SUCCESS) { - return value; - } - return default_value; -} - } // namespace namespace gfx { @@ -133,63 +56,25 @@ Size GetDPI() { } float GetDPIScale() { - if (IsHighDPIEnabled()) { - if (gfx::Display::HasForceDeviceScaleFactor()) - return gfx::Display::GetForcedDeviceScaleFactor(); - float dpi_scale = GetUnforcedDeviceScaleFactor(); - if (dpi_scale <= 1.25) { - // Force 125% and below to 100% scale. We do this to maintain previous - // (non-DPI-aware) behavior where only the font size was boosted. - dpi_scale = 1.0; - } - return dpi_scale; - } - 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(); + if (gfx::Display::HasForceDeviceScaleFactor()) + return gfx::Display::GetForcedDeviceScaleFactor(); + float dpi_scale = GetUnforcedDeviceScaleFactor(); + if (dpi_scale <= 1.25) { + // Force 125% and below to 100% scale. We do this to maintain previous + // (non-DPI-aware) behavior where only the font size was boosted. + dpi_scale = 1.0; } + return dpi_scale; } 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())); + return ToFlooredPoint(ScalePoint(pixel_point, 1.0f / GetDPIScale())); } Point DIPToScreenPoint(const Point& dip_point) { - return ToFlooredPoint(ScalePoint(dip_point, GetDeviceScaleFactor())); + return ToFlooredPoint(ScalePoint(dip_point, GetDPIScale())); } Rect ScreenToDIPRect(const Rect& pixel_bounds) { @@ -210,22 +95,16 @@ Rect DIPToScreenRect(const Rect& dip_bounds) { Size ScreenToDIPSize(const Size& size_in_pixels) { // Always ceil sizes. Otherwise we may be leaving off part of the bounds. - return ToCeiledSize( - ScaleSize(size_in_pixels, 1.0f / GetDeviceScaleFactor())); + return ToCeiledSize(ScaleSize(size_in_pixels, 1.0f / GetDPIScale())); } Size DIPToScreenSize(const Size& dip_size) { // Always ceil sizes. Otherwise we may be leaving off part of the bounds. - return ToCeiledSize(ScaleSize(dip_size, GetDeviceScaleFactor())); + return ToCeiledSize(ScaleSize(dip_size, GetDPIScale())); } int GetSystemMetricsInDIP(int metric) { - return static_cast(GetSystemMetrics(metric) / - GetDeviceScaleFactor() + 0.5); -} - -bool IsDeviceScaleFactorSet() { - return g_device_scale_factor != 0.0f; + return static_cast(GetSystemMetrics(metric) / GetDPIScale() + 0.5); } } // namespace win