sdl2-win93 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/.dir-locals.el +2 -0
 - data/.github/workflows/gempush.yml +29 -0
 - data/.gitignore +14 -0
 - data/COPYING.txt +165 -0
 - data/Gemfile +4 -0
 - data/Gemfile.lock +24 -0
 - data/Makefile +4 -0
 - data/README.md +36 -0
 - data/Rakefile +51 -0
 - data/doc/po/ja.po +10357 -0
 - data/ext/sdl2_ext/clipboard.c +61 -0
 - data/ext/sdl2_ext/color.c +103 -0
 - data/ext/sdl2_ext/color.h +4 -0
 - data/ext/sdl2_ext/event.c +1298 -0
 - data/ext/sdl2_ext/extconf.rb +22 -0
 - data/ext/sdl2_ext/filesystem.c +63 -0
 - data/ext/sdl2_ext/gamecontroller.c +408 -0
 - data/ext/sdl2_ext/gamecontroller.c.m4 +408 -0
 - data/ext/sdl2_ext/gl.c +351 -0
 - data/ext/sdl2_ext/gl.c.m4 +351 -0
 - data/ext/sdl2_ext/hint.c +99 -0
 - data/ext/sdl2_ext/joystick.c +339 -0
 - data/ext/sdl2_ext/joystick.c.m4 +339 -0
 - data/ext/sdl2_ext/key.c +1302 -0
 - data/ext/sdl2_ext/key.c.m4 +833 -0
 - data/ext/sdl2_ext/main.c +258 -0
 - data/ext/sdl2_ext/messagebox.c +233 -0
 - data/ext/sdl2_ext/mixer.c +1205 -0
 - data/ext/sdl2_ext/mixer.c.m4 +1205 -0
 - data/ext/sdl2_ext/mouse.c +286 -0
 - data/ext/sdl2_ext/rubysdl2_internal.h +127 -0
 - data/ext/sdl2_ext/timer.c +63 -0
 - data/ext/sdl2_ext/ttf.c +376 -0
 - data/ext/sdl2_ext/ttf.c.m4 +376 -0
 - data/ext/sdl2_ext/video.c +4093 -0
 - data/ext/sdl2_ext/video.c.m4 +3867 -0
 - data/lib/sdl2.rb +3 -0
 - data/lib/sdl2/event.rb +55 -0
 - data/lib/sdl2/version.rb +8 -0
 - data/sample/chunk_destroy.rb +16 -0
 - data/sample/gfxprimitives.rb +54 -0
 - data/sample/icon.bmp +0 -0
 - data/sample/memory_test/m1.rb +28 -0
 - data/sample/memory_test/m2.rb +18 -0
 - data/sample/memory_test/m3.rb +12 -0
 - data/sample/message_box.rb +33 -0
 - data/sample/music_player.rb +137 -0
 - data/sample/playwave.rb +19 -0
 - data/sample/primitives.rb +32 -0
 - data/sample/test_clipboard.rb +16 -0
 - data/sample/test_controller.rb +62 -0
 - data/sample/test_joystick.rb +53 -0
 - data/sample/test_keyboard.rb +52 -0
 - data/sample/test_mouse.rb +50 -0
 - data/sample/test_surface.rb +13 -0
 - data/sample/test_ttf.rb +82 -0
 - data/sample/test_video.rb +59 -0
 - data/sample/testgl.rb +175 -0
 - data/sample/testsprite.rb +296 -0
 - data/sample/testspriteminimal.rb +75 -0
 - data/sample/timer.rb +11 -0
 - data/sample/version.rb +12 -0
 - data/sample/video_info.rb +64 -0
 - data/sdl2-win93.gemspec +31 -0
 - metadata +158 -0
 
| 
         @@ -0,0 +1,296 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sdl2'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            MAX_SPEED = 1
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class Integer
         
     | 
| 
      
 7 
     | 
    
         
            +
              def bit?(mask)
         
     | 
| 
      
 8 
     | 
    
         
            +
                (self & mask) != 0
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            class Cycle < Struct.new(:cycle_color, :cycle_alpha, :color, :alpha,
         
     | 
| 
      
 13 
     | 
    
         
            +
                                     :color_direction, :alpha_direction)
         
     | 
| 
      
 14 
     | 
    
         
            +
              def update
         
     | 
| 
      
 15 
     | 
    
         
            +
                self.color += self.color_direction
         
     | 
| 
      
 16 
     | 
    
         
            +
                if self.color < 0
         
     | 
| 
      
 17 
     | 
    
         
            +
                  self.color = 0
         
     | 
| 
      
 18 
     | 
    
         
            +
                  self.color_direction *= -1
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                if color > 255
         
     | 
| 
      
 21 
     | 
    
         
            +
                  self.color = 255
         
     | 
| 
      
 22 
     | 
    
         
            +
                  self.color_direction *= -1
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                self.alpha += self.alpha_direction
         
     | 
