2007-08-10 11:27:13 +02:00
|
|
|
#region --- License ---
|
|
|
|
/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
|
|
|
|
* See license.txt for license info
|
|
|
|
*/
|
2007-07-23 02:15:18 +02:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Text;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
namespace Bind.Structures
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
#region Parameter class
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Represents a single parameter of an opengl function.
|
|
|
|
/// </summary>
|
2007-08-01 23:14:39 +02:00
|
|
|
public class Parameter : Type
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
#region Constructors
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a new Parameter without type and name.
|
|
|
|
/// </summary>
|
|
|
|
public Parameter()
|
2007-08-01 23:14:39 +02:00
|
|
|
:base()
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a new parameter from the parameters passed (deep copy).
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="p">The parameter to copy from.</param>
|
|
|
|
public Parameter(Parameter p)
|
2007-08-01 23:14:39 +02:00
|
|
|
: base(p)
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
if (p == null)
|
|
|
|
return;
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
this.Name = !String.IsNullOrEmpty(p.Name) ? new string(p.Name.ToCharArray()) : "";
|
2007-07-23 02:15:18 +02:00
|
|
|
this.Unchecked = p.Unchecked;
|
|
|
|
this.UnmanagedType = p.UnmanagedType;
|
2007-08-01 11:27:57 +02:00
|
|
|
this.Flow = p.Flow;
|
2007-07-23 02:15:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
#region public string Name
|
2007-07-23 02:15:18 +02:00
|
|
|
|
|
|
|
string _name;
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets the name of the parameter.
|
|
|
|
/// </summary>
|
|
|
|
public string Name
|
|
|
|
{
|
|
|
|
get { return _name; }
|
|
|
|
set { _name = value; }
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region UnmanagedType property
|
|
|
|
|
|
|
|
UnmanagedType _unmanaged_type;
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets the name of the parameter.
|
|
|
|
/// </summary>
|
2007-08-01 23:14:39 +02:00
|
|
|
private UnmanagedType UnmanagedType
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
get { return _unmanaged_type; }
|
|
|
|
set { _unmanaged_type = value; }
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
#region public FlowDirection Flow
|
2007-07-23 02:15:18 +02:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Enumarates the possible flows of a parameter (ie. is this parameter
|
|
|
|
/// used as input or as output?)
|
|
|
|
/// </summary>
|
|
|
|
public enum FlowDirection
|
|
|
|
{
|
|
|
|
Undefined = 0,
|
|
|
|
In,
|
|
|
|
Out
|
|
|
|
}
|
|
|
|
|
|
|
|
FlowDirection _flow;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets the flow of the parameter.
|
|
|
|
/// </summary>
|
|
|
|
public FlowDirection Flow
|
|
|
|
{
|
|
|
|
get { return _flow; }
|
|
|
|
set { _flow = value; }
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
#region public bool NeedsPin
|
|
|
|
|
|
|
|
public bool NeedsPin
|
|
|
|
{
|
|
|
|
get { return
|
2007-08-01 23:14:39 +02:00
|
|
|
(Array > 0 || Reference || CurrentType == "object") &&
|
|
|
|
!CurrentType.ToLower().Contains("string");
|
|
|
|
}
|
2007-08-01 11:27:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region public bool Unchecked
|
|
|
|
|
|
|
|
private bool _unchecked;
|
|
|
|
|
|
|
|
public bool Unchecked
|
|
|
|
{
|
|
|
|
get { return _unchecked; }
|
|
|
|
set { _unchecked = value; }
|
|
|
|
}
|
|
|
|
|
2007-07-23 02:15:18 +02:00
|
|
|
#endregion
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
#region override public string ToString()
|
|
|
|
|
2007-07-23 02:15:18 +02:00
|
|
|
override public string ToString()
|
2007-08-01 11:27:57 +02:00
|
|
|
{
|
|
|
|
return ToString(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region public string ToString(bool taoCompatible)
|
|
|
|
|
|
|
|
public string ToString(bool taoCompatible)
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
//if (UnmanagedType == UnmanagedType.AsAny && Flow == FlowDirection.In)
|
|
|
|
// sb.Append("[MarshalAs(UnmanagedType.AsAny)] ");
|
2007-07-23 02:15:18 +02:00
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
//if (UnmanagedType == UnmanagedType.LPArray)
|
|
|
|
// sb.Append("[MarshalAs(UnmanagedType.LPArray)] ");
|
2007-07-23 02:15:18 +02:00
|
|
|
|
|
|
|
//if (Flow == FlowDirection.Out && !Array && !(Type == "IntPtr"))
|
|
|
|
// sb.Append("out ");
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
if (Flow == FlowDirection.Out)
|
|
|
|
sb.Append("[Out] ");
|
|
|
|
else if (Flow == FlowDirection.Undefined)
|
|
|
|
sb.Append("[In, Out] ");
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
if (Reference)
|
|
|
|
{
|
|
|
|
if (Flow == FlowDirection.Out)
|
|
|
|
sb.Append("out ");
|
|
|
|
else
|
|
|
|
sb.Append("ref ");
|
|
|
|
}
|
2007-07-23 02:15:18 +02:00
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
if (taoCompatible && Settings.Compatibility == Settings.Legacy.Tao)
|
|
|
|
{
|
|
|
|
if (Pointer)
|
|
|
|
{
|
|
|
|
sb.Append("IntPtr");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-08-01 23:14:39 +02:00
|
|
|
sb.Append(CurrentType);
|
2007-08-01 11:27:57 +02:00
|
|
|
if (Array > 0)
|
|
|
|
sb.Append("[]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-08-01 23:14:39 +02:00
|
|
|
sb.Append(CurrentType);
|
2007-08-01 11:27:57 +02:00
|
|
|
if (Pointer)
|
|
|
|
sb.Append("*");
|
|
|
|
if (Array > 0)
|
|
|
|
sb.Append("[]");
|
|
|
|
}
|
2007-07-23 02:15:18 +02:00
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
if (!String.IsNullOrEmpty(Name))
|
|
|
|
{
|
|
|
|
sb.Append(" ");
|
|
|
|
sb.Append(Utilities.Keywords.Contains(Name) ? "@" + Name : Name);
|
|
|
|
}
|
2007-07-23 02:15:18 +02:00
|
|
|
return sb.ToString();
|
|
|
|
}
|
2007-08-01 11:27:57 +02:00
|
|
|
|
2007-07-23 02:15:18 +02:00
|
|
|
#endregion
|
2007-08-01 23:14:39 +02:00
|
|
|
|
2007-08-10 11:27:13 +02:00
|
|
|
#region internal static Parameter Translate(Parameter par, string Category)
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
internal static Parameter Translate(Parameter par, string Category)
|
|
|
|
{
|
|
|
|
Enum @enum;
|
|
|
|
string s;
|
|
|
|
Parameter p = new Parameter(par);
|
2007-08-12 18:14:23 +02:00
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
// Translate enum types
|
|
|
|
if (Enum.GLEnums.TryGetValue(p.CurrentType, out @enum) && @enum.Name != "GLenum")
|
|
|
|
{
|
|
|
|
if (Settings.Compatibility == Settings.Legacy.Tao)
|
|
|
|
p.CurrentType = "int";
|
|
|
|
else
|
|
|
|
p.CurrentType = p.CurrentType.Insert(0, String.Format("{0}.", Settings.GLEnumsClass));
|
|
|
|
}
|
|
|
|
else if (Bind.Structures.Type.GLTypes.TryGetValue(p.CurrentType, out s))
|
|
|
|
{
|
|
|
|
// Check if the parameter is a generic GLenum. If yes,
|
|
|
|
// check if a better match exists:
|
|
|
|
if (s.Contains("GLenum") && !String.IsNullOrEmpty(Category))
|
|
|
|
{
|
|
|
|
if (Settings.Compatibility == Settings.Legacy.None)
|
|
|
|
{
|
|
|
|
// Better match: enum.Name == function.Category (e.g. GL_VERSION_1_1 etc)
|
|
|
|
if (Enum.GLEnums.ContainsKey(Category))
|
|
|
|
{
|
|
|
|
p.CurrentType = String.Format("{0}.{1}", Settings.GLEnumsClass, Category);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-08-03 02:14:31 +02:00
|
|
|
p.CurrentType = String.Format("{0}.{1}", Settings.GLEnumsClass, Settings.CompleteEnumName);
|
2007-08-01 23:14:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
p.CurrentType = "int";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// This is not enum, default translation:
|
|
|
|
p.CurrentType = s;
|
|
|
|
p.CurrentType =
|
|
|
|
Bind.Structures.Type.CSTypes.ContainsKey(p.CurrentType) ?
|
|
|
|
Bind.Structures.Type.CSTypes[p.CurrentType] : p.CurrentType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//if (CSTypes.ContainsKey(p.CurrentType))
|
|
|
|
// p.CurrentType = CSTypes[p.CurrentType];
|
|
|
|
|
|
|
|
// Translate pointer parameters
|
|
|
|
if (p.Pointer)
|
|
|
|
{
|
|
|
|
p.WrapperType = WrapperTypes.ArrayParameter;
|
|
|
|
|
|
|
|
if (p.CurrentType.ToLower().Contains("char") || p.CurrentType.ToLower().Contains("string"))
|
|
|
|
{
|
|
|
|
// char* or string -> [In] String or [Out] StringBuilder
|
|
|
|
p.CurrentType =
|
|
|
|
p.Flow == Parameter.FlowDirection.Out ?
|
|
|
|
"System.Text.StringBuilder" :
|
|
|
|
"System.String";
|
|
|
|
|
|
|
|
p.Pointer = false;
|
|
|
|
p.WrapperType = WrapperTypes.None;
|
|
|
|
}
|
|
|
|
else if (p.CurrentType.ToLower().Contains("void"))
|
|
|
|
{
|
|
|
|
p.WrapperType = WrapperTypes.GenericParameter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p.CurrentType.ToLower().Contains("bool"))
|
|
|
|
{
|
|
|
|
// Is this actually used anywhere?
|
|
|
|
p.WrapperType = WrapperTypes.BoolParameter;
|
|
|
|
}
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
2007-08-10 11:27:13 +02:00
|
|
|
|
|
|
|
#endregion
|
2007-07-23 02:15:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ParameterCollection class
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Holds the parameter list of an opengl function.
|
|
|
|
/// </summary>
|
|
|
|
public class ParameterCollection : List<Parameter>
|
|
|
|
{
|
|
|
|
#region Constructors
|
|
|
|
|
|
|
|
public ParameterCollection()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public ParameterCollection(ParameterCollection pc)
|
|
|
|
{
|
|
|
|
foreach (Parameter p in pc)
|
|
|
|
{
|
|
|
|
this.Add(new Parameter(p));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region override public string ToString()
|
|
|
|
|
|
|
|
/// <summary>
|
2007-08-01 11:27:57 +02:00
|
|
|
/// Gets the parameter declaration string.
|
2007-07-23 02:15:18 +02:00
|
|
|
/// </summary>
|
|
|
|
/// <returns>The parameter list of an opengl function in the form ( [parameters] )</returns>
|
|
|
|
override public string ToString()
|
2007-08-01 11:27:57 +02:00
|
|
|
{
|
2007-08-01 23:14:39 +02:00
|
|
|
return ToString(false);
|
2007-08-01 11:27:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
#region public string ToString(bool taoCompatible)
|
2007-08-01 11:27:57 +02:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the parameter declaration string.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="getCLSCompliant">If true, all types will be replaced by their CLSCompliant C# equivalents</param>
|
|
|
|
/// <param name="CSTypes">The list of C# types equivalent to the OpenGL types.</param>
|
|
|
|
/// <returns>The parameter list of an opengl function in the form ( [parameters] )</returns>
|
2007-08-01 23:14:39 +02:00
|
|
|
public string ToString(bool taoCompatible)
|
2007-07-23 02:15:18 +02:00
|
|
|
{
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.Append("(");
|
|
|
|
if (this.Count > 0)
|
|
|
|
{
|
|
|
|
foreach (Parameter p in this)
|
|
|
|
{
|
2007-08-01 11:27:57 +02:00
|
|
|
if (taoCompatible)
|
|
|
|
{
|
|
|
|
sb.Append(p.ToString(true));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sb.Append(p.ToString());
|
|
|
|
}
|
2007-07-23 02:15:18 +02:00
|
|
|
sb.Append(", ");
|
|
|
|
}
|
|
|
|
sb.Replace(", ", ")", sb.Length - 2, 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sb.Append(")");
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
}
|
|
|
|
|
2007-08-01 11:27:57 +02:00
|
|
|
#endregion
|
|
|
|
|
2007-08-01 23:14:39 +02:00
|
|
|
public string CallString()
|
|
|
|
{
|
|
|
|
return CallString(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public string CallString(bool taoCompatible)
|
|
|
|
{
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
|
|
sb.Append("(");
|
|
|
|
|
|
|
|
if (this.Count > 0)
|
|
|
|
{
|
|
|
|
foreach (Parameter p in this)
|
|
|
|
{
|
|
|
|
if (p.Unchecked)
|
|
|
|
sb.Append("unchecked((" + p.CurrentType + ")");
|
|
|
|
|
|
|
|
if (p.CurrentType != "object")
|
|
|
|
{
|
|
|
|
if (p.CurrentType.ToLower().Contains("string"))
|
|
|
|
{
|
|
|
|
sb.Append(String.Format(
|
|
|
|
"({0}{1})",
|
|
|
|
p.CurrentType,
|
|
|
|
(p.Array > 0) ? "[]" : ""));
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sb.Append(String.Format(
|
|
|
|
"({0}{1})",
|
|
|
|
p.CurrentType,
|
|
|
|
(p.Pointer || p.Array > 0 || p.Reference) ? "*" : ""));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sb.Append(
|
|
|
|
Utilities.Keywords.Contains(p.Name) ? "@" + p.Name : p.Name
|
|
|
|
);
|
|
|
|
|
|
|
|
if (p.Unchecked)
|
|
|
|
sb.Append(")");
|
|
|
|
|
|
|
|
sb.Append(", ");
|
|
|
|
}
|
|
|
|
sb.Replace(", ", ")", sb.Length - 2, 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sb.Append(")");
|
|
|
|
}
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
}
|
|
|
|
|
2007-07-23 02:15:18 +02:00
|
|
|
public bool ContainsType(string type)
|
|
|
|
{
|
|
|
|
foreach (Parameter p in this)
|
2007-08-01 23:14:39 +02:00
|
|
|
if (p.CurrentType == type)
|
2007-07-23 02:15:18 +02:00
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
}
|