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