opengl-registry 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ module GL
2
+ class Registry
3
+
4
+ ##
5
+ # @abstract Base class for OpenGL registry defined items.
6
+ class Token
7
+
8
+ ##
9
+ # @return [String?] an arbitrary comment associated with this object.
10
+ attr_reader :comment
11
+
12
+ ##
13
+ # Creates a new instance of the {Token} class.
14
+ #
15
+ # @param node [Ox::Element] The XML element defining the instance.
16
+ def initialize(node)
17
+ raise ArgumentError, 'item node cannot be nil' unless node
18
+
19
+ @comment = node[Words::COMMENT]
20
+ end
21
+
22
+ ##
23
+ # @return [String] the string representation of this object.
24
+ def to_s
25
+ @name || super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GL
4
+ class Registry
5
+
6
+ ##
7
+ # The current version of the `opengl-registry` gem.
8
+ VERSION = '1.0.0'
9
+ end
10
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GL
4
+
5
+ class Registry
6
+
7
+ ##
8
+ # Strongly-typed values for common XML element/attribute names.
9
+ module Words
10
+
11
+ ENUM = 'enum'
12
+ COMMAND = 'command'
13
+ REGISTRY = 'registry'
14
+ COMMENT = 'comment'
15
+ NAMESPACE = 'namespace'
16
+ GROUP = 'group'
17
+ NAME = 'name'
18
+ RANGE_START = 'start'
19
+ RANGE_END = 'end'
20
+ API = 'api'
21
+ ALIAS = 'alias'
22
+ TYPE = 'type'
23
+ VENDOR = 'vendor'
24
+ VALUE = 'value'
25
+ PROTO = 'proto'
26
+ PTYPE = 'ptype'
27
+ PARAM = 'param'
28
+ GLX = 'glx'
29
+ VECTOR_EQUIVALENT = 'vecequiv'
30
+ LENGTH = 'len'
31
+ NUMBER = 'number'
32
+ PROFILE = 'profile'
33
+ SUPPORTED = 'supported'
34
+ U_LONG = 'u'
35
+ U_LONG_LONG = 'ull'
36
+ BITMASK = 'bitmask'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,176 @@
1
+ module GL
2
+
3
+ ##
4
+ # Describes a specific subset of the OpenGL registry, targeting an API, version, profile, etc.
5
+ #
6
+ # Automatically filters all results bu the specified criteria, only returning results that are
7
+ # used in the specification.
8
+ class Spec
9
+
10
+ ##
11
+ # @return [Registry] the registry instance the specification uses for reference.
12
+ attr_accessor :registry
13
+
14
+ ##
15
+ # @return [Symbol] the OpenGL API name.
16
+ attr_reader :api
17
+
18
+ ##
19
+ # @return [String] the OpenGL version number for the specification.
20
+ attr_reader :version
21
+
22
+ ##
23
+ # @return [Symbol] the OpenGL profile name for the specification.
24
+ attr_reader :profile
25
+
26
+ ##
27
+ # @return [Array<String>] an array of extension names.
28
+ attr_reader :extensions
29
+
30
+ ##
31
+ # Creates a new instance of the {Spec} class.
32
+ #
33
+ # @param registry [Registry] An registry instance to use for definition referencing.
34
+ # @param api [Symbol,String] The OpenGL API name.
35
+ # @param version [String,Float] The OpenGL version number for the specification.
36
+ # @param profile [Symbol,String] The OpenGL profile name for the specification.
37
+ # @param extensions [Array<String>] Names of extensions name to include definitions for.
38
+ def initialize(registry, api, version, profile, *extensions)
39
+ @registry = registry
40
+ @api = api.to_sym
41
+ @profile = profile.to_sym
42
+ @version = Float(version).to_s
43
+ @extensions = extensions&.uniq || []
44
+ end
45
+
46
+ ##
47
+ # Retrieves a complete list of all OpenGL types that this specification must have defined. Any type not included
48
+ # here does not need to be mapped.
49
+ #
50
+ # @param groups [Boolean] `true` to include group (enumeration) names, otherwise `false`
51
+ #
52
+ # @return [Array<Symbol>] a collection of OpenGL types.
53
+ # @note The values are re-calculated each time this method is invoked, so consider caching the result if reusing.
54
+ def types(groups = false)
55
+
56
+ values = {}
57
+ functions.each do |func|
58
+
59
+ values[func.type.base] = true
60
+ values[func.type.group] = true if groups && func.type.group
61
+
62
+ func.arguments.each do |arg|
63
+ values[arg.type.base] = true
64
+ values[arg.type.group] = true if groups && arg.type.group
65
+ end
66
+ end
67
+
68
+ #noinspection RubyYardReturnMatch
69
+ values.keys.map(&:to_sym)
70
+ end
71
+
72
+ ##
73
+ # Retrieves a complete list of all OpenGL functions that this specification defines.
74
+ #
75
+ # @return [Array<Registry::Function>] a collection of {Registry::Function} instances.
76
+ # @note The values are re-calculated each time this method is invoked, so consider caching the result if reusing.
77
+ def functions
78
+ items(:function, @registry.functions)
79
+ end
80
+
81
+ ##
82
+ # Retrieves a complete list of all OpenGL enumeration values that this specification defines.
83
+ #
84
+ # @return [Array<Registry::Enum>] a collection of {Registry::Enum} instances.
85
+ # @note The values are re-calculated each time this method is invoked, so consider caching the result if reusing.
86
+ def enums
87
+ items(:enum, @registry.enums)
88
+ end
89
+
90
+ ##
91
+ # Retrieves a complete list of all OpenGL group names that this specification uses.
92
+ #
93
+ # @return [Array<String>] a collection of group (enumeration) names.
94
+ # @note The values are re-calculated each time this method is invoked, so consider caching the result if reusing.
95
+ def used_groups
96
+
97
+ names = {}
98
+ functions.each do |func|
99
+
100
+ names[func.type.group] = true if func.type.group
101
+ func.arguments.each do |arg|
102
+ group = arg.type.group
103
+ next unless group
104
+
105
+ names[group] = true
106
+ end
107
+ end
108
+ names.keys
109
+ end
110
+
111
+ ##
112
+ # @return [String] the string representation of this object.
113
+ def to_s
114
+ if profile != :none
115
+ return "Open#{@api.to_s.upcase} #{@version} (#{@profile} profile)"
116
+ end
117
+ "Open#{@api.to_s.upcase} #{@version}"
118
+ end
119
+
120
+ private
121
+
122
+ def items(type, definitions)
123
+ raise 'registry is nil' unless @registry
124
+
125
+ values = []
126
+
127
+ # Enumerate through each feature group
128
+ @registry.features.each do |group|
129
+
130
+ # Skip unless this group implements the specified API and version
131
+ next if group.api != @api
132
+ next if group.version > @version
133
+
134
+ # Enumerator through item this group implements
135
+ group.additions.each do |feature|
136
+ # Skip if this is not the specified type of not within the profile
137
+ next if feature.type != type
138
+ next unless feature.profile == :none || feature.profile == @profile
139
+
140
+ # Add the definition this feature represents
141
+ values << definitions.find { |item| item.name == feature.name }
142
+ end
143
+
144
+ # Enumerate through any "removed item" for this group
145
+ group.removals.each do |feature|
146
+ # Skip if this is not the specified type of not within the profile
147
+ next unless feature.type == type
148
+ next unless feature.profile == :none || feature.profile == @profile
149
+
150
+ # Remove the definition this feature represents
151
+ values.delete_if { |item| item.name == feature.name }
152
+ end
153
+ end
154
+
155
+ # Enumerate through each extension
156
+ @extensions.each do |name|
157
+ # Find the extension definition, skipping unless supported by the API
158
+ ext = @registry.extensions.find { |e| e.name == name }
159
+ next unless ext && ext.supported.include?(@api)
160
+
161
+ # Enumerate through each feature this extension implements
162
+ ext.additions.each do |feature|
163
+ # Skip if this is not the specified type of not within the profile
164
+ next if feature.type != type
165
+ next unless feature.profile == :none || feature.profile == @profile
166
+
167
+ # Add the definition this feature represents
168
+ values << definitions.find { |item| item.name == feature.name }
169
+ end
170
+ end
171
+
172
+ # Return results
173
+ values
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/opengl/registry/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'opengl-registry'
7
+ spec.version = GL::Registry::VERSION
8
+ spec.authors = ['ForeverZer0']
9
+ spec.email = ['efreed09@gmail.com']
10
+
11
+ spec.summary = 'OpenGL Registry parser for generating API specifications'
12
+ spec.description = <<-EOS
13
+ Parses the Khronos OpenGL registry into a standardized and user-friendly data structure that can be walked through,
14
+ providing an essential need for tools that generate code to create an OpenGL wrapper/bindings, for any language. Given
15
+ an API name, version, and profile, is capable of filtering and grouping data structures that cover that specific
16
+ subset of definitions, using a typical Ruby object-oriented approach.
17
+ EOS
18
+ spec.homepage = 'https://github.com/ForeverZer0/opengl-registry'
19
+ spec.license = 'MIT'
20
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
21
+
22
+ spec.metadata['homepage_uri'] = spec.homepage
23
+ spec.metadata['source_code_uri'] = 'https://github.com/ForeverZer0/opengl-registry'
24
+ spec.metadata['changelog_uri'] = 'https://github.com/ForeverZer0/opengl-registry/CHANGELOG.md'
25
+
26
+ # Specify which files should be added to the gem when it is released.
27
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ end
31
+ spec.bindir = 'exe'
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_development_dependency 'rake', '~> 12.0'
36
+ spec.add_runtime_dependency 'ox', '~> 2.13'
37
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opengl-registry
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - ForeverZer0
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-05-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '12.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '12.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ox
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.13'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.13'
41
+ description: |2
42
+ Parses the Khronos OpenGL registry into a standardized and user-friendly data structure that can be walked through,
43
+ providing an essential need for tools that generate code to create an OpenGL wrapper/bindings, for any language. Given
44
+ an API name, version, and profile, is capable of filtering and grouping data structures that cover that specific
45
+ subset of definitions, using a typical Ruby object-oriented approach.
46
+ email:
47
+ - efreed09@gmail.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - ".gitignore"
53
+ - ".travis.yml"
54
+ - ".yardopts"
55
+ - CHANGELOG.md
56
+ - Gemfile
57
+ - LICENSE.txt
58
+ - README.md
59
+ - Rakefile
60
+ - bin/console
61
+ - bin/setup
62
+ - lib/opengl/registry.rb
63
+ - lib/opengl/registry/argument.rb
64
+ - lib/opengl/registry/enum.rb
65
+ - lib/opengl/registry/extension.rb
66
+ - lib/opengl/registry/feature.rb
67
+ - lib/opengl/registry/feature_group.rb
68
+ - lib/opengl/registry/feature_provider.rb
69
+ - lib/opengl/registry/function.rb
70
+ - lib/opengl/registry/group.rb
71
+ - lib/opengl/registry/native_type.rb
72
+ - lib/opengl/registry/token.rb
73
+ - lib/opengl/registry/version.rb
74
+ - lib/opengl/registry/words.rb
75
+ - lib/opengl/spec.rb
76
+ - opengl-registry.gemspec
77
+ homepage: https://github.com/ForeverZer0/opengl-registry
78
+ licenses:
79
+ - MIT
80
+ metadata:
81
+ homepage_uri: https://github.com/ForeverZer0/opengl-registry
82
+ source_code_uri: https://github.com/ForeverZer0/opengl-registry
83
+ changelog_uri: https://github.com/ForeverZer0/opengl-registry/CHANGELOG.md
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 2.3.0
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubygems_version: 3.1.2
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: OpenGL Registry parser for generating API specifications
103
+ test_files: []