sdl2_ffi 0.0.5 → 0.0.6

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -59
  3. data/lib/sdl2.rb +52 -15
  4. data/lib/sdl2/application.rb +71 -0
  5. data/lib/sdl2/audio.rb +72 -24
  6. data/lib/sdl2/clipboard.rb +9 -3
  7. data/lib/sdl2/color.rb +8 -3
  8. data/lib/sdl2/cpuinfo.rb +30 -10
  9. data/lib/sdl2/engine.rb +52 -0
  10. data/lib/sdl2/engine/block_engine.rb +27 -0
  11. data/lib/sdl2/engine/engines.rb +46 -0
  12. data/lib/sdl2/error.rb +9 -3
  13. data/lib/sdl2/events.rb +68 -6
  14. data/lib/sdl2/gamecontroller.rb +60 -20
  15. data/lib/sdl2/gem_version.rb +1 -1
  16. data/lib/sdl2/gesture.rb +12 -4
  17. data/lib/sdl2/haptic.rb +90 -30
  18. data/lib/sdl2/hints.rb +12 -4
  19. data/lib/sdl2/image.rb +85 -3
  20. data/lib/sdl2/init.rb +15 -5
  21. data/lib/sdl2/joystick.rb +63 -21
  22. data/lib/sdl2/keyboard.rb +101 -17
  23. data/lib/sdl2/keycode.rb +72 -72
  24. data/lib/sdl2/library.rb +7 -0
  25. data/lib/sdl2/log.rb +78 -21
  26. data/lib/sdl2/mixer.rb +651 -0
  27. data/lib/sdl2/mixer/chunk.rb +47 -0
  28. data/lib/sdl2/mixer/lib_paths.rb +8 -0
  29. data/lib/sdl2/mouse.rb +39 -13
  30. data/lib/sdl2/pixels.rb +39 -13
  31. data/lib/sdl2/point.rb +29 -0
  32. data/lib/sdl2/power.rb +3 -1
  33. data/lib/sdl2/rect.rb +94 -19
  34. data/lib/sdl2/render.rb +156 -52
  35. data/lib/sdl2/rwops.rb +60 -20
  36. data/lib/sdl2/surface.rb +85 -28
  37. data/lib/sdl2/syswm.rb +3 -1
  38. data/lib/sdl2/timer.rb +18 -6
  39. data/lib/sdl2/touch.rb +12 -4
  40. data/lib/sdl2/ttf.rb +153 -59
  41. data/lib/sdl2/ttf/font.rb +21 -5
  42. data/lib/sdl2/version.rb +9 -3
  43. data/lib/sdl2/video.rb +210 -70
  44. data/lib/sdl2/window.rb +9 -3
  45. data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/draws_the_message_to_the_screen.approved.png +0 -0
  46. data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/writes_a_message_to_a_surface.approved.png +0 -0
  47. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/defaults_to_mouse_out.approved.png +0 -0
  48. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/has_a_button_sheet.approved.png +0 -0
  49. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/shows_mouse_down.approved.png +0 -0
  50. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/shows_mouse_in.approved.png +0 -0
  51. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/shows_mouse_out.approved.png +0 -0
  52. data/spec/fixtures/approvals/lazyfoonet_lesson_09_mouse_events/shows_mouse_up.approved.png +0 -0
  53. data/spec/fixtures/images/button_sheet.png +0 -0
  54. data/spec/functional/lazy_foo_tutorial/lazy_foo_01_hello_world_spec.rb +9 -2
  55. data/spec/functional/lazy_foo_tutorial/lazy_foo_03_extension_libraries_spec.rb +1 -0
  56. data/spec/functional/lazy_foo_tutorial/lazy_foo_04_event_driven_programming_spec.rb +4 -3
  57. data/spec/functional/lazy_foo_tutorial/lazy_foo_05_color_keying_spec.rb +1 -1
  58. data/spec/functional/lazy_foo_tutorial/lazy_foo_06_clip_blitting_and_sprite_sheets_spec.rb +4 -3
  59. data/spec/functional/lazy_foo_tutorial/lazy_foo_07_true_type_fonts_spec.rb +4 -2
  60. data/spec/functional/lazy_foo_tutorial/lazy_foo_08_key_presses_spec.rb +10 -22
  61. data/spec/functional/lazy_foo_tutorial/lazy_foo_09_mouse_events_spec.rb +121 -0
  62. data/spec/functional/lazy_foo_tutorial/lazy_foo_10_key_states_spec.rb +30 -0
  63. data/spec/functional/lazy_foo_tutorial/lazy_foo_11_playing_sounds_spec.rb +116 -0
  64. data/spec/functional/lazy_foo_tutorial/lazy_foo_12_timing_spec.rb +57 -0
  65. data/spec/spec_helper.rb +3 -1
  66. metadata +31 -2
