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
3// found in the LICENSE file.
4
5#include "ui/display/util/display_util.h"
6
7#include "base/logging.h"
8
9namespace ui {
10
11namespace {
12
13// A list of bogus sizes in mm that should be ignored.
14// See crbug.com/136533. The first element maintains the minimum
15// size required to be valid size.
16const int kInvalidDisplaySizeList[][2] = {
17  {40, 30},
18  {50, 40},
19  {160, 90},
20  {160, 100},
21};
22
23// The DPI threshold to detect high density screen.
24// Higher DPI than this will use device_scale_factor=2.
25const 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
30const unsigned int kHighDensityDPIThresholdLarge = 150;
31
32// The width threshold in mm for "large" monitors.
33const int kLargeDisplayWidthThresholdMM = 500;
34
35// 1 inch in mm.
36const float kInchInMm = 25.4f;
37
38}  // namespace
39
40bool IsDisplaySizeBlackListed(const gfx::Size& physical_size) {
41  // Ignore if the reported display is smaller than minimum size.
42  if (physical_size.width() <= kInvalidDisplaySizeList[0][0] ||
43      physical_size.height() <= kInvalidDisplaySizeList[0][1]) {
44    VLOG(1) << "Smaller than minimum display size";
45    return true;
46  }
47  for (size_t i = 1; i < arraysize(kInvalidDisplaySizeList); ++i) {
48    const gfx::Size size(kInvalidDisplaySizeList[i][0],
49                         kInvalidDisplaySizeList[i][1]);
50    if (physical_size == size) {
51      VLOG(1) << "Black listed display size detected:" << size.ToString();
52      return true;
53    }
54  }
55  return false;
56}
57
58float 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
71}  // namespace ui
72