port from perforce

This commit is contained in:
2026-04-18 22:31:51 +02:00
commit 8d0ab5b7cc
8409 changed files with 3972376 additions and 0 deletions

View 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
}
}