105 lines
3.6 KiB
C#
105 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Aiwaz.Contracts;
|
|
using SlimDX;
|
|
|
|
namespace Aiwaz.Core
|
|
{
|
|
public class OutputDevice : IDisposable
|
|
{
|
|
private SlimDX.DXGI.OutputDescription outputDesc;
|
|
private DeviceEnumerator deviceEnumerator;
|
|
|
|
public SlimDX.DXGI.Output Output { get; private set; }
|
|
|
|
public bool HasEnumerated
|
|
{
|
|
get { return DisplayModes.Count > 0; }
|
|
}
|
|
|
|
public List<DisplayMode> DisplayModes { get; private set; }
|
|
|
|
public string Name
|
|
{
|
|
get { return outputDesc.Name; }
|
|
}
|
|
|
|
public OutputDevice(DeviceEnumerator argDeviceEnumerator, SlimDX.DXGI.Output argOutput)
|
|
{
|
|
this.deviceEnumerator = argDeviceEnumerator;
|
|
this.Output = argOutput;
|
|
this.DisplayModes = new List<DisplayMode>();
|
|
}
|
|
|
|
~OutputDevice()
|
|
{
|
|
this.Dispose();
|
|
}
|
|
|
|
public bool TryEnumerate()
|
|
{
|
|
for ( int formatIndex = (int)deviceEnumerator.DesiredFormat;
|
|
formatIndex <= (deviceEnumerator.DesiredFormat == SlimDX.DXGI.Format.Unknown ? (int)SlimDX.DXGI.Format.B8G8R8X8_UNorm : (int)deviceEnumerator.DesiredFormat);
|
|
++formatIndex
|
|
)
|
|
{
|
|
var format = (SlimDX.DXGI.Format)formatIndex;
|
|
var flags = SlimDX.DXGI.DisplayModeEnumerationFlags.Scaling;
|
|
var displayModes = Output.GetDisplayModeList(format, flags);
|
|
if (displayModes.Count > 0)
|
|
{
|
|
foreach (var displayModeRaw in displayModes)
|
|
{
|
|
var keepDisplayMode = false;
|
|
var refreshRate = displayModeRaw.RefreshRate.Numerator == 0 ? 0 : (int)(displayModeRaw.RefreshRate.Numerator / displayModeRaw.RefreshRate.Denominator);
|
|
if ((deviceEnumerator.DesiredWidth == 0 || deviceEnumerator.DesiredWidth <= displayModeRaw.Width) &&
|
|
(deviceEnumerator.DesiredHeight == 0 || deviceEnumerator.DesiredHeight <= displayModeRaw.Height) &&
|
|
(deviceEnumerator.DesiredRefreshRate == 0 || deviceEnumerator.DesiredRefreshRate <= refreshRate) &&
|
|
(deviceEnumerator.DesiredFormat == SlimDX.DXGI.Format.Unknown || (int)deviceEnumerator.DesiredFormat == (int)displayModeRaw.Format))
|
|
{
|
|
if (deviceEnumerator.Device != null)
|
|
{
|
|
var supported = deviceEnumerator.Device.CheckFormatSupport(format);
|
|
|
|
if ((supported & SlimDX.Direct3D10.FormatSupport.FormatDisplaySupport) != 0)
|
|
keepDisplayMode = true;
|
|
}
|
|
else
|
|
keepDisplayMode = true;
|
|
}
|
|
if (keepDisplayMode)
|
|
DisplayModes.Add(new DisplayMode(displayModeRaw));
|
|
}
|
|
}
|
|
}
|
|
|
|
return HasEnumerated;
|
|
}
|
|
|
|
public DisplayMode FindBestDisplayMode(bool argAllowToEnumerate)
|
|
{
|
|
if (argAllowToEnumerate && !this.TryEnumerate())
|
|
return null;
|
|
|
|
if (!HasEnumerated)
|
|
return null;
|
|
|
|
return DisplayModes.Last();
|
|
}
|
|
|
|
|
|
#region IDisposable Members
|
|
|
|
public void Dispose()
|
|
{
|
|
if (Output != null)
|
|
Output.Dispose();
|
|
Output = null;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|