text: // Copyright 2016 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "ui/display/win/display_info.h"
  
  #include "base/hash.h"
  #include "base/strings/utf_string_conversions.h"
  
  namespace display {
  namespace {
  
  Display::Rotation GetRotationForDevice(const wchar_t* device_name) {
    DEVMODE mode;
    ::ZeroMemory(&mode, sizeof(mode));
    mode.dmSize = sizeof(mode);
    mode.dmDriverExtra = 0;
    if (::EnumDisplaySettings(device_name, ENUM_CURRENT_SETTINGS, &mode)) {
      switch (mode.dmDisplayOrientation) {
      case DMDO_DEFAULT:
        return Display::ROTATE_0;
      case DMDO_90:
        return Display::ROTATE_90;
      case DMDO_180:
        return Display::ROTATE_180;
      case DMDO_270:
        return Display::ROTATE_270;
      default:
        NOTREACHED();
      }
    }
    return Display::ROTATE_0;
  }
  
  }  // namespace
  
  namespace win {
  
  DisplayInfo::DisplayInfo(const MONITORINFOEX& monitor_info,
                           float device_scale_factor)
      : DisplayInfo(monitor_info,
                    device_scale_factor,
                    GetRotationForDevice(monitor_info.szDevice)) {}
  
  DisplayInfo::DisplayInfo(const MONITORINFOEX& monitor_info,
                           float device_scale_factor,
                           Display::Rotation rotation)
      : id_(DeviceIdFromDeviceName(monitor_info.szDevice)),
        rotation_(rotation),
        screen_rect_(monitor_info.rcMonitor),
        screen_work_rect_(monitor_info.rcWork),
        device_scale_factor_(device_scale_factor) {}
  
  // static
  int64_t DisplayInfo::DeviceIdFromDeviceName(const wchar_t* device_name) {
    return static_cast<int64_t>(base::Hash(base::WideToUTF8(device_name)));
  }
  
  }  // namespace win
  }  // namespace display
  