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

Unified Diff: trunk/src/ui/base/layout.cc

Issue 24262008: Revert 224473 "Remove dependency on ui::ScaleFactor from ui/gfx" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 3 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 | « trunk/src/ui/base/layout.h ('k') | trunk/src/ui/base/layout_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: trunk/src/ui/base/layout.cc
===================================================================
--- trunk/src/ui/base/layout.cc (revision 224498)
+++ trunk/src/ui/base/layout.cc (working copy)
@@ -15,24 +15,30 @@
#include "ui/base/touch/touch_device.h"
#include "ui/base/ui_base_switches.h"
#include "ui/gfx/display.h"
-#include "ui/gfx/image/image_skia.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/gfx/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 GetImageScale(lhs) < GetImageScale(rhs);
+ return GetScaleFactorScale(lhs) < GetScaleFactorScale(rhs);
}
-std::vector<ScaleFactor>* g_supported_scale_factors = NULL;
-
#if defined(OS_WIN)
// Helper function that determines whether we want to optimize the UI for touch.
bool UseTouchOptimizedUI() {
@@ -66,8 +72,75 @@
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 (gfx::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())
@@ -76,37 +149,13 @@
return LAYOUT_DESKTOP;
}
-void SetSupportedScaleFactors(
- const std::vector<ui::ScaleFactor>& scale_factors) {
- if (g_supported_scale_factors != NULL)
- delete g_supported_scale_factors;
-
- g_supported_scale_factors = new std::vector<ScaleFactor>(scale_factors);
- std::sort(g_supported_scale_factors->begin(),
- g_supported_scale_factors->end(),
- ScaleFactorComparator);
-
- // Set ImageSkia's supported scales.
- std::vector<float> scales;
- for (std::vector<ScaleFactor>::const_iterator it =
- g_supported_scale_factors->begin();
- it != g_supported_scale_factors->end(); ++it) {
- scales.push_back(GetImageScale(*it));
- }
- gfx::ImageSkia::SetSupportedScales(scales);
-}
-
-const std::vector<ScaleFactor>& GetSupportedScaleFactors() {
- DCHECK(g_supported_scale_factors != NULL);
- return *g_supported_scale_factors;
-}
-
-ScaleFactor GetSupportedScaleFactor(float scale) {
- DCHECK(g_supported_scale_factors != NULL);
+ScaleFactor GetScaleFactorFromScale(float scale) {
ScaleFactor closest_match = SCALE_FACTOR_100P;
float smallest_diff = std::numeric_limits<float>::max();
- for (size_t i = 0; i < g_supported_scale_factors->size(); ++i) {
- ScaleFactor scale_factor = (*g_supported_scale_factors)[i];
+ 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;
@@ -117,55 +166,49 @@
return closest_match;
}
-float GetImageScale(ScaleFactor scale_factor) {
+float GetScaleFactorScale(ScaleFactor scale_factor) {
return kScaleFactorScales[scale_factor];
}
-bool IsScaleFactorSupported(ScaleFactor scale_factor) {
- DCHECK(g_supported_scale_factors != NULL);
- return std::find(g_supported_scale_factors->begin(),
- g_supported_scale_factors->end(),
- scale_factor) != g_supported_scale_factors->end();
+ScaleFactor GetMaxScaleFactor() {
+#if defined(OS_CHROMEOS)
+ return ResourceBundle::GetSharedInstance().max_scale_factor();
+#else
+ return GetSupportedScaleFactorsInternal().back();
+#endif
}
-// 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;
+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) {
- if (g_supported_scale_factors) {
- original_scale_factors_ =
- new std::vector<ScaleFactor>(*g_supported_scale_factors);
- } else {
- original_scale_factors_ = NULL;
- }
+ const std::vector<ui::ScaleFactor>& new_scale_factors)
+ : original_scale_factors_(GetSupportedScaleFactors()) {
SetSupportedScaleFactors(new_scale_factors);
}
ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() {
- if (original_scale_factors_) {
- SetSupportedScaleFactors(*original_scale_factors_);
- delete original_scale_factors_;
- } else {
- delete g_supported_scale_factors;
- g_supported_scale_factors = NULL;
- }
+ SetSupportedScaleFactors(original_scale_factors_);
}
} // namespace test
@@ -175,7 +218,7 @@
gfx::Screen* screen = gfx::Screen::GetScreenFor(view);
if (screen->IsDIPEnabled()) {
gfx::Display display = screen->GetDisplayNearestWindow(view);
- return GetSupportedScaleFactor(display.device_scale_factor());
+ return GetScaleFactorFromScale(display.device_scale_factor());
}
return ui::SCALE_FACTOR_100P;
}
« no previous file with comments | « trunk/src/ui/base/layout.h ('k') | trunk/src/ui/base/layout_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698