Always validate parameters to ReadBit/EnableBit/DisableBit before using them.
This commit is contained in:
parent
fa0abf0d51
commit
1657bcad91
2 changed files with 72 additions and 15 deletions
|
@ -39,7 +39,8 @@ namespace OpenTK.Input
|
|||
#region Fields
|
||||
|
||||
// Allocate enough ints to store all keyboard keys
|
||||
const int NumInts = ((int)Key.LastKey + 31) / 32;
|
||||
const int IntSize = sizeof(int);
|
||||
const int NumInts = ((int)Key.LastKey + IntSize - 1) / IntSize;
|
||||
// The following line triggers bogus CS0214 in gmcs 2.0.1, sigh...
|
||||
unsafe fixed int Keys[NumInts];
|
||||
|
||||
|
@ -47,6 +48,24 @@ namespace OpenTK.Input
|
|||
|
||||
#region Public Members
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="System.Boolean"/> indicating whether the specified
|
||||
/// <see cref="OpenTK.Input.Key"/> is pressed.
|
||||
/// </summary>
|
||||
/// <param name="key">The <see cref="OpenTK.Input.Key"/> to check.</param>
|
||||
/// <returns>True if key is pressed; false otherwise.</returns>
|
||||
public bool this[Key key]
|
||||
{
|
||||
get { return IsKeyDown(key); }
|
||||
internal set
|
||||
{
|
||||
if (value)
|
||||
EnableBit((int)key);
|
||||
else
|
||||
DisableBit((int)key);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="System.Boolean"/> indicating whether this key is down.
|
||||
/// </summary>
|
||||
|
@ -71,6 +90,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal bool ReadBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -84,6 +105,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal void EnableBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -97,6 +120,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal void DisableBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -110,6 +135,16 @@ namespace OpenTK.Input
|
|||
|
||||
#endregion
|
||||
|
||||
#region Private Members
|
||||
|
||||
static void ValidateOffset(int offset)
|
||||
{
|
||||
if (offset < 0 || offset >= NumInts * IntSize)
|
||||
throw new ArgumentOutOfRangeException("offset");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEquatable<KeyboardState> Members
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -39,7 +39,8 @@ namespace OpenTK.Input
|
|||
#region Fields
|
||||
|
||||
// Allocate enough ints to store all mouse buttons
|
||||
const int NumInts = ((int)MouseButton.LastButton + 31) / 32;
|
||||
const int IntSize = sizeof(int);
|
||||
const int NumInts = ((int)MouseButton.LastButton + IntSize - 1) / IntSize;
|
||||
// The following line triggers bogus CS0214 in gmcs 2.0.1, sigh...
|
||||
unsafe fixed int Buttons[NumInts];
|
||||
int x, y;
|
||||
|
@ -49,6 +50,24 @@ namespace OpenTK.Input
|
|||
|
||||
#region Public Members
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="System.Boolean"/> indicating whether the specified
|
||||
/// <see cref="OpenTK.Input.MouseButton"/> is pressed.
|
||||
/// </summary>
|
||||
/// <param name="button">The <see cref="OpenTK.Input.MouseButton"/> to check.</param>
|
||||
/// <returns>True if key is pressed; false otherwise.</returns>
|
||||
public bool this[MouseButton button]
|
||||
{
|
||||
get { return IsButtonDown(button); }
|
||||
internal set
|
||||
{
|
||||
if (value)
|
||||
EnableBit((int)button);
|
||||
else
|
||||
DisableBit((int)button);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="System.Boolean"/> indicating whether this button is down.
|
||||
/// </summary>
|
||||
|
@ -106,19 +125,6 @@ namespace OpenTK.Input
|
|||
internal set { y = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a System.Boolean indicating the state of the specified MouseButton.
|
||||
/// </summary>
|
||||
/// <param name="button">The MouseButton to check.</param>
|
||||
/// <returns>True if the MouseButton is pressed, false otherwise.</returns>
|
||||
public bool this[MouseButton button]
|
||||
{
|
||||
get
|
||||
{
|
||||
return IsButtonDown(button);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="System.Boolean" indicating whether the left mouse button is pressed.
|
||||
/// This property is intended for XNA compatibility.
|
||||
|
@ -251,6 +257,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal bool ReadBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -264,6 +272,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal void EnableBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -277,6 +287,8 @@ namespace OpenTK.Input
|
|||
|
||||
internal void DisableBit(int offset)
|
||||
{
|
||||
ValidateOffset(offset);
|
||||
|
||||
int int_offset = offset / 32;
|
||||
int bit_offset = offset % 32;
|
||||
unsafe
|
||||
|
@ -290,6 +302,16 @@ namespace OpenTK.Input
|
|||
|
||||
#endregion
|
||||
|
||||
#region Private Members
|
||||
|
||||
static void ValidateOffset(int offset)
|
||||
{
|
||||
if (offset < 0 || offset >= NumInts * IntSize)
|
||||
throw new ArgumentOutOfRangeException("offset");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEquatable<MouseState> Members
|
||||
|
||||
/// <summary>
|
||||
|
|
Loading…
Reference in a new issue