sdl2_ffi 0.0.4 → 0.0.5
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 +4 -4
- data/.gitignore +2 -0
- data/Gemfile +6 -0
- data/Guardfile +47 -25
- data/Rakefile +6 -0
- data/bin/approvals +16 -0
- data/bin/autospec +16 -0
- data/bin/htmldiff +16 -0
- data/bin/ldiff +16 -0
- data/bin/nokogiri +16 -0
- data/bin/rspec +16 -0
- data/lib/enumerable_constants.rb +23 -8
- data/lib/sdl2.rb +116 -39
- data/lib/sdl2/color.rb +19 -7
- data/lib/sdl2/events.rb +184 -85
- data/lib/sdl2/gamecontroller.rb +1 -1
- data/lib/sdl2/gem_version.rb +1 -1
- data/lib/sdl2/joystick.rb +1 -1
- data/lib/sdl2/keyboard.rb +3 -0
- data/lib/sdl2/mouse.rb +5 -5
- data/lib/sdl2/pixel_format.rb +11 -3
- data/lib/sdl2/pixels.rb +40 -40
- data/lib/sdl2/point.rb +17 -1
- data/lib/sdl2/power.rb +12 -3
- data/lib/sdl2/rect.rb +19 -0
- data/lib/sdl2/render.rb +3 -3
- data/lib/sdl2/scancode.rb +7 -0
- data/lib/sdl2/stdinc.rb +2 -0
- data/lib/sdl2/surface.rb +64 -12
- data/lib/sdl2/ttf.rb +52 -66
- data/lib/sdl2/ttf/font.rb +115 -0
- data/lib/sdl2/video.rb +23 -23
- data/lib/sdl2/window.rb +15 -15
- data/sdl2_ffi.gemspec +5 -2
- data/spec/fixtures/approvals/lazyfoonet_lesson_01_hello_world/draws_hello_to_the_window_surface.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_01_hello_world/loaded_and_optimizes_hello_bitmap.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_02_optimized_images/draws_the_message_and_background.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_03_extension_libraries/should_blit_a_png_to_screen.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_04_event_driven_programming/draws_something_to_the_screen.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_05_color_keying/draws_the_sprite_using_a_color_key.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_06_clip_blitting_and_sprite_sheets/draws_the_clipped_sprites_to_the_screen.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/draws_the_message_to_the_screen.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/writes_a_message_to_a_surface.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_down_message.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_left_message.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_right_message.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_08_key_presses/rendered_the_up_message.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_color/looks_blue_when_it_should.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_color/looks_green_when_it_should.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_color/looks_red_when_it_should.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_color/should_cast_arrays_properly.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_color/should_cast_hashes_properly.approved.png +0 -0
- data/spec/fixtures/fonts/FreeMono.ttf +0 -0
- data/spec/fixtures/fonts/GaroaHackerClubeBold.otf +0 -0
- data/spec/fixtures/fonts/GaroaHackerClubeBold.otf.credits.yaml +4 -0
- data/spec/fixtures/images/an_example.png +0 -0
- data/spec/fixtures/images/background.bmp +0 -0
- data/spec/fixtures/images/background.jpg +0 -0
- data/spec/fixtures/images/background.png +0 -0
- data/spec/fixtures/images/foo.jpg +0 -0
- data/spec/fixtures/images/hello.bmp +0 -0
- data/spec/fixtures/images/sprites.jpg +0 -0
- data/spec/fixtures/images/tile.png +0 -0
- data/spec/fixtures/images/x.png +0 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_01_hello_world_spec.rb +39 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_02_optimized_images_spec.rb +51 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_03_extension_libraries_spec.rb +31 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_04_event_driven_programming_spec.rb +55 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_05_color_keying_spec.rb +41 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_06_clip_blitting_and_sprite_sheets_spec.rb +41 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_07_true_type_fonts_spec.rb +56 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_08_key_presses_spec.rb +120 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_helper.rb +6 -0
- data/spec/png_writer.rb +21 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/sdl2/color_spec.rb +46 -0
- data/spec/unit/unit_helper.rb +3 -0
- data/test/approvals/clip_blitting_and_sprite_sheets.received.bmp +0 -0
- data/test/approvals/color_keying_example.approved.png +0 -0
- data/test/approvals/hello_world_example_hello.approved.png +0 -0
- data/test/approvals/hello_world_example_screen.approved.png +0 -0
- data/test/approvals/optimized_surface_loading.approved.png +0 -0
- data/test/fixtures/background.jpg +0 -0
- data/test/fixtures/foo.jpg +0 -0
- data/test/fixtures/sprites.jpg +0 -0
- data/test/fixtures/x.png +0 -0
- data/test/functional/examples/lazyfoo.net_s/test_clip_blitting_and_sprite_sheets.rb +50 -0
- data/test/functional/examples/lazyfoo.net_s/test_color_keying.rb +42 -0
- data/test/functional/examples/test_lazy_foo_examples.rb +120 -48
- data/test/test_helper.rb +9 -0
- metadata +138 -4
- data/graph +0 -566
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60ab089f8e71037fce4c4f2a46cf5586db4af65f
|
4
|
+
data.tar.gz: cd50c7524713298ed2ad850d637a46f0c20d6347
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8322d3174b86096df92c9fd2127b54604c3ef9e99a4f1c055bb56570e0e986bcd93fd8d576bd7d444daac7bca497162b5f0aea94eac8e5c58c113d62797034ea
|
7
|
+
data.tar.gz: 028e8e3b02c672c1fb45796bb21bdc8cb25f369b9cf34f8861e816f099f3a56277d7003ac5256efcbd697f7f88ed96299b41cbe4ebb0c6e1dd89c6ed0ba35d30
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -2,3 +2,9 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in sdl2_ffi.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
# TODO: Once SDL/Image support has been added, migrate to official
|
7
|
+
# gem.
|
8
|
+
group :development do
|
9
|
+
gem 'approvals', git:'http://github.com/BadQuanta/approvals', branch: 'feature_binary_formats'
|
10
|
+
end
|
data/Guardfile
CHANGED
@@ -1,33 +1,55 @@
|
|
1
1
|
# A sample Guardfile
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
3
3
|
|
4
|
-
guard :minitest do
|
5
|
-
# with Minitest::Unit
|
6
|
-
watch(%r{^test/(.*)\/?test_(.*)\.rb})
|
7
|
-
watch(%r{^lib/(.*/)?([^/]+)\.rb}) { |m| "test/unit/#{m[1]}test_#{m[2]}.rb" }
|
8
|
-
watch(%r{^test/test_helper\.rb}) { 'test' }
|
4
|
+
#guard :minitest do
|
5
|
+
# # with Minitest::Unit
|
6
|
+
# watch(%r{^test/(.*)\/?test_(.*)\.rb})
|
7
|
+
# watch(%r{^lib/(.*/)?([^/]+)\.rb}) { |m| "test/unit/#{m[1]}test_#{m[2]}.rb" }
|
8
|
+
# watch(%r{^test/test_helper\.rb}) { 'test' }
|
9
|
+
#
|
10
|
+
# # with Minitest::Spec
|
11
|
+
# watch(%r{^spec/(.*)_spec\.rb})
|
12
|
+
# watch(%r{^lib/(.+)\.rb}) { |m| "spec/unit/#{m[1]}_spec.rb" }
|
13
|
+
# watch(%r{^spec/spec_helper\.rb}) { 'spec' }
|
14
|
+
#
|
15
|
+
# # Rails 4
|
16
|
+
# # watch(%r{^test/test_helper\.rb}) { 'test' }
|
17
|
+
# # watch(%r{^test/.+_test\.rb})
|
18
|
+
# # watch(%r{^app/(.+)\.rb}) { |m| "test/#{m[1]}_test.rb" }
|
19
|
+
# # watch(%r{^app/controllers/application_controller\.rb}) { 'test/controllers' }
|
20
|
+
# # watch(%r{^app/controllers/(.+)_controller\.rb}) { |m| "test/integration/#{m[1]}_test.rb" }
|
21
|
+
# # watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
|
22
|
+
# # watch(%r{^lib/(.+)\.rb}) { |m| "test/lib/#{m[1]}_test.rb" }
|
23
|
+
#
|
24
|
+
# # Rails 3.2
|
25
|
+
# # watch(%r{^app/controllers/(.*)\.rb}) { |m| "test/controllers/#{m[1]}_test.rb" }
|
26
|
+
# # watch(%r{^app/helpers/(.*)\.rb}) { |m| "test/helpers/#{m[1]}_test.rb" }
|
27
|
+
# # watch(%r{^app/models/(.*)\.rb}) { |m| "test/unit/#{m[1]}_test.rb" }
|
28
|
+
#
|
29
|
+
# # Rails
|
30
|
+
# # watch(%r{^app/controllers/(.*)\.rb}) { |m| "test/functional/#{m[1]}_test.rb" }
|
31
|
+
# # watch(%r{^app/helpers/(.*)\.rb}) { |m| "test/helpers/#{m[1]}_test.rb" }
|
32
|
+
# # watch(%r{^app/models/(.*)\.rb}) { |m| "test/unit/#{m[1]}_test.rb" }
|
33
|
+
#end
|
9
34
|
|
10
|
-
|
11
|
-
watch(%r{^spec
|
12
|
-
watch(%r{^lib/(.+)\.rb})
|
13
|
-
watch(
|
35
|
+
guard :rspec do
|
36
|
+
watch(%r{^spec/.+_spec\.rb$})
|
37
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
38
|
+
watch('spec/spec_helper.rb') { "spec" }
|
14
39
|
|
15
|
-
# Rails
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# watch(%r{^lib/(.+)\.rb}) { |m| "test/lib/#{m[1]}_test.rb" }
|
40
|
+
# Rails example
|
41
|
+
#watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
42
|
+
#watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
43
|
+
#watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
44
|
+
#watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
45
|
+
#watch('config/routes.rb') { "spec/routing" }
|
46
|
+
#watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
23
47
|
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# watch(%r{^app/helpers/(.*)\.rb}) { |m| "test/helpers/#{m[1]}_test.rb" }
|
27
|
-
# watch(%r{^app/models/(.*)\.rb}) { |m| "test/unit/#{m[1]}_test.rb" }
|
48
|
+
# Capybara features specs
|
49
|
+
#watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
28
50
|
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# watch(%r{^app/models/(.*)\.rb}) { |m| "test/unit/#{m[1]}_test.rb" }
|
51
|
+
# Turnip features and steps
|
52
|
+
#watch(%r{^spec/acceptance/(.+)\.feature$})
|
53
|
+
#watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
33
54
|
end
|
55
|
+
|
data/Rakefile
CHANGED
data/bin/approvals
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'approvals' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'approvals')
|
data/bin/autospec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'autospec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'autospec')
|
data/bin/htmldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'htmldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'htmldiff')
|
data/bin/ldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'ldiff')
|
data/bin/nokogiri
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'nokogiri' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'nokogiri')
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('sdl2_ffi', 'rspec')
|
data/lib/enumerable_constants.rb
CHANGED
@@ -6,13 +6,13 @@ require 'ffi'
|
|
6
6
|
# An example:
|
7
7
|
# module MyEnumeration
|
8
8
|
# include EnumerableConstants
|
9
|
-
# MY_FIRST_CONSTANT
|
10
|
-
# MY_NEXT_CONSTANT
|
11
|
-
# MY_THIRD_CONSTANT
|
9
|
+
# MY_FIRST_CONSTANT # defaults to 0
|
10
|
+
# MY_NEXT_CONSTANT # will be 1
|
11
|
+
# MY_THIRD_CONSTANT # will be 2, and the next would be 3 unless
|
12
12
|
# MY_FOURTH_CONSTANT = 100 # you assign a value.
|
13
|
-
# MY_FIFTH_CONSTANT
|
13
|
+
# MY_FIFTH_CONSTANT # will be 101
|
14
14
|
# MY_SIXTH_CONSTANT = MY_THIRD_CONSTANT # There are no rules against duplicate values.
|
15
|
-
# MY_SEVENTH_CONSTANT
|
15
|
+
# MY_SEVENTH_CONSTANT # will be 3, be careful you don't unintentionally reuse values.
|
16
16
|
# end
|
17
17
|
#
|
18
18
|
# With this module, you can:
|
@@ -34,10 +34,14 @@ require 'ffi'
|
|
34
34
|
#
|
35
35
|
# MyEnumeration::MY_EIGTH_CONSTANT = MyEnumeration.next_const_value # 4
|
36
36
|
#
|
37
|
+
# Or, you could just do:
|
38
|
+
#
|
39
|
+
# MyEnumeration::MY_NINTH_CONSTANT #=> Automatically assigned value 5
|
40
|
+
#
|
37
41
|
# However, successive calls to just `#next_const_value` will just result in
|
38
42
|
# the same value.
|
39
|
-
# MyEnumeration.next_const_value #
|
40
|
-
# MyEnumeration.next_const_value #
|
43
|
+
# MyEnumeration.next_const_value # 6
|
44
|
+
# MyEnumeration.next_const_value # 6
|
41
45
|
module EnumerableConstants
|
42
46
|
|
43
47
|
# This is the method that injects the new static-scope routines.
|
@@ -54,6 +58,15 @@ module EnumerableConstants
|
|
54
58
|
return result
|
55
59
|
end
|
56
60
|
|
61
|
+
# Return the defined constants in a hash keyed by value.
|
62
|
+
def self.by_value
|
63
|
+
result = {}
|
64
|
+
self.constants.each do |constant|
|
65
|
+
result[self.const_get(constant)] = constant
|
66
|
+
end
|
67
|
+
return result
|
68
|
+
end
|
69
|
+
|
57
70
|
# This routine returns a flattened array of alternating symbols and values.
|
58
71
|
# The symbols are the CONSTANT names and values are the values defined by that constant.
|
59
72
|
def self.flatten_consts
|
@@ -76,7 +89,9 @@ module EnumerableConstants
|
|
76
89
|
last_const_value.next
|
77
90
|
end
|
78
91
|
|
92
|
+
def self.const_missing(const)
|
93
|
+
self.const_set(const, next_const_value)
|
94
|
+
end
|
79
95
|
end
|
80
96
|
end
|
81
|
-
|
82
97
|
end
|
data/lib/sdl2.rb
CHANGED
@@ -2,48 +2,35 @@ require 'sdl2/sdl_module'
|
|
2
2
|
require 'active_support/inflector'
|
3
3
|
require 'enumerable_constants'
|
4
4
|
require 'sdl2/stdinc'
|
5
|
+
|
5
6
|
# libSDL2's prototypes are attached directly to this module.
|
6
7
|
#
|
7
8
|
module SDL2
|
8
9
|
extend FFI::Library
|
9
10
|
extend Library
|
10
|
-
ffi_lib SDL_MODULE
|
11
|
-
|
12
|
-
# FFI::Struct class with some useful additions.
|
13
|
-
class Struct < FFI::Struct
|
11
|
+
ffi_lib SDL_MODULE
|
14
12
|
|
15
|
-
|
16
|
-
def initialize(*args, &block)
|
17
|
-
super(*args)
|
18
|
-
if block_given?
|
19
|
-
throw 'Release must be defined to use block' unless self.class.respond_to?(:release)
|
20
|
-
yield self
|
21
|
-
self.class.release(self.pointer)
|
22
|
-
end
|
23
|
-
end
|
13
|
+
PrintDebug = false
|
24
14
|
|
25
|
-
|
26
|
-
def self.release(pointer)
|
27
|
-
pointer.free
|
28
|
-
end
|
15
|
+
module StructHelper
|
29
16
|
|
30
17
|
# Define a set of member readers
|
31
18
|
# Ex1: `member_readers [:one, :two, :three]`
|
32
19
|
# Ex2: `member_readers *members`
|
33
|
-
def
|
20
|
+
def member_readers(*members_to_define)
|
34
21
|
#self.class_eval do
|
35
22
|
members_to_define.each do |member|
|
36
23
|
define_method member do
|
37
|
-
[member]
|
24
|
+
self[member]
|
38
25
|
end
|
39
26
|
end
|
40
27
|
#end
|
41
28
|
end
|
42
29
|
|
43
30
|
# Define a set of member writers
|
44
|
-
|
45
|
-
|
46
|
-
def
|
31
|
+
# Ex1: `member_writers [:one, :two, :three]`
|
32
|
+
# Ex2: `member_writers *members`
|
33
|
+
def member_writers(*members_to_define)
|
47
34
|
members_to_define.each do |member|
|
48
35
|
define_method "#{member}=".to_sym do |value|
|
49
36
|
self[member]= value
|
@@ -51,32 +38,121 @@ module SDL2
|
|
51
38
|
end
|
52
39
|
end
|
53
40
|
|
54
|
-
|
55
|
-
|
56
|
-
|
41
|
+
end
|
42
|
+
|
43
|
+
# Augmented for compares with anything that can be an array
|
44
|
+
class FFI::Struct::InlineArray
|
45
|
+
|
46
|
+
def ==(other)
|
47
|
+
self.to_a == other.to_a
|
48
|
+
end
|
49
|
+
end
|
57
50
|
|
58
|
-
|
59
|
-
|
51
|
+
# FFI::Struct class with some useful additions.
|
52
|
+
class Struct < FFI::Struct
|
53
|
+
extend StructHelper
|
54
|
+
|
55
|
+
# Allows creation and use within block, automatically freeing pointer after block.
|
56
|
+
def initialize(*args, &block)
|
57
|
+
super(*args)
|
58
|
+
if block_given?
|
59
|
+
throw 'Release must be defined to use block' unless self.class.respond_to?(:release)
|
60
|
+
yield self
|
61
|
+
self.class.release(self.pointer)
|
62
|
+
end
|
63
|
+
end
|
60
64
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end.join(' ')
|
65
|
-
report += "}"
|
65
|
+
# A default release scheme is defined, but should be redefined where appropriate.
|
66
|
+
def self.release(pointer)
|
67
|
+
pointer.free
|
66
68
|
end
|
67
69
|
|
70
|
+
# A human-readable representation of the struct and it's values.
|
71
|
+
#def inspect
|
72
|
+
# return 'nil' if self.null?
|
73
|
+
#
|
74
|
+
# #binding.pry
|
75
|
+
# #return self.to_s
|
76
|
+
#
|
77
|
+
# report = "struct #{self.class.to_s}{"
|
78
|
+
# report += self.class.members.collect do |field|
|
79
|
+
# "#{field}->#{self[field].inspect}"
|
80
|
+
# end.join(' ')
|
81
|
+
# report += "}"
|
82
|
+
# end
|
83
|
+
|
68
84
|
# Compare two structures by class and values.
|
69
85
|
def ==(other)
|
70
|
-
|
71
|
-
|
72
|
-
|
86
|
+
if PrintDebug
|
87
|
+
@@rec ||= -1
|
88
|
+
@@rec += 1
|
89
|
+
pad = "\t"*@@rec
|
90
|
+
|
91
|
+
puts
|
92
|
+
puts " #{pad}COMPARING #{self} to #{other}"
|
93
|
+
end
|
94
|
+
|
95
|
+
result = catch(:result) do
|
96
|
+
unless self.class == other.class
|
97
|
+
puts "Class Mismatch" if PrintDebug
|
98
|
+
throw :result, false
|
99
|
+
end
|
100
|
+
|
101
|
+
if self.null? or other.null?
|
102
|
+
unless self.null? and other.null?
|
103
|
+
puts "AHHHAOne is null and the other is not" if PrintDebug
|
104
|
+
throw :result, false
|
105
|
+
end
|
106
|
+
else
|
107
|
+
self.class.members.each do |field|
|
108
|
+
print "#{pad} #{field}:#{self[field].class} = " if PrintDebug
|
109
|
+
|
110
|
+
unless self[field] == other[field]
|
111
|
+
binding.pry
|
112
|
+
puts "NO MATCH: #{self[field].to_s} #{other[field].to_s}" if PrintDebug
|
113
|
+
throw :result, false
|
114
|
+
end
|
115
|
+
puts "MATCH" if PrintDebug
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
true # Everything passed.
|
120
|
+
|
121
|
+
end
|
122
|
+
if PrintDebug
|
123
|
+
@@rec += -1
|
124
|
+
puts
|
125
|
+
puts "#{pad}RESULT = #{result}"
|
126
|
+
end
|
127
|
+
return result
|
128
|
+
end
|
129
|
+
|
130
|
+
# Default cast handler
|
131
|
+
def self.cast(something)
|
132
|
+
if something.kind_of? self
|
133
|
+
return something
|
134
|
+
elsif something.kind_of? Hash
|
135
|
+
common = (self.members & something.keys)
|
136
|
+
if common.empty?
|
137
|
+
raise "#{self} can't cast this Hash: #{something.inspect}"
|
138
|
+
else
|
139
|
+
tmp = self.new
|
140
|
+
common.each do |field|
|
141
|
+
tmp[field] = something[field]
|
142
|
+
end
|
143
|
+
return tmp
|
144
|
+
end
|
145
|
+
elsif something.nil?
|
146
|
+
return something #TODO: Assume NUL is ok?
|
147
|
+
else
|
148
|
+
raise "#{self} can't cast #{something.insepct}"
|
73
149
|
end
|
74
|
-
true # return true if we get this far.
|
75
150
|
end
|
76
151
|
end
|
77
152
|
|
78
153
|
# FFI::ManagedStruct possibly with useful additions.
|
79
154
|
class ManagedStruct < FFI::ManagedStruct
|
155
|
+
extend StructHelper
|
80
156
|
|
81
157
|
# Allows create and use the struct within a block.
|
82
158
|
def initialize(*args, &block)
|
@@ -88,7 +164,9 @@ module SDL2
|
|
88
164
|
|
89
165
|
end
|
90
166
|
|
91
|
-
|
167
|
+
class Union < FFI::Union
|
168
|
+
extend StructHelper
|
169
|
+
end
|
92
170
|
|
93
171
|
class TypedPointer < Struct
|
94
172
|
|
@@ -126,7 +204,7 @@ module SDL2
|
|
126
204
|
class UInt8Struct < TypedPointer
|
127
205
|
type :uint8
|
128
206
|
end
|
129
|
-
|
207
|
+
|
130
208
|
# TODO: Review if this is the best place to put it.
|
131
209
|
# BlendMode is defined in a header file that is always included, so I'm
|
132
210
|
# defineing again here.
|
@@ -148,7 +226,6 @@ module SDL2
|
|
148
226
|
|
149
227
|
end
|
150
228
|
|
151
|
-
|
152
229
|
require 'sdl2/init'
|
153
230
|
|
154
231
|
#TODO: require 'sdl2/assert'
|