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 |
oshima
2014/10/20 21:11:59
consider moving win impl to dip_win.cc ?
scottmg
2014/10/22 18:54:14
Done.
|
+ |
} // namespace gfx |