data/lib/sdl2/color.rb CHANGED
@@ -11,14 +11,19 @@ module SDL2
11
11
 
12
12
  member_readers *members
13
13
  member_writers *members
14
-
14
+
15
+ def self.create(values = {})
16
+ values[:a] ||= ALPHA_OPAQUE
17
+ super(values)
18
+ end
19
+
15
20
  # If possible, convert argument into a SDL::Color
16
21
  def self.cast(something)
17
22
  if something.kind_of? Array
18
23
  something.map!(&:to_i)
19
24
  result = new
20
25
  result.set(*something)
21
-
26
+
22
27
  return result
23
28
  else
24
29
  return super
@@ -37,7 +42,7 @@ module SDL2
37
42
  self.send("#{c}=", color.send(c))
38
43
  end
39
44
  end
40
-
45
+
41
46
  def to_a
42
47
  [r, g, b, a]
43
48
  end
data/lib/sdl2/cpuinfo.rb CHANGED
@@ -4,15 +4,35 @@ module SDL2
4
4
 
5
5
  CACHELINE_SIZE = 128
6
6
 
7
- api :SDL_GetCPUCount, [], :int
8
- api :SDL_GetCPUCacheLineSize, [], :int
9
- api :SDL_HasRDTSC, [], :bool
10
- api :SDL_HasAltiVec, [], :bool
11
- api :SDL_Has3DNow, [], :bool
12
- api :SDL_HasSSE, [], :bool
13
- api :SDL_HasSSE2, [], :bool
14
- api :SDL_HasSSE3, [], :bool
15
- api :SDL_HasSSE41, [], :bool
16
- api :SDL_HasSSE42, [], :bool
7
+ ##
8
+ #
9
+ api :SDL_GetCPUCount, [], :int
10
+ ##
11
+ #
12
+ api :SDL_GetCPUCacheLineSize, [], :int
13
+ ##
14
+ #
15
+ api :SDL_HasRDTSC, [], :bool
16
+ ##
17
+ #
18
+ api :SDL_HasAltiVec, [], :bool
19
+ ##
20
+ #
21
+ api :SDL_Has3DNow, [], :bool
22
+ ##
23
+ #
24
+ api :SDL_HasSSE, [], :bool
25
+ ##
26
+ #
27
+ api :SDL_HasSSE2, [], :bool
28
+ ##
29
+ #
30
+ api :SDL_HasSSE3, [], :bool
31
+ ##
32
+ #
33
+ api :SDL_HasSSE41, [], :bool
34
+ ##
35
+ #
36
+ api :SDL_HasSSE42, [], :bool
17
37
 
18
38
  end
