port from perforce
This commit is contained in:
104
aiwaz/Aiwaz.Core/DeviceEnumerator/OutputDevice.cs
Normal file
104
aiwaz/Aiwaz.Core/DeviceEnumerator/OutputDevice.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user