| 
      
 25 
     | 
    
         
            +
                if self.alpha < 0
         
     | 
| 
      
 26 
     | 
    
         
            +
                  self.alpha = 0
         
     | 
| 
      
 27 
     | 
    
         
            +
                  self.alpha_direction *= -1
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
                if self.alpha > 255
         
     | 
| 
      
 30 
     | 
    
         
            +
                  self.alpha = 255
         
     | 
| 
      
 31 
     | 
    
         
            +
                  self.alpha_direction *= -1
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
                               
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            class WindowData
         
     | 
| 
      
 38 
     | 
    
         
            +
              def initialize(sdl_window, renderer, cycle, blend_mode, use_color_key)
         
     | 
| 
      
 39 
     | 
    
         
            +
                @sdl_window = sdl_window
         
     | 
| 
      
 40 
     | 
    
         
            +
                @renderer = renderer
         
     | 
| 
      
 41 
     | 
    
         
            +
                @cycle = cycle
         
     | 
| 
      
 42 
     | 
    
         
            +
                @blend_mode = blend_mode
         
     | 
| 
      
 43 
     | 
    
         
            +
                @use_color_key = use_color_key
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              def setup(spritepath, num_sprites)
         
     | 
| 
      
 47 
     | 
    
         
            +
                load_sprite(spritepath)
         
     | 
| 
      
 48 
     | 
    
         
            +
                @sprite.blend_mode = @blend_mode
         
     | 
| 
      
 49 
     | 
    
         
            +
                @sprites = Array.new(num_sprites){
         
     | 
| 
      
 50 
     | 
    
         
            +
                  Sprite.new(@sdl_window, @renderer, @sprite)
         
     | 
| 
      
 51 
     | 
    
         
            +
                }
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
              
         
     | 
| 
      
 54 
     | 
    
         
            +
              def load_sprite(fname)
         
     | 
| 
      
 55 
     | 
    
         
            +
                bitmap = SDL2::Surface.load(fname)
         
     | 
| 
      
 56 
     | 
    
         
            +
                bitmap.color_key = bitmap.pixel(0, 0) if @use_color_key
         
     | 
| 
      
 57 
     | 
    
         
            +
                @sprite = @renderer.create_texture_from(bitmap)
         
     | 
| 
      
 58 
     | 
    
         
            +
                bitmap.destroy
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
              def update
         
     | 
| 
      
 62 
     | 
    
         
            +
                @sprites.each(&:update)
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 66 
     | 
    
         
            +
                viewport = @renderer.viewport
         
     | 
| 
      
 67 
     | 
    
         
            +
                # Draw a gray background
         
     | 
| 
      
 68 
     | 
    
         
            +
                @renderer.draw_color = [0xA0, 0xA0, 0xA0]
         
     | 
| 
      
 69 
     | 
    
         
            +
                @renderer.clear
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                # Points
         
     | 
| 
      
 72 
     | 
    
         
            +
                @renderer.draw_color = [0xff, 0, 0]
         
     | 
| 
      
 73 
     | 
    
         
            +
                @renderer.draw_point(0, 0)
         
     | 
| 
      
 74 
     | 
    
         
            +
                @renderer.draw_point(viewport.w - 1, 0)
         
     | 
| 
      
 75 
     | 
    
         
            +
                @renderer.draw_point(0 ,viewport.h - 1)
         
     | 
| 
      
 76 
     | 
    
         
            +
                @renderer.draw_point(viewport.w - 1, viewport.h - 1)
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                # Fill rect
         
     | 
| 
      
 79 
     | 
    
         
            +
                @renderer.draw_color = [0xff, 0xff, 0xff]
         
     | 
| 
      
 80 
     | 
    
         
            +
                @renderer.fill_rect(SDL2::Rect[viewport.w/2 - 50, viewport.h/2 - 50, 100, 100])
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                # Draw rect
         
     | 
| 
      
 83 
     | 
    
         
            +
                @renderer.draw_color = [0, 0, 0]
         
     | 
| 
      
 84 
     | 
    
         
            +
                @renderer.draw_rect(SDL2::Rect[viewport.w/2 - 50, viewport.h/2 - 50, 100, 100])
         
     | 
| 
      
 85 
     | 
    
         
            +
                
         
     | 
| 
      
 86 
     | 
    
         
            +
                # lines
         
     | 
| 
      
 87 
     | 
    
         
            +
                @renderer.draw_color = [0, 0xff, 0]
         
     | 
| 
      
 88 
     | 
    
         
            +
                @renderer.draw_line(1, 1, viewport.w - 2, viewport.h - 2)
         
     | 
| 
      
 89 
     | 
    
         
            +
                @renderer.draw_line(1, viewport.h - 2, viewport.w - 2, 1)
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                @sprite.color_mod = [@cycle.color, 255, @cycle.color] if @cycle.cycle_color
         
     | 
