Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Unified Diff: ui/base/layout.cc

Issue 23011044: Added 125% DPI option to ui::ScaleFactors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/layout.h ('k') | ui/base/layout_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/layout.cc
diff --git a/ui/base/layout.cc b/ui/base/layout.cc
index 024948cd5eee928b5ab45f8d7efd17fef7b82f48..d38430161c8a45e3b4b3ea89cbff868656fab6db 100644
--- a/ui/base/layout.cc
+++ b/ui/base/layout.cc
@@ -1,226 +1,227 @@
-// 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/base/layout.h"
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "ui/base/touch/touch_device.h"
-#include "ui/base/ui_base_switches.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/screen.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mac_util.h"
-#endif
-
-#if defined(OS_WIN)
-#include "base/win/metro.h"
-#include "ui/base/win/dpi.h"
-#include <Windows.h>
-#endif // defined(OS_WIN)
-
-#if defined(OS_CHROMEOS)
-#include "ui/base/resource/resource_bundle.h"
-#endif
-
-namespace ui {
-
-namespace {
-
-bool ScaleFactorComparator(const ScaleFactor& lhs, const ScaleFactor& rhs){
- return GetScaleFactorScale(lhs) < GetScaleFactorScale(rhs);
-}
-
-#if defined(OS_WIN)
-// Helper function that determines whether we want to optimize the UI for touch.
-bool UseTouchOptimizedUI() {
- // If --touch-optimized-ui is specified and not set to "auto", then override
- // the hardware-determined setting (eg. for testing purposes).
- static bool has_touch_optimized_ui = CommandLine::ForCurrentProcess()->
- HasSwitch(switches::kTouchOptimizedUI);
- if (has_touch_optimized_ui) {
- const std::string switch_value = CommandLine::ForCurrentProcess()->
- GetSwitchValueASCII(switches::kTouchOptimizedUI);
-
- // Note that simply specifying the switch is the same as enabled.
- if (switch_value.empty() ||
- switch_value == switches::kTouchOptimizedUIEnabled) {
- return true;
- } else if (switch_value == switches::kTouchOptimizedUIDisabled) {
- return false;
- } else if (switch_value != switches::kTouchOptimizedUIAuto) {
- LOG(ERROR) << "Invalid --touch-optimized-ui option: " << switch_value;
- }
- }
-
- // We use the touch layout only when we are running in Metro mode.
- return base::win::IsMetroProcess() && ui::IsTouchDevicePresent();
-}
-#endif // defined(OS_WIN)
-
-const float kScaleFactorScales[] = {1.0f, 1.0f, 1.33f, 1.4f, 1.5f, 1.8f, 2.0f};
-COMPILE_ASSERT(NUM_SCALE_FACTORS == arraysize(kScaleFactorScales),
- kScaleFactorScales_incorrect_size);
-const size_t kScaleFactorScalesLength = arraysize(kScaleFactorScales);
-
-namespace {
-
-// Returns the scale factor closest to |scale| from the full list of factors.
-// Note that it does NOT rely on the list of supported scale factors.
-// Finding the closest match is inefficient and shouldn't be done frequently.
-ScaleFactor FindClosestScaleFactorUnsafe(float scale) {
- float smallest_diff = std::numeric_limits<float>::max();
- ScaleFactor closest_match = SCALE_FACTOR_100P;
- for (int i = SCALE_FACTOR_100P; i < NUM_SCALE_FACTORS; ++i) {
- const ScaleFactor scale_factor = static_cast<ScaleFactor>(i);
- float diff = std::abs(kScaleFactorScales[scale_factor] - scale);
- if (diff < smallest_diff) {
- closest_match = scale_factor;
- smallest_diff = diff;
- }
- }
- return closest_match;
-}
-
-} // namespace
-
-std::vector<ScaleFactor>& GetSupportedScaleFactorsInternal() {
- static std::vector<ScaleFactor>* supported_scale_factors =
- new std::vector<ScaleFactor>();
- if (supported_scale_factors->empty()) {
-#if !defined(OS_IOS)
- // On platforms other than iOS, 100P is always a supported scale factor.
- supported_scale_factors->push_back(SCALE_FACTOR_100P);
-#endif
-
-#if defined(OS_ANDROID)
- const gfx::Display display =
- gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
- const float display_density = display.device_scale_factor();
- const ScaleFactor closest = FindClosestScaleFactorUnsafe(display_density);
- if (closest != SCALE_FACTOR_100P)
- supported_scale_factors->push_back(closest);
-#elif defined(OS_IOS)
- gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
- if (display.device_scale_factor() > 1.0) {
- DCHECK_EQ(2.0, display.device_scale_factor());
- supported_scale_factors->push_back(SCALE_FACTOR_200P);
- } else {
- supported_scale_factors->push_back(SCALE_FACTOR_100P);
- }
-#elif defined(OS_MACOSX)
- if (base::mac::IsOSLionOrLater())
- supported_scale_factors->push_back(SCALE_FACTOR_200P);
-#elif defined(OS_WIN)
- // Have high-DPI resources for 140% and 180% scaling on Windows based on
- // default scaling for Metro mode. Round to nearest supported scale in
- // all cases.
- if (ui::IsInHighDPIMode()) {
- supported_scale_factors->push_back(SCALE_FACTOR_140P);
- supported_scale_factors->push_back(SCALE_FACTOR_180P);
- }
-#elif defined(OS_CHROMEOS)
- // TODO(oshima): Include 200P only if the device support 200P
- supported_scale_factors->push_back(SCALE_FACTOR_200P);
-#endif
- std::sort(supported_scale_factors->begin(),
- supported_scale_factors->end(),
- ScaleFactorComparator);
- }
- return *supported_scale_factors;
-}
-
-} // namespace
-
-DisplayLayout GetDisplayLayout() {
-#if defined(OS_WIN)
- if (UseTouchOptimizedUI())
- return LAYOUT_TOUCH;
-#endif
- return LAYOUT_DESKTOP;
-}
-
-ScaleFactor GetScaleFactorFromScale(float scale) {
- ScaleFactor closest_match = SCALE_FACTOR_100P;
- float smallest_diff = std::numeric_limits<float>::max();
- const std::vector<ScaleFactor>& supported =
- GetSupportedScaleFactorsInternal();
- for (size_t i = 0; i < supported.size(); ++i) {
- ScaleFactor scale_factor = supported[i];
- float diff = std::abs(kScaleFactorScales[scale_factor] - scale);
- if (diff < smallest_diff) {
- closest_match = scale_factor;
- smallest_diff = diff;
- }
- }
- DCHECK_NE(closest_match, SCALE_FACTOR_NONE);
- return closest_match;
-}
-
-float GetScaleFactorScale(ScaleFactor scale_factor) {
- return kScaleFactorScales[scale_factor];
-}
-
-ScaleFactor GetMaxScaleFactor() {
-#if defined(OS_CHROMEOS)
- return ResourceBundle::GetSharedInstance().max_scale_factor();
-#else
- return GetSupportedScaleFactorsInternal().back();
-#endif
-}
-
-std::vector<ScaleFactor> GetSupportedScaleFactors() {
- return GetSupportedScaleFactorsInternal();
-}
-
-bool IsScaleFactorSupported(ScaleFactor scale_factor) {
- const std::vector<ScaleFactor>& supported =
- GetSupportedScaleFactorsInternal();
- return std::find(supported.begin(), supported.end(), scale_factor) !=
- supported.end();
-}
-
-namespace test {
-
-void SetSupportedScaleFactors(
- const std::vector<ui::ScaleFactor>& scale_factors) {
- std::vector<ui::ScaleFactor>& supported_scale_factors =
- GetSupportedScaleFactorsInternal();
- supported_scale_factors = scale_factors;
- std::sort(supported_scale_factors.begin(),
- supported_scale_factors.end(),
- ScaleFactorComparator);
-}
-
-ScopedSetSupportedScaleFactors::ScopedSetSupportedScaleFactors(
- const std::vector<ui::ScaleFactor>& new_scale_factors)
- : original_scale_factors_(GetSupportedScaleFactors()) {
- SetSupportedScaleFactors(new_scale_factors);
-}
-
-ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() {
- SetSupportedScaleFactors(original_scale_factors_);
-}
-
-} // namespace test
-
-#if !defined(OS_MACOSX)
-ScaleFactor GetScaleFactorForNativeView(gfx::NativeView view) {
- gfx::Screen* screen = gfx::Screen::GetScreenFor(view);
- if (screen->IsDIPEnabled()) {
- gfx::Display display = screen->GetDisplayNearestWindow(view);
- return GetScaleFactorFromScale(display.device_scale_factor());
- }
- return ui::SCALE_FACTOR_100P;
-}
-#endif // !defined(OS_MACOSX)
-
-} // namespace ui
+// 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/base/layout.h"
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+#include "base/basictypes.h"
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "build/build_config.h"
+#include "ui/base/touch/touch_device.h"
+#include "ui/base/ui_base_switches.h"
+#include "ui/gfx/display.h"
+#include "ui/gfx/screen.h"
+
+#if defined(OS_MACOSX) && !defined(OS_IOS)
+#include "base/mac/mac_util.h"
+#endif
+
+#if defined(OS_WIN)
+#include "base/win/metro.h"
+#include "ui/base/win/dpi.h"
+#include <Windows.h>
+#endif // defined(OS_WIN)
+
+#if defined(OS_CHROMEOS)
+#include "ui/base/resource/resource_bundle.h"
+#endif
+
+namespace ui {
+
+namespace {
+
+bool ScaleFactorComparator(const ScaleFactor& lhs, const ScaleFactor& rhs){
+ return GetScaleFactorScale(lhs) < GetScaleFactorScale(rhs);
+}
+
+#if defined(OS_WIN)
+// Helper function that determines whether we want to optimize the UI for touch.
+bool UseTouchOptimizedUI() {
+ // If --touch-optimized-ui is specified and not set to "auto", then override
+ // the hardware-determined setting (eg. for testing purposes).
+ static bool has_touch_optimized_ui = CommandLine::ForCurrentProcess()->
+ HasSwitch(switches::kTouchOptimizedUI);
+ if (has_touch_optimized_ui) {
+ const std::string switch_value = CommandLine::ForCurrentProcess()->
+ GetSwitchValueASCII(switches::kTouchOptimizedUI);
+
+ // Note that simply specifying the switch is the same as enabled.
+ if (switch_value.empty() ||
+ switch_value == switches::kTouchOptimizedUIEnabled) {
+ return true;
+ } else if (switch_value == switches::kTouchOptimizedUIDisabled) {
+ return false;
+ } else if (switch_value != switches::kTouchOptimizedUIAuto) {
+ LOG(ERROR) << "Invalid --touch-optimized-ui option: " << switch_value;
+ }
+ }
+
+ // We use the touch layout only when we are running in Metro mode.
+ return base::win::IsMetroProcess() && ui::IsTouchDevicePresent();
+}
+#endif // defined(OS_WIN)
+
+const float kScaleFactorScales[] = {1.0f, 1.0f, 1.25f, 1.33f, 1.4f, 1.5f, 1.8f,
+ 2.0f};
+COMPILE_ASSERT(NUM_SCALE_FACTORS == arraysize(kScaleFactorScales),
+ kScaleFactorScales_incorrect_size);
+const size_t kScaleFactorScalesLength = arraysize(kScaleFactorScales);
+
+namespace {
+
+// Returns the scale factor closest to |scale| from the full list of factors.
+// Note that it does NOT rely on the list of supported scale factors.
+// Finding the closest match is inefficient and shouldn't be done frequently.
+ScaleFactor FindClosestScaleFactorUnsafe(float scale) {
+ float smallest_diff = std::numeric_limits<float>::max();
+ ScaleFactor closest_match = SCALE_FACTOR_100P;
+ for (int i = SCALE_FACTOR_100P; i < NUM_SCALE_FACTORS; ++i) {
+ const ScaleFactor scale_factor = static_cast<ScaleFactor>(i);
+ float diff = std::abs(kScaleFactorScales[scale_factor] - scale);
+ if (diff < smallest_diff) {
+ closest_match = scale_factor;
+ smallest_diff = diff;
+ }
+ }
+ return closest_match;
+}
+
+} // namespace
+
+std::vector<ScaleFactor>& GetSupportedScaleFactorsInternal() {
+ static std::vector<ScaleFactor>* supported_scale_factors =
+ new std::vector<ScaleFactor>();
+ if (supported_scale_factors->empty()) {
+#if !defined(OS_IOS)
+ // On platforms other than iOS, 100P is always a supported scale factor.
+ supported_scale_factors->push_back(SCALE_FACTOR_100P);
+#endif
+
+#if defined(OS_ANDROID)
+ const gfx::Display display =
+ gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
+ const float display_density = display.device_scale_factor();
+ const ScaleFactor closest = FindClosestScaleFactorUnsafe(display_density);
+ if (closest != SCALE_FACTOR_100P)
+ supported_scale_factors->push_back(closest);
+#elif defined(OS_IOS)
+ gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
+ if (display.device_scale_factor() > 1.0) {
+ DCHECK_EQ(2.0, display.device_scale_factor());
+ supported_scale_factors->push_back(SCALE_FACTOR_200P);
+ } else {
+ supported_scale_factors->push_back(SCALE_FACTOR_100P);
+ }
+#elif defined(OS_MACOSX)
+ if (base::mac::IsOSLionOrLater())
+ supported_scale_factors->push_back(SCALE_FACTOR_200P);
+#elif defined(OS_WIN)
+ // Have high-DPI resources for 140% and 180% scaling on Windows based on
+ // default scaling for Metro mode. Round to nearest supported scale in
+ // all cases.
+ if (ui::IsInHighDPIMode()) {
+ supported_scale_factors->push_back(SCALE_FACTOR_140P);
+ supported_scale_factors->push_back(SCALE_FACTOR_180P);
+ }
+#elif defined(OS_CHROMEOS)
+ // TODO(oshima): Include 200P only if the device support 200P
+ supported_scale_factors->push_back(SCALE_FACTOR_200P);
+#endif
+ std::sort(supported_scale_factors->begin(),
+ supported_scale_factors->end(),
+ ScaleFactorComparator);
+ }
+ return *supported_scale_factors;
+}
+
+} // namespace
+
+DisplayLayout GetDisplayLayout() {
+#if defined(OS_WIN)
+ if (UseTouchOptimizedUI())
+ return LAYOUT_TOUCH;
+#endif
+ return LAYOUT_DESKTOP;
+}
+
+ScaleFactor GetScaleFactorFromScale(float scale) {
+ ScaleFactor closest_match = SCALE_FACTOR_100P;
+ float smallest_diff = std::numeric_limits<float>::max();
+ const std::vector<ScaleFactor>& supported =
+ GetSupportedScaleFactorsInternal();
+ for (size_t i = 0; i < supported.size(); ++i) {
+ ScaleFactor scale_factor = supported[i];
+ float diff = std::abs(kScaleFactorScales[scale_factor] - scale);
+ if (diff < smallest_diff) {
+ closest_match = scale_factor;
+ smallest_diff = diff;
+ }
+ }
+ DCHECK_NE(closest_match, SCALE_FACTOR_NONE);
+ return closest_match;
+}
+
+float GetScaleFactorScale(ScaleFactor scale_factor) {
+ return kScaleFactorScales[scale_factor];
+}
+
+ScaleFactor GetMaxScaleFactor() {
+#if defined(OS_CHROMEOS)
+ return ResourceBundle::GetSharedInstance().max_scale_factor();
+#else
+ return GetSupportedScaleFactorsInternal().back();
+#endif
+}
+
+std::vector<ScaleFactor> GetSupportedScaleFactors() {
+ return GetSupportedScaleFactorsInternal();
+}
+
+bool IsScaleFactorSupported(ScaleFactor scale_factor) {
+ const std::vector<ScaleFactor>& supported =
+ GetSupportedScaleFactorsInternal();
+ return std::find(supported.begin(), supported.end(), scale_factor) !=
+ supported.end();
+}
+
+namespace test {
+
+void SetSupportedScaleFactors(
+ const std::vector<ui::ScaleFactor>& scale_factors) {
+ std::vector<ui::ScaleFactor>& supported_scale_factors =
+ GetSupportedScaleFactorsInternal();
+ supported_scale_factors = scale_factors;
+ std::sort(supported_scale_factors.begin(),
+ supported_scale_factors.end(),
+ ScaleFactorComparator);
+}
+
+ScopedSetSupportedScaleFactors::ScopedSetSupportedScaleFactors(
+ const std::vector<ui::ScaleFactor>& new_scale_factors)
+ : original_scale_factors_(GetSupportedScaleFactors()) {
+ SetSupportedScaleFactors(new_scale_factors);
+}
+
+ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() {
+ SetSupportedScaleFactors(original_scale_factors_);
+}
+
+} // namespace test
+
+#if !defined(OS_MACOSX)
+ScaleFactor GetScaleFactorForNativeView(gfx::NativeView view) {
+ gfx::Screen* screen = gfx::Screen::GetScreenFor(view);
+ if (screen->IsDIPEnabled()) {
+ gfx::Display display = screen->GetDisplayNearestWindow(view);
+ return GetScaleFactorFromScale(display.device_scale_factor());
+ }
+ return ui::SCALE_FACTOR_100P;
+}
+#endif // !defined(OS_MACOSX)
+
+} // namespace ui
« no previous file with comments | « ui/base/layout.h ('k') | ui/base/layout_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698