Esempio n. 1
0
        /// <summary>
        /// Get the OpenGL "strong" name.
        /// </summary>
        /// <param name="specificationName">
        /// The OpenGL specification name to be converted.
        /// </param>
        /// <returns>
        /// It returns the name of the enumerant for the OpenGL binding.
        /// </returns>
        public static string GetExtensionBindingName(string specificationName)
        {
            if (specificationName == null)
            {
                throw new ArgumentNullException("specificationName");
            }

            int        namespaceIndex = specificationName.IndexOf("_");
            int        extIndex       = specificationName.IndexOf("_", namespaceIndex + 1);
            List <int> wordsIndices   = new List <int>();
            int        wordsIndex     = extIndex;

            wordsIndices.Add(extIndex + 1);
            while ((wordsIndex = specificationName.IndexOf("_", wordsIndex + 1)) >= 0)
            {
                wordsIndices.Add(wordsIndex + 1);
            }
            wordsIndices.Add(specificationName.Length + 1);

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < wordsIndices.Count - 1; i++)
            {
                string token = specificationName.Substring(wordsIndices[i], wordsIndices[i + 1] - wordsIndices[i] - 1);

                sb.Append(SpecificationStyle.EnsureFirstUpperCase(token));
            }

            sb.Append("_");
            sb.Append(specificationName.Substring(namespaceIndex + 1, extIndex - namespaceIndex - 1));

            return(GetLegalCsField(sb.ToString()));
        }
