OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/display/display_util.h" | 5 #include "ui/display/display_util.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 | 8 |
9 namespace ui { | 9 namespace ui { |
10 | 10 |
11 namespace { | 11 namespace { |
12 | 12 |
13 // A list of bogus sizes in mm that should be ignored. | 13 // A list of bogus sizes in mm that should be ignored. |
14 // See crbug.com/136533. The first element maintains the minimum | 14 // See crbug.com/136533. The first element maintains the minimum |
15 // size required to be valid size. | 15 // size required to be valid size. |
16 const int kInvalidDisplaySizeList[][2] = { | 16 const int kInvalidDisplaySizeList[][2] = { |
17 {40, 30}, | 17 {40, 30}, |
18 {50, 40}, | 18 {50, 40}, |
19 {160, 90}, | 19 {160, 90}, |
20 {160, 100}, | 20 {160, 100}, |
21 }; | 21 }; |
22 | 22 |
| 23 // The DPI threshold to detect high density screen. |
| 24 // Higher DPI than this will use device_scale_factor=2. |
| 25 const unsigned int kHighDensityDPIThresholdSmall = 170; |
| 26 |
| 27 // The HiDPI threshold for large (usually external) monitors. Lower threshold |
| 28 // makes sense for large monitors, because such monitors should be located |
| 29 // farther from the user's face usually. See http://crbug.com/348279 |
| 30 const unsigned int kHighDensityDPIThresholdLarge = 150; |
| 31 |
| 32 // The width threshold in mm for "large" monitors. |
| 33 const int kLargeDisplayWidthThresholdMM = 500; |
| 34 |
| 35 // 1 inch in mm. |
| 36 const float kInchInMm = 25.4f; |
| 37 |
23 } // namespace | 38 } // namespace |
24 | 39 |
25 bool IsDisplaySizeBlackListed(const gfx::Size& physical_size) { | 40 bool IsDisplaySizeBlackListed(const gfx::Size& physical_size) { |
26 // Ignore if the reported display is smaller than minimum size. | 41 // Ignore if the reported display is smaller than minimum size. |
27 if (physical_size.width() <= kInvalidDisplaySizeList[0][0] || | 42 if (physical_size.width() <= kInvalidDisplaySizeList[0][0] || |
28 physical_size.height() <= kInvalidDisplaySizeList[0][1]) { | 43 physical_size.height() <= kInvalidDisplaySizeList[0][1]) { |
29 LOG(WARNING) << "Smaller than minimum display size"; | 44 LOG(WARNING) << "Smaller than minimum display size"; |
30 return true; | 45 return true; |
31 } | 46 } |
32 for (size_t i = 1; i < arraysize(kInvalidDisplaySizeList); ++i) { | 47 for (size_t i = 1; i < arraysize(kInvalidDisplaySizeList); ++i) { |
33 const gfx::Size size(kInvalidDisplaySizeList[i][0], | 48 const gfx::Size size(kInvalidDisplaySizeList[i][0], |
34 kInvalidDisplaySizeList[i][1]); | 49 kInvalidDisplaySizeList[i][1]); |
35 if (physical_size == size) { | 50 if (physical_size == size) { |
36 LOG(WARNING) << "Black listed display size detected:" << size.ToString(); | 51 LOG(WARNING) << "Black listed display size detected:" << size.ToString(); |
37 return true; | 52 return true; |
38 } | 53 } |
39 } | 54 } |
40 return false; | 55 return false; |
41 } | 56 } |
42 | 57 |
| 58 float GetScaleFactor(const gfx::Size& physical_size_in_mm, |
| 59 const gfx::Size& screen_size_in_pixels) { |
| 60 if (IsDisplaySizeBlackListed(physical_size_in_mm)) |
| 61 return 1.0f; |
| 62 |
| 63 const unsigned int dpi = (kInchInMm * screen_size_in_pixels.width() / |
| 64 physical_size_in_mm.width()); |
| 65 const unsigned int threshold = |
| 66 (physical_size_in_mm.width() >= kLargeDisplayWidthThresholdMM) ? |
| 67 kHighDensityDPIThresholdLarge : kHighDensityDPIThresholdSmall; |
| 68 return (dpi > threshold) ? 2.0f : 1.0f; |
| 69 } |
| 70 |
43 } // namespace ui | 71 } // namespace ui |
OLD | NEW |