Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: ash/display/display_manager.cc

Issue 417113012: Introduce user customization of external HighDPI mode for 4K monitor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698