| 
      
 92 
     | 
    
         
            +
                @sprite.alpha_mod = @cycle.alpha if @cycle.cycle_alpha
         
     | 
| 
      
 93 
     | 
    
         
            +
                
         
     | 
| 
      
 94 
     | 
    
         
            +
                @sprites.each(&:draw)
         
     | 
| 
      
 95 
     | 
    
         
            +
                @renderer.present
         
     | 
| 
      
 96 
     | 
    
         
            +
              end
         
     | 
| 
      
 97 
     | 
    
         
            +
              
         
     | 
| 
      
 98 
     | 
    
         
            +
              class Sprite
         
     | 
| 
      
 99 
     | 
    
         
            +
                def initialize(window, renderer, sprite, max_speed = MAX_SPEED)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  @renderer = renderer
         
     | 
| 
      
 101 
     | 
    
         
            +
                  @sprite = sprite
         
     | 
| 
      
 102 
     | 
    
         
            +
                  window_w, window_h = window.size
         
     | 
| 
      
 103 
     | 
    
         
            +
                  @position = SDL2::Rect[rand(window_w - sprite.w),
         
     | 
| 
      
 104 
     | 
    
         
            +
                                         rand(window_h - sprite.h),
         
     | 
| 
      
 105 
     | 
    
         
            +
                                         sprite.w, sprite.h]
         
     | 
| 
      
 106 
     | 
    
         
            +
                  @velocity = random_velocity(max_speed)
         
     | 
| 
      
 107 
     | 
    
         
            +
                end
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                def random_velocity(max_speed)
         
     | 
| 
      
 110 
     | 
    
         
            +
                  loop do
         
     | 
| 
      
 111 
     | 
    
         
            +
                    dx = rand(2*max_speed + 1) - max_speed
         
     | 
| 
      
 112 
     | 
    
         
            +
                    dy = rand(2*max_speed + 1) - max_speed
         
     | 
| 
      
 113 
     | 
    
         
            +
                    return SDL2::Point[dx, dy] if dx != 0 || dy != 0
         
     | 
| 
      
 114 
     | 
    
         
            +
                  end
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                def update
         
     | 
| 
      
 118 
     | 
    
         
            +
                  viewport = @renderer.viewport
         
     | 
| 
      
 119 
     | 
    
         
            +
                  @position.x += @velocity.x
         
     | 
| 
      
 120 
     | 
    
         
            +
                  @position.y += @velocity.y
         
     | 
| 
      
 121 
     | 
    
         
            +
                  unless (0 .. viewport.w - @sprite.w).cover?(@position.x)
         
     | 
| 
      
 122 
     | 
    
         
            +
                    @velocity.x *= -1
         
     | 
| 
      
 123 
     | 
    
         
            +
                    @position.x += @velocity.x
         
     | 
| 
      
 124 
     | 
    
         
            +
                  end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                  unless (0 .. viewport.h - @sprite.h).cover?(@position.y)
         
     | 
| 
      
 127 
     | 
    
         
            +
                    @velocity.y *= -1
         
     | 
| 
      
 128 
     | 
    
         
            +
                    @position.y += @velocity.y
         
     | 
| 
      
 129 
     | 
    
         
            +
                  end
         
     | 
| 
      
 130 
     | 
    
         
            +
                end
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                def draw
         
     | 
| 
      
 133 
     | 
    
         
            +
                  @renderer.copy(@sprite, nil, @position)
         
     | 
| 
      
 134 
     | 
    
         
            +
                end
         
     | 
| 
      
 135 
     | 
    
         
            +
              end
         
     | 
| 
      
 136 
     | 
    
         
            +
            end
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
            class App
         
     | 
| 
      
 139 
     | 
    
         
            +
              def initialize
         
     | 
| 
      
 140 
     | 
    
         
            +
                @title = "testsprite"
         
     | 
| 
      
 141 
     | 
    
         
            +
                @window_flags = 0
         
     | 
| 
      
 142 
     | 
    
         
            +
                @icon_path = nil
         
     | 
| 
      
 143 
     | 
    
         
            +
                @num_window = 1
         
     | 
| 
      
 144 
     | 
    
         
            +
                @window_x = @window_y = SDL2::Window::POS_UNDEFINED
         
     | 
| 
      
 145 
     | 
    
         
            +
                @window_w = 640
         
     | 
| 
      
 146 
     | 
    
         
            +
                @window_h = 480
         
     | 
| 
      
 147 
     | 
    
         
            +
                @spritepath = "icon.bmp"
         
     | 
| 
      
 148 
     | 
    
         
            +
                @renderer_flags = 0
         
     | 
| 
      
 149 
     | 
    
         
            +
                @num_sprites = 100
         
     | 
| 
      
 150 
     | 
    
         
            +
                @blend_mode = SDL2::BlendMode::BLEND
         
     | 
