// Copyright 2014 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 "ash/display/display_util.h" #include #include "ash/display/display_info.h" #if defined(OS_CHROMEOS) #include "base/sys_info.h" #endif namespace ash { namespace { // List of value UI Scale values. Scales for 2x are equivalent to 640, // 800, 1024, 1280, 1440, 1600 and 1920 pixel width respectively on // 2560 pixel width 2x density display. Please see crbug.com/233375 // for the full list of resolutions. const float kUIScalesFor2x[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.125f, 1.25f, 1.5f, 2.0f}; const float kUIScalesFor1_25x[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.25f }; const float kUIScalesFor1280[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.125f }; const float kUIScalesFor1366[] = {0.5f, 0.6f, 0.75f, 1.0f, 1.125f }; std::vector GetScalesForDisplay(const DisplayMode& native_mode) { #define ASSIGN_ARRAY(v, a) v.assign(a, a + arraysize(a)) std::vector ret; if (native_mode.device_scale_factor == 2.0f) { ASSIGN_ARRAY(ret, kUIScalesFor2x); return ret; } else if (native_mode.device_scale_factor == 1.25f) { ASSIGN_ARRAY(ret, kUIScalesFor1_25x); return ret; } switch (native_mode.size.width()) { case 1280: ASSIGN_ARRAY(ret, kUIScalesFor1280); break; case 1366: ASSIGN_ARRAY(ret, kUIScalesFor1366); break; default: ASSIGN_ARRAY(ret, kUIScalesFor1280); #if defined(OS_CHROMEOS) if (base::SysInfo::IsRunningOnChromeOS()) NOTREACHED() << "Unknown resolution:" << native_mode.size.ToString(); #endif } return ret; } struct ScaleComparator { explicit ScaleComparator(float s) : scale(s) {} bool operator()(const DisplayMode& mode) const { const float kEpsilon = 0.0001f; return std::abs(scale - mode.ui_scale) < kEpsilon; } float scale; }; } // namespace std::vector CreateInternalDisplayModeList( const DisplayMode& native_mode) { std::vector display_mode_list; float native_ui_scale = (native_mode.device_scale_factor == 1.25f) ? 1.0f : native_mode.device_scale_factor; for (float ui_scale : GetScalesForDisplay(native_mode)) { DisplayMode mode = native_mode; mode.ui_scale = ui_scale; mode.native = (ui_scale == native_ui_scale); display_mode_list.push_back(mode); } return display_mode_list; } // static float GetNextUIScale(const DisplayInfo& info, bool up) { ScaleComparator comparator(info.configured_ui_scale()); const std::vector& modes = info.display_modes(); for (auto iter = modes.begin(); iter != modes.end(); ++iter) { if (comparator(*iter)) { if (up && (iter + 1) != modes.end()) return (iter + 1)->ui_scale; if (!up && iter != modes.begin()) return (iter - 1)->ui_scale; return info.configured_ui_scale(); } } // Fallback to 1.0f if the |scale| wasn't in the list. return 1.0f; } bool HasDisplayModeForUIScale(const DisplayInfo& info, float ui_scale) { ScaleComparator comparator(ui_scale); const std::vector& modes = info.display_modes(); return std::find_if(modes.begin(), modes.end(), comparator) != modes.end(); } } // namespace ash