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

Side by Side Diff: chrome/browser/ui/webui/options/chromeos/display_options_handler.cc

Issue 227593011: Modifies the threshold for hidpi displays. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 8 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 "chrome/browser/ui/webui/options/chromeos/display_options_handler.h" 5 #include "chrome/browser/ui/webui/options/chromeos/display_options_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "ash/display/display_controller.h" 9 #include "ash/display/display_controller.h"
10 #include "ash/display/display_manager.h" 10 #include "ash/display/display_manager.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 47
48 int64 display_id = gfx::Display::kInvalidDisplayID; 48 int64 display_id = gfx::Display::kInvalidDisplayID;
49 if (!base::StringToInt64(id_value, &display_id)) { 49 if (!base::StringToInt64(id_value, &display_id)) {
50 LOG(ERROR) << "Invalid display id: " << id_value; 50 LOG(ERROR) << "Invalid display id: " << id_value;
51 return gfx::Display::kInvalidDisplayID; 51 return gfx::Display::kInvalidDisplayID;
52 } 52 }
53 53
54 return display_id; 54 return display_id;
55 } 55 }
56 56
57 bool CompareDisplayMode(ash::DisplayMode d1, ash::DisplayMode d2) { 57 bool CompareResolution(base::Value* display1, base::Value* display2) {
58 if (d1.size.GetArea() == d2.size.GetArea()) 58 base::DictionaryValue* d1 = NULL;
59 return d1.refresh_rate < d2.refresh_rate; 59 base::DictionaryValue* d2 = NULL;
60 return d1.size.GetArea() < d2.size.GetArea(); 60 CHECK(display1->GetAsDictionary(&d1) && display2->GetAsDictionary(&d2));
61 int w1 = 0, h1 = 0, w2 = 0, h2 = 0;
oshima 2014/04/09 23:07:37 width1/height1
Jun Mukai 2014/04/09 23:16:00 Done.
62 CHECK(d1->GetInteger("width", &w1) && d1->GetInteger("height", &h1));
63 CHECK(d2->GetInteger("width", &w2) && d2->GetInteger("height", &h2));
64 double sf1 = 0, sf2 = 0;
65 if (d1->GetDouble("scaleFactor", &sf1)) {
66 w1 /= sf1;
67 h1 /= sf1;
68 }
69 if (d2->GetDouble("scaleFactor", &sf2)) {
70 w2 /= sf2;
71 h2 /= sf2;
72 }
73
74 if (w1 * h1 == w2 * h2) {
75 if (sf1 != sf2)
76 return sf1 < sf2;
77
78 int r1 = 0, r2 = 0;
79 CHECK(d1->GetInteger("refreshRate", &r1) ==
80 d2->GetInteger("refreshRate", &r2));
81 return r1 < r2;
82 }
83 return w1 * h1 < w2 * h2;
61 } 84 }
62 85
63 base::string16 GetColorProfileName(ui::ColorCalibrationProfile profile) { 86 base::string16 GetColorProfileName(ui::ColorCalibrationProfile profile) {
64 switch (profile) { 87 switch (profile) {
65 case ui::COLOR_PROFILE_STANDARD: 88 case ui::COLOR_PROFILE_STANDARD:
66 return l10n_util::GetStringUTF16( 89 return l10n_util::GetStringUTF16(
67 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_STANDARD); 90 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_STANDARD);
68 case ui::COLOR_PROFILE_DYNAMIC: 91 case ui::COLOR_PROFILE_DYNAMIC:
69 return l10n_util::GetStringUTF16( 92 return l10n_util::GetStringUTF16(
70 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_DYNAMIC); 93 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_DYNAMIC);
71 case ui::COLOR_PROFILE_MOVIE: 94 case ui::COLOR_PROFILE_MOVIE:
72 return l10n_util::GetStringUTF16( 95 return l10n_util::GetStringUTF16(
73 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_MOVIE); 96 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_MOVIE);
74 case ui::COLOR_PROFILE_READING: 97 case ui::COLOR_PROFILE_READING:
75 return l10n_util::GetStringUTF16( 98 return l10n_util::GetStringUTF16(
76 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_READING); 99 IDS_OPTIONS_SETTINGS_DISPLAY_OPTIONS_COLOR_PROFILE_READING);
77 case ui::NUM_COLOR_PROFILES: 100 case ui::NUM_COLOR_PROFILES:
78 break; 101 break;
79 } 102 }
80 103
81 NOTREACHED(); 104 NOTREACHED();
82 return base::string16(); 105 return base::string16();
83 } 106 }
84 107
108 scoped_ptr<base::ListValue> GetResolutionsForInternalDisplay(
109 const ash::DisplayInfo& display_info) {
110 scoped_ptr<base::ListValue> js_resolutions(new base::ListValue);
111 const std::vector<float> ui_scales =
112 DisplayManager::GetScalesForDisplay(display_info);
113 gfx::SizeF base_size = display_info.bounds_in_native().size();
114 base_size.Scale(1.0f / display_info.device_scale_factor());
115 if (display_info.rotation() == gfx::Display::ROTATE_90 ||
116 display_info.rotation() == gfx::Display::ROTATE_270) {
117 float tmp = base_size.width();
118 base_size.set_width(base_size.height());
119 base_size.set_height(tmp);
120 }
121
122 for (size_t i = 0; i < ui_scales.size(); ++i) {
123 base::DictionaryValue* resolution_info = new base::DictionaryValue();
124 gfx::SizeF new_size = base_size;
125 new_size.Scale(ui_scales[i]);
126 gfx::Size resolution = gfx::ToFlooredSize(new_size);
127 resolution_info->SetDouble("scale", ui_scales[i]);
128 if (ui_scales[i] == 1.0f)
129 resolution_info->SetBoolean("isBest", true);
130 resolution_info->SetBoolean(
131 "selected", display_info.configured_ui_scale() == ui_scales[i]);
132 resolution_info->SetInteger("width", resolution.width());
133 resolution_info->SetInteger("height", resolution.height());
134 js_resolutions->Append(resolution_info);
135 }
136
137 return js_resolutions.Pass();
138 }
139
140 scoped_ptr<base::ListValue> GetResolutionsForExternalDisplay(
141 const ash::DisplayInfo& display_info) {
142 scoped_ptr<base::ListValue> js_resolutions(new base::ListValue);
143
144 gfx::Size current_size = display_info.bounds_in_native().size();
145 gfx::Insets current_overscan = display_info.GetOverscanInsetsInPixel();
146 int largest_index = -1;
147 int largest_area = -1;
148
149 for (size_t i = 0; i < display_info.display_modes().size(); ++i) {
150 base::DictionaryValue* resolution_info = new base::DictionaryValue();
151 const ash::DisplayMode& display_mode = display_info.display_modes()[i];
152 gfx::Size resolution = display_mode.size;
153
154 if (resolution.GetArea() > largest_area) {
155 resolution_info->SetBoolean("isBest", true);
156 largest_area = resolution.GetArea();
157 if (largest_index >= 0) {
158 base::DictionaryValue* prev_largest = NULL;
159 CHECK(js_resolutions->GetDictionary(largest_index, &prev_largest));
160 prev_largest->SetBoolean("isBest", false);
161 }
162 largest_index = i;
163 }
164
165 if (resolution == current_size) {
166 // Right now, the scale factor for unselected resolutions is unknown.
167 // TODO(mukai): Set the scale factor for unselected ones.
168 resolution_info->SetDouble(
169 "scaleFactor", display_info.device_scale_factor());
170 resolution_info->SetBoolean("selected", true);
171 }
172
173 resolution.Enlarge(
174 -current_overscan.width(), -current_overscan.height());
175 resolution_info->SetInteger("width", resolution.width());
176 resolution_info->SetInteger("height", resolution.height());
177 resolution_info->SetDouble("refreshRate", display_mode.refresh_rate);
178 js_resolutions->Append(resolution_info);
179 }
180
181 return js_resolutions.Pass();
182 }
183
85 } // namespace 184 } // namespace
86 185
87 DisplayOptionsHandler::DisplayOptionsHandler() { 186 DisplayOptionsHandler::DisplayOptionsHandler() {
88 ash::Shell::GetInstance()->display_controller()->AddObserver(this); 187 ash::Shell::GetInstance()->display_controller()->AddObserver(this);
89 } 188 }
90 189
91 DisplayOptionsHandler::~DisplayOptionsHandler() { 190 DisplayOptionsHandler::~DisplayOptionsHandler() {
92 ash::Shell::GetInstance()->display_controller()->RemoveObserver(this); 191 ash::Shell::GetInstance()->display_controller()->RemoveObserver(this);
93 } 192 }
94 193
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 js_display->SetInteger("x", bounds.x()); 309 js_display->SetInteger("x", bounds.x());
211 js_display->SetInteger("y", bounds.y()); 310 js_display->SetInteger("y", bounds.y());
212 js_display->SetInteger("width", bounds.width()); 311 js_display->SetInteger("width", bounds.width());
213 js_display->SetInteger("height", bounds.height()); 312 js_display->SetInteger("height", bounds.height());
214 js_display->SetString("name", 313 js_display->SetString("name",
215 display_manager->GetDisplayNameForId(display.id())); 314 display_manager->GetDisplayNameForId(display.id()));
216 js_display->SetBoolean("isPrimary", display.id() == primary_id); 315 js_display->SetBoolean("isPrimary", display.id() == primary_id);
217 js_display->SetBoolean("isInternal", display.IsInternal()); 316 js_display->SetBoolean("isInternal", display.IsInternal());
218 js_display->SetInteger("orientation", 317 js_display->SetInteger("orientation",
219 static_cast<int>(display_info.rotation())); 318 static_cast<int>(display_info.rotation()));
220 std::vector<ash::DisplayMode> display_modes;
221 std::vector<float> ui_scales;
222 if (display.IsInternal()) {
223 ui_scales = DisplayManager::GetScalesForDisplay(display_info);
224 gfx::SizeF base_size = display_info.bounds_in_native().size();
225 base_size.Scale(1.0f / display_info.device_scale_factor());
226 if (display_info.rotation() == gfx::Display::ROTATE_90 ||
227 display_info.rotation() == gfx::Display::ROTATE_270) {
228 float tmp = base_size.width();
229 base_size.set_width(base_size.height());
230 base_size.set_height(tmp);
231 }
232 for (size_t i = 0; i < ui_scales.size(); ++i) {
233 gfx::SizeF new_size = base_size;
234 new_size.Scale(ui_scales[i]);
235 display_modes.push_back(ash::DisplayMode(
236 gfx::ToFlooredSize(new_size), -1.0f, false, false));
237 }
238 } else {
239 for (size_t i = 0; i < display_info.display_modes().size(); ++i)
240 display_modes.push_back(display_info.display_modes()[i]);
241 }
242 std::sort(display_modes.begin(), display_modes.end(), CompareDisplayMode);
243 319
244 base::ListValue* js_resolutions = new base::ListValue(); 320 scoped_ptr<base::ListValue> js_resolutions = display.IsInternal() ?
245 gfx::Size current_size = display_info.bounds_in_native().size(); 321 GetResolutionsForInternalDisplay(display_info) :
246 gfx::Insets current_overscan = display_info.GetOverscanInsetsInPixel(); 322 GetResolutionsForExternalDisplay(display_info);
247 for (size_t i = 0; i < display_modes.size(); ++i) { 323 std::sort(
248 base::DictionaryValue* resolution_info = new base::DictionaryValue(); 324 js_resolutions->begin(), js_resolutions->end(), CompareResolution);
249 gfx::Size resolution = display_modes[i].size; 325 js_display->Set("resolutions", js_resolutions.release());
250 if (!ui_scales.empty()) {
251 resolution_info->SetDouble("scale", ui_scales[i]);
252 if (ui_scales[i] == 1.0f)
253 resolution_info->SetBoolean("isBest", true);
254 resolution_info->SetBoolean(
255 "selected", display_info.configured_ui_scale() == ui_scales[i]);
256 } else {
257 // Picks the largest one as the "best", which is the last element
258 // because |display_modes| is sorted by its area.
259 if (i == display_modes.size() - 1)
260 resolution_info->SetBoolean("isBest", true);
261 resolution_info->SetBoolean("selected", (resolution == current_size));
262 resolution.Enlarge(
263 -current_overscan.width(), -current_overscan.height());
264 }
265 resolution_info->SetInteger("width", resolution.width());
266 resolution_info->SetInteger("height", resolution.height());
267 if (display_modes[i].refresh_rate > 0.0f) {
268 resolution_info->SetDouble("refreshRate",
269 display_modes[i].refresh_rate);
270 }
271 js_resolutions->Append(resolution_info);
272 }
273 js_display->Set("resolutions", js_resolutions);
274 326
275 js_display->SetInteger("colorProfile", display_info.color_profile()); 327 js_display->SetInteger("colorProfile", display_info.color_profile());
276 base::ListValue* available_color_profiles = new base::ListValue(); 328 base::ListValue* available_color_profiles = new base::ListValue();
277 for (size_t i = 0; 329 for (size_t i = 0;
278 i < display_info.available_color_profiles().size(); ++i) { 330 i < display_info.available_color_profiles().size(); ++i) {
279 base::DictionaryValue* color_profile_dict = new base::DictionaryValue(); 331 base::DictionaryValue* color_profile_dict = new base::DictionaryValue();
280 ui::ColorCalibrationProfile color_profile = 332 ui::ColorCalibrationProfile color_profile =
281 display_info.available_color_profiles()[i]; 333 display_info.available_color_profiles()[i];
282 color_profile_dict->SetInteger("profileId", color_profile); 334 color_profile_dict->SetInteger("profileId", color_profile);
283 color_profile_dict->SetString("name", GetColorProfileName(color_profile)); 335 color_profile_dict->SetString("name", GetColorProfileName(color_profile));
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 return; 532 return;
481 } 533 }
482 534
483 GetDisplayManager()->SetColorCalibrationProfile( 535 GetDisplayManager()->SetColorCalibrationProfile(
484 display_id, static_cast<ui::ColorCalibrationProfile>(profile_id)); 536 display_id, static_cast<ui::ColorCalibrationProfile>(profile_id));
485 SendAllDisplayInfo(); 537 SendAllDisplayInfo();
486 } 538 }
487 539
488 } // namespace options 540 } // namespace options
489 } // namespace chromeos 541 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698