sdl2_ffi 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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