@@ -0,0 +1,52 @@
1
+ require 'sdl2'
2
+
3
+ module SDL2
4
+
5
+ # Input/Output engine.
6
+ class Engine
7
+
8
+ def initialize(opts = {})
9
+
10
+ # TODO: ??
11
+ end
12
+
13
+ def quit()
14
+
15
+ end
16
+
17
+ attr_reader :surface
18
+
19
+ def on_handlers
20
+ @on_handlers ||= {}
21
+ end
22
+
23
+ def on(*args, &block)
24
+ raise "Must specify EVENTTYPEs to handle" if args.empty?
25
+ raise "Must give block to call on event" if args.empty? unless block.nil?
26
+ args.each do |event_hash|
27
+ raise "Expected Hash: #{event_hash.inspect}" unless event_hash.kind_of? Hash
28
+ on_handlers[event_hash] = block
29
+ end
30
+ end
31
+
32
+ def handle_event(event)
33
+
34
+ on_handlers.each_pair do |event_hash, handler|
35
+
36
+ return true if handler.call(event) if event == event_hash
37
+
38
+ end
39
+
40
+ return false # if we get to here.
41
+ end
42
+
43
+ # This routine should be overriden.
44
+ def paint_to(surface)
45
+ false
46
+ end
47
+
48
+ protected
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,27 @@
1
+ require 'sdl2/engine'
2
+
3
+ module SDL2
4
+
5
+ class Engine
6
+
7
+ class BlockEngine < Engine
8
+
9
+ def initialize(opts={})
10
+ super(opts)
11
+ painter = opts[:painter]
12
+ end
13
+
14
+ attr_accessor :painter
15
+
16
+ def paint_to(surface)
17
+ unless painter.nil?
18
+ return painter.call(surface)
19
+ else
20
+ return super(surface)
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,46 @@
1
+ require 'sdl2/engine'
2
+
3
+ module SDL2
4
+
5
+ # An engine multiplexor.
6
+ # Only has one focus, but that focus can change.
7
+ class Engine::Engines < Engine
8
+
9
+ def initialize(opts)
10
+ super(opts)
11
+ @engines = [] #opts[:engines] || []
12
+ @current_idx = 0
13
+ end
14
+
15
+ attr_reader :engines
16
+
17
+ def current_engine
18
+ @engines[@current_idx]
19
+ end
20
+
21
+ def handle_event(event)
22
+ return true if super(event) # self swallowed event.
23
+ if current_engine
24
+ puts "Passing to current engine."if SDL2::PrintDebug
25
+ return true if current_engine.handle_event(event)
26
+ end
27
+ puts "Unable to handle"if SDL2::PrintDebug
28
+ return false # if we get to here.
29
+ end
30
+
31
+ def paint_to(surface)
32
+ if ce = current_engine
33
+ return ce.paint_to(surface)
34
+ else
35
+ return false
36
+ end
37
+ end
38
+
39
+ def quit()
40
+ @engines.each(&:quit)
41
+ super()
42
+ end
43
+
44
+ end
45
+
46
+ end
data/lib/sdl2/error.rb CHANGED
@@ -2,8 +2,14 @@ require 'sdl2'
2
2
 
3
3
  module SDL2
4
4
 
5
- api :SDL_ClearError, [], :void
6
- api :SDL_GetError, [], :string
7
- api :SDL_SetError, [:string, :varargs], :int
5
+ ##
6
+ #
7
+ api :SDL_ClearError, [], :void
8
+ ##
9
+ #
10
+ api :SDL_GetError, [], :string
11
+ ##
12
+ #
13
+ api :SDL_SetError, [:string, :varargs], :int
8
14
 
9
15
  end
data/lib/sdl2/events.rb CHANGED
@@ -77,12 +77,14 @@ module SDL2
77
77
 
78
78
  class AbstractEvent < Struct
79
79
  SHARED = [:type, :event_type, :timestamp, :uint32]
80
+
80
81
  end
81
82
 
82
83
  # Fields shared by every event
83
84
  class CommonEvent < AbstractEvent
84
85
 
85
86
  layout *SHARED
87
+
86
88
  end
87
89
 
88
90
  # Window state change event data (event.window.*)
@@ -439,20 +441,48 @@ module SDL2
439
441
  end
440
442
  return tmp_event # May be nil if SDL2.poll_event fails.
441
443
  end
442
-
444
+
445
+ def self.push(event)
446
+ event = Event.cast(event)
447
+ SDL2.push_event!(event)
448
+ end
449
+
443
450
  def self.cast(something)
444
451
  if something.kind_of? AbstractEvent
445
452
  return self.new(something.pointer)
453
+ elsif something.kind_of? Hash
454
+ raise "Must have type : #{something.inspect}" unless something.has_key? :type
455
+ tmp = self.new
456
+ fields = members & something.keys
457
+ fields.each do |field|
458
+ if tmp[field].kind_of? Struct and something[field].kind_of? Hash
459
+ tmp[field].update_members(something[field])
460
+ else
461
+ tmp[field] = something[field]
462
+ end
463
+ end
464
+ return tmp
446
465
  else
447
466
  raise "Is not an AbstractEvent!: #{something.inspect}"
448
467
  end
449
468
  end
