opengl-registry 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +85 -0
- data/Rakefile +3 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/opengl/registry.rb +318 -0
- data/lib/opengl/registry/argument.rb +60 -0
- data/lib/opengl/registry/enum.rb +64 -0
- data/lib/opengl/registry/extension.rb +23 -0
- data/lib/opengl/registry/feature.rb +48 -0
- data/lib/opengl/registry/feature_group.rb +38 -0
- data/lib/opengl/registry/feature_provider.rb +45 -0
- data/lib/opengl/registry/function.rb +86 -0
- data/lib/opengl/registry/group.rb +62 -0
- data/lib/opengl/registry/native_type.rb +59 -0
- data/lib/opengl/registry/token.rb +29 -0
- data/lib/opengl/registry/version.rb +10 -0
- data/lib/opengl/registry/words.rb +39 -0
- data/lib/opengl/spec.rb +176 -0
- data/opengl-registry.gemspec +37 -0
- metadata +103 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes an individual argument of an OpenGL function.
|
6
|
+
class Argument < Token
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [String] the name of the argument
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [NativeType] the type of the argument.
|
14
|
+
attr_reader :type
|
15
|
+
|
16
|
+
##
|
17
|
+
# @return [String?] a hint for any length constraints of an argument, such as a C-style array,
|
18
|
+
# @note This may be a numerical value, reference to another "count" argument, etc.
|
19
|
+
attr_reader :length
|
20
|
+
|
21
|
+
##
|
22
|
+
# Creates a new instance of the {Argument} class.
|
23
|
+
#
|
24
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
25
|
+
def initialize(node)
|
26
|
+
super(node)
|
27
|
+
|
28
|
+
base = nil
|
29
|
+
buffer = ''
|
30
|
+
node.nodes.each do |child|
|
31
|
+
|
32
|
+
# Don't care about comments
|
33
|
+
next if child.is_a?(Ox::Comment)
|
34
|
+
|
35
|
+
# Raw text
|
36
|
+
if child.is_a?(String)
|
37
|
+
buffer << child
|
38
|
+
next
|
39
|
+
end
|
40
|
+
|
41
|
+
# Child node
|
42
|
+
case child.name
|
43
|
+
when Words::PTYPE
|
44
|
+
base = child.text
|
45
|
+
buffer << base
|
46
|
+
when Words::NAME
|
47
|
+
@name = child.text
|
48
|
+
else
|
49
|
+
next
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
@length = node[Words::LENGTH]
|
54
|
+
group = node[Words::GROUP]
|
55
|
+
@type = NativeType.new(buffer, base, group)
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GL
|
3
|
+
|
4
|
+
class Registry
|
5
|
+
|
6
|
+
##
|
7
|
+
# Describes an OpenGL enumeration (constant) value.
|
8
|
+
class Enum < Token
|
9
|
+
|
10
|
+
##
|
11
|
+
# @return [String] the name of the enumeration member.
|
12
|
+
attr_reader :name
|
13
|
+
|
14
|
+
##
|
15
|
+
# @return [String] the value of the enumeration, always numerical, typically in hexadecimal format.
|
16
|
+
attr_reader :value
|
17
|
+
|
18
|
+
##
|
19
|
+
# @return [String?] an alternative name for the value.
|
20
|
+
attr_reader :alias_name
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [Symbol] a hint for the enumeration value type (i.e. GLenum, GLuint, GLuint64, etc)
|
24
|
+
attr_reader :type
|
25
|
+
|
26
|
+
##
|
27
|
+
# @return [Symbol?] an API associated with this enumeration value.
|
28
|
+
attr_reader :api
|
29
|
+
|
30
|
+
##
|
31
|
+
# @return [Array<String>] an array of names of the groups this enumeration is defined within.
|
32
|
+
attr_reader :groups
|
33
|
+
|
34
|
+
##
|
35
|
+
# Creates a new instance of the {Enum} class.
|
36
|
+
#
|
37
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
38
|
+
def initialize(node)
|
39
|
+
super(node)
|
40
|
+
|
41
|
+
# Required
|
42
|
+
@name = node[Words::NAME]
|
43
|
+
@value = node[Words::VALUE]
|
44
|
+
|
45
|
+
# Optional
|
46
|
+
@alias_name = node[Words::ALIAS]
|
47
|
+
@api = node[Words::API]&.to_sym
|
48
|
+
@groups = node[Words::GROUP]&.split(',') || []
|
49
|
+
|
50
|
+
@type = case node[Words::TYPE]
|
51
|
+
when Words::U_LONG then :GLuint
|
52
|
+
when Words::U_LONG_LONG then :GLuint64
|
53
|
+
else :GLenum
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# @return [Integer] the enumeration's value, as an integer.
|
59
|
+
def to_i
|
60
|
+
@value.start_with?('0x') ? @value.hex : @value.to_i
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes an OpenGL extension.
|
6
|
+
class Extension < FeatureProvider
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [Array<Symbol>] an array of supported APIs this extension is associated with.
|
10
|
+
attr_reader :supported
|
11
|
+
|
12
|
+
##
|
13
|
+
# Creates a new instance of the {Extension} class.
|
14
|
+
#
|
15
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
16
|
+
def initialize(node)
|
17
|
+
super(node)
|
18
|
+
supported = node[Words::SUPPORTED]
|
19
|
+
@supported = supported ? supported.split('|').map(&:to_sym) : Array.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes a single definition of a item to add/remove from an OpenGL API.
|
6
|
+
#
|
7
|
+
# @note This is a reference for the item only, and is only used to look up the corresponding item's definition.
|
8
|
+
class Feature < Token
|
9
|
+
|
10
|
+
##
|
11
|
+
# @return [String] the name of the entity.
|
12
|
+
attr_reader :name
|
13
|
+
|
14
|
+
##
|
15
|
+
# @return [Symbol] the OpenGL API this item is associated with.
|
16
|
+
attr_reader :api
|
17
|
+
|
18
|
+
##
|
19
|
+
# @return [Symbol] the OpenGL profile this item is associated with.
|
20
|
+
attr_reader :profile
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [:enum,:function,:type] a symbol specifying the feature type.
|
24
|
+
attr_reader :type
|
25
|
+
|
26
|
+
##
|
27
|
+
# Creates a new instance of the {Feature} class.
|
28
|
+
#
|
29
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
30
|
+
# @param api [Symbol?] The OpenGL API this item is associated with.
|
31
|
+
# @param profile [Symbol?] The OpenGL profile this item is associated with.
|
32
|
+
def initialize(node, api, profile)
|
33
|
+
super(node)
|
34
|
+
|
35
|
+
@name = node[Words::NAME]
|
36
|
+
@api = api || :none
|
37
|
+
@profile = profile || :none
|
38
|
+
|
39
|
+
@type = case node.name
|
40
|
+
when Words::ENUM then :enum
|
41
|
+
when Words::COMMAND then :function
|
42
|
+
when Words::TYPE then :type
|
43
|
+
else :unknown
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes a logical grouping of features for an OpenGL API.
|
6
|
+
class FeatureGroup < FeatureProvider
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [String] the OpenGL version this feature is associated with.
|
10
|
+
attr_reader :version
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [Array<Feature>] an array of features that this instance removes.
|
14
|
+
attr_reader :removals
|
15
|
+
|
16
|
+
##
|
17
|
+
# Creates a new instance of the {Feature} class.
|
18
|
+
#
|
19
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
20
|
+
def initialize(node)
|
21
|
+
super(node)
|
22
|
+
|
23
|
+
@version = node[Words::NUMBER]
|
24
|
+
@removals = []
|
25
|
+
node.locate('remove').each do |child|
|
26
|
+
|
27
|
+
api = child[Words::API]&.to_sym || @api
|
28
|
+
profile = child[Words::PROFILE]&.to_sym
|
29
|
+
|
30
|
+
child.nodes.each do |item|
|
31
|
+
next unless item.is_a?(Ox::Element)
|
32
|
+
@removals << Feature.new(item, api, profile)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# @abstract Base class for objects that add definitions to the API.
|
6
|
+
class FeatureProvider < Token
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [Symbol] the name of the API this feature is defined within.
|
10
|
+
attr_reader :api
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [String] the name of the feature set.
|
14
|
+
attr_reader :name
|
15
|
+
|
16
|
+
##
|
17
|
+
# @return [Array<Feature>] an array of features that this instance provides.
|
18
|
+
attr_reader :additions
|
19
|
+
|
20
|
+
##
|
21
|
+
# Creates a new instance of the {FeatureProvider} class.
|
22
|
+
#
|
23
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
24
|
+
def initialize(node)
|
25
|
+
super(node)
|
26
|
+
|
27
|
+
@api = node[Words::API]&.to_sym || :none
|
28
|
+
@name = node[Words::NAME]
|
29
|
+
|
30
|
+
@additions = []
|
31
|
+
node.locate('require').each do |child|
|
32
|
+
|
33
|
+
api = child[Words::API]&.to_sym || @api
|
34
|
+
profile = child[Words::PROFILE]&.to_sym
|
35
|
+
|
36
|
+
child.nodes.each do |item|
|
37
|
+
next unless item.is_a?(Ox::Element)
|
38
|
+
@additions << Feature.new(item, api, profile)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes an OpenGL function.
|
6
|
+
class Function < Token
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [String] the name of the function.
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [NativeType] the return type of function.
|
14
|
+
attr_reader :type
|
15
|
+
|
16
|
+
##
|
17
|
+
# @return [Array<Argument>] an array of arguments for this function.
|
18
|
+
attr_reader :arguments
|
19
|
+
|
20
|
+
##
|
21
|
+
# @return [String?] an alternative name associated with this function.
|
22
|
+
attr_reader :alias_name
|
23
|
+
|
24
|
+
##
|
25
|
+
# @return [String?] a "vector equivalent" version of this function that does not use separate parameters.
|
26
|
+
attr_reader :vec_equiv
|
27
|
+
|
28
|
+
##
|
29
|
+
# Creates a new instance of the {Function} class.
|
30
|
+
#
|
31
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
32
|
+
def initialize(node)
|
33
|
+
super(node)
|
34
|
+
|
35
|
+
@arguments = []
|
36
|
+
node.nodes.each do |child|
|
37
|
+
|
38
|
+
case child.name
|
39
|
+
when Words::PROTO
|
40
|
+
parse_prototype(child)
|
41
|
+
when Words::PARAM
|
42
|
+
@arguments << Argument.new(child)
|
43
|
+
when Words::ALIAS
|
44
|
+
@alias_name = child[Words::NAME]
|
45
|
+
when Words::VECTOR_EQUIVALENT
|
46
|
+
@vec_equiv = child[Words::NAME]
|
47
|
+
else
|
48
|
+
next
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def parse_prototype(node)
|
56
|
+
base = nil
|
57
|
+
buffer = ''
|
58
|
+
node.nodes.each do |child|
|
59
|
+
|
60
|
+
# Don't care about comments
|
61
|
+
next if child.is_a?(Ox::Comment)
|
62
|
+
|
63
|
+
# Raw text
|
64
|
+
if child.is_a?(String)
|
65
|
+
buffer << child
|
66
|
+
next
|
67
|
+
end
|
68
|
+
|
69
|
+
# Child node
|
70
|
+
case child.name
|
71
|
+
when Words::PTYPE
|
72
|
+
base = child.text
|
73
|
+
buffer << base
|
74
|
+
when Words::NAME
|
75
|
+
@name = child.text
|
76
|
+
else
|
77
|
+
next
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
group = node[Words::GROUP]
|
82
|
+
@type = NativeType.new(buffer, base, group)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module GL
|
2
|
+
class Registry
|
3
|
+
|
4
|
+
##
|
5
|
+
# Describes a logical grouping of enumerated values.
|
6
|
+
class Group < Token
|
7
|
+
|
8
|
+
##
|
9
|
+
# @return [String] the namespace this group belongs within.
|
10
|
+
attr_reader :namespace
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [Array<Enum>] an array of enum values that are associated with this group.
|
14
|
+
attr_reader :members
|
15
|
+
|
16
|
+
##
|
17
|
+
# @return [String?] the name of this grouping.
|
18
|
+
# @note Not all groups are named, and this value may be `nil`.
|
19
|
+
attr_reader :name
|
20
|
+
|
21
|
+
##
|
22
|
+
# @return [String?] the name of the vendor that defines this value.
|
23
|
+
attr_reader :vendor
|
24
|
+
|
25
|
+
##
|
26
|
+
# @return [Range?] an end-inclusive range of values this group covers.
|
27
|
+
attr_reader :range
|
28
|
+
|
29
|
+
##
|
30
|
+
# Creates a new instance of the {Group} class.
|
31
|
+
#
|
32
|
+
# @param node [Ox::Element] The XML element defining the instance.
|
33
|
+
def initialize(node)
|
34
|
+
super(node)
|
35
|
+
|
36
|
+
@namespace = node[Words::NAMESPACE]
|
37
|
+
@name = node[Words::GROUP]
|
38
|
+
type = node[Words::TYPE]
|
39
|
+
@bitmask = type && type == Words::BITMASK
|
40
|
+
@vendor = node[Words::VENDOR]
|
41
|
+
|
42
|
+
first = node[Words::RANGE_START]
|
43
|
+
if first
|
44
|
+
last = node[Words::RANGE_END]
|
45
|
+
@range = Range.new(first.hex, last.hex, false) if last
|
46
|
+
end
|
47
|
+
|
48
|
+
@members = []
|
49
|
+
node.locate('enum').each do |enum|
|
50
|
+
next unless enum.is_a?(Ox::Element)
|
51
|
+
@members << Enum.new(enum)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# @return [Boolean] `true` if group members are flags that can be bitwise OR'ed together, otherwise `false`.
|
57
|
+
def bitmask?
|
58
|
+
@bitmask
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
module GL
|
3
|
+
class Registry
|
4
|
+
|
5
|
+
##
|
6
|
+
# Describes the native type for a return or parameter value.
|
7
|
+
class NativeType
|
8
|
+
|
9
|
+
##
|
10
|
+
# @return [String] the full native type, including constant constraints, pointer symbols, etc.
|
11
|
+
# @note This is essentially the "raw" and fully-qualified type as it would appear in the C language.
|
12
|
+
attr_reader :type
|
13
|
+
|
14
|
+
##
|
15
|
+
# @return [Symbol] the basic type, excluding any constant constraints, pointer symbols, etc. as a Symbol.
|
16
|
+
attr_reader :base
|
17
|
+
|
18
|
+
##
|
19
|
+
# @return [String?] a group that is associated with this type.
|
20
|
+
attr_reader :group
|
21
|
+
|
22
|
+
##
|
23
|
+
# Creates a new instance fo the {NativeType} class.
|
24
|
+
#
|
25
|
+
# @param type [String] The full native type, including constant constraints, pointer symbols, etc.
|
26
|
+
# @param base [String?] The basic type, excluding any constant constraints, pointer symbols, etc.
|
27
|
+
# @param group [String?] A group that is associated with this type.
|
28
|
+
def initialize(type, base, group)
|
29
|
+
@type = type.strip
|
30
|
+
@base = base ? base.to_sym : :GLvoid
|
31
|
+
@group = group
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @return [Boolean] `true` if this a C-style pointer type, otherwise `false`.
|
36
|
+
def pointer?
|
37
|
+
@type.include?('*')
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# @return [Boolean] `true` if value is a C-style pointer that can not be modified, otherwise `false`.
|
42
|
+
def const?
|
43
|
+
/^const /.match?(@type)
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# @return [Boolean] `true` if value is a C-style pointer that may be modified, otherwise `false`.
|
48
|
+
def out?
|
49
|
+
@type.include?('*') && !/\bconst\b/.match?(@type)
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# @return [String] the string representation of this object.
|
54
|
+
def to_s
|
55
|
+
@type
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|