| Index: ash/display/display_manager.cc
|
| diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
|
| index 07d44155fa6ccdd1ad4a6e89b7d7939a69455f5e..622630caf5e98d3db1293d1c1ecdb866ca2280cc 100644
|
| --- a/ash/display/display_manager.cc
|
| +++ b/ash/display/display_manager.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "ash/display/display_manager.h"
|
|
|
| +#include <algorithm>
|
| #include <cmath>
|
| #include <set>
|
| #include <string>
|
| @@ -68,6 +69,7 @@ const float kUIScalesFor2x[] =
|
| 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 };
|
| +const float kDeviceScaleFactorsFor4k[] = {1.0f, 1.25f, 2.0f};
|
|
|
| struct DisplaySortFunctor {
|
| bool operator()(const gfx::Display& a, const gfx::Display& b) {
|
| @@ -87,6 +89,10 @@ struct DisplayModeMatcher {
|
| gfx::Size size;
|
| };
|
|
|
| +bool CompareDisplayModeBySize(const DisplayMode& m1, const DisplayMode& m2) {
|
| + return m1.size.GetArea() < m2.size.GetArea();
|
| +}
|
| +
|
| struct ScaleComparator {
|
| explicit ScaleComparator(float s) : scale(s) {}
|
|
|
| @@ -213,6 +219,24 @@ std::vector<float> DisplayManager::GetScalesForDisplay(
|
| }
|
|
|
| // static
|
| +std::vector<float> DisplayManager::GetDeviceScaleFactorsForDisplay(
|
| + const DisplayInfo& info) {
|
| + // This method is currently only used for external displays.
|
| + std::vector<float> scale_factors;
|
| + scale_factors.push_back(1.0f);
|
| + if (gfx::Display::InternalDisplayId() == info.id())
|
| + return scale_factors;
|
| +
|
| + const std::vector<DisplayMode>& display_modes = info.display_modes();
|
| + std::vector<DisplayMode>::const_iterator iter =
|
| + std::max_element(display_modes.begin(), display_modes.end(),
|
| + CompareDisplayModeBySize);
|
| + if (iter != display_modes.end() && iter->size.width() >= 3840)
|
| + ASSIGN_ARRAY(scale_factors, kDeviceScaleFactorsFor4k);
|
| + return scale_factors;
|
| +}
|
| +
|
| +// static
|
| float DisplayManager::GetNextUIScale(const DisplayInfo& info, bool up) {
|
| float scale = info.configured_ui_scale();
|
| std::vector<float> scales = GetScalesForDisplay(info);
|
| @@ -472,6 +496,32 @@ void DisplayManager::SetDisplayResolution(int64 display_id,
|
| #endif
|
| }
|
|
|
| +void DisplayManager::SetDisplayDeviceScaleFactor(int64 display_id,
|
| + float device_scale_factor) {
|
| + DCHECK_NE(gfx::Display::InternalDisplayId(), display_id);
|
| + if (gfx::Display::InternalDisplayId() == display_id)
|
| + return;
|
| +
|
| + DisplayInfoList display_info_list;
|
| + for (DisplayList::const_iterator iter = displays_.begin();
|
| + iter != displays_.end(); ++iter) {
|
| + DisplayInfo info = GetDisplayInfo(iter->id());
|
| + if (info.id() == display_id) {
|
| + if (info.device_scale_factor() == device_scale_factor)
|
| + return;
|
| + std::vector<float> scales = GetDeviceScaleFactorsForDisplay(info);
|
| + ScaleComparator comparator(device_scale_factor);
|
| + if (std::find_if(scales.begin(), scales.end(), comparator) ==
|
| + scales.end()) {
|
| + return;
|
| + }
|
| + info.set_device_scale_factor(device_scale_factor);
|
| + }
|
| + display_info_list.push_back(info);
|
| + }
|
| + UpdateDisplays(display_info_list);
|
| +}
|
| +
|
| void DisplayManager::RegisterDisplayProperty(
|
| int64 display_id,
|
| gfx::Display::Rotation rotation,
|
|
|