2
0

CmWin32VideoModeInfo.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "CmWin32VideoModeInfo.h"
  2. #include "CmMath.h"
  3. #include "CmException.h"
  4. namespace BansheeEngine
  5. {
  6. BOOL CALLBACK monitorEnumCallback(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM lParam)
  7. {
  8. Vector<VideoOutputInfo*>* outputInfos = (Vector<VideoOutputInfo*>*)lParam;
  9. outputInfos->push_back(cm_new<Win32VideoOutputInfo>(hMonitor));
  10. return TRUE;
  11. };
  12. Win32VideoModeInfo::Win32VideoModeInfo()
  13. {
  14. EnumDisplayMonitors(0, nullptr, &monitorEnumCallback, (LPARAM)&mOutputs);
  15. }
  16. Win32VideoOutputInfo::Win32VideoOutputInfo(HMONITOR monitorHandle)
  17. :mMonitorHandle(monitorHandle)
  18. {
  19. MONITORINFOEX monitorInfo;
  20. memset(&monitorInfo, 0, sizeof(MONITORINFOEX));
  21. monitorInfo.cbSize = sizeof(MONITORINFOEX);
  22. GetMonitorInfo(mMonitorHandle, &monitorInfo);
  23. mName = monitorInfo.szDevice;
  24. DEVMODE devMode;
  25. devMode.dmSize = sizeof(DEVMODE);
  26. devMode.dmDriverExtra = 0;
  27. UINT32 i = 0;
  28. while (EnumDisplaySettings(monitorInfo.szDevice, i++, &devMode))
  29. {
  30. bool foundVideoMode = false;
  31. for (auto videoMode : mVideoModes)
  32. {
  33. Win32VideoMode* win32VideoMode = static_cast<Win32VideoMode*>(videoMode);
  34. if (win32VideoMode->mWidth == devMode.dmPelsWidth && win32VideoMode->mHeight == devMode.dmPelsHeight)
  35. {
  36. bool foundRefreshRate = false;
  37. for (auto refreshRate : win32VideoMode->mRefreshRates)
  38. {
  39. UINT32 intRefresh = Math::roundToInt(refreshRate);
  40. if (refreshRate == devMode.dmDisplayFrequency)
  41. {
  42. foundRefreshRate = true;
  43. break;
  44. }
  45. }
  46. if (!foundRefreshRate)
  47. {
  48. win32VideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
  49. }
  50. foundVideoMode = true;
  51. break;
  52. }
  53. }
  54. if (!foundVideoMode)
  55. {
  56. Win32VideoMode* videoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
  57. videoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
  58. mVideoModes.push_back(videoMode);
  59. }
  60. }
  61. // Get desktop display mode
  62. EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
  63. Win32VideoMode* desktopVideoMode = cm_new<Win32VideoMode>(devMode.dmPelsWidth, devMode.dmPelsHeight, this);
  64. desktopVideoMode->mRefreshRates.push_back((float)devMode.dmDisplayFrequency);
  65. mDesktopVideoMode = desktopVideoMode;
  66. }
  67. Win32VideoOutputInfo::~Win32VideoOutputInfo()
  68. {
  69. CloseHandle(mMonitorHandle);
  70. }
  71. Win32VideoMode::Win32VideoMode(UINT32 width, UINT32 height, VideoOutputInfo* outputInfo)
  72. :VideoMode(width, height, outputInfo)
  73. { }
  74. }