layout.cc revision 3551c9c881056c480085172ff9840cab31610854
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/touch/touch_device.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/win/dpi.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Windows.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScaleFactorComparator(const ScaleFactor& lhs, const ScaleFactor& rhs){ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetScaleFactorScale(lhs) < GetScaleFactorScale(rhs); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function that determines whether we want to optimize the UI for touch. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UseTouchOptimizedUI() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If --touch-optimized-ui is specified and not set to "auto", then override 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the hardware-determined setting (eg. for testing purposes). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool has_touch_optimized_ui = CommandLine::ForCurrentProcess()-> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasSwitch(switches::kTouchOptimizedUI); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_touch_optimized_ui) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string switch_value = CommandLine::ForCurrentProcess()-> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwitchValueASCII(switches::kTouchOptimizedUI); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that simply specifying the switch is the same as enabled. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value.empty() || 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch_value == switches::kTouchOptimizedUIEnabled) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value == switches::kTouchOptimizedUIDisabled) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value != switches::kTouchOptimizedUIAuto) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid --touch-optimized-ui option: " << switch_value; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the touch layout only when we are running in Metro mode. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::win::IsMetroProcess() && ui::IsTouchDevicePresent(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const float kScaleFactorScales[] = {1.0f, 1.0f, 1.25f, 1.33f, 1.4f, 1.5f, 1.8f, 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2.0f}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(NUM_SCALE_FACTORS == arraysize(kScaleFactorScales), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScaleFactorScales_incorrect_size); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kScaleFactorScalesLength = arraysize(kScaleFactorScales); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the scale factor closest to |scale| from the full list of factors. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note that it does NOT rely on the list of supported scale factors. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Finding the closest match is inefficient and shouldn't be done frequently. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScaleFactor FindClosestScaleFactorUnsafe(float scale) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float smallest_diff = std::numeric_limits<float>::max(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScaleFactor closest_match = SCALE_FACTOR_100P; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = SCALE_FACTOR_100P; i < NUM_SCALE_FACTORS; ++i) { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ScaleFactor scale_factor = static_cast<ScaleFactor>(i); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float diff = std::abs(kScaleFactorScales[scale_factor] - scale); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (diff < smallest_diff) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) closest_match = scale_factor; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) smallest_diff = diff; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return closest_match; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<ScaleFactor>& GetSupportedScaleFactorsInternal() { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::vector<ScaleFactor>* supported_scale_factors = 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new std::vector<ScaleFactor>(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (supported_scale_factors->empty()) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_IOS) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On platforms other than iOS, 100P is always a supported scale factor. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_100P); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display display = 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float display_density = display.device_scale_factor(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ScaleFactor closest = FindClosestScaleFactorUnsafe(display_density); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (closest != SCALE_FACTOR_100P) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) supported_scale_factors->push_back(closest); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_IOS) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (display.device_scale_factor() > 1.0) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(2.0, display.device_scale_factor()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_200P); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_100P); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::mac::IsOSLionOrLater()) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_200P); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Have high-DPI resources for 140% and 180% scaling on Windows based on 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // default scaling for Metro mode. Round to nearest supported scale in 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all cases. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ui::IsInHighDPIMode()) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_140P); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_180P); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(oshima): Include 200P only if the device support 200P 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->push_back(SCALE_FACTOR_200P); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(supported_scale_factors->begin(), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors->end(), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScaleFactorComparator); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *supported_scale_factors; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DisplayLayout GetDisplayLayout() { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UseTouchOptimizedUI()) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LAYOUT_TOUCH; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LAYOUT_DESKTOP; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScaleFactor GetScaleFactorFromScale(float scale) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScaleFactor closest_match = SCALE_FACTOR_100P; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float smallest_diff = std::numeric_limits<float>::max(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ScaleFactor>& supported = 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSupportedScaleFactorsInternal(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < supported.size(); ++i) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScaleFactor scale_factor = supported[i]; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float diff = std::abs(kScaleFactorScales[scale_factor] - scale); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (diff < smallest_diff) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closest_match = scale_factor; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smallest_diff = diff; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(closest_match, SCALE_FACTOR_NONE); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closest_match; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetScaleFactorScale(ScaleFactor scale_factor) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kScaleFactorScales[scale_factor]; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScaleFactor GetMaxScaleFactor() { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ResourceBundle::GetSharedInstance().max_scale_factor(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSupportedScaleFactorsInternal().back(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<ScaleFactor> GetSupportedScaleFactors() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSupportedScaleFactorsInternal(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsScaleFactorSupported(ScaleFactor scale_factor) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ScaleFactor>& supported = 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSupportedScaleFactorsInternal(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find(supported.begin(), supported.end(), scale_factor) != 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported.end(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSupportedScaleFactors( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& scale_factors) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::ScaleFactor>& supported_scale_factors = 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSupportedScaleFactorsInternal(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors = scale_factors; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(supported_scale_factors.begin(), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_scale_factors.end(), 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScaleFactorComparator); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedSetSupportedScaleFactors::ScopedSetSupportedScaleFactors( 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<ui::ScaleFactor>& new_scale_factors) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : original_scale_factors_(GetSupportedScaleFactors()) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSupportedScaleFactors(new_scale_factors); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSupportedScaleFactors(original_scale_factors_); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScaleFactor GetScaleFactorForNativeView(gfx::NativeView view) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen* screen = gfx::Screen::GetScreenFor(view); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screen->IsDIPEnabled()) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display display = screen->GetDisplayNearestWindow(view); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetScaleFactorFromScale(display.device_scale_factor()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::SCALE_FACTOR_100P; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_MACOSX) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 228