450
469
 
451
- # Converts SDL's type integer into a EVENTTYPE symbol
452
- # Returns :UNKOWN on failure.
453
- def type_symbol
454
- sym = EVENTTYPE.by_value[self.type]
455
- sym.nil? ? :UNKOWN : sym
470
+ def ==(other)
471
+ if other.kind_of?(Hash)
472
+ # False if there are fields that do not exist
473
+ return false unless (other.keys - members).empty?
474
+
475
+ (other.keys & members).each do |field|
476
+ return false unless self[field] == other[field]
477
+ end
478
+
479
+ return true #if we get this far
480
+
481
+ else
482
+
483
+ return super(other)
484
+
485
+ end
456
486
  end
457
487
 
458
488
  end
@@ -468,15 +498,33 @@ module SDL2
468
498
 
469
499
  ##
470
500
  # :class-method: peep_events
501
+ ##
502
+ #
471
503
  api :SDL_PeepEvents, [Event.by_ref, :count, :eventaction, :uint32, :uint32], :int
504
+ ##
505
+ #
472
506
  api :SDL_HasEvent, [:uint32], :bool
507
+ ##
508
+ #
473
509
  api :SDL_HasEvents, [:uint32, :uint32], :bool
510
+ ##
511
+ #
474
512
  api :SDL_FlushEvent, [:uint32], :void
513
+ ##
514
+ #
475
515
  api :SDL_FlushEvents, [:uint32, :uint32], :void
516
+ ##
517
+ #
476
518
  api :SDL_PollEvent, [Event.by_ref], :int
477
519
  boolean? :poll_event, TRUE_WHEN_ONE
520
+ ##
521
+ #
478
522
  api :SDL_WaitEvent, [Event.by_ref], :int
523
+ ##
524
+ #
479
525
  api :SDL_WaitEventTimeout, [Event.by_ref, :count], :int
526
+ ##
527
+ #
480
528
  api :SDL_PushEvent, [Event.by_ref], :int, {error: true, filter: TRUE_WHEN_ONE}
481
529
 
482
530
  ##
@@ -488,10 +536,20 @@ module SDL2
488
536
  layout :callback, :event_filter
489
537
  end
490
538
 
539
+ ##
540
+ #
491
541
  api :SDL_SetEventFilter, [:event_filter, :pointer], :void
542
+ ##
543
+ #
492
544
  api :SDL_GetEventFilter, [:pointer, :pointer], :bool
545
+ ##
546
+ #
493
547
  api :SDL_AddEventWatch, [:event_filter, :pointer], :void
548
+ ##
549
+ #
494
550
  api :SDL_DelEventWatch, [:event_filter, :pointer], :void
551
+ ##
552
+ #
495
553
  api :SDL_FilterEvents, [:event_filter, :pointer], :void
496
554
 
497
555
  # Enumeration of event_state query
@@ -505,6 +563,8 @@ module SDL2
505
563
 
506
564
  enum :event_state, EVENTSTATE.flatten_consts
507
565
 
566
+ ##
567
+ #
508
568
  ##
509
569
  #
510
570
  api :SDL_EventState, [:uint32, :event_state], :uint8
@@ -513,5 +573,7 @@ module SDL2
513
573
  event_state(type, EVENTSTATE::QUERY)
514
574
  end
515
575
 
576
+ ##
577
+ #
516
578
  api :SDL_RegisterEvents, [:count], :uint32
517
579
  end
@@ -30,33 +30,73 @@ module SDL2
30
30
 
31
31
  end#GameController
32
32
 