| 
      
 151 
     | 
    
         
            +
                @cycle = Cycle.new(false, false, rand(255), rand(255), [1,-1].sample, [1,-1].sample)
         
     | 
| 
      
 152 
     | 
    
         
            +
                @use_color_key = true
         
     | 
| 
      
 153 
     | 
    
         
            +
              end
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
              def options
         
     | 
| 
      
 156 
     | 
    
         
            +
                opts = OptionParser.new("Usage: testsprite [options] [SPRITE]")
         
     | 
| 
      
 157 
     | 
    
         
            +
                opts.version = SDL2::VERSION
         
     | 
| 
      
 158 
     | 
    
         
            +
                opts.release = nil
         
     | 
| 
      
 159 
     | 
    
         
            +
                
         
     | 
| 
      
 160 
     | 
    
         
            +
                opts.on("-m", "--mode MODE", "fullscreen|fullscreen-desktop|window"){|mode|
         
     | 
| 
      
 161 
     | 
    
         
            +
                  case mode
         
     | 
| 
      
 162 
     | 
    
         
            +
                  when "fullscreen"
         
     | 
| 
      
 163 
     | 
    
         
            +
                    raise "Only one window is available for fullscreen mode" if @num_window != 1
         
     | 
| 
      
 164 
     | 
    
         
            +
                    @window_flags |= SDL2::Window::FULLSCREEN
         
     | 
| 
      
 165 
     | 
    
         
            +
                  when "fullscreen-desktop"
         
     | 
| 
      
 166 
     | 
    
         
            +
                    raise "Only one window is available for fullscreen-desktop mode" if @num_window != 1
         
     | 
| 
      
 167 
     | 
    
         
            +
                    @window_flags |= SDL2::Window::FULLSCREEN_DESKTOP
         
     | 
| 
      
 168 
     | 
    
         
            +
                  when "window"
         
     | 
| 
      
 169 
     | 
    
         
            +
                    @window_flags &= ~(SDL2::Window::FULLSCREEN|SDL2::Window::FULLSCREEN_DESKTOP)
         
     | 
| 
      
 170 
     | 
    
         
            +
                  end
         
     | 
| 
      
 171 
     | 
    
         
            +
                }
         
     | 
| 
      
 172 
     | 
    
         
            +
                
         
     | 
| 
      
 173 
     | 
    
         
            +
                opts.on("--windows N", "Number of windows", Integer){|n|
         
     | 
| 
      
 174 
     | 
    
         
            +
                  if n != 1 and @window_flags.bit?(SDL2::Window::FULLSCREEN|SDL2::Window::FULLSCREEN_DESKTOP)
         
     | 
| 
      
 175 
     | 
    
         
            +
                    raise "Only one window is available for fullscreen mode"
         
     | 
| 
      
 176 
     | 
    
         
            +
                  end
         
     | 
| 
      
 177 
     | 
    
         
            +
                  @num_window = n
         
     | 
| 
      
 178 
     | 
    
         
            +
                }
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
                opts.on("--geometry WxH", "size of the window/screen"){|s|
         
     | 
| 
      
 181 
     | 
    
         
            +
                  raise "geomtry format error #{s}" unless /\A(\d+)x(\d+)\Z/ =~ s
         
     | 
| 
      
 182 
     | 
    
         
            +
                  @window_w = Integer($1); @window_h = Integer($2)
         
     | 
| 
      
 183 
     | 
    
         
            +
                }
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
                opts.on("--center", "Window will be centered"){
         
     | 
| 
      
 186 
     | 
    
         
            +
                  @window_x = @window_y = SDL2::Window::POS_CENTERED
         
     | 
| 
      
 187 
     | 
    
         
            +
                }
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
                opts.on("-t", "--title TITLE", "Window title"){|title| @title = title }
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                opts.on("--icon ICON", "Window icon"){|path| @icon_path = path }
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
                opts.on("--position X,Y", "Position of the window", Array){|x,y|
         
     | 
| 
      
 194 
     | 
    
         
            +
                  @window_x = Integer(x); @window_y = Integer(y)
         
     | 
| 
      
 195 
     | 
    
         
            +
                }
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                opts.on("--noframe", "Window is borderless") { @window_flags |= SDL2::Window::BORDERLESS }
         
     | 
| 
      
 198 
     | 
    
         
            +
             
     | 
| 
      
 199 
     | 
    
         
            +
                opts.on("--resize", "Window is resizable") { @window_flags |= SDL2::Window::RESIZABLE }
         
     | 
| 
      
 200 
     | 
    
         
            +
             
     | 
| 
      
 201 
     | 
    
         
            +
                opts.on("--allow-highdip"){ @window_flags |= SDL2::Window::ALLOW_HIGHDPI }
         
     | 
| 
      
 202 
     | 
    
         
            +
             
     | 