Esempio n. 2
0
        private static void GenerateVersionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Versions.cs", _OutputBasePath, ctx.Class);

            Console.WriteLine("Generate version support class to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("#region Known Versions Constants");
                sw.WriteLine();

                foreach (Feature featureVersion in ctx.Registry.Features)
                {
                    if (featureVersion.Number == null)
                    {
                        continue;
                    }

                    // Determine version value (support up to 3 version numbers)
                    Match versionMatch = Regex.Match(featureVersion.Number, @"(?<Major>\d+)\.(?<Minor>\d+)(\.(?<Rev>\d+))?");
                    if (versionMatch.Success == false)
                    {
                        continue;
                    }

                    int versionMajor = Int32.Parse(versionMatch.Groups["Major"].Value);
                    int versionMinor = Int32.Parse(versionMatch.Groups["Minor"].Value);
                    int versionRev   = versionMatch.Groups["Rev"].Success ? Int32.Parse(versionMatch.Groups["Rev"].Value) : 0;

                    int versionValue = versionMajor * 100 + versionMinor * 10 + versionRev;

                    // Determine version/api name
                    string versionName = String.Format("Version_{0}", versionValue);
                    string api         = ctx.Class;

                    if (featureVersion.IsEsVersion)
                    {
                        versionName = String.Format("Version_{0}_ES", versionValue);
                        switch (versionMajor)
                        {
                        case 1:
                            api = "Gles1";
                            break;

                        case 2:
                        default:
                            api = "Gles2";
                            break;
                        }
                    }
                    else if (featureVersion.IsScVersion)
                    {
                        versionName = String.Format("Version_{0}_SC", versionValue);
                        api         = "Glsc2";
                    }

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Version for {0} API.", SpecificationStyle.GetKhronosVersionHumanReadable(featureVersion.Name));
                    sw.WriteLine("/// </summary>");
                    if (versionRev != 0)
                    {
                        sw.WriteLine("public static readonly KhronosVersion {0} = new KhronosVersion({1}, {2}, {3}, KhronosVersion.Api{4});", versionName, versionMajor, versionMinor, versionRev, api);
                    }
                    else
                    {
                        sw.WriteLine("public static readonly KhronosVersion {0} = new KhronosVersion({1}, {2}, KhronosVersion.Api{3});", versionName, versionMajor, versionMinor, api);
                    }
                    sw.WriteLine();
                }

                sw.WriteLine("#endregion");
                sw.WriteLine();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
Esempio n. 3
0
        private static void GenerateLimitsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Limits.cs", _OutputBasePath, ctx.Class);

            List <Enumerant> limitEnums = new List <Enumerant>();

            foreach (Enumerant enumerant in ctx.Registry.Enumerants)
            {
                // Skip enumeration with aliases
                if (enumerant.EnumAlias != null)
                {
                    continue;
                }

                bool maxLimit = enumerant.Name.StartsWith("GL_MAX_");
                bool minLimit = enumerant.Name.StartsWith("GL_MIN_");

                if (!maxLimit && !minLimit)
                {
                    continue;
                }

                if (CommandFlagsDatabase.IsExcludedLimit(enumerant.Name))
                {
                    continue;
                }

                limitEnums.Add(enumerant);
            }

            foreach (CommandFlagsDatabase.Limit limit in CommandFlagsDatabase.GetLimits())
            {
                if (limitEnums.Exists(delegate(Enumerant item) { return(item.Name == limit.Name); }))
                {
                    continue;
                }

                Enumerant addedEnum = ctx.Registry.GetEnumerant(limit.Name);

                Debug.Assert(addedEnum != null);
                if (addedEnum == null)
                {
                    continue;
                }

                limitEnums.Add(addedEnum);
            }

            Console.WriteLine("Generate API limits to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("using System;");
                sw.WriteLine();

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("/// <summary>");
                sw.WriteLine("/// Limits support listing.");
                sw.WriteLine("/// </summary>");
                sw.WriteLine("public sealed partial class Limits");
                sw.WriteLine("{");
                sw.Indent();

                foreach (Enumerant enumerant in limitEnums)
                {
                    // Filter enumerant
                    CommandFlagsDatabase.Limit limit = CommandFlagsDatabase.GetLimit(enumerant.Name);
                    string fieldName   = SpecificationStyle.GetCamelCase(enumerant.ImplementationName);
                    string fieldType   = "int";
                    int    fieldLength = 1;

                    if (limit != null)
                    {
                        fieldType   = limit.Type;
                        fieldLength = limit.Length;
                    }

                    enumerant.GenerateDocumentation(sw, ctx);
                    if (fieldLength > 1)
                    {
                        sw.WriteLine("[Limit({0}, ArrayLength = {1})]", enumerant.ImplementationName, fieldLength);
                        enumerant.GenerateRequirements(sw, ctx);

                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("public {0}[] {1} = new {0}[] {{", fieldType, fieldName);
                        for (int i = 0; i < fieldLength; i++)
                        {
                            switch (fieldType)
                            {
                            case "int":
                                sb.Append("0");
                                break;

                            case "float":
                                sb.Append("0.0f");
                                break;
                            }
                            if (i < fieldLength - 1)
                            {
                                sb.Append(", ");
                            }
                        }

                        sb.Append(" };");

                        sw.WriteLine(sb.ToString());
                    }
                    else
                    {
                        sw.WriteLine("[Limit({0})]", enumerant.ImplementationName);
                        enumerant.GenerateRequirements(sw, ctx);
                        sw.WriteLine("public {0} {1};", fieldType, fieldName);
                    }
                    sw.WriteLine();
                }

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
Esempio n. 4
0
        private static void GenerateExtensionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Extensions.cs", _OutputBasePath, ctx.Class);

            Console.WriteLine("Generate registry khronosExtensions to {0}.", path);

            SortedList <int, List <IFeature> > khronosExtensions = new SortedList <int, List <IFeature> >();
            SortedList <int, List <IFeature> > vendorExtensions  = new SortedList <int, List <IFeature> >();

            foreach (IFeature feature in ctx.Registry.Extensions)
            {
                SortedList <int, List <IFeature> > extensionDict;
                List <IFeature> extensionFeatures;

                if (Extension.IsArbVendor(feature.Name))
                {
                    extensionDict = khronosExtensions;
                }
                else
                {
                    extensionDict = vendorExtensions;
                }

                int index = ExtensionIndices.GetIndex(feature.Name);

                if (extensionDict.TryGetValue(index, out extensionFeatures) == false)
                {
                    extensionFeatures = new List <IFeature>();
                    extensionDict.Add(index, extensionFeatures);
                }

                extensionFeatures.Add(feature);
            }

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("using System;");
                sw.WriteLine();

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("/// <summary>");
                sw.WriteLine("/// Extension support listing.");
                sw.WriteLine("/// </summary>");
                sw.WriteLine("public partial class Extensions : ExtensionsCollection");
                sw.WriteLine("{");
                sw.Indent();

                foreach (KeyValuePair <int, List <IFeature> > pair in khronosExtensions)
                {
                    IFeature mainFeature        = pair.Value[0];
                    string   extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
                    sw.WriteLine("/// </summary>");
                    foreach (IFeature feature in pair.Value)
                    {
                        if (feature.Api != null && feature.Api != ctx.Class.ToLower())
                        {
                            sw.WriteLine("[Extension(\"{0}\", Api = \"{1}\")]", feature.Name, feature.Api);
                        }
                        else
                        {
                            sw.WriteLine("[Extension(\"{0}\")]", feature.Name);
                        }
                    }

                    Extension mainExtension = (Extension)mainFeature;
                    if (String.IsNullOrEmpty(mainExtension.Supported) == false)
                    {
                        sw.WriteLine("[ExtensionSupport(\"{0}\")]", mainExtension.Supported);
                    }

                    sw.WriteLine("public bool {0};", extensionFieldName);
                    sw.WriteLine();
                }

                foreach (KeyValuePair <int, List <IFeature> > pair in vendorExtensions)
                {
                    IFeature mainFeature        = pair.Value[0];
                    string   extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
                    sw.WriteLine("/// </summary>");
                    foreach (IFeature feature in pair.Value)
                    {
                        if (feature.Api != null && feature.Api != ctx.Class.ToLower())
                        {
                            sw.WriteLine("[Extension(\"{0}\", Api = \"{1}\")]", feature.Name, feature.Api);
                        }
                        else
                        {
                            sw.WriteLine("[Extension(\"{0}\")]", feature.Name);
                        }
                    }

                    sw.WriteLine("public bool {0};", extensionFieldName);
                    sw.WriteLine();
                }

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
Esempio n. 5
0
        private static void GenerateVersionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("OpenGL.NET/{0}.Versions.cs", ctx.Class);

            Console.WriteLine("Generate version support class to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("namespace OpenGL");
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("#region Known Versions Constants");
                sw.WriteLine();

                foreach (Feature featureVersion in ctx.Registry.Features)
                {
                    if (featureVersion.Number == null)
                    {
                        continue;
                    }

                    // Determine version value (support up to 3 version numbers)
                    Match versionMatch = Regex.Match(featureVersion.Number, @"(?<Major>\d+)\.(?<Minor>\d+)(\.(?<Rev>\d+))?");
                    if (versionMatch.Success == false)
                    {
                        continue;
                    }

                    int versionMajor = Int32.Parse(versionMatch.Groups["Major"].Value);
                    int versionMinor = Int32.Parse(versionMatch.Groups["Minor"].Value);
                    int versionRev   = versionMatch.Groups["Rev"].Success ? Int32.Parse(versionMatch.Groups["Rev"].Value) : 0;

                    int versionValue = versionMajor * 100 + versionMinor * 10 + versionRev;

                    // Determine version name
                    string versionName = String.Format("Version_{0}", versionValue);
                    if (featureVersion.IsEsVersion)
                    {
                        versionName = String.Format("Version_{0}ES", versionValue);
                    }

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Version for {0} API.", SpecificationStyle.GetKhronosVersionHumanReadable(featureVersion.Name));
                    sw.WriteLine("/// </summary>");
                    sw.WriteLine("public const int {0} = {1};", versionName, versionValue);
                    sw.WriteLine();
                }

                sw.WriteLine("#endregion");
                sw.WriteLine();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }