graphics 1.0.0b6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/History.rdoc +88 -0
  5. data/Manifest.txt +2 -0
  6. data/Rakefile +7 -8
  7. data/examples/boid.rb +44 -63
  8. data/examples/bounce.rb +4 -4
  9. data/examples/canvas.rb +17 -16
  10. data/examples/collision.rb +1 -1
  11. data/examples/demo.rb +1 -1
  12. data/examples/editor.rb +1 -1
  13. data/examples/fluid.rb +6 -6
  14. data/examples/fluid2.rb +22 -9
  15. data/examples/gol.rb +1 -1
  16. data/examples/gol2.rb +14 -22
  17. data/examples/math.rb +1 -1
  18. data/examples/pi_polygon.rb +8 -3
  19. data/examples/radar.rb +3 -3
  20. data/examples/rainbow_fluid.rb +4 -3
  21. data/examples/tank.rb +7 -3
  22. data/examples/tank2.rb +3 -3
  23. data/examples/targeting.rb +3 -3
  24. data/examples/vants.rb +13 -4
  25. data/examples/walker.rb +1 -1
  26. data/examples/walker2.rb +1 -1
  27. data/examples/zombies.rb +13 -7
  28. data/ext/sdl/extconf.rb +12 -20
  29. data/ext/sdl/sdl.c +619 -360
  30. data/ext/sdl/sge/Makefile +36 -11
  31. data/ext/sdl/sge/Makefile.conf +15 -9
  32. data/ext/sdl/sge/sge_bm_text.cpp +7 -6
  33. data/ext/sdl/sge/sge_collision.cpp +3 -1
  34. data/ext/sdl/sge/sge_config.h +0 -2
  35. data/ext/sdl/sge/sge_internal.h +0 -8
  36. data/ext/sdl/sge/sge_primitives.cpp +0 -11
  37. data/ext/sdl/sge/sge_primitives.h +0 -3
  38. data/ext/sdl/sge/sge_rotation.cpp +1 -1
  39. data/ext/sdl/sge/sge_shape.cpp +18 -9
  40. data/ext/sdl/sge/sge_surface.cpp +10 -4
  41. data/ext/sdl/sge/sge_textpp.cpp +17 -13
  42. data/graphics_setup.sh +43 -13
  43. data/lib/graphics.rb +1 -1
  44. data/lib/graphics/body.rb +8 -0
  45. data/lib/graphics/decorators.rb +15 -3
  46. data/lib/graphics/extensions.rb +1 -1
  47. data/lib/graphics/rainbows.rb +17 -25
  48. data/lib/graphics/simulation.rb +265 -106
  49. data/lib/graphics/v.rb +8 -1
  50. data/resources/sounds/attribution.txt +2 -0
  51. data/resources/sounds/bullet.wav +0 -0
  52. data/test/test_graphics.rb +232 -107
  53. metadata +37 -43
  54. metadata.gz.sig +1 -2
@@ -74,7 +74,7 @@ class WalkerSimulation < Graphics::Simulation
74
74
  attr_accessor :ps, :body_img, :cmap
75
75
 
76
76
  def initialize
77
- super 850, 850, 16, "Walker"
77
+ super 850, 850
78
78
 
79
79
  self.ps = populate Person
80
80
  register_bodies ps
@@ -141,7 +141,7 @@ class WalkerSimulation < Graphics::Simulation
141
141
  attr_accessor :ps, :body_img, :cmap
142
142
 
143
143
  def initialize
144
- super 850, 850, 16, "Walker"
144
+ super 850, 850
145
145
 
146
146
  self.ps = populate Person, 2
147
147
  register_bodies ps
@@ -74,7 +74,7 @@ class Person < Entity
74
74
 
75
75
  INFECT_STEPS = 50.0 # must be a float
76
76
 
77
- NORMAL_COLOR = :blue
77
+ NORMAL_COLOR = :black
78
78
  FREAKD_COLOR = :yellow
79
79
 
80
80
  attr_accessor :state, :infect, :speed
@@ -171,7 +171,7 @@ end
171
171
 
172
172
  class Hunter < Person
173
173
  COUNT = 6
174
- COLOR = :white
174
+ COLOR = :red
175
175
 
176
176
  def color
177
177
  if @infect then
@@ -187,7 +187,7 @@ class Hunter < Person
187
187
  limit_bounds
188
188
 
189
189
  baddies = sim.zombie + sim.person.select(&:infect)
190
- nearest = baddies.sort_by { |z| self.distance_from_squared z }.first
190
+ nearest = baddies.min_by { |z| self.distance_from_squared z }
191
191
 
192
192
  return unless nearest
193
193
 
@@ -195,10 +195,10 @@ class Hunter < Person
195
195
  if Person === nearest then
196
196
  nearest.kill
197
197
  else
198
- if rand(10) != 0 then
198
+ if 9 =~ 10 then # Hunter has a 1 in 10 chance of dying
199
199
  nearest.kill
200
200
  else
201
- self.state = INFECT
201
+ self.state = INFECT
202
202
  self.infect = INFECT_STEPS.to_i
203
203
  end
204
204
  end
@@ -217,7 +217,7 @@ end
217
217
 
218
218
  class Zombie < Entity
219
219
  COUNT = 5
220
- ZOMBIE_COLOR = :red
220
+ ZOMBIE_COLOR = :green50
221
221
 
222
222
  def self.from_person p, sim
223
223
  z = new sim
@@ -261,13 +261,15 @@ class Zombie < Entity
261
261
  end
262
262
 
263
263
  class ZombieGame < Graphics::Simulation
264
+ include WhiteBackground
265
+
264
266
  attr_accessor :person, :zombie
265
267
  attr_accessor :part_p, :part_z
266
268
  attr_accessor :scale, :partitions
267
269
  attr_accessor :start
268
270
 
269
271
  def initialize
270
- super 512, 512, 16, "Zombie Epidemic Simulator"
272
+ super 512, 512, "Zombie Epidemic Simulator"
271
273
  self.scale = 2
272
274
  self.partitions = 64
273
275
 
@@ -374,6 +376,10 @@ class ZombieGame < Graphics::Simulation
374
376
  def max
375
377
  @max ||= w / scale
376
378
  end
379
+
380
+ def inspect
381
+ "ZombieGame"
382
+ end
377
383
  end
378
384
 
379
385
  ZombieGame.new.run
@@ -5,27 +5,19 @@ $INCFLAGS << " -I$(srcdir)/sge"
5
5
 
6
6
  $srcs = Dir.glob("#{$srcdir}/{,sge/}*.c{,pp}")
7
7
 
8
- sdl_config = with_config "sdl-config", "sdl-config"
9
- $CPPFLAGS += " " + `#{sdl_config} --cflags`.chomp
8
+ sdl_config = with_config "sdl2-config", "sdl2-config"
9
+ $CPPFLAGS += `#{sdl_config} --cflags`.chomp
10
+ if ENV["STRICT"] then # this isn't right because it is at Makefile creation time
11
+ $CPPFLAGS += " "
12
+ $CPPFLAGS += %w[-Werror -Wall
13
+ -Wimplicit-function-declaration
14
+ -Wundefined-internal].join(" ")
15
+ end
10
16
  $LOCAL_LIBS += " " + `#{sdl_config} --libs`.chomp
11
17
 
12
- have_library("SDL_mixer", "Mix_OpenAudio") or abort "Need sdl_mixer"
13
- have_library("SDL_image", "IMG_Load") or abort "Need sdl_image"
14
- have_library("SDL_ttf", "TTF_Init") or abort "Need sdl_ttf"
15
- # have_library("SDL_gfx", "fuck") or abort "Need sdl_gfx"
16
-
17
- # have_func "TTF_OpenFontIndex"
18
- # have_func "TTF_FontFaces"
19
- # have_func "TTF_FontFaceIsFixedWidth"
20
- # have_func "TTF_FontFaceFamilyName"
21
- # have_func "TTF_FontFaceStyleName"
22
- # have_func "Mix_LoadMUS_RW"
23
- # have_func "rb_thread_blocking_region"
24
- # have_func "rb_thread_call_without_gvl" if have_header "ruby/thread.h"
25
-
26
- # if have_func("rb_enc_str_new") && have_func("rb_str_export_to_enc")
27
- # $CPPFLAGS += " -D ENABLE_M17N"
28
- # $CPPFLAGS += " -D ENABLE_M17N_FILESYSTEM" if enable_config "m17n-filesystem", false
29
- # end
18
+ have_library("SDL2_mixer", "Mix_OpenAudio") or abort "Need sdl2_mixer"
19
+ have_library("SDL2_image", "IMG_Load") or abort "Need sdl2_image"
20
+ have_library("SDL2_ttf", "TTF_Init") or abort "Need sdl2_ttf"
21
+ have_library("SDL2_gfx", "hlineColor") or abort "Need sdl2_gfx"
30
22
 
31
23
  create_makefile "sdl/sdl"
@@ -3,7 +3,9 @@
3
3
  #include <ruby/intern.h>
4
4
  #include <SDL_ttf.h>
5
5
  #include <SDL_image.h>
6
- #include <sge.h>
6
+ #include <SDL2_gfxPrimitives.h>
7
+ #include <SDL2_rotozoom.h>
8
+ #include <sge/sge_collision.h>
7
9
  #include <SDL_mixer.h>
8
10
 
9
11
  // https://github.com/google/protobuf/blob/master/ruby/ext/google/protobuf_c/defs.c
@@ -33,6 +35,12 @@
33
35
  #define DEFINE_SELF(type, var, rb_var) \
34
36
  SDL_##type* var = ruby_to_##type(rb_var)
35
37
 
38
+ #define DEFINE_SELF0(type, var, rb_var) \
39
+ SDL_##type* var = RTEST(rb_var) ? ruby_to_##type(rb_var) : NULL;
40
+
41
+ #define SET_SELF(type, var, rb_var) \
42
+ var = ruby_to_##type(rb_var)
43
+
36
44
  #define NUM2SINT32(n) (Sint32)NUM2INT(n)