| 
      
 203 
     | 
    
         
            +
                opts.on("--blend MODE", "none|blend|add|mod"){|blend_mode|
         
     | 
| 
      
 204 
     | 
    
         
            +
                  @blend_mode = case blend_mode
         
     | 
| 
      
 205 
     | 
    
         
            +
                                when "none"
         
     | 
| 
      
 206 
     | 
    
         
            +
                                  SDL2::BlendMode::NONE
         
     | 
| 
      
 207 
     | 
    
         
            +
                                when "blend"
         
     | 
| 
      
 208 
     | 
    
         
            +
                                  SDL2::BlendMode::BLEND
         
     | 
| 
      
 209 
     | 
    
         
            +
                                when "add"
         
     | 
| 
      
 210 
     | 
    
         
            +
                                  SDL2::BlendMode::ADD
         
     | 
| 
      
 211 
     | 
    
         
            +
                                when "mod"
         
     | 
| 
      
 212 
     | 
    
         
            +
                                  SDL2::BlendMode::MOD
         
     | 
| 
      
 213 
     | 
    
         
            +
                                end
         
     | 
| 
      
 214 
     | 
    
         
            +
                }
         
     | 
| 
      
 215 
     | 
    
         
            +
                
         
     | 
| 
      
 216 
     | 
    
         
            +
                opts.on("--cycle-color"){ @cycle.cycle_color = true }
         
     | 
| 
      
 217 
     | 
    
         
            +
             
     | 
| 
      
 218 
     | 
    
         
            +
                opts.on("--cycle-alpha"){ @cycle.cycle_alpha = true }
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
      
 220 
     | 
    
         
            +
                opts.on("--vsync", "Present is syncronized with the refresh rate") {
         
     | 
| 
      
 221 
     | 
    
         
            +
                  @renderer_flags |= SDL2::Renderer::Flags::PRESENTVSYNC
         
     | 
| 
      
 222 
     | 
    
         
            +
                }
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
                opts.on("--use-color-key (yes|no)", TrueClass){|bool| @use_color_key = bool }
         
     | 
| 
      
 225 
     | 
    
         
            +
                opts
         
     | 
| 
      
 226 
     | 
    
         
            +
              end
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
      
 228 
     | 
    
         
            +
              def run(argv)
         
     | 
| 
      
 229 
     | 
    
         
            +
                options.parse!(argv)
         
     | 
| 
      
 230 
     | 
    
         
            +
                @spritepath = argv.shift || @spritepath
         
     | 
| 
      
 231 
     | 
    
         
            +
                
         
     | 
| 
      
 232 
     | 
    
         
            +
                SDL2.init(SDL2::INIT_VIDEO)
         
     | 
| 
      
 233 
     | 
    
         
            +
                icon = load_icon
         
     | 
| 
      
 234 
     | 
    
         
            +
                @windows = @num_window.times.map do |n|
         
     | 
| 
      
 235 
     | 
    
         
            +
                  window = SDL2::Window.create("#{@title} #{n}",
         
     | 
| 
      
 236 
     | 
    
         
            +
                                               @window_x, @window_y, @window_w, @window_h,
         
     | 
| 
      
 237 
     | 
    
         
            +
                                               @window_flags)
         
     | 
| 
      
 238 
     | 
    
         
            +
                  renderer = window.create_renderer(-1, @renderer_flags)
         
     | 
| 
      
 239 
     | 
    
         
            +
                  window.icon = icon if icon
         
     | 
| 
      
 240 
     | 
    
         
            +
                  
         
     | 
| 
      
 241 
     | 
    
         
            +
                  WindowData.new(window, renderer, @cycle, @blend_mode, @use_color_key)
         
     | 
| 
      
 242 
     | 
    
         
            +
                end
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
      
 244 
     | 
    
         
            +
                @windows.each{|win| win.setup(@spritepath, @num_sprites) }
         
     | 
| 
      
 245 
     | 
    
         
            +
             
     | 
| 
      
 246 
     | 
    
         
            +
                loop do
         
     | 
| 
      
 247 
     | 
    
         
            +
                  while event = SDL2::Event.poll
         
     | 
| 
      
 248 
     | 
    
         
            +
                    handle_event(event)
         
     | 
| 
      
 249 
     | 
    
         
            +
                  end
         
     | 
| 
      
 250 
     | 
    
         
            +
                  @cycle.update
         
     | 
| 
      
 251 
     | 
    
         
            +
                  @windows.each {|window| window.update; window.draw }
         
     | 
| 
      
 252 
     | 
    
         
            +
                  sleep 0.01
         
     | 
| 
      
 253 
     | 
    
         
            +
                end
         
     | 
| 
      
 254 
     | 
    
         
            +
              end
         
     | 
| 
      
 255 
     | 
    
         
            +
             
     | 
| 
      
 256 
     | 
    
         
            +
              def load_icon
         
     | 
