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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/display/display_manager.h" 5 #include "ash/display/display_manager.h"
6 6
7 #include <algorithm>
7 #include <cmath> 8 #include <cmath>
8 #include <set> 9 #include <set>
9 #include <string> 10 #include <string>
10 #include <vector> 11 #include <vector>
11 12
12 #include "ash/ash_switches.h" 13 #include "ash/ash_switches.h"
13 #include "ash/display/display_layout_store.h" 14 #include "ash/display/display_layout_store.h"
14 #include "ash/display/screen_ash.h" 15 #include "ash/display/screen_ash.h"
15 #include "ash/screen_util.h" 16 #include "ash/screen_util.h"
16 #include "ash/shell.h" 17 #include "ash/shell.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 62
62 // List of value UI Scale values. Scales for 2x are equivalent to 640, 63 // List of value UI Scale values. Scales for 2x are equivalent to 640,
63 // 800, 1024, 1280, 1440, 1600 and 1920 pixel width respectively on 64 // 800, 1024, 1280, 1440, 1600 and 1920 pixel width respectively on
64 // 2560 pixel width 2x density display. Please see crbug.com/233375 65 // 2560 pixel width 2x density display. Please see crbug.com/233375
65 // for the full list of resolutions. 66 // for the full list of resolutions.
66 const float kUIScalesFor2x[] = 67 const float kUIScalesFor2x[] =
67 {0.5f, 0.625f, 0.8f, 1.0f, 1.125f, 1.25f, 1.5f, 2.0f}; 68 {0.5f, 0.625f, 0.8f, 1.0f, 1.125f, 1.25f, 1.5f, 2.0f};
68 const float kUIScalesFor1_25x[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.25f }; 69 const float kUIScalesFor1_25x[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.25f };
69 const float kUIScalesFor1280[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.125f }; 70 const float kUIScalesFor1280[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.125f };
70 const float kUIScalesFor1366[] = {0.5f, 0.6f, 0.75f, 1.0f, 1.125f }; 71 const float kUIScalesFor1366[] = {0.5f, 0.6f, 0.75f, 1.0f, 1.125f };
72 const float kDeviceScaleFactorsFor4k[] = {1.0f, 1.25f, 2.0f};
71 73
72 struct DisplaySortFunctor { 74 struct DisplaySortFunctor {
73 bool operator()(const gfx::Display& a, const gfx::Display& b) { 75 bool operator()(const gfx::Display& a, const gfx::Display& b) {
74 return a.id() < b.id(); 76 return a.id() < b.id();
75 } 77 }
76 }; 78 };
77 79
78 struct DisplayInfoSortFunctor { 80 struct DisplayInfoSortFunctor {
79 bool operator()(const DisplayInfo& a, const DisplayInfo& b) { 81 bool operator()(const DisplayInfo& a, const DisplayInfo& b) {
80 return a.id() < b.id(); 82 return a.id() < b.id();
81 } 83 }
82 }; 84 };
83 85
84 struct DisplayModeMatcher { 86 struct DisplayModeMatcher {
85 DisplayModeMatcher(const gfx::Size& size) : size(size) {} 87 DisplayModeMatcher(const gfx::Size& size) : size(size) {}
86 bool operator()(const DisplayMode& mode) { return mode.size == size; } 88 bool operator()(const DisplayMode& mode) { return mode.size == size; }
87 gfx::Size size; 89 gfx::Size size;
88 }; 90 };
89 91
92 bool CompareDisplayModeBySize(const DisplayMode& m1, const DisplayMode& m2) {
93 return m1.size.GetArea() < m2.size.GetArea();
94 }
95
90 struct ScaleComparator { 96 struct ScaleComparator {
91 explicit ScaleComparator(float s) : scale(s) {} 97 explicit ScaleComparator(float s) : scale(s) {}
92 98
93 bool operator()(float s) const { 99 bool operator()(float s) const {
94 const float kEpsilon = 0.0001f; 100 const float kEpsilon = 0.0001f;
95 return std::abs(scale - s) < kEpsilon; 101 return std::abs(scale - s) < kEpsilon;
96 } 102 }
97 float scale; 103 float scale;
98 }; 104 };
99 105
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 ASSIGN_ARRAY(ret, kUIScalesFor1280); 212 ASSIGN_ARRAY(ret, kUIScalesFor1280);
207 #if defined(OS_CHROMEOS) 213 #if defined(OS_CHROMEOS)
208 if (base::SysInfo::IsRunningOnChromeOS()) 214 if (base::SysInfo::IsRunningOnChromeOS())
209 NOTREACHED() << "Unknown resolution:" << info.ToString(); 215 NOTREACHED() << "Unknown resolution:" << info.ToString();
210 #endif 216 #endif
211 } 217 }
212 return ret; 218 return ret;
213 } 219 }
214 220
215 // static 221 // static
222 std::vector<float> DisplayManager::GetDeviceScaleFactorsForDisplay(
223 const DisplayInfo& info) {
224 // This method is currently only used for external displays.
225 std::vector<float> scale_factors;
226 scale_factors.push_back(1.0f);
227 if (gfx::Display::InternalDisplayId() == info.id())
228 return scale_factors;
229
230 const std::vector<DisplayMode>& display_modes = info.display_modes();
231 std::vector<DisplayMode>::const_iterator iter =
232 std::max_element(display_modes.begin(), display_modes.end(),
233 CompareDisplayModeBySize);
234 if (iter != display_modes.end() && iter->size.width() >= 3840)
235 ASSIGN_ARRAY(scale_factors, kDeviceScaleFactorsFor4k);
236 return scale_factors;
237 }
238
239 // static
216 float DisplayManager::GetNextUIScale(const DisplayInfo& info, bool up) { 240 float DisplayManager::GetNextUIScale(const DisplayInfo& info, bool up) {
217 float scale = info.configured_ui_scale(); 241 float scale = info.configured_ui_scale();
218 std::vector<float> scales = GetScalesForDisplay(info); 242 std::vector<float> scales = GetScalesForDisplay(info);
219 for (size_t i = 0; i < scales.size(); ++i) { 243 for (size_t i = 0; i < scales.size(); ++i) {
220 if (ScaleComparator(scales[i])(scale)) { 244 if (ScaleComparator(scales[i])(scale)) {
221 if (up && i != scales.size() - 1) 245 if (up && i != scales.size() - 1)
222 return scales[i + 1]; 246 return scales[i + 1];
223 if (!up && i != 0) 247 if (!up && i != 0)
224 return scales[i - 1]; 248 return scales[i - 1];
225 return scales[i]; 249 return scales[i];
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 << resolution.ToString(); 489 << resolution.ToString();
466 return; 490 return;
467 } 491 }
468 display_modes_[display_id] = *iter; 492 display_modes_[display_id] = *iter;
469 #if defined(OS_CHROMEOS) 493 #if defined(OS_CHROMEOS)
470 if (base::SysInfo::IsRunningOnChromeOS()) 494 if (base::SysInfo::IsRunningOnChromeOS())
471 Shell::GetInstance()->display_configurator()->OnConfigurationChanged(); 495 Shell::GetInstance()->display_configurator()->OnConfigurationChanged();
472 #endif 496 #endif
473 } 497 }
474 498
499 void DisplayManager::SetDisplayDeviceScaleFactor(int64 display_id,
500 float device_scale_factor) {
501 DCHECK_NE(gfx::Display::InternalDisplayId(), display_id);
502 if (gfx::Display::InternalDisplayId() == display_id)
503 return;
504
505 DisplayInfoList display_info_list;
506 for (DisplayList::const_iterator iter = displays_.begin();
507 iter != displays_.end(); ++iter) {
508 DisplayInfo info = GetDisplayInfo(iter->id());
509 if (info.id() == display_id) {
510 if (info.device_scale_factor() == device_scale_factor)
511 return;
512 std::vector<float> scales = GetDeviceScaleFactorsForDisplay(info);
513 ScaleComparator comparator(device_scale_factor);
514 if (std::find_if(scales.begin(), scales.end(), comparator) ==
515 scales.end()) {
516 return;
517 }
518 info.set_device_scale_factor(device_scale_factor);
519 }
520 display_info_list.push_back(info);
521 }
522 UpdateDisplays(display_info_list);
523 }
524
475 void DisplayManager::RegisterDisplayProperty( 525 void DisplayManager::RegisterDisplayProperty(
476 int64 display_id, 526 int64 display_id,
477 gfx::Display::Rotation rotation, 527 gfx::Display::Rotation rotation,
478 float ui_scale, 528 float ui_scale,
479 const gfx::Insets* overscan_insets, 529 const gfx::Insets* overscan_insets,
480 const gfx::Size& resolution_in_pixels, 530 const gfx::Size& resolution_in_pixels,
481 ui::ColorCalibrationProfile color_profile) { 531 ui::ColorCalibrationProfile color_profile) {
482 if (display_info_.find(display_id) == display_info_.end()) 532 if (display_info_.find(display_id) == display_info_.end())
483 display_info_[display_id] = DisplayInfo(display_id, std::string(), false); 533 display_info_[display_id] = DisplayInfo(display_id, std::string(), false);
484 534
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 new_secondary_origin.Offset(-secondary_bounds.width(), offset); 1194 new_secondary_origin.Offset(-secondary_bounds.width(), offset);
1145 break; 1195 break;
1146 } 1196 }
1147 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); 1197 gfx::Insets insets = secondary_display->GetWorkAreaInsets();
1148 secondary_display->set_bounds( 1198 secondary_display->set_bounds(
1149 gfx::Rect(new_secondary_origin, secondary_bounds.size())); 1199 gfx::Rect(new_secondary_origin, secondary_bounds.size()));
1150 secondary_display->UpdateWorkAreaFromInsets(insets); 1200 secondary_display->UpdateWorkAreaFromInsets(insets);
1151 } 1201 }
1152 1202
1153 } // namespace ash 1203 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698