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, |