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