| 
      
 257 
     | 
    
         
            +
                return nil if @icon_path.nil?
         
     | 
| 
      
 258 
     | 
    
         
            +
                SDL2::Surface.load(@icon_path)
         
     | 
| 
      
 259 
     | 
    
         
            +
              end
         
     | 
| 
      
 260 
     | 
    
         
            +
              
         
     | 
| 
      
 261 
     | 
    
         
            +
              def handle_event(event)
         
     | 
| 
      
 262 
     | 
    
         
            +
                case event
         
     | 
| 
      
 263 
     | 
    
         
            +
                when SDL2::Event::Quit
         
     | 
| 
      
 264 
     | 
    
         
            +
                  exit
         
     | 
| 
      
 265 
     | 
    
         
            +
                when SDL2::Event::KeyDown
         
     | 
| 
      
 266 
     | 
    
         
            +
                  case event.sym
         
     | 
| 
      
 267 
     | 
    
         
            +
                  when SDL2::Key::ESCAPE
         
     | 
| 
      
 268 
     | 
    
         
            +
                    exit
         
     | 
| 
      
 269 
     | 
    
         
            +
                  when SDL2::Key::RETURN
         
     | 
| 
      
 270 
     | 
    
         
            +
                    if event.mod.bit?(SDL2::Key::Mod::ALT)
         
     | 
| 
      
 271 
     | 
    
         
            +
                      if event.window.fullscreen_mode == 0
         
     | 
| 
      
 272 
     | 
    
         
            +
                        event.window.fullscreen_mode = SDL2::Window::FULLSCREEN_DESKTOP
         
     | 
| 
      
 273 
     | 
    
         
            +
                      else
         
     | 
| 
      
 274 
     | 
    
         
            +
                        event.window.fullscreen_mode = 0
         
     | 
| 
      
 275 
     | 
    
         
            +
                      end
         
     | 
| 
      
 276 
     | 
    
         
            +
                    end
         
     | 
| 
      
 277 
     | 
    
         
            +
                  when SDL2::Key::M
         
     | 
| 
      
 278 
     | 
    
         
            +
                    if event.mod.bit?(SDL2::Key::Mod::CTRL|SDL2::Key::Mod::CAPS)
         
     | 
| 
      
 279 
     | 
    
         
            +
                      window = event.window
         
     | 
| 
      
 280 
     | 
    
         
            +
                      if window.flags & SDL2::Window::MAXIMIZED != 0
         
     | 
| 
      
 281 
     | 
    
         
            +
                        window.restore
         
     | 
| 
      
 282 
     | 
    
         
            +
                      else
         
     | 
| 
      
 283 
     | 
    
         
            +
                        window.maximize
         
     | 
| 
      
 284 
     | 
    
         
            +
                      end
         
     | 
| 
      
 285 
     | 
    
         
            +
                    end
         
     | 
| 
      
 286 
     | 
    
         
            +
                  when SDL2::Key::Z
         
     | 
| 
      
 287 
     | 
    
         
            +
                    if event.mod.bit?(SDL2::Key::Mod::CTRL|SDL2::Key::Mod::CAPS)
         
     | 
| 
      
 288 
     | 
    
         
            +
                      window = event.window
         
     | 
| 
      
 289 
     | 
    
         
            +
                      window.minimize if window
         
     | 
| 
      
 290 
     | 
    
         
            +
                    end
         
     | 
| 
      
 291 
     | 
    
         
            +
                  end
         
     | 
| 
      
 292 
     | 
    
         
            +
                end
         
     | 
| 
      
 293 
     | 
    
         
            +
              end
         
     | 
| 
      
 294 
     | 
    
         
            +
            end
         
     | 
| 
      
 295 
     | 
    
         
            +
             
     | 
| 
      
 296 
     | 
    
         
            +
            App.new.run(ARGV)
         
     | 
| 
         @@ -0,0 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sdl2'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            SpriteMotion = Struct.new(:position, :velocity)
         
     | 
| 
      
 4 
     | 
    
         
            +
            WINDOW_W = 640
         
     | 
| 
      
 5 
     | 
    
         
            +
            WINDOW_H = 480
         
     | 
| 
      
 6 
     | 
    
         
            +
            NUM_SPRITES = 100
         
     | 
| 
      
 7 
     | 
    
         
            +
            MAX_SPEED = 1
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            def load_sprite(filename, renderer)
         
     | 
| 
      
 10 
     | 
    
         
            +
              bitmap = SDL2::Surface.load_bmp(filename)
         
     | 
| 
      
 11 
     | 
    
         
            +
              bitmap.color_key = bitmap.pixel(0, 0)
         
     | 
| 
      
 12 
     | 
    
         
            +
              sprite = renderer.create_texture_from(bitmap)
         
     | 
| 
      
 13 
     | 
    
         
            +
              bitmap.destroy
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              sprite
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            def move_sprite(motions, renderer, sprite)
         
     | 