37
45
  #define NUM2SINT16(n) (Sint16)NUM2INT(n)
38
46
  #define NUM2UINT32(n) (Uint32)NUM2UINT(n)
@@ -45,31 +53,15 @@
45
53
 
46
54
  #define UNUSED(x) (void)(x)
47
55
 
48
- #define ZERO_RECT(r) r.x == 0 && r.y == 0 && r.w == 0 && r.h == 0
56
+ #define FAILURE(s) rb_raise(eSDLError, "%s failed: %s", (s), SDL_GetError())
57
+ #define AUDIO_FAILURE(s) rb_raise(eSDLError, "%s failed: %s", (s), Mix_GetError())
58
+ #define TTF_FAILURE(s) rb_raise(eSDLError, "%s failed: %s", (s), TTF_GetError())
49
59
 
50
- #define FAILURE(s) rb_raise(eSDLError, "%s failed: %s", (s), SDL_GetError());
51
- #define AUDIO_FAILURE(s) rb_raise(eSDLError, "%s failed: %s", (s), Mix_GetError());
52
-
53
- #ifdef rb_intern
54
- #undef rb_intern // HACK -- clang warns about recursive macros
55
- #endif
60
+ #define SHOULD_BLEND(a) (a) != 0xff
56
61
 
57
62
  #define DEFINE_ID(name) static ID id_iv_##name
58
63
  #define INIT_ID(name) id_iv_##name = rb_intern("@"#name)
59
64
 
60
- #define DEFINE_DRAW6(type, name, func) \
61
- static VALUE Surface_##name(VALUE s, VALUE x, VALUE y, VALUE w, VALUE h, VALUE c) { \
62
- return _draw_func_##type(&func, s, x, y, w, h, c); \
63
- }
64
-
65
- #define DEFINE_SXYRC(name, func) \
66
- static VALUE Surface_##name(VALUE s, VALUE x, VALUE y, VALUE r, VALUE c) { \
67
- return _draw_func_sxyrc(&func, s, x, y, r, c); \
68
- }
69
-
70
- #define DEFINE_SXYXYC(name, func) DEFINE_DRAW6(sxyxyc, name, func)
71
- #define DEFINE_SXYWHC(name, func) DEFINE_DRAW6(sxywhc, name, func)
72
-
73
65
  static VALUE cEvent;
74
66
  static VALUE cEventKeydown;
75
67
  static VALUE cEventKeyup;
@@ -79,22 +71,27 @@ static VALUE cEventMouseup;
79
71
  static VALUE cEventQuit;
80
72
  static VALUE cScreen;
81
73
  static VALUE eSDLError;
82
- static VALUE eSDLMem;
83
74
  static VALUE mKey;
84
75
  static VALUE mSDL;
85
- static VALUE mWM;
86
76
  static VALUE mMouse;
87
77
 
88
78
  typedef TTF_Font SDL_TTFFont;
89
79
  typedef Mix_Chunk SDL_Audio;
90
80
  typedef sge_cdata SDL_CollisionMap;
91
81
 
82
+ static ID id_H;
83
+ static ID id_W;
84
+
85
+ DEFINE_ID(surface);
86
+ DEFINE_ID(format);
87
+ DEFINE_ID(renderer);
88
+ DEFINE_ID(window);
89
+ DEFINE_ID(texture);
92
90
  DEFINE_ID(button);
93
91
  DEFINE_ID(mod);
94
92
  DEFINE_ID(press);
95
93
  DEFINE_ID(state);
96
94
  DEFINE_ID(sym);
97
- DEFINE_ID(unicode);
98
95
  DEFINE_ID(x);
99
96
  DEFINE_ID(xrel);
100
97
  DEFINE_ID(y);
@@ -105,42 +102,30 @@ DEFINE_CLASS(Surface, "SDL::Surface")
105
102
  DEFINE_CLASS(CollisionMap, "SDL::CollisionMap")
106
103
  DEFINE_CLASS(PixelFormat, "SDL::PixelFormat")
107
104
  DEFINE_CLASS_0(TTFFont, "SDL::TTFFont")
105
+ DEFINE_CLASS_0(Renderer, "SDL::Renderer") // TODO: I kinda want these hidden
106
+ DEFINE_CLASS_0(Window, "SDL::Window") // TODO: I kinda want these hidden
107
+ DEFINE_CLASS_0(Texture, "SDL::Texture") // TODO: I kinda want these hidden
108
108
 
109
+ #define SDL_NUMEVENTS 0xFFFF // HACK
109
110
  typedef VALUE (*event_creator)(SDL_Event *);
110
111
  static event_creator event_creators[SDL_NUMEVENTS];
111
112
 
112
113
  static int is_quit = 0;
114
+ static int key_state_len = 0;
113
115
  static Uint8* key_state = NULL;
114
- static SDLMod mod_state;
116
+ static SDL_Keymod mod_state;
115
117
 
116
118
  void Init_sdl(void);
117
119
 
118
120
  //// Misc / Utility functions:
119
121
 
