| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 <stdio.h> | 5 #include <stdio.h> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "ash/display/display_info.h" | 9 #include "ash/display/display_info.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
| 14 #include "ui/gfx/display.h" | 14 #include "ui/gfx/display.h" |
| 15 #include "ui/gfx/size_conversions.h" | 15 #include "ui/gfx/size_conversions.h" |
| 16 #include "ui/gfx/size_f.h" | 16 #include "ui/gfx/size_f.h" |
| 17 | 17 |
| 18 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
| 19 #include "ui/aura/window_tree_host.h" | 19 #include "ui/aura/window_tree_host.h" |
| 20 #include "ui/gfx/win/dpi.h" | 20 #include "ui/gfx/win/dpi.h" |
| 21 #endif | 21 #endif |
| 22 | 22 |
| 23 namespace ash { | 23 namespace ash { |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 // TODO(oshima): This feature is obsolete. Remove this after m38. | 26 // TODO(oshima): This feature is obsolete. Remove this after m38. |
| 27 bool allow_upgrade_to_high_dpi = false; | 27 bool allow_upgrade_to_high_dpi = false; |
| 28 | 28 |
| 29 // Check the content of |spec| and fill |bounds| and |device_scale_factor|. |
| 30 // Returns true when |bounds| is found. |
| 31 bool GetDisplayBounds( |
| 32 const std::string& spec, gfx::Rect* bounds, float* device_scale_factor) { |
| 33 int width = 0; |
| 34 int height = 0; |
| 35 int x = 0; |
| 36 int y = 0; |
| 37 if (sscanf(spec.c_str(), "%dx%d*%f", |
| 38 &width, &height, device_scale_factor) >= 2 || |
| 39 sscanf(spec.c_str(), "%d+%d-%dx%d*%f", &x, &y, &width, &height, |
| 40 device_scale_factor) >= 4) { |
| 41 bounds->SetRect(x, y, width, height); |
| 42 return true; |
| 43 } |
| 44 return false; |
| 45 } |
| 46 |
| 29 } | 47 } |
| 30 | 48 |
| 31 DisplayMode::DisplayMode() | 49 DisplayMode::DisplayMode() |
| 32 : refresh_rate(0.0f), | 50 : refresh_rate(0.0f), |
| 33 interlaced(false), | 51 interlaced(false), |
| 34 native(false), | 52 native(false), |
| 35 ui_scale(1.0f), | 53 ui_scale(1.0f), |
| 36 device_scale_factor(1.0f) {} | 54 device_scale_factor(1.0f) {} |
| 37 | 55 |
| 38 DisplayMode::DisplayMode(const gfx::Size& size, | 56 DisplayMode::DisplayMode(const gfx::Size& size, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 rotation = gfx::Display::ROTATE_180; | 137 rotation = gfx::Display::ROTATE_180; |
| 120 break; | 138 break; |
| 121 case 'l': // rotate 90 degrees to 'left'. | 139 case 'l': // rotate 90 degrees to 'left'. |
| 122 rotation = gfx::Display::ROTATE_270; | 140 rotation = gfx::Display::ROTATE_270; |
| 123 break; | 141 break; |
| 124 } | 142 } |
| 125 } | 143 } |
| 126 } | 144 } |
| 127 } | 145 } |
| 128 | 146 |
| 129 int x = 0, y = 0, width, height; | |
| 130 float device_scale_factor = 1.0f; | 147 float device_scale_factor = 1.0f; |
| 131 if (sscanf(main_spec.c_str(), "%dx%d*%f", | 148 if (!GetDisplayBounds(main_spec, &bounds_in_native, &device_scale_factor)) { |
| 132 &width, &height, &device_scale_factor) >= 2 || | |
| 133 sscanf(main_spec.c_str(), "%d+%d-%dx%d*%f", &x, &y, &width, &height, | |
| 134 &device_scale_factor) >= 4) { | |
| 135 bounds_in_native.SetRect(x, y, width, height); | |
| 136 } else { | |
| 137 #if defined(OS_WIN) | 149 #if defined(OS_WIN) |
| 138 if (gfx::IsHighDPIEnabled()) { | 150 if (gfx::IsHighDPIEnabled()) { |
| 139 device_scale_factor = gfx::GetDPIScale(); | 151 device_scale_factor = gfx::GetDPIScale(); |
| 140 } | 152 } |
| 141 #endif | 153 #endif |
| 142 } | 154 } |
| 143 | 155 |
| 144 std::vector<DisplayMode> display_modes; | 156 std::vector<DisplayMode> display_modes; |
| 145 if (Tokenize(main_spec, "#", &parts) == 2) { | 157 if (Tokenize(main_spec, "#", &parts) == 2) { |
| 146 size_t native_mode = 0; | 158 size_t native_mode = 0; |
| 147 int largest_area = -1; | 159 int largest_area = -1; |
| 148 float highest_refresh_rate = -1.0f; | 160 float highest_refresh_rate = -1.0f; |
| 149 main_spec = parts[0]; | 161 main_spec = parts[0]; |
| 150 std::string resolution_list = parts[1]; | 162 std::string resolution_list = parts[1]; |
| 151 count = Tokenize(resolution_list, "|", &parts); | 163 count = Tokenize(resolution_list, "|", &parts); |
| 152 for (size_t i = 0; i < count; ++i) { | 164 for (size_t i = 0; i < count; ++i) { |
| 153 std::string resolution = parts[i]; | 165 DisplayMode mode; |
| 154 int width, height; | 166 gfx::Rect mode_bounds; |
| 155 float refresh_rate = 0.0f; | 167 std::vector<std::string> resolution; |
| 156 if (sscanf(resolution.c_str(), | 168 Tokenize(parts[i], "%", &resolution); |
| 157 "%dx%d%%%f", | 169 if (GetDisplayBounds( |
| 158 &width, | 170 resolution[0], &mode_bounds, &mode.device_scale_factor)) { |
| 159 &height, | 171 mode.size = mode_bounds.size(); |
| 160 &refresh_rate) >= 2) { | 172 if (resolution.size() > 1) |
| 161 if (width * height >= largest_area && | 173 sscanf(resolution[1].c_str(), "%f", &mode.refresh_rate); |
| 162 refresh_rate > highest_refresh_rate) { | 174 if (mode.size.GetArea() >= largest_area && |
| 175 mode.refresh_rate > highest_refresh_rate) { |
| 163 // Use mode with largest area and highest refresh rate as native. | 176 // Use mode with largest area and highest refresh rate as native. |
| 164 largest_area = width * height; | 177 largest_area = mode.size.GetArea(); |
| 165 highest_refresh_rate = refresh_rate; | 178 highest_refresh_rate = mode.refresh_rate; |
| 166 native_mode = i; | 179 native_mode = i; |
| 167 } | 180 } |
| 168 display_modes.push_back( | 181 display_modes.push_back(mode); |
| 169 DisplayMode(gfx::Size(width, height), refresh_rate, false, false)); | |
| 170 } | 182 } |
| 171 } | 183 } |
| 172 display_modes[native_mode].native = true; | 184 display_modes[native_mode].native = true; |
| 173 } | 185 } |
| 174 | 186 |
| 175 if (id == gfx::Display::kInvalidDisplayID) | 187 if (id == gfx::Display::kInvalidDisplayID) |
| 176 id = synthesized_display_id++; | 188 id = synthesized_display_id++; |
| 177 DisplayInfo display_info( | 189 DisplayInfo display_info( |
| 178 id, base::StringPrintf("Display-%d", static_cast<int>(id)), has_overscan); | 190 id, base::StringPrintf("Display-%d", static_cast<int>(id)), has_overscan); |
| 179 display_info.set_device_scale_factor(device_scale_factor); | 191 display_info.set_device_scale_factor(device_scale_factor); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 } | 372 } |
| 361 | 373 |
| 362 bool DisplayInfo::IsColorProfileAvailable( | 374 bool DisplayInfo::IsColorProfileAvailable( |
| 363 ui::ColorCalibrationProfile profile) const { | 375 ui::ColorCalibrationProfile profile) const { |
| 364 return std::find(available_color_profiles_.begin(), | 376 return std::find(available_color_profiles_.begin(), |
| 365 available_color_profiles_.end(), | 377 available_color_profiles_.end(), |
| 366 profile) != available_color_profiles_.end(); | 378 profile) != available_color_profiles_.end(); |
| 367 } | 379 } |
| 368 | 380 |
| 369 } // namespace ash | 381 } // namespace ash |
| OLD | NEW |