blob: 25e89524c7a10ad47a4d3afca5f8fb8859857012 [file] [log] [blame]
blundell8e66adc2015-10-12 11:46:121// Copyright 2015 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 "components/metrics/ui/screen_info_metrics_provider.h"
6
avi26062922015-12-26 00:14:187#include "build/build_config.h"
Steven Holtef9d5ed62017-10-21 02:02:308#include "third_party/metrics_proto/system_profile.pb.h"
oshima888290a2016-05-13 20:36:069#include "ui/display/display.h"
oshimaecaa7b62016-04-28 20:04:4010#include "ui/display/screen.h"
blundell8e66adc2015-10-12 11:46:1211
12namespace metrics {
13
14#if defined(OS_WIN)
15
16#include <windows.h>
17
18namespace {
19
20struct ScreenDPIInformation {
21 double max_dpi_x;
22 double max_dpi_y;
23};
24
25// Called once for each connected monitor.
26BOOL CALLBACK GetMonitorDPICallback(HMONITOR, HDC hdc, LPRECT, LPARAM dwData) {
27 const double kMillimetersPerInch = 25.4;
28 ScreenDPIInformation* screen_info =
29 reinterpret_cast<ScreenDPIInformation*>(dwData);
30 // Size of screen, in mm.
31 DWORD size_x = GetDeviceCaps(hdc, HORZSIZE);
32 DWORD size_y = GetDeviceCaps(hdc, VERTSIZE);
33 double dpi_x = (size_x > 0) ?
34 GetDeviceCaps(hdc, HORZRES) / (size_x / kMillimetersPerInch) : 0;
35 double dpi_y = (size_y > 0) ?
36 GetDeviceCaps(hdc, VERTRES) / (size_y / kMillimetersPerInch) : 0;
37 screen_info->max_dpi_x = std::max(dpi_x, screen_info->max_dpi_x);
38 screen_info->max_dpi_y = std::max(dpi_y, screen_info->max_dpi_y);
39 return TRUE;
40}
41
42void WriteScreenDPIInformationProto(SystemProfileProto::Hardware* hardware) {
43 HDC desktop_dc = GetDC(NULL);
44 if (desktop_dc) {
45 ScreenDPIInformation si = {0, 0};
46 if (EnumDisplayMonitors(desktop_dc, NULL, GetMonitorDPICallback,
47 reinterpret_cast<LPARAM>(&si))) {
48 hardware->set_max_dpi_x(si.max_dpi_x);
49 hardware->set_max_dpi_y(si.max_dpi_y);
50 }
51 ReleaseDC(GetDesktopWindow(), desktop_dc);
52 }
53}
54
55} // namespace
56
57#endif // defined(OS_WIN)
58
59ScreenInfoMetricsProvider::ScreenInfoMetricsProvider() {
60}
61
62ScreenInfoMetricsProvider::~ScreenInfoMetricsProvider() {
63}
64
65void ScreenInfoMetricsProvider::ProvideSystemProfileMetrics(
66 SystemProfileProto* system_profile_proto) {
67 SystemProfileProto::Hardware* hardware =
68 system_profile_proto->mutable_hardware();
69
70 const gfx::Size display_size = GetScreenSize();
71 hardware->set_primary_screen_width(display_size.width());
72 hardware->set_primary_screen_height(display_size.height());
73 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor());
74 hardware->set_screen_count(GetScreenCount());
75
76#if defined(OS_WIN)
77 WriteScreenDPIInformationProto(hardware);
78#endif
79}
80
81gfx::Size ScreenInfoMetricsProvider::GetScreenSize() const {
oshimaecaa7b62016-04-28 20:04:4082 return display::Screen::GetScreen()->GetPrimaryDisplay().GetSizeInPixel();
blundell8e66adc2015-10-12 11:46:1283}
84
85float ScreenInfoMetricsProvider::GetScreenDeviceScaleFactor() const {
oshimaecaa7b62016-04-28 20:04:4086 return display::Screen::GetScreen()
87 ->GetPrimaryDisplay()
88 .device_scale_factor();
blundell8e66adc2015-10-12 11:46:1289}
90
91int ScreenInfoMetricsProvider::GetScreenCount() const {
oshimaecaa7b62016-04-28 20:04:4092 return display::Screen::GetScreen()->GetNumDisplays();
blundell8e66adc2015-10-12 11:46:1293}
94
95} // namespace metrics