| 
      
 19 
     | 
    
         
            +
              # draw a gray background
         
     | 
| 
      
 20 
     | 
    
         
            +
              renderer.draw_color = [0xA0, 0xA0, 0xA0]
         
     | 
| 
      
 21 
     | 
    
         
            +
              renderer.clear
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
              sprite_w = sprite.w; sprite_h = sprite.h
         
     | 
| 
      
 24 
     | 
    
         
            +
              
         
     | 
| 
      
 25 
     | 
    
         
            +
              motions.each do |m|
         
     | 
| 
      
 26 
     | 
    
         
            +
                m.position.x += m.velocity.x
         
     | 
| 
      
 27 
     | 
    
         
            +
                if m.position.x < 0 || m.position.x >= WINDOW_W - sprite_w
         
     | 
| 
      
 28 
     | 
    
         
            +
                  m.velocity.x *= -1
         
     | 
| 
      
 29 
     | 
    
         
            +
                  m.position.x += m.velocity.x
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                m.position.y += m.velocity.y
         
     | 
| 
      
 33 
     | 
    
         
            +
                if m.position.y < 0 || m.position.y >= WINDOW_H - sprite_h
         
     | 
| 
      
 34 
     | 
    
         
            +
                  m.velocity.y *= -1
         
     | 
| 
      
 35 
     | 
    
         
            +
                  m.position.y += m.velocity.y
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                renderer.copy(sprite, nil, m.position)
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              renderer.present
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            def random_position(sprite_w, sprite_h)
         
     | 
| 
      
 45 
     | 
    
         
            +
              SDL2::Rect[rand(WINDOW_W - sprite_w), rand(WINDOW_H - sprite_h), sprite_w, sprite_h]
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            def random_velocity
         
     | 
| 
      
 49 
     | 
    
         
            +
              loop do
         
     | 
| 
      
 50 
     | 
    
         
            +
                x = rand(MAX_SPEED*2+1) - MAX_SPEED
         
     | 
| 
      
 51 
     | 
    
         
            +
                y = rand(MAX_SPEED*2+1) - MAX_SPEED
         
     | 
| 
      
 52 
     | 
    
         
            +
                return SDL2::Point.new(x, y) if x != 0 || y != 0
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            window = SDL2::Window.create("testspritesimple", 0, 0, WINDOW_W, WINDOW_H, 0)
         
     | 
| 
      
 57 
     | 
    
         
            +
            renderer = window.create_renderer(-1, 0)
         
     | 
| 
      
 58 
     | 
    
         
            +
            sprite = load_sprite("icon.bmp", renderer)
         
     | 
| 
      
 59 
     | 
    
         
            +
            sprite_w = sprite.w; sprite_h = sprite.h
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            motions = Array.new(NUM_SPRITES) do
         
     | 
| 
      
 62 
     | 
    
         
            +
              SpriteMotion.new(random_position(sprite_w, sprite_h), random_velocity)
         
     | 
| 
      
 63 
     | 
    
         
            +
            end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            loop do
         
     | 
| 
      
 66 
     | 
    
         
            +
              while event = SDL2::Event.poll
         
     | 
| 
      
 67 
     | 
    
         
            +
                case event
         
     | 
| 
      
 68 
     | 
    
         
            +
                when SDL2::Event::Quit, SDL2::Event::KeyDown
         
     | 
| 
      
 69 
     | 
    
         
            +
                  exit
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
              move_sprite(motions, renderer, sprite)
         
     | 
| 
      
 74 
     | 
    
         
            +
              sleep 0.01
         
     | 
| 
      
 75 
     | 
    
         
            +
            end
         
     | 
    
        data/sample/timer.rb
    ADDED
    
    
    
        data/sample/version.rb
    ADDED
    
    | 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sdl2'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            p SDL2::LIBSDL_VERSION
         
     | 
| 
      
 4 
     | 
    
         
            +
            p SDL2::LIBSDL_VERSION_NUMBER
         
     | 
| 
      
 5 
     | 
    
         
            +
            p SDL2::LIBSDL_REVISION
         
     | 
| 
      
 6 
     | 
    
         
            +
            p SDL2::LIBSDL_REVISION_NUMBER
         
     | 
| 
      
 7 
     | 
    
         
            +
            p SDL2::LIBSDL_IMAGE_VERSION
         
     | 
| 
      
 8 
     | 
    
         
            +
            p SDL2::LIBSDL_IMAGE_VERSION_NUMBER
         
     | 
| 
      
 9 
     | 
    
         
            +
            p SDL2::LIBSDL_MIXER_VERSION
         
     | 
| 
      
 10 
     | 
    
         
            +
            p SDL2::LIBSDL_MIXER_VERSION_NUMBER
         
     | 
| 
      
 11 
     | 
    
         
            +
            p SDL2::LIBSDL_TTF_VERSION
         
     | 