33
- api :SDL_GameControllerAddMapping, [:string], :int
34
- api :SDL_GameControllerMappingForGUID, [JoystickGUID.by_value], :string
35
- api :SDL_GameControllerMapping, [GameController.by_ref], :string
36
- api :SDL_IsGameController, [:joystick_index], :bool
37
- api :SDL_GameControllerNameForIndex, [:joystick_index], :string
38
- api :SDL_GameControllerOpen, [:joystick_index], :string
39
- api :SDL_GameControllerName, [GameController.by_ref], :string
40
- api :SDL_GameControllerGetAttached, [GameController.by_ref], :bool
41
- api :SDL_GameControllerGetJoystick, [GameController.by_ref], Joystick.by_ref
42
- api :SDL_GameControllerEventState, [:int], :int
43
- api :SDL_GameControllerUpdate, [], :void
33
+ ##
34
+ #
35
+ api :SDL_GameControllerAddMapping, [:string], :int
36
+ ##
37
+ #
38
+ api :SDL_GameControllerMappingForGUID, [JoystickGUID.by_value], :string
39
+ ##
40
+ #
41
+ api :SDL_GameControllerMapping, [GameController.by_ref], :string
42
+ ##
43
+ #
44
+ api :SDL_IsGameController, [:joystick_index], :bool
45
+ ##
46
+ #
47
+ api :SDL_GameControllerNameForIndex, [:joystick_index], :string
48
+ ##
49
+ #
50
+ api :SDL_GameControllerOpen, [:joystick_index], :string
51
+ ##
52
+ #
53
+ api :SDL_GameControllerName, [GameController.by_ref], :string
54
+ ##
55
+ #
56
+ api :SDL_GameControllerGetAttached, [GameController.by_ref], :bool
57
+ ##
58
+ #
59
+ api :SDL_GameControllerGetJoystick, [GameController.by_ref], Joystick.by_ref
60
+ ##
61
+ #
62
+ api :SDL_GameControllerEventState, [:int], :int
63
+ ##
64
+ #
65
+ api :SDL_GameControllerUpdate, [], :void
44
66
 
45
67
  enum :game_controller_axis, [:INVALID, -1, :LEFTX, :LEFTY, :RIGHTX, :RIGHTY, :TRIGGERLEFT, :TRIGGERRIGHT, :MAX]
46
68
 
47
- api :SDL_GameControllerGetAxisFromString, [:string], :game_controller_axis
48
- api :SDL_GameControllerGetStringForAxis, [:game_controller_axis], :string
49
- api :SDL_GameControllerGetBindForAxis, [GameController.by_ref, :game_controller_axis], GameController::ButtonBind
50
- api :SDL_GameControllerGetAxis, [GameController.by_ref, :game_controller_axis], :int16
69
+ ##
70
+ #
71
+ api :SDL_GameControllerGetAxisFromString, [:string], :game_controller_axis
72
+ ##
73
+ #
74
+ api :SDL_GameControllerGetStringForAxis, [:game_controller_axis], :string
75
+ ##
76
+ #
77
+ api :SDL_GameControllerGetBindForAxis, [GameController.by_ref, :game_controller_axis], GameController::ButtonBind
78
+ ##
79
+ #
80
+ api :SDL_GameControllerGetAxis, [GameController.by_ref, :game_controller_axis], :int16
51
81
 
52
82
  enum :game_controller_button, [:INVLIAD, -1,
53
83
  :A, :B, :X, :Y, :BACK, :GUIDE, :START,
54
84
  :LEFTSTICK, :RIGHTSTICK, :LEFTSHOULDER, :RIGHTSHOULDER,
55
85
  :DPAD_UP, :DPAD_DOWN, :DPAD_LEFT, :DPAD_RIGHT]
56
86
 
57
- api :SDL_GameControllerGetButtonFromString, [:string], :game_controller_button
58
- api :SDL_GameControllerGetStringForButton, [:game_controller_button], :string
59
- api :SDL_GameControllerGetBindForButton, [GameController.by_ref, :game_controller_button], GameController::ButtonBind
60
- api :SDL_GameControllerGetButton, [GameController.by_ref, :game_controller_button], :uint8
61
- api :SDL_GameControllerClose, [GameController.by_ref], :void
87
+ ##
88
+ #
89
+ api :SDL_GameControllerGetButtonFromString, [:string], :game_controller_button
90
+ ##
91
+ #
92
+ api :SDL_GameControllerGetStringForButton, [:game_controller_button], :string
93
+ ##
94
+ #
95
+ api :SDL_GameControllerGetBindForButton, [GameController.by_ref, :game_controller_button], GameController::ButtonBind
96
+ ##
97
+ #
98
+ api :SDL_GameControllerGetButton, [GameController.by_ref, :game_controller_button], :uint8
99
+ ##
100
+ #
101
+ api :SDL_GameControllerClose, [GameController.by_ref], :void
62
102
  end