#region --- License ---
/* Licensed under the MIT/X11 license.
* Copyright (c) 2006-2008 the OpenTK team.
* This notice may not be removed.
* See license.txt for licensing detailed licensing details.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
#if !MINIMAL
using System.Drawing;
#endif
namespace OpenTK
{
/// Contains information regarding a monitor's display resolution.
public class DisplayResolution
{
Rectangle bounds;
int bits_per_pixel;
float refresh_rate;
#region --- Constructors ---
internal DisplayResolution() { }
#region public DisplayResolution(int width, int height, int bitsPerPixel, float refreshRate)
// Creates a new DisplayResolution object for the primary DisplayDevice.
internal DisplayResolution(int x, int y, int width, int height, int bitsPerPixel, float refreshRate)
{
// Refresh rate may be zero, since this information may not be available on some platforms.
if (width <= 0) throw new ArgumentOutOfRangeException("width", "Must be greater than zero.");
if (height <= 0) throw new ArgumentOutOfRangeException("height", "Must be greater than zero.");
if (bitsPerPixel <= 0) throw new ArgumentOutOfRangeException("bitsPerPixel", "Must be greater than zero.");
if (refreshRate < 0) throw new ArgumentOutOfRangeException("refreshRate", "Must be greater than, or equal to zero.");
this.bounds = new Rectangle(x, y, width, height);
this.bits_per_pixel = bitsPerPixel;
this.refresh_rate = refreshRate;
}
#endregion
#region public DisplayResolution(int width, int height, int bitsPerPixel, float refreshRate, DisplayDevice device)
#if false
///
/// Creates a new DisplayResolution object for the specified DisplayDevice.
///
/// The requested width in pixels.
/// The requested height in pixels.
/// The requested bits per pixel in bits.
/// The requested refresh rate in hertz.
/// OpenTK will select the closest match between all available resolutions on the specified DisplayDevice.
///
public DisplayResolution(int width, int height, int bitsPerPixel, float refreshRate, DisplayDevice device)
{
// Refresh rate may be zero, since this information may not be available on some platforms.
if (width <= 0) throw new ArgumentOutOfRangeException("width", "Must be greater than zero.");
if (height <= 0) throw new ArgumentOutOfRangeException("height", "Must be greater than zero.");
if (bitsPerPixel <= 0) throw new ArgumentOutOfRangeException("bitsPerPixel", "Must be greater than zero.");
if (refreshRate < 0) throw new ArgumentOutOfRangeException("refreshRate", "Must be greater than, or equal to zero.");
if (device == null) throw new ArgumentNullException("DisplayDevice", "Must be a valid DisplayDevice");
DisplayResolution res = device.SelectResolution(width, height, bitsPerPixel, refreshRate);
this.width = res.width;
this.height = res.height;
this.bits_per_pixel = res.bits_per_pixel;
this.refresh_rate = res.refresh_rate;
}
#endif
#endregion
#endregion
#region --- Public Methods ---
#region Bounds
///
/// Gets a System.Drawing.Rectangle that contains the bounds of this display device.
///
[Obsolete("This property will return invalid results if a monitor changes resolution. Use DisplayDevice.Bounds instead.")]
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public Rectangle Bounds
{
get { return bounds; }
}
#endregion
#region public int Width
/// Gets a System.Int32 that contains the width of this display in pixels.
public int Width
{
get { return bounds.Width; }
internal set { bounds.Width = value; }
}
#endregion
#region public int Height
/// Gets a System.Int32 that contains the height of this display in pixels.
public int Height
{
get { return bounds.Height; }
internal set { bounds.Height = value; }
}
#endregion
#region public int BitsPerPixel
/// Gets a System.Int32 that contains number of bits per pixel of this display. Typical values include 8, 16, 24 and 32.
public int BitsPerPixel
{
get { return bits_per_pixel; }
internal set { bits_per_pixel = value; }
}
#endregion
#region public float RefreshRate
///
/// Gets a System.Single representing the vertical refresh rate of this display.
///
public float RefreshRate
{
get { return refresh_rate; }
internal set { refresh_rate = value; }
}
#endregion
#endregion
#region --- Overrides ---
#region public override string ToString()
///
/// Returns a System.String representing this DisplayResolution.
///
/// A System.String representing this DisplayResolution.
public override string ToString()
{
return String.Format("{0}x{1}@{2}Hz", Bounds, bits_per_pixel, refresh_rate);
}
#endregion
#region public override bool Equals(object obj)
/// Determines whether the specified resolutions are equal.
/// The System.Object to check against.
/// True if the System.Object is an equal DisplayResolution; false otherwise.
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() == obj.GetType())
{
DisplayResolution res = (DisplayResolution)obj;
return
Width == res.Width &&
Height == res.Height &&
BitsPerPixel == res.BitsPerPixel &&
RefreshRate == res.RefreshRate;
}
return false;
}
#endregion
#region public override int GetHashCode()
/// Returns a unique hash representing this resolution.
/// A System.Int32 that may serve as a hash code for this resolution.
public override int GetHashCode()
{
return Bounds.GetHashCode() ^ bits_per_pixel ^ refresh_rate.GetHashCode();
}
#endregion
#endregion
#region --- Operator Overloads ---
///
/// Compares two instances for equality.
///
/// The first instance.
/// The second instance.
/// True, if left equals right; false otherwise.
public static bool operator== (DisplayResolution left, DisplayResolution right)
{
if (((object)left) == null && ((object)right) == null)
return true;
else if ((((object)left) == null && ((object)right) != null) ||
(((object)left) != null && ((object)right) == null))
return false;
return left.Equals(right);
}
///
/// Compares two instances for inequality.
///
/// The first instance.
/// The second instance.
/// True, if left does not equal right; false otherwise.
public static bool operator !=(DisplayResolution left, DisplayResolution right)
{
return !(left == right);
}
#endregion
}
}