| 
      
 12 
     | 
    
         
            +
            p SDL2::LIBSDL_TTF_VERSION_NUMBER
         
     | 
| 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sdl2'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "pp"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            SDL2.init(SDL2::INIT_VIDEO)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            pp SDL2::PixelFormat::FORMATS.map{|f| f.name}
         
     | 
| 
      
 7 
     | 
    
         
            +
            p SDL2::PixelFormat::RGBA8888
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            p SDL2::Display.displays
         
     | 
| 
      
 10 
     | 
    
         
            +
            SDL2::Display.displays.each{|display| p display.modes }
         
     | 
| 
      
 11 
     | 
    
         
            +
            display = SDL2::Display.displays.first
         
     | 
| 
      
 12 
     | 
    
         
            +
            print "curent mode: "; p display.current_mode
         
     | 
| 
      
 13 
     | 
    
         
            +
            print "desktop mode: "; p display.desktop_mode
         
     | 
| 
      
 14 
     | 
    
         
            +
            search_mode = SDL2::Display::Mode.new(SDL2::PixelFormat::UNKNOWN, 640, 480, 60)
         
     | 
| 
      
 15 
     | 
    
         
            +
            puts "The mode closest to #{search_mode.inspect} is #{display.closest_mode(search_mode).inspect}"
         
     | 
| 
      
 16 
     | 
    
         
            +
            print "bounds: "; p display.bounds
         
     | 
| 
      
 17 
     | 
    
         
            +
            puts "current video driver: #{SDL2.current_video_driver}"
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            window = SDL2::Window.create("video info", 10, 10, 640, 480, 0)
         
     | 
| 
      
 20 
     | 
    
         
            +
            renderer = window.create_renderer(-1, 0)
         
     | 
| 
      
 21 
     | 
    
         
            +
            texture = renderer.load_texture("icon.bmp")
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            puts "window id: #{window.window_id}"
         
     | 
| 
      
 24 
     | 
    
         
            +
            p SDL2::Window.all_windows
         
     | 
| 
      
 25 
     | 
    
         
            +
            p window.display_mode
         
     | 
| 
      
 26 
     | 
    
         
            +
            p window.display
         
     | 
| 
      
 27 
     | 
    
         
            +
            print "window brightness: "; p window.brightness
         
     | 
| 
      
 28 
     | 
    
         
            +
            print "window input grabbing: "; p window.input_is_grabbed?
         
     | 
| 
      
 29 
     | 
    
         
            +
            print "window maximum size: "; p window.maximum_size
         
     | 
| 
      
 30 
     | 
    
         
            +
            print "window minimum size: "; p window.minimum_size
         
     | 
| 
      
 31 
     | 
    
         
            +
            print "window position: "; p window.position
         
     | 
| 
      
 32 
     | 
    
         
            +
            print "window size: "; p window.size
         
     | 
| 
      
 33 
     | 
    
         
            +
            print "window title: "; p window.title
         
     | 
| 
      
 34 
     | 
    
         
            +
            print "window bordered: "; p window.bordered
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            p window.renderer
         
     | 
| 
      
 37 
     | 
    
         
            +
            p renderer
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            p SDL2.video_drivers
         
     | 
| 
      
 40 
     | 
    
         
            +
            p SDL2::Renderer.drivers_info
         
     | 
| 
      
 41 
     | 
    
         
            +
            p renderer.info
         
     | 
| 
      
 42 
     | 
    
         
            +
            p renderer.clip_rect
         
     | 
| 
      
 43 
     | 
    
         
            +
            p renderer.logical_size
         
     | 
| 
      
 44 
     | 
    
         
            +
            p renderer.scale
         
     | 
| 
      
 45 
     | 
    
         
            +
            p renderer.viewport
         
     | 
| 
      
 46 
     | 
    
         
            +
            p renderer.support_render_target?
         
     | 
| 
      
 47 
     | 
    
         
            +
            p renderer.output_size
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            p renderer.info.texture_formats
         
     | 
| 
      
 50 
     | 
    
         
            +
            renderer.info.texture_formats.each do |format|
         
     | 
| 
      
 51 
     | 
    
         
            +
              p [format.format, format.name, format.type,  format.order, format.layout, format.bpp, format.bytes_per_pixel,
         
     | 
| 
      
 52 
     | 
    
         
            +
                 format.indexed?, format.alpha?, format.fourcc?]
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            p texture
         
     | 
| 
      
 57 
     | 
    
         
            +
            texture.destroy
         
     | 
| 
      
 58 
     | 
    
         
            +
            p texture
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            p SDL2::ScreenSaver.enabled?
         
     | 
| 
      
 61 
     | 
    
         
            +
            SDL2::ScreenSaver.disable
         
     | 
| 
      
 62 
     | 
    
         
            +
            p SDL2::ScreenSaver.enabled?
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            renderer.present
         
     |