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 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(); } ~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 } }