Home | History | Annotate | Download | only in util
      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 
      9 namespace ui {
     10 
     11 namespace {
     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.
     16 const 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.
     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 
     38 }  // namespace
     39 
     40 bool 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 
     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 
     71 }  // namespace ui
     72