120
- // TODO: collapse to one format
121
- static Uint32 VALUE2COLOR(VALUE color, SDL_PixelFormat *format) {
122
- // TODO: reverse and use FIXNUM_P ?
123
- if (rb_obj_is_kind_of(color, rb_cArray)) {
124
- switch (RARRAY_LEN(color)) {
125
- case 3:
126
- return SDL_MapRGB(format,
127
- (Uint8)FIX2UINT(rb_ary_entry(color, 0)),
128
- (Uint8)FIX2UINT(rb_ary_entry(color, 1)),
129
- (Uint8)FIX2UINT(rb_ary_entry(color, 2)));
130
- case 4:
131
- return SDL_MapRGBA(format,
132
- (Uint8)FIX2UINT(rb_ary_entry(color, 0)),
133
- (Uint8)FIX2UINT(rb_ary_entry(color, 1)),
134
- (Uint8)FIX2UINT(rb_ary_entry(color, 2)),
135
- (Uint8)FIX2UINT(rb_ary_entry(color, 3)));
136
- default:
137
- rb_raise(rb_eArgError, "type mismatch:color array needs 3 or 4 elements");
138
- }
139
- } else {
140
- return NUM2UINT(color);
141
- }
122
+ static void rb_const_reset(VALUE mod, ID id, VALUE val) { // avoids warnings
123
+ rb_const_remove(mod, id);
124
+ rb_const_set(mod, id, val);
142
125
  }
143
126
 
127
+ #define VALUE2COLOR(c) NUM2UINT(c)
128
+
144
129
  //// SDL methods:
145
130
 
146
131
  static VALUE sdl_s_init(VALUE mod, VALUE flags) {
@@ -151,6 +136,15 @@ static VALUE sdl_s_init(VALUE mod, VALUE flags) {
151
136
  if (TTF_Init())
152
137
  rb_raise(eSDLError, "TTF_Init error: %s", TTF_GetError());
153
138
 
139
+ SDL_Rect r;
140
+ if (SDL_GetDisplayBounds(0, &r) != 0) {
141
+ rb_raise(eSDLError, "Failure calling SDL_GetDisplayBounds()");
142
+ return 1;
143
+ }
144
+
145
+ rb_const_reset(cScreen, id_W, UINT2NUM(r.w));
146
+ rb_const_reset(cScreen, id_H, UINT2NUM(r.h));
147
+
154
148
  return Qnil;
155
149
  }
156
150
 
@@ -205,7 +199,7 @@ static VALUE Audio_s_load(VALUE self, VALUE path) {
205
199
  Mix_Chunk *chunk = Mix_LoadWAV(RSTRING_PTR(path));
206
200
 
207
201
  if (!chunk)
208
- FAILURE("Audio.load");
202
+ AUDIO_FAILURE("Audio.load");
209
203
 
210
204
  return TypedData_Wrap_Struct(cAudio, &_Audio_type, chunk);
211
205
  }
@@ -225,14 +219,7 @@ static void _CollisionMap_free(void* p) {
225
219
  if (is_quit) return;
226
220
  if (!p) return;
227
221
 
228
- SDL_PixelFormat *format = p;
229
-
230
- if (format->palette) {
231
- free(format->palette->colors);
232
- free(format->palette);
233
- }
234
-
235
- free(format);
222
+ sge_destroy_cmap(p);
236
223
  }
237
224
 
238
225
  static void _CollisionMap_mark(void* p) {
@@ -279,7 +266,6 @@ static VALUE __new_key_event(VALUE klass, SDL_Event *event) {
279
266
  rb_ivar_set(obj, id_iv_press, INT2BOOL(event->key.state == SDL_PRESSED)); // TODO: nuke?
280
267
  rb_ivar_set(obj, id_iv_sym, INT2FIX(event->key.keysym.sym));
281
268
  rb_ivar_set(obj, id_iv_mod, UINT2NUM(event->key.keysym.mod));
282
- rb_ivar_set(obj, id_iv_unicode, UINT2NUM(event->key.keysym.unicode));
283
269
  return obj;
284
270
  }
285
271
 
@@ -325,24 +311,27 @@ static VALUE Event__mouseup(SDL_Event *event) {
325
311
 
326
312
  //// SDL::Key methods:
327
313
 
328
- static VALUE Key_s_press_p(VALUE mod, VALUE keysym) {
314
+ static VALUE Key_s_press_p(VALUE mod, VALUE keycode_) {
329
315
  UNUSED(mod);
330
- int sym = NUM2INT(keysym);
331
-
332
- if (SDLK_FIRST >= sym || sym >= SDLK_LAST)
333
- rb_raise(eSDLError, "%d is out of key", sym);
334
316
 
335
317
  if (!key_state)
336
318
  rb_raise(eSDLError,
337
319
  "You should call SDL::Key#scan before calling SDL::Key#press?");
338
320
 
339
- return INT2BOOL(key_state[sym]);
321
+ SDL_Keycode keycode = NUM2INT(keycode_);
322
+ SDL_Scancode scancode = SDL_GetScancodeFromKey(keycode);
323
+
324
+ if (0 >= scancode || scancode >= key_state_len)
325
+ rb_raise(eSDLError, "%d (%d) is out of bounds: %d",
326
+ keycode, scancode, key_state_len);
327
+
328
+ return INT2BOOL(key_state[scancode]);
340
329
  }
341
330
 
342
331
  static VALUE Key_s_scan(VALUE mod) {
343
332
  UNUSED(mod);
344
333
 
345
- key_state = SDL_GetKeyState(NULL);
334
+ key_state = (Uint8 *) SDL_GetKeyboardState(&key_state_len);
346
335
  mod_state = SDL_GetModState();
347
336
 
348
337
  return Qnil;
@@ -371,14 +360,7 @@ static void _PixelFormat_free(void* p) {
371
360
  if (is_quit) return;
372
361
  if (!p) return;
373
362
 
374
- SDL_PixelFormat *format = p;
375
-
376
- if (format->palette) {
377
- free(format->palette->colors);
378
- free(format->palette);
379
- }
380
-
381
- free(format);
363
+ SDL_FreeFormat(p);
382
364
  }
383
365
 
384
366
  static void _PixelFormat_mark(void* p) {
@@ -397,57 +379,75 @@ static VALUE PixelFormat_map_rgba(VALUE self, VALUE r, VALUE g, VALUE b, VALUE a
397
379
  NUM2UINT8(b), NUM2UINT8(a)));
398
380
  }
399
381
 
400
- static VALUE PixelFormat_get_rgb(VALUE self, VALUE pixel) {
382
+ static VALUE PixelFormat_get_rgba(VALUE self, VALUE pixel) {
401
383
  DEFINE_SELF(PixelFormat, format, self);
402
- Uint8 r, g, b;
384
+ Uint8 r, g, b, a;
403
385
 
404
- SDL_GetRGB(NUM2UINT(pixel), format, &r, &g, &b);
386
+ SDL_GetRGBA(NUM2UINT(pixel), format, &r, &g, &b, &a);
405
387
 
406
- return rb_ary_new3(3, UINT2NUM(r), UINT2NUM(g), UINT2NUM(b));
388
+ return rb_ary_new3(4, UINT2NUM(r), UINT2NUM(g), UINT2NUM(b), UINT2NUM(a));
407
389
  }
408
390
 
409
- static VALUE PixelFormat_colorkey(VALUE self) {
410
- DEFINE_SELF(PixelFormat, format, self);
391
+ //// SDL::Screen methods:
411
392
 
412
- return UINT2NUM(format->colorkey);
413
- }
393
+ static VALUE Screen_s_open(VALUE klass, VALUE w_, VALUE h_, VALUE bpp_, VALUE flags_) {
394
+ UNUSED(klass);
414
395
 
415
- static VALUE PixelFormat_alpha(VALUE self) {
416
- DEFINE_SELF(PixelFormat, format, self);
396
+ int w = NUM2INT(w_);
397
+ int h = NUM2INT(h_);
398
+ int bpp = NUM2INT(bpp_);
399
+ Uint32 flags = NUM2UINT32(flags_);
417
400
 
418
- return UINT2NUM(format->alpha);
419
- }
401
+ if (!bpp) bpp = 32; // TODO: remove bpp option and always be 32?
420
402
 
421
- //// SDL::Screen methods:
403
+ SDL_Window *window =
404
+ SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
405
+ w, h,
406
+ flags);
407
+ if (!window) FAILURE("Screen.open(CreateWindow)");
422
408
 
423
- static VALUE Screen_s_open(VALUE klass, VALUE w, VALUE h, VALUE bpp, VALUE flags) {
424
- UNUSED(klass);
425
- SDL_Surface *screen;
409
+ SDL_Renderer *renderer =
410
+ SDL_CreateRenderer(window, -1,
411
+ SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_ACCELERATED);
412
+ if (!renderer) FAILURE("Screen.open(CreateRenderer)");
413
+
414
+ // bumps the refcount and returns the same thing
415
+ SDL_PixelFormat *format = SDL_AllocFormat(SDL_PIXELFORMAT_RGBA32);
416
+ if (!format)
417
+ rb_raise(eSDLError, "SDL_AllocFormat freaked out.");
426
418
 
427
- screen = SDL_SetVideoMode(NUM2INT(w), NUM2INT(h), NUM2INT(bpp), NUM2UINT(flags));
419
+ VALUE vrenderer = TypedData_Wrap_Struct(cRenderer, &_Renderer_type, renderer);
420
+ VALUE vwindow = TypedData_Wrap_Struct(cWindow, &_Window_type, window);
421
+ VALUE vformat = TypedData_Wrap_Struct(cPixelFormat, &_PixelFormat_type, format);
428
422
 
429
- if (!screen)
430
- rb_raise(eSDLError, "Couldn't set %dx%d %d bpp video mode: %s",
431
- NUM2INT(w), NUM2INT(h), NUM2INT(bpp), SDL_GetError());
423
+ rb_ivar_set(vrenderer, id_iv_window, vwindow);
424
+ rb_ivar_set(vrenderer, id_iv_format, vformat);
432
425
 
433
- return TypedData_Wrap_Struct(cScreen, &_Surface_type, screen);
426
+ return vrenderer;
434
427
  }
435
428
 
436
- static VALUE Screen_flip(VALUE self) {
437
- DEFINE_SELF(Surface, surface, self);
429
+ static VALUE Renderer_new_texture(VALUE self) {
430
+ DEFINE_SELF(Renderer, renderer, self);
438
431
 
439
- if (SDL_Flip(surface) < 0)
440
- FAILURE("Screen#flip");
432
+ int w, h;
433
+ if (SDL_GetRendererOutputSize(renderer, &w, &h))
434
+ FAILURE("Renderer#new_texture(GetRendererOutputSize");
441
435
 
442
- return Qnil;
436
+ SDL_Texture *texture = SDL_CreateTexture(renderer,
437
+ SDL_PIXELFORMAT_RGBA32,
438
+ SDL_TEXTUREACCESS_TARGET,
439
+ w, h);
440
+ if (!texture)
441
+ FAILURE("Renderer#new_texture(CreateTexture)");
442
+
443
+ return TypedData_Wrap_Struct(cTexture, &_Texture_type, texture);
443
444
  }
444
445
 
445
- static VALUE Screen_update(VALUE self, VALUE x, VALUE y, VALUE w, VALUE h) {
446
- DEFINE_SELF(Surface, surface, self);
447
446
 
448
- SDL_UpdateRect(surface,
449
- NUM2SINT32(x), NUM2SINT32(y),
450
- NUM2UINT32(w), NUM2UINT32(h));
447
+ static VALUE Renderer_present(VALUE self) {
448
+ DEFINE_SELF(Renderer, renderer, self);
449
+
450
+ SDL_RenderPresent(renderer);
451
451
 
452
452
  return Qnil;
453
453
  }
@@ -467,45 +467,6 @@ static size_t _Surface_memsize(const void *p) {
467
467
  return p ? sizeof(struct SDL_Surface) : 0;
468
468
  }
469
469
 
470
- static VALUE Surface_s_blit(VALUE self,
471
- VALUE src, VALUE srcX, VALUE srcY, VALUE srcW, VALUE srcH,
472
- VALUE dst, VALUE dstX, VALUE dstY) {
473
- UNUSED(self);
474
- DEFINE_SELF(Surface, src_surface, src);
475
- DEFINE_SELF(Surface, dst_surface, dst);
476
-
477
- SDL_Rect src_rect = NewRect(srcX, srcY, srcW, srcH);
478
- SDL_Rect dst_rect = NewRect(dstX, dstY, srcW, srcH);
479
- SDL_Rect *sr = ZERO_RECT(src_rect) ? NULL : &src_rect;
480
- SDL_Rect *dr = ZERO_RECT(dst_rect) ? NULL : &dst_rect;
481
- int result = SDL_BlitSurface(src_surface, sr, dst_surface, dr);
482
-
483
- switch (result) {
484
- case -1:
485
- FAILURE("SDL::Surface.blit");
486
- case -2:
487
- rb_raise(eSDLMem, "SDL::Surface lost video memory");
488
- }
489
-
490
- return INT2NUM(result);
491
- }
492
-
493
- static VALUE Surface_s_new(VALUE self, VALUE w, VALUE h, VALUE pf) {
494
- UNUSED(self);
495
- SDL_Surface* surface;
496
-
497
- DEFINE_SELF(PixelFormat, format, pf);
498
-
499
- surface = SDL_CreateRGBSurface(SDL_SWSURFACE, NUM2INT(w), NUM2INT(h),
500
- format->BitsPerPixel,
501
- format->Rmask, format->Gmask,
502
- format->Bmask, format->Amask);
503
- if (!surface)
504
- FAILURE("Surface.new");
505
-
506
- return TypedData_Wrap_Struct(cSurface, &_Surface_type, surface);
507
- }
508
-
509
470
  static VALUE Surface_s_load(VALUE klass, VALUE path) {
510
471
  UNUSED(klass);
511
472
  SDL_Surface *surface;
@@ -522,129 +483,232 @@ static VALUE Surface_s_load(VALUE klass, VALUE path) {
522
483
  return TypedData_Wrap_Struct(cSurface, &_Surface_type, surface);
523
484
  }
524
485
 
525
- static VALUE Surface_set_color_key(VALUE self, VALUE flag, VALUE key) {
526
- DEFINE_SELF(Surface, surface, self);
486
+ #define DEFINE_WRAP12(name) \
487
+ void wrap_##name(SDL_Surface* a, \
488
+ Sint16 b, Sint16 c, Sint16 d, Sint16 e, \
489
+ Sint16 f, Sint16 g, Sint16 h, Sint16 i, \
490
+ int j, \
491
+ Uint32 k, Uint8 l) { name(a, b, c, d, e, f, g, h, i, j, k); }
492
+ #define DEFINE_WRAP7(name) \
493
+ void wrap_##name(SDL_Surface* a, \
494
+ Sint16 b, Sint16 c, Sint16 d, Sint16 e, \
495
+ Uint32 f, Uint8 g) { name(a, b, c, d, e, f); }
496
+ #define DEFINE_WRAP6(name) \
497
+ void wrap_##name(SDL_Surface* a, \
498
+ Sint16 b, Sint16 c, Sint16 d, \
499
+ Uint32 e, Uint8 f) { name(a, b, c, d, e); }
500
+
501
+ #define IDX1(a) !!(a)
502
+ #define IDX2(a, b) (!!(a))<<1 | !!(b)
503
+ #define IDX3(a, b, c) (!!(a))<<2 | (!!(b))<<1 | !!(c)
504
+
505
+ typedef int (*f_rxyxyc)(SDL_Renderer*,
506
+ Sint16, Sint16, Sint16, Sint16,
507
+ Uint32);
508
+ typedef int (*f_rxyrc)(SDL_Renderer*,
509
+ Sint16, Sint16, Sint16,
510
+ Uint32);
511
+
512
+ // TODO: ? maybe ?
513
+ // int hlineColor (SDL_Renderer *renderer, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color)
514
+ // int vlineColor (SDL_Renderer *renderer, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color)
515
+ // int roundedRectangleColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)
516
+ // int roundedBoxColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 rad, Uint32 color)
517
+ // int thickLineColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 width, Uint32 color)
518
+ // int arcColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
519
+ // int pieColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
520
+ // int filledPieColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color)
521
+ // int trigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
522
+ // int aatrigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
523
+ // int filledTrigonColor (SDL_Renderer *renderer, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint32 color)
524
+ // int polygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
525
+ // int aapolygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
526
+ // int filledPolygonColor (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, Uint32 color)
527
+ // int texturedPolygon (SDL_Renderer *renderer, const Sint16 *vx, const Sint16 *vy, int n, SDL_Surface *texture, int texture_dx, int texture_dy)
528
+ // void gfxPrimitivesSetFont (const void *fontdata, Uint32 cw, Uint32 ch)
529
+ // void gfxPrimitivesSetFontRotation(Uint32 rotation)
530
+ // int characterColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, char c, Uint32 color)
531
+ // int stringColor (SDL_Renderer *renderer, Sint16 x, Sint16 y, const char *s, Uint32 color)
532
+
533
+ static VALUE Renderer_draw_bezier(VALUE self,
534
+ VALUE xs_,
535
+ VALUE ys_,
536
+ VALUE steps_,
537
+ VALUE color_) {
538
+ DEFINE_SELF(Renderer, renderer, self);
539
+
540
+ int xlen = RARRAY_LENINT(xs_);
541
+ int ylen = RARRAY_LENINT(ys_);
542
+
543
+ if (xlen != ylen)
544
+ rb_raise(rb_eArgError, "xs & ys are different length");
545
+
546
+ Sint16 *xs = malloc(xlen*sizeof(Sint16));
547
+
548
+ for (int i = 0; i < xlen; i++) {
549
+ xs[i] = NUM2SINT16(RARRAY_AREF(xs_, i));
550
+ }
551
+
552
+ Sint16 *ys = malloc(ylen*sizeof(Sint16));
553
+ for (int i = 0; i < ylen; i++) {
554
+ ys[i] = NUM2SINT16(RARRAY_AREF(ys_, i));
555
+ }
556
+
557
+ int steps = NUM2INT(steps_);
558
+ Uint32 color = VALUE2COLOR(color_);
527
559
 
528
- if (SDL_SetColorKey(surface,
529
- NUM2UINT(flag),
530
- VALUE2COLOR(key, surface->format)) < 0)
531
- FAILURE("Surface#set_color_key");
560
+ if (bezierColor(renderer, xs, ys, xlen, steps, color))
561
+ FAILURE("draw_bezier");
562
+
563
+ free(xs);
564
+ free(ys);
532
565
 
533
566
  return Qnil;
534
567
  }
535
568
 
536
- typedef void (*sxyxyc_func)(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
537
- typedef void (*sxyrc_func)(SDL_Surface *, Sint16, Sint16, Sint16, Uint32);
569
+ int aafilledCircleColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rad, Uint32 color) {
570
+ int result = 0;
571
+ result |= filledCircleColor(renderer, x, y, rad, color);
572
+ result |= aacircleColor(renderer, x, y, rad, color);
573
+ return result;
574
+ }
538
575
 
539
- static VALUE _draw_func_sxyrc(sxyrc_func f, VALUE self, VALUE x, VALUE y, VALUE r, VALUE c) {
540
- DEFINE_SELF(Surface, surface, self);
576
+ static f_rxyrc f_circle[] = { &circleColor,
577
+ &filledCircleColor,
578
+ &aacircleColor,
579
+ &aafilledCircleColor };
541
580
 
542
- Sint16 x1, y1, r_;
543
- Uint32 color;
581
+ static VALUE Renderer_draw_circle(VALUE self,
582
+ VALUE x, VALUE y,
583
+ VALUE r,
584
+ VALUE c,
585
+ VALUE aa, VALUE f) {
586
+ DEFINE_SELF(Renderer, renderer, self);
544
587
 
545
- x1 = NUM2SINT16(x);
546
- y1 = NUM2SINT16(y);
547
- r_ = NUM2SINT16(r);
548
- color = VALUE2COLOR(c, surface->format);
588
+ Uint8 idx = IDX2(RTEST(aa), RTEST(f));
549
589
 
550
- f(surface, x1, y1, r_, color);
590
+ f_circle[idx](renderer,
591
+ NUM2SINT16(x), NUM2SINT16(y),
592
+ NUM2SINT16(r),
593
+ NUM2UINT(c));
551
594
 
552
595
  return Qnil;
553
596
  }
554
597
 
555
- static VALUE _draw_func_sxywhc(sxyxyc_func f, VALUE self, VALUE x, VALUE y, VALUE w, VALUE h, VALUE c) {
556
- DEFINE_SELF(Surface, surface, self);
598
+ int aafilledEllipseColor(SDL_Renderer * renderer, Sint16 x, Sint16 y, Sint16 rx, Sint16 ry, Uint32 color) {
599
+ int result = 0;
600
+ result |= filledEllipseColor(renderer, x, y, rx, ry, color);
601
+ result |= aaellipseColor(renderer, x, y, rx, ry, color);
602
+ return result;
603
+ }
604
+
605
+ static f_rxyxyc f_ellipse[] = { &ellipseColor,
606
+ &filledEllipseColor,
607
+ &aaellipseColor,
608
+ &aafilledEllipseColor };
557
609
 
558
- Sint16 x1, y1, x2, y2;
559
- Uint32 color;
610
+ static VALUE Renderer_draw_ellipse(VALUE self,
611
+ VALUE x, VALUE y,
612
+ VALUE rx, VALUE ry,
613
+ VALUE c,
614
+ VALUE aa, VALUE f) {
615
+ DEFINE_SELF(Renderer, renderer, self);
560
616
 
561
- x1 = NUM2SINT16(x);
562
- y1 = NUM2SINT16(y);
563
- x2 = x1 + NUM2SINT16(w);
564
- y2 = y1 + NUM2SINT16(h);
565
- color = VALUE2COLOR(c, surface->format);
617
+ Uint8 idx = IDX2(RTEST(aa), RTEST(f));
566
618
 
567
- f(surface, x1, y1, x2, y2, color);
619
+ f_ellipse[idx](renderer,
620
+ NUM2SINT16(x),
621
+ NUM2SINT16(y),
622
+ NUM2SINT16(rx),
623
+ NUM2SINT16(ry),
624
+ NUM2UINT(c));
568
625
 
569
626
  return Qnil;
570
627
  }
571
628
 
572
- static VALUE _draw_func_sxyxyc(sxyxyc_func f, VALUE self, VALUE x, VALUE y, VALUE w, VALUE h, VALUE c) {
573
- DEFINE_SELF(Surface, surface, self);
629
+ static f_rxyxyc f_line[] = { &lineColor,
630
+ &aalineColor };
574
631
 
575
- Sint16 x1, y1, r1, r2;
576
- Uint32 color;
632
+ static VALUE Renderer_draw_line(VALUE self,
633
+ VALUE x1, VALUE y1,
634
+ VALUE x2, VALUE y2,
635
+ VALUE c,
636
+ VALUE aa) {
637
+ DEFINE_SELF(Renderer, renderer, self);
577
638
 
578
- x1 = NUM2SINT16(x);
579
- y1 = NUM2SINT16(y);
580
- r1 = NUM2SINT16(w);
581
- r2 = NUM2SINT16(h);
582
- color = VALUE2COLOR(c, surface->format);
639
+ Uint8 idx = IDX1(RTEST(aa));
583
640
 
584
- f(surface, x1, y1, r1, r2, color);
641
+ f_line[idx](renderer,
642
+ NUM2SINT16(x1),
643
+ NUM2SINT16(y1),
644
+ NUM2SINT16(x2),
645
+ NUM2SINT16(y2),
646
+ VALUE2COLOR(c));
585
647
 
586
648
  return Qnil;
587
649
  }
588
650
 
589
- static VALUE Surface_draw_bezier(VALUE self,
590
- VALUE x1, VALUE y1,
591
- VALUE cx1, VALUE cy1,
592
- VALUE cx2, VALUE cy2,
593
- VALUE x2, VALUE y2,
594
- VALUE l, VALUE c) {
595
- DEFINE_SELF(Surface, surface, self);
651
+ static f_rxyxyc f_rect[] = { &rectangleColor,
652
+ &boxColor };
653
+
654
+ static VALUE Renderer_draw_rect(VALUE self,
655
+ VALUE x_, VALUE y_,
656
+ VALUE w_, VALUE h_,
657
+ VALUE c,
658
+ VALUE f) {
659
+ DEFINE_SELF(Renderer, renderer, self);
596
660
 
597
- sge_AABezier(surface,
598
- NUM2SINT16(x1), NUM2SINT16(y1),
599
- NUM2SINT16(cx1), NUM2SINT16(cy1),
600
- NUM2SINT16(cx2), NUM2SINT16(cy2),
601
- NUM2SINT16(x2), NUM2SINT16(y2),
602
- NUM2INT(l),
603
- VALUE2COLOR(c, surface->format));
661
+ Sint16 x1 = NUM2SINT16(x_);
662
+ Sint16 y1 = NUM2SINT16(y_);
663
+ Sint16 x2 = NUM2SINT16(w_) + x1;
664
+ Sint16 y2 = NUM2SINT16(h_) + y1;
665
+ Uint8 idx = IDX1(RTEST(f));
666
+
667
+ f_rect[idx](renderer, x1, y1, x2, y2, NUM2UINT(c));
604
668
 
605
669
  return Qnil;
606
670
  }
607
671
 
608
- DEFINE_SXYRC(draw_circle, sge_AACircle)
609
- DEFINE_SXYRC(fill_circle, sge_AAFilledCircle)
610
- DEFINE_SXYXYC(draw_line, sge_AALine)
611
- DEFINE_SXYXYC(fill_ellipse, sge_FilledEllipse)
612
- DEFINE_SXYXYC(draw_ellipse, sge_Ellipse)
613
- DEFINE_SXYWHC(draw_rect, sge_Rect)
614
- DEFINE_SXYWHC(fill_rect, sge_FilledRect)
672
+ static VALUE Renderer_clear(VALUE self, VALUE color) {
673
+ DEFINE_SELF(Renderer, renderer, self);
674
+ DEFINE_SELF(PixelFormat, format, rb_ivar_get(self, id_iv_format));
615
675
 
616
- static VALUE Surface_fast_rect(VALUE self, VALUE x, VALUE y, VALUE w, VALUE h, VALUE color) {
617
- DEFINE_SELF(Surface, surface, self);
676
+ Uint8 r, g, b, a;
677
+ SDL_GetRGBA(NUM2UINT(color), format, &r, &g, &b, &a);
618
678
 
619
- SDL_Rect rect = NewRect(x, y, w, h);
679
+ SDL_SetRenderDrawColor(renderer, r, g, b, a);
620
680
 
621
- if (SDL_FillRect(surface, &rect, VALUE2COLOR(color, surface->format)) < 0)
622
- FAILURE("Surface#fast_rect");
681
+ if (SDL_RenderClear(renderer))
682
+ FAILURE("Renderer#clear");
623
683
 
624
684
  return Qnil;
625
685
  }
626
686
 
627
- static VALUE Surface_flags(VALUE self) {
628
- DEFINE_SELF(Surface, surface, self);
629
-
630
- return UINT2NUM(surface->flags);
631
- }
632
-
633
- static VALUE Surface_set_alpha(VALUE self, VALUE flag, VALUE alpha) {
634
- DEFINE_SELF(Surface, surface, self);
687
+ static VALUE Renderer_copy_texture(VALUE self, VALUE texture_) {
688
+ DEFINE_SELF(Renderer, renderer, self);
689
+ DEFINE_SELF(Texture, texture, texture_);
635
690
 
636
- if (SDL_SetAlpha(surface, NUM2UINT(flag), NUM2UINT8(alpha)))
637
- FAILURE("Surface#set_alpha");
691
+ if (SDL_RenderCopy(renderer, texture, NULL, NULL))
692
+ FAILURE("Renderer#copy_texture");
638
693
 
639
694
  return Qnil;
640
695
  }
641
696
 
697
+ static VALUE Renderer_fast_rect(VALUE self,
698
+ VALUE x, VALUE y,
699
+ VALUE w, VALUE h,
700
+ VALUE color) {
701
+ return Renderer_draw_rect(self, x, y, w, h, color, Qtrue);
702
+ }
703
+
642
704
  static VALUE Surface_format(VALUE self) {
643
705
  DEFINE_SELF(Surface, surface, self);
644
706
  SDL_PixelFormat* format;
645
707
  SDL_Palette* palette;
646
708
  SDL_Palette* src = surface->format->palette;
647
709
 
710
+ // TODO: remove this or drop down to SDL_AllocFormat only
711
+
648
712
  if (src) {
649
713
  palette = ALLOC(SDL_Palette);
650
714
  palette->ncolors = src->ncolors;
@@ -662,6 +726,26 @@ static VALUE Surface_format(VALUE self) {
662
726
  return ret;
663
727
  }
664
728
 
729
+ static VALUE Renderer_h(VALUE self) {
730
+ DEFINE_SELF(Renderer, renderer, self);
731
+
732
+ int w, h;
733
+
734
+ SDL_GetRendererOutputSize(renderer, &w, &h);
735
+
736
+ return INT2NUM(h);
737
+ }
738
+
739
+ static VALUE Renderer_w(VALUE self) {
740
+ DEFINE_SELF(Renderer, renderer, self);
741
+
742
+ int w, h;
743
+
744
+ SDL_GetRendererOutputSize(renderer, &w, &h);
745
+
746
+ return INT2NUM(w);
747
+ }
748
+
665
749
  static VALUE Surface_h(VALUE self) {
666
750
  DEFINE_SELF(Surface, surface, self);
667
751
 
@@ -669,27 +753,41 @@ static VALUE Surface_h(VALUE self) {
669
753
  }
670
754
 
671
755
  static VALUE Surface_index(VALUE self, VALUE x, VALUE y) {
672
- DEFINE_SELF(Surface, surface, self);
673
-
674
- return UINT2NUM(sge_GetPixel(surface,
675
- NUM2SINT16(x), NUM2SINT16(y)));
756
+ rb_raise(eSDLError, "Reading the canvas isn't currently supported");
757
+ return Qnil;
676
758
  }
677
759
 
678
- static VALUE Surface_index_equals(VALUE self, VALUE x, VALUE y, VALUE color) {
679
- DEFINE_SELF(Surface, surface, self);
760
+ static VALUE Renderer_index_eq(VALUE self, VALUE x, VALUE y, VALUE color) {
761
+ DEFINE_SELF(Renderer, renderer, self);
680
762
 
681
- sge_PutPixel(surface,
682
- NUM2SINT16(x), NUM2SINT16(y),
683
- VALUE2COLOR(color, surface->format));
763
+ pixelColor(renderer, NUM2SINT16(x), NUM2SINT16(y), VALUE2COLOR(color));
684
764
 
685
765
  return Qnil;
686
766
  }
687
767
 
768
+ static SDL_Surface *pixel = NULL;
769
+
770
+ static VALUE Renderer_index(VALUE self, VALUE x, VALUE y) {
771
+ DEFINE_SELF(Renderer, renderer, self);
772
+
773
+ SDL_Rect pixel_rect = { NUM2SINT16(x), NUM2SINT16(y), 1, 1 };
774
+
775
+ if (!pixel)
776
+ pixel = SDL_CreateRGBSurfaceWithFormat(0, 1, 1, 32,
777
+ SDL_PIXELFORMAT_RGBA32);
778
+
779
+ if (SDL_RenderReadPixels(renderer, &pixel_rect, SDL_PIXELFORMAT_RGBA32,
780
+ pixel->pixels,
781
+ pixel->pitch))
782
+ FAILURE("Renderer#[]");
783
+
784
+ return UINT2NUM(((Uint32*)pixel->pixels)[0]);
785
+ }
786
+
688
787
  static VALUE Surface_make_collision_map(VALUE self) {
689
788
  DEFINE_SELF(Surface, surface, self);
690
789
 
691
790
  sge_cdata * cdata = sge_make_cmap(surface);
692
-
693
791
  if (!cdata)
694
792
  FAILURE("Surface#make_collision_map");
695
793
 
@@ -702,35 +800,205 @@ static VALUE Surface_w(VALUE self) {
702
800
  return INT2NUM(surface->w);
703
801
  }
704
802
 
705
- static VALUE Surface_transform(VALUE self, VALUE bgcolor, VALUE angle,
706
- VALUE xscale, VALUE yscale, VALUE flags) {
803
+ // TODO: maybe remove? I dunno... could be nice for pre-rendering?
804
+ static VALUE Surface_transform(VALUE self, VALUE angle,
805
+ VALUE xscale, VALUE yscale,
806
+ VALUE flags) {
707
807
  DEFINE_SELF(Surface, surface, self);
708
808
 
709
- SDL_Surface *result = sge_transform_surface(surface,
710
- VALUE2COLOR(bgcolor, surface->format),
711
- NUM2FLT(angle),
712
- NUM2FLT(xscale),
713
- NUM2FLT(yscale),
714
- NUM2UINT8(flags));
809
+ SDL_Surface *result = rotozoomSurfaceXY(surface,
810
+ NUM2FLT(angle),
811
+ NUM2FLT(xscale),
812
+ NUM2FLT(yscale),
813
+ SMOOTHING_ON);
814
+
715
815
  if (!result)
716
816
  FAILURE("Surface#transform");
717
817
 
718
- if (SDL_SetColorKey(result,
719
- SDL_SRCCOLORKEY|SDL_RLEACCEL,
720
- surface->format->colorkey) < 0)
721
- FAILURE("Surface#transform(set_color_key)");
818
+ return TypedData_Wrap_Struct(cSurface, &_Surface_type, result);
819
+ }
722
820
 
821
+ static VALUE Renderer_blit(VALUE self, VALUE src_,
822
+ VALUE x_, VALUE y_,
823
+ VALUE a_,
824
+ VALUE ws_, VALUE hs_,
825
+ VALUE center_) {
826
+ DEFINE_SELF(Renderer, renderer, self);
827
+ DEFINE_SELF(Surface, src, src_);
723
828
 
724
- if (SDL_SetAlpha(result, SDL_SRCALPHA|SDL_RLEACCEL, surface->format->alpha))
725
- FAILURE("Surface#transform(set_alpha)");
829
+ int x = NUM2SINT16(x_);
830
+ int y = NUM2SINT16(y_);
831
+ double a = RTEST(a_) ? -NUM2DBL(a_) : 0.0;
832
+ float ws = RTEST(ws_) ? NUM2FLT(ws_) : 1.0;
833
+ float hs = RTEST(hs_) ? NUM2FLT(hs_) : 1.0;
726
834
 
727
- return TypedData_Wrap_Struct(cSurface, &_Surface_type, result);
835
+ SDL_Texture* texture;
836
+ VALUE vtexture = rb_attr_get(src_, id_iv_texture);
837
+
838
+ if (RTEST(vtexture)) {
839
+ SET_SELF(Texture, texture, vtexture);
840
+ } else {
841
+ texture = SDL_CreateTextureFromSurface(renderer, src);
842
+ if (!texture)
843
+ FAILURE("_blit(SDL_CreateTextureFromSurface)");
844
+
845
+ VALUE vtexture = TypedData_Wrap_Struct(cTexture, &_Texture_type, texture);
846
+
847
+ rb_ivar_set(src_, id_iv_texture, vtexture);
848
+ }
849
+
850
+ int w, h;
851
+ if (SDL_QueryTexture(texture, NULL, NULL, &w, &h))
852
+ FAILURE("_blit(SDL_QueryTexture)");
853
+
854
+ SDL_Rect dst_rect = { x, y, w*ws, h*hs };
855
+
856
+ if (SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND))
857
+ FAILURE("Renderer#blit(SetTextureBlendMode)");
858
+
859
+ if (RTEST(a_) || RTEST(ws_) || RTEST(hs_)) {
860
+ SDL_Point bottom_left = { 0, h-1 };
861
+ SDL_Point *point = (RTEST(center_) ? NULL : &bottom_left);
862
+
863
+ if (SDL_RenderCopyEx(renderer, texture, NULL, &dst_rect,
864
+ a, point, SDL_FLIP_NONE))
865
+ FAILURE("_blit(SDL_RenderCopyEx)");
866
+ } else {
867
+ if (SDL_RenderCopy(renderer, texture, NULL, &dst_rect))
868
+ FAILURE("_blit(SDL_RenderCopyEx)");
869
+ }
870
+
871
+ return Qnil;
728
872
  }
729
873
 
730
- static VALUE Surface_save(VALUE self, VALUE path) {
731
- DEFINE_SELF(Surface, surface, self);
874
+ static VALUE Renderer_sprite(VALUE self, VALUE w_, VALUE h_) {
875
+ UNUSED(self);
876
+
877
+ int w = NUM2INT(w_);
878
+ int h = NUM2INT(h_);
879
+ int bpp = 32;
880
+
881
+ SDL_Surface *surface =
882
+ SDL_CreateRGBSurfaceWithFormat(0, w, h, bpp, SDL_PIXELFORMAT_RGBA32);
883
+ if (!surface) FAILURE("Surface#sprite(CreateRGBSurfaceWithFormat)");
884
+
885
+ SDL_Renderer *renderer = SDL_CreateSoftwareRenderer(surface);
886
+ if (!renderer) FAILURE("Surface#sprite(CreateSoftwareRenderer)");
887
+
888
+ // bumps the refcount and returns the same thing
889
+ SDL_PixelFormat *format = SDL_AllocFormat(surface->format->format);
890
+ if (format != surface->format)
891
+ rb_raise(eSDLError, "SDL_AllocFormat freaked out. %p vs %p",
892
+ format,
893
+ surface->format);
894
+
895
+ VALUE vrenderer = TypedData_Wrap_Struct(cRenderer, &_Renderer_type, renderer);
896
+ VALUE vsurface = TypedData_Wrap_Struct(cSurface, &_Surface_type, surface);
897
+ VALUE vformat = TypedData_Wrap_Struct(cPixelFormat, &_PixelFormat_type, format);
898
+
899
+ rb_ivar_set(vrenderer, id_iv_surface, vsurface);
900
+ rb_ivar_set(vrenderer, id_iv_format, vformat);
901
+
902
+ return vrenderer;
903
+ }
904
+
905
+ static VALUE Renderer_save(VALUE self, VALUE path) {
906
+ DEFINE_SELF(Renderer, renderer, self);
907
+
908
+ int w, h;
909
+ SDL_GetRendererOutputSize(renderer, &w, &h);
910
+
911
+ SDL_Surface *sshot = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32,
912
+ SDL_PIXELFORMAT_RGBA32);
913
+ if (SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_RGBA32,
914
+ sshot->pixels,
915
+ sshot->pitch))
916
+ FAILURE("Renderer#save");
917
+ int ret = IMG_SavePNG(sshot, RSTRING_PTR(path));
918
+ SDL_FreeSurface(sshot);
919
+
920
+ return INT2NUM(ret);
921
+ }
922
+
923
+ //// SDL::Renderer methods:
924
+
925
+ static void _Renderer_free(void* renderer) {
926
+ if (is_quit) return;
927
+ if (renderer) SDL_DestroyRenderer(renderer);
928
+ }
929
+
930
+ static void _Renderer_mark(void* renderer) {
931
+ UNUSED(renderer);
932
+ }
933
+
934
+ static VALUE Renderer_target(VALUE self) {
935
+ DEFINE_SELF(Renderer, renderer, self);
936
+
937
+ SDL_Texture* texture = SDL_GetRenderTarget(renderer);
938
+
939
+ if (!texture)
940
+ FAILURE("Renderer#target");
941
+
942
+ return TypedData_Wrap_Struct(cTexture, &_Texture_type, texture);
943
+ }
944
+
945
+ static VALUE Renderer_target_eq(VALUE self, VALUE texture_) {
946
+ DEFINE_SELF(Renderer, renderer, self);
947
+ DEFINE_SELF0(Texture, texture, texture_);
948
+
949
+ if (SDL_SetRenderTarget(renderer, texture))
950
+ FAILURE("Renderer#target=");
951
+
952
+ return texture_;
953
+ }
954
+
955
+ //// SDL::Texture methods:
956
+
957
+ static void _Texture_free(void* texture) {
958
+ if (is_quit) return;
959
+ if (texture) SDL_DestroyTexture(texture);
960
+ }
732
961
 
733
- return INT2NUM(SDL_SaveBMP(surface, RSTRING_PTR(path)));
962
+ static void _Texture_mark(void* texture) {
963
+ UNUSED(texture);
964
+ }
965
+
966
+ //// SDL::Window methods:
967
+
968
+ static void _Window_free(void* Window) {
969
+ if (is_quit) return;
970
+ if (Window) SDL_DestroyWindow(Window);
971
+ }
972
+
973
+ static void _Window_mark(void* Window) {
974
+ UNUSED(Window);
975
+ }
976
+
977
+ static VALUE Window_title_eq(VALUE self, VALUE title) {
978
+ DEFINE_SELF(Window, window, self);
979
+
980
+ ExportStringValue(title);
981
+
982
+ SDL_SetWindowTitle(window, StringValueCStr(title));
983
+
984
+ return Qnil;
985
+ }
986
+
987
+ static VALUE Window_title(VALUE self) {
988
+ DEFINE_SELF(Window, window, self);
989
+
990
+ const char* title = SDL_GetWindowTitle(window);
991
+
992
+ return rb_str_new_cstr(title);
993
+ }
994
+
995
+ static VALUE Window_update(VALUE self) {
996
+ DEFINE_SELF(Window, window, self);
997
+
998
+ if (SDL_UpdateWindowSurface(window))
999
+ FAILURE("Window#update");
1000
+
1001
+ return Qnil;
734
1002
  }
735
1003
 
736
1004
  //// SDL::TTFFont methods:
@@ -765,47 +1033,47 @@ static VALUE Font_height(VALUE self) {
765
1033
 
766
1034
  static VALUE Font_render(VALUE self, VALUE dst, VALUE text, VALUE c) {
767
1035
  DEFINE_SELF(TTFFont, font, self);
768
- DEFINE_SELF(Surface, surface, dst);
1036
+ DEFINE_SELF(PixelFormat, format, rb_ivar_get(dst, id_iv_format));
769
1037
 
770
1038
  SDL_Surface *result;
1039
+ SDL_Color fg;
771
1040
 
772
- SDL_Color fg = sge_GetRGB(surface, VALUE2COLOR(c, surface->format));
1041
+ SDL_GetRGBA(VALUE2COLOR(c), format,
1042
+ &(fg.r), &(fg.g), &(fg.b), &(fg.a));
773
1043
 
774
1044
  ExportStringValue(text);
775
1045
  result = TTF_RenderUTF8_Blended(font, StringValueCStr(text), fg);
776
1046
 
777
- if (result) return TypedData_Wrap_Struct(cSurface, &_Surface_type, result);
778
- return Qnil;
1047
+ if (!result)
1048
+ TTF_FAILURE("Font.render");
1049
+
1050
+ return TypedData_Wrap_Struct(cSurface, &_Surface_type, result);
779
1051
  }
780
1052
 
781
1053
  static VALUE Font_draw(VALUE self, VALUE dst, VALUE text, VALUE x, VALUE y, VALUE c) {
782
1054
  VALUE img = Font_render(self, dst, text, c);
783
- VALUE zero = INT2FIX(0);
784
-
785
- Surface_s_blit(cSurface, img, zero, zero, zero, zero, dst, x, y);
786
-
787
- return Qnil;
1055
+ return Renderer_blit(dst, img, x, y, Qnil, Qnil, Qnil, Qnil);
788
1056
  }
789
1057
 
790
- //// SDL::WM methods:
791
-
792
- static VALUE WM_s_set_caption(VALUE mod, VALUE title, VALUE icon) {
793
- UNUSED(mod);
794
- ExportStringValue(title);
795
- ExportStringValue(icon);
1058
+ static VALUE Font_text_size(VALUE self, VALUE text) {
1059
+ DEFINE_SELF(TTFFont, font, self);
1060
+ int w = 1, h = 2, result;
796
1061
 
797
- SDL_WM_SetCaption(StringValueCStr(title), StringValueCStr(icon));
1062
+ ExportStringValue(text);
1063
+ result = TTF_SizeText(font, StringValueCStr(text), &w, &h);
798
1064
 
799
- return Qnil;
1065
+ if (!result) {
1066
+ return rb_ary_new_from_args(2, INT2FIX(w), INT2FIX(h));
1067
+ } else {
1068
+ FAILURE("SDL::TTF#text_size");
1069
+ }
800
1070
  }
801
1071
 
802
1072
  // The Rest...
803
1073
 
804
1074
  void Init_sdl() {
805
-
806
1075
  mSDL = rb_define_module("SDL");
807
1076
  mKey = rb_define_module_under(mSDL, "Key");
808
- mWM = rb_define_module_under(mSDL, "WM");
809
1077
  mMouse = rb_define_module_under(mSDL, "Mouse");
810
1078
 
811
1079
  cAudio = rb_define_class_under(mSDL, "Audio", rb_cData);
@@ -816,17 +1084,19 @@ void Init_sdl() {
816
1084
  cTTFFont = rb_define_class_under(mSDL, "TTF", rb_cData); // TODO: Font
817
1085
 
818
1086
  cScreen = rb_define_class_under(mSDL, "Screen", cSurface);
1087
+ cRenderer = rb_define_class_under(mSDL, "Renderer", rb_cData);
1088
+ cWindow = rb_define_class_under(mSDL, "Window", rb_cData);
1089
+ cTexture = rb_define_class_under(mSDL, "Texture", rb_cData);
819
1090
 
820
- cEventQuit = rb_define_class_under(cEvent, "Quit", cEvent);
1091
+ cEventQuit = rb_define_class_under(cEvent, "Quit", cEvent);
821
1092
  cEventKeydown = rb_define_class_under(cEvent, "Keydown", cEvent);
822
- cEventKeyup = rb_define_class_under(cEvent, "Keyup", cEvent);
1093
+ cEventKeyup = rb_define_class_under(cEvent, "Keyup", cEvent);
823
1094
 
824
1095
  cEventMousemove = rb_define_class_under(cEvent, "Mousemove", cEvent);
825
1096
  cEventMousedown = rb_define_class_under(cEvent, "Mousedown", cEvent);
826
1097
  cEventMouseup = rb_define_class_under(cEvent, "Mouseup", cEvent);
827
1098
 
828
1099
  eSDLError = rb_define_class_under(mSDL, "Error", rb_eStandardError);
829
- eSDLMem = rb_define_class_under(cSurface, "VideoMemoryLost", rb_eStandardError);
830
1100
 
831
1101
  //// SDL methods:
832
1102
 
@@ -849,7 +1119,6 @@ void Init_sdl() {
849
1119
  rb_define_attr(cEventKeydown, "press", 1, 1);
850
1120
  rb_define_attr(cEventKeydown, "sym", 1, 1);
851
1121
  rb_define_attr(cEventKeydown, "mod", 1, 1);
852
- rb_define_attr(cEventKeydown, "unicode", 1, 1);
853
1122
 
854
1123
  rb_define_attr(cEventKeyup, "press", 1, 1); // TODO: refactor, possibly subclass
855
1124
  rb_define_attr(cEventKeyup, "sym", 1, 1);
@@ -882,62 +1151,74 @@ void Init_sdl() {
882
1151
  rb_define_module_function(mMouse, "state", Mouse_s_state, 0);
883
1152
 
884
1153
  //// SDL::PixelFormat methods:
1154
+ //// TODO: phase these out... move to renderer or top of SDL
885
1155
 
886
- rb_define_method(cPixelFormat, "get_rgb", PixelFormat_get_rgb, 1);
1156
+ rb_define_method(cPixelFormat, "get_rgba", PixelFormat_get_rgba, 1);
887
1157
  rb_define_method(cPixelFormat, "map_rgba", PixelFormat_map_rgba, 4);
888
- rb_define_method(cPixelFormat, "colorkey", PixelFormat_colorkey, 0);
889
- rb_define_method(cPixelFormat, "alpha", PixelFormat_alpha, 0);
890
1158
 
891
1159
  //// SDL::Screen methods:
1160
+ //// TODO: phase these out entirely?
892
1161
 
893
1162
  rb_define_singleton_method(cScreen, "open", Screen_s_open, 4);
894
- rb_define_method(cScreen, "flip", Screen_flip, 0);
895
- rb_define_method(cScreen, "update", Screen_update, 4);
1163
+
1164
+ id_W = rb_intern("W");
1165
+ id_H = rb_intern("H");
1166
+ rb_const_set(cScreen, id_W, Qnil);
1167
+ rb_const_set(cScreen, id_H, Qnil);
1168
+
1169
+ //// SDL::Window methods:
1170
+
1171
+ // TODO: move to top renderer?
1172
+ rb_define_method(cWindow, "title", Window_title, 0);
1173
+ rb_define_method(cWindow, "title=", Window_title_eq, 1);
1174
+ rb_define_method(cWindow, "update", Window_update, 0);
1175
+
1176
+ //// SDL::Renderer methods:
1177
+
1178
+ rb_define_method(cRenderer, "[]", Renderer_index, 2);
1179
+ rb_define_method(cRenderer, "[]=", Renderer_index_eq, 3);
1180
+ rb_define_method(cRenderer, "blit", Renderer_blit, 7);
1181
+ rb_define_method(cRenderer, "clear", Renderer_clear, 1);
1182
+ rb_define_method(cRenderer, "copy_texture", Renderer_copy_texture, 1);
1183
+ rb_define_method(cRenderer, "draw_bezier", Renderer_draw_bezier, 4);
1184
+ rb_define_method(cRenderer, "draw_circle", Renderer_draw_circle, 6);
1185
+ rb_define_method(cRenderer, "draw_ellipse", Renderer_draw_ellipse, 7);
1186
+ rb_define_method(cRenderer, "draw_line", Renderer_draw_line, 6);
1187
+ rb_define_method(cRenderer, "draw_rect", Renderer_draw_rect, 6);
1188
+ rb_define_method(cRenderer, "fast_rect", Renderer_fast_rect, 5);
1189
+ rb_define_method(cRenderer, "h", Renderer_h, 0);
1190
+ rb_define_method(cRenderer, "new_texture", Renderer_new_texture, 0);
1191
+ rb_define_method(cRenderer, "present", Renderer_present, 0);
1192
+ rb_define_method(cRenderer, "save", Renderer_save, 1);
1193
+ rb_define_method(cRenderer, "sprite", Renderer_sprite, 2);
1194
+ rb_define_method(cRenderer, "target", Renderer_target, 0);
1195
+ rb_define_method(cRenderer, "target=", Renderer_target_eq, 1);
1196
+ rb_define_method(cRenderer, "w", Renderer_w, 0);
896
1197
 
897
1198
  //// SDL::Surface methods:
898
1199
 
899
- rb_define_singleton_method(cSurface, "blit", Surface_s_blit, 8);
900
- rb_define_singleton_method(cSurface, "new", Surface_s_new, 3);
901
1200
  rb_define_singleton_method(cSurface, "load", Surface_s_load, 1);
902
- rb_define_method(cSurface, "set_color_key", Surface_set_color_key, 2);
903
- rb_define_method(cSurface, "draw_bezier", Surface_draw_bezier, 10);
904
- rb_define_method(cSurface, "draw_circle", Surface_draw_circle, 4);
905
- rb_define_method(cSurface, "fill_circle", Surface_fill_circle, 4);
906
- rb_define_method(cSurface, "draw_ellipse", Surface_draw_ellipse, 5);
907
- rb_define_method(cSurface, "fill_ellipse", Surface_fill_ellipse, 5);
908
- rb_define_method(cSurface, "draw_line", Surface_draw_line, 5);
909
- rb_define_method(cSurface, "draw_rect", Surface_draw_rect, 5);
910
- rb_define_method(cSurface, "fill_rect", Surface_fill_rect, 5);
911
- rb_define_method(cSurface, "fast_rect", Surface_fast_rect, 5);
912
- rb_define_method(cSurface, "format", Surface_format, 0);
913
- rb_define_method(cSurface, "h", Surface_h, 0);
1201
+
1202
+ rb_define_method(cSurface, "h", Surface_h, 0);
1203
+ rb_define_method(cSurface, "[]", Surface_index, 2);
1204
+ rb_define_method(cSurface, "format", Surface_format, 0);
1205
+ rb_define_method(cSurface, "transform", Surface_transform, 4);
1206
+ rb_define_method(cSurface, "w", Surface_w, 0);
1207
+
1208
+ // TODO: reimplement and jettison SGE
914
1209
  rb_define_method(cSurface, "make_collision_map", Surface_make_collision_map, 0);
915
- rb_define_method(cSurface, "w", Surface_w, 0);
916
- rb_define_method(cSurface, "[]", Surface_index, 2);
917
- rb_define_method(cSurface, "[]=", Surface_index_equals, 3);
918
- rb_define_method(cSurface, "transform", Surface_transform, 5);
919
- rb_define_method(cSurface, "save", Surface_save, 1);
920
- rb_define_method(cSurface, "flags", Surface_flags, 0);
921
- rb_define_method(cSurface, "set_alpha", Surface_set_alpha, 2);
922
1210
 
923
1211
  //// SDL::TTFFont methods:
924
1212
 
925
1213
  rb_define_singleton_method(cTTFFont, "open", Font_s_open, 2);
926
1214
 
927
- rb_define_method(cTTFFont, "height", Font_height, 0);
928
- rb_define_method(cTTFFont, "render", Font_render, 3);
929
- rb_define_method(cTTFFont, "draw", Font_draw, 5);
930
-
931
- //// SDL::WM methods:
932
-
933
- rb_define_module_function(mWM, "set_caption", WM_s_set_caption, 2);
1215
+ rb_define_method(cTTFFont, "height", Font_height, 0);
1216
+ rb_define_method(cTTFFont, "render", Font_render, 3);
1217
+ rb_define_method(cTTFFont, "draw", Font_draw, 5);
1218
+ rb_define_method(cTTFFont, "text_size", Font_text_size, 1);
934
1219
 
935
1220
  //// Other Init Actions:
936
1221
 
937
- sge_Lock_ON();
938
- sge_Update_OFF();
939
- SDL_EnableUNICODE(1);
940
-
941
1222
  for (int i=0; i < SDL_NUMEVENTS; ++i)
942
1223
  event_creators[i] = Event__null;
943
1224
 
@@ -951,42 +1232,49 @@ void Init_sdl() {
951
1232
  // event_creators[SDL_SYSWMEVENT] = Event__syswm;
952
1233
  // event_creators[SDL_VIDEORESIZE] = Event__videoresize;
953
1234
 
1235
+ // TODO: maybe pause/unpause automatically instead of chewing CPU?
1236
+ // SDL_APP_DIDENTERBACKGROUND
1237
+ // SDL_APP_DIDENTERFOREGROUND
1238
+
954
1239
  rb_set_end_proc(sdl__quit, 0);
955
1240
 
956
1241
  //// Simple Mapped Constants:
957
1242
 
1243
+ INIT_ID(surface);
1244
+ INIT_ID(format);
1245
+ INIT_ID(renderer);
1246
+ INIT_ID(window);
1247
+ INIT_ID(texture);
958
1248
  INIT_ID(button);
959
1249
  INIT_ID(mod);
960
1250
  INIT_ID(press);
961
1251
  INIT_ID(state);
962
1252
  INIT_ID(sym);
963
- INIT_ID(unicode);
964
1253
  INIT_ID(x);
965
1254
  INIT_ID(xrel);
966
1255
  INIT_ID(y);
967
1256
  INIT_ID(yrel);
968
1257
 
969
1258
  #define DC(n) rb_define_const(mSDL, #n, UINT2NUM(SDL_##n))
970
- DC(DOUBLEBUF);
971
- DC(HWSURFACE);
972
1259
  DC(INIT_EVERYTHING);
973
- DC(INIT_VIDEO);
974
- DC(RLEACCEL);
975
- DC(SRCALPHA);
976
- DC(SRCCOLORKEY);
977
- DC(SWSURFACE);
978
-
979
- // DC("ANYFORMAT");
980
- // DC("ASYNCBLIT");
981
- // DC("FULLSCREEN");
982
- // DC("HWACCEL");
983
- // DC("HWPALETTE");
984
- // DC("NOFRAME");
985
- // DC("OPENGL");
986
- // DC("OPENGLBLIT");
987
- // DC("PREALLOC");
988
- // DC("RESIZABLE");
989
- // DC("RLEACCELOK");
1260
+ DC(INIT_VIDEO); // TODO: phase out? it's in the tests...
1261
+ DC(TRUE);
1262
+
1263
+ #define DW(n) rb_define_const(mSDL, #n, UINT2NUM(SDL_WINDOW_##n))
1264
+ DW(FULLSCREEN);
1265
+ DW(OPENGL);
1266
+ DW(SHOWN);
1267
+ DW(HIDDEN);
1268
+ DW(BORDERLESS);
1269
+ DW(RESIZABLE);
1270
+ DW(MINIMIZED);
1271
+ DW(MAXIMIZED);
1272
+ DW(INPUT_GRABBED);
1273
+ DW(INPUT_FOCUS);
1274
+ DW(MOUSE_FOCUS);
1275
+ DW(FULLSCREEN_DESKTOP);
1276
+ DW(FOREIGN);
1277
+ DW(ALLOW_HIGHDPI);
990
1278
 
991
1279
  //// Keyboard Constants
992
1280
 
@@ -995,9 +1283,8 @@ void Init_sdl() {
995
1283
  #define DK(n) _KEY(#n, SDLK_##n)
996
1284
  #define DKP(n) _KEY("K"#n, SDLK_##n)
997
1285
  #define DM(n) _KEY("MOD_"#n, KMOD_##n)
998
- #define DR(n) _KEY("DEFAULT_REPEAT_"#n, SDL_DEFAULT_REPEAT_##n)
999
1286
 
1000
- DK(UNKNOWN); DK(FIRST); DK(BACKSPACE); DK(TAB); DK(CLEAR);
1287
+ DK(UNKNOWN); DK(BACKSPACE); DK(TAB); DK(CLEAR);
1001
1288
  DK(RETURN); DK(PAUSE); DK(ESCAPE); DK(SPACE); DK(EXCLAIM);
1002
1289
  DK(QUOTEDBL); DK(HASH); DK(DOLLAR); DK(AMPERSAND); DK(QUOTE);
1003
1290
  DK(LEFTPAREN); DK(RIGHTPAREN); DK(ASTERISK); DK(PLUS); DK(COMMA);
@@ -1017,31 +1304,9 @@ void Init_sdl() {
1017
1304
  KEY("U", u); KEY("V", v); KEY("W", w); KEY("X", x); KEY("Y", y);
1018
1305
  KEY("Z", z);
1019
1306
 
1020
- // International keyboard syms
1021
- DK(WORLD_0); DK(WORLD_1); DK(WORLD_2); DK(WORLD_3); DK(WORLD_4);
1022
- DK(WORLD_5); DK(WORLD_6); DK(WORLD_7); DK(WORLD_8); DK(WORLD_9);
1023
- DK(WORLD_10); DK(WORLD_11); DK(WORLD_12); DK(WORLD_13); DK(WORLD_14);
1024
- DK(WORLD_15); DK(WORLD_16); DK(WORLD_17); DK(WORLD_18); DK(WORLD_19);
1025
- DK(WORLD_20); DK(WORLD_21); DK(WORLD_22); DK(WORLD_23); DK(WORLD_24);
1026
- DK(WORLD_25); DK(WORLD_26); DK(WORLD_27); DK(WORLD_28); DK(WORLD_29);
1027
- DK(WORLD_30); DK(WORLD_31); DK(WORLD_32); DK(WORLD_33); DK(WORLD_34);
1028
- DK(WORLD_35); DK(WORLD_36); DK(WORLD_37); DK(WORLD_38); DK(WORLD_39);
1029
- DK(WORLD_40); DK(WORLD_41); DK(WORLD_42); DK(WORLD_43); DK(WORLD_44);
1030
- DK(WORLD_45); DK(WORLD_46); DK(WORLD_47); DK(WORLD_48); DK(WORLD_49);
1031
- DK(WORLD_50); DK(WORLD_51); DK(WORLD_52); DK(WORLD_53); DK(WORLD_54);
1032
- DK(WORLD_55); DK(WORLD_56); DK(WORLD_57); DK(WORLD_58); DK(WORLD_59);
1033
- DK(WORLD_60); DK(WORLD_61); DK(WORLD_62); DK(WORLD_63); DK(WORLD_64);
1034
- DK(WORLD_65); DK(WORLD_66); DK(WORLD_67); DK(WORLD_68); DK(WORLD_69);
1035
- DK(WORLD_70); DK(WORLD_71); DK(WORLD_72); DK(WORLD_73); DK(WORLD_74);
1036
- DK(WORLD_75); DK(WORLD_76); DK(WORLD_77); DK(WORLD_78); DK(WORLD_79);
1037
- DK(WORLD_80); DK(WORLD_81); DK(WORLD_82); DK(WORLD_83); DK(WORLD_84);
1038
- DK(WORLD_85); DK(WORLD_86); DK(WORLD_87); DK(WORLD_88); DK(WORLD_89);
1039
- DK(WORLD_90); DK(WORLD_91); DK(WORLD_92); DK(WORLD_93); DK(WORLD_94);
1040
- DK(WORLD_95);
1041
-
1042
1307
  // Numeric keypad
1043
- DK(KP0); DK(KP1); DK(KP2); DK(KP3); DK(KP4);
1044
- DK(KP5); DK(KP6); DK(KP7); DK(KP8); DK(KP9);
1308
+ DK(KP_0); DK(KP_1); DK(KP_2); DK(KP_3); DK(KP_4);
1309
+ DK(KP_5); DK(KP_6); DK(KP_7); DK(KP_8); DK(KP_9);
1045
1310
 
1046
1311
  DK(KP_PERIOD); DK(KP_DIVIDE); DK(KP_MULTIPLY); DK(KP_MINUS);
1047
1312
  DK(KP_PLUS); DK(KP_ENTER); DK(KP_EQUALS);
@@ -1055,20 +1320,14 @@ void Init_sdl() {
1055
1320
  DK(F10); DK(F11); DK(F12); DK(F13); DK(F14); DK(F15);
1056
1321
 
1057
1322
  // Key state modifier keys
1058
- DK(NUMLOCK); DK(CAPSLOCK); DK(SCROLLOCK); DK(RSHIFT); DK(LSHIFT); DK(RCTRL);
1059
- DK(LCTRL); DK(RALT); DK(LALT); DK(RMETA); DK(LMETA); DK(LSUPER); DK(RSUPER);
1060
- DK(MODE);
1323
+ DK(CAPSLOCK); DK(SCROLLLOCK); DK(RSHIFT); DK(LSHIFT); DK(RCTRL);
1324
+ DK(LCTRL); DK(RALT); DK(LALT); DK(RGUI); DK(LGUI); DK(MODE);
1061
1325
 
1062
1326
  // Miscellaneous function keys
1063
- DK(HELP); DK(PRINT); DK(SYSREQ); DK(BREAK);
1064
- DK(MENU); DK(POWER); DK(EURO); DK(LAST);
1327
+ DK(HELP); DK(SYSREQ); DK(MENU); DK(POWER);
1065
1328
 
1066
1329
  // key mods
1067
1330
  DM(NONE); DM(LSHIFT); DM(RSHIFT); DM(LCTRL); DM(RCTRL); DM(LALT); DM(RALT);
1068
- DM(LMETA); DM(RMETA); DM(NUM); DM(CAPS); DM(MODE); DM(RESERVED); DM(CTRL);
1069
- DM(SHIFT); DM(ALT); DM(META);
1070
-
1071
- // key repeat constants
1072
- DR(DELAY);
1073
- DR(INTERVAL);
1331
+ DM(LGUI); DM(RGUI); DM(NUM); DM(CAPS); DM(MODE); DM(RESERVED); DM(CTRL);
1332
+ DM(SHIFT); DM(ALT); DM(GUI);
1074
1333
  }