ruby-sdl2 0.3.0 → 0.3.1

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.
data/event.c CHANGED
@@ -923,7 +923,7 @@ static VALUE ControllerDevice_inspect(VALUE self)
923
923
  * You don't handle the instance
924
924
  * of this class directly, but you handle the instances of
925
925
  * two subclasses of this subclasses:
926
- * {SDL2::Event::FingerMotion} and {SDL2::Event::MouseButtonUp}.
926
+ * {SDL2::Event::FingerMotion}, {SDL2::Event::FingerDown}, and {SDL2::Event::FingerUp}.
927
927
  *
928
928
  * @attribute touch_id
929
929
  * the touch device id
@@ -981,7 +981,7 @@ static VALUE EvTouchFinger_inspect(VALUE self)
981
981
  * @return [Float]
982
982
  *
983
983
  * @attribute dy
984
- * the distance moved in the x-axis, normalized (0...1)
984
+ * the distance moved in the y-axis, normalized (0...1)
985
985
  * @return [Float]
986
986
  *
987
987
  */
@@ -1,6 +1,6 @@
1
1
  module SDL2
2
2
  # Version string of Ruby/SDL2
3
- VERSION = "0.3.0"
3
+ VERSION = "0.3.1"
4
4
  # Version of Ruby/SDL2, [major, minor, patch level]
5
- VERSION_NUMBER = [0, 2, 0]
5
+ VERSION_NUMBER = VERSION.split(".").map(&:to_i)
6
6
  end
@@ -46,7 +46,7 @@ static inline SDL_Window* Get_SDL_Window_or_NULL(VALUE win)
46
46
  * @param [SDL2::Window,nil] parent the parent window, or nil for no parent
47
47
  * @return [nil]
48
48
  *
49
- * @see .show_message_box
49
+ * @see .show
50
50
  */
51
51
  static VALUE MessageBox_s_show_simple_box(VALUE self, VALUE flag, VALUE title,
52
52
  VALUE message, VALUE parent)
@@ -138,7 +138,7 @@ static void set_color_scheme(VALUE colors, VALUE sym, SDL_MessageBoxColor* color
138
138
  * color scheme, or nil for the default color scheme
139
139
  * @return [Integer] pressed button id
140
140
  *
141
- * @see .show_simple_message_box
141
+ * @see .show_simple_box
142
142
  */
143
143
  static VALUE MessageBox_s_show(VALUE self, VALUE params)
144
144
  {
data/mixer.c.m4 CHANGED
@@ -13,7 +13,7 @@ static VALUE mMusicChannel;
13
13
  static VALUE playing_chunks = Qnil;
14
14
  static VALUE playing_music = Qnil;
15
15
 
16
- #define MIX_ERROR() do { HANDLE_ERROR(SDL_SetError(Mix_GetError())); } while(0)
16
+ #define MIX_ERROR() do { HANDLE_ERROR(SDL_SetError("%s", Mix_GetError())); } while(0)
17
17
  #define HANDLE_MIX_ERROR(code) \
18
18
  do { if ((code) < 0) { MIX_ERROR(); } } while (0)
19
19
 
@@ -124,7 +124,7 @@ DEFINE_WRAPPER(Mix_Music, Music, music, cMusic, "SDL2::Mixer::Music");
124
124
  static VALUE Mixer_s_init(VALUE self, VALUE f)
125
125
  {
126
126
  int flags = NUM2INT(f);
127
- if (Mix_Init(flags) & flags != flags)
127
+ if ((Mix_Init(flags) & flags) != flags)
128
128
  rb_raise(eSDL2Error, "Couldn't initialize SDL_mixer");
129
129
 
130
130
  return Qnil;
data/ttf.c.m4 CHANGED
@@ -8,7 +8,7 @@ static VALUE cTTF;
8
8
  static VALUE mStyle;
9
9
  static VALUE mHinting;
10
10
 
11
- #define TTF_ERROR() do { HANDLE_ERROR(SDL_SetError(TTF_GetError())); } while (0)
11
+ #define TTF_ERROR() do { HANDLE_ERROR(SDL_SetError("%s", TTF_GetError())); } while (0)
12
12
  #define HANDLE_TTF_ERROR(code) \
13
13
  do { if ((code) < 0) { TTF_ERROR(); } } while (0)
14
14
 
data/video.c.m4 CHANGED
@@ -37,7 +37,7 @@ struct Texture;
37
37
  #ifdef DEBUG_GC
38
38
  #define GC_LOG(args) fprintf args
39
39
  #else
40
- #define GC_LOG(args)
40
+ #define GC_LOG(args)
41
41
  #endif
42
42
 
43
43
  typedef struct Window {
@@ -69,7 +69,7 @@ static void Renderer_free(Renderer*);
69
69
  static void Window_destroy_internal(Window* w)
70
70
  {
71
71
  int i;
72
- for (i=0; i<w->num_renderers; ++i)
72
+ for (i=0; i<w->num_renderers; ++i)
73
73
  Renderer_free(w->renderers[i]);
74
74
  w->num_renderers = w->max_renderers = 0;
75
75
  free(w->renderers);
@@ -78,12 +78,12 @@ static void Window_destroy_internal(Window* w)
78
78
 
79
79
  static void Window_free(Window* w)
80
80
  {
81
-
81
+
82
82
  GC_LOG((stderr, "Window free: %p\n", w));
83
83
  Window_destroy_internal(w);
84
84
  if (w->window && rubysdl2_is_active())
85
85
  SDL_DestroyWindow(w->window);
86
-
86
+
87
87
  free(w);
88
88
  }
89
89
 
@@ -148,7 +148,7 @@ static void Renderer_free(Renderer* r)
148
148
  {
149
149
  GC_LOG((stderr, "Renderer free: %p (refcount=%d)\n", r, r->refcount));
150
150
  Renderer_destroy_internal(r);
151
-
151
+
152
152
  r->refcount--;
153
153
  if (r->refcount == 0) {
154
154
  free(r);
@@ -254,14 +254,14 @@ static VALUE RendererInfo_new(SDL_RendererInfo* info)
254
254
  VALUE rinfo = rb_obj_alloc(cRendererInfo);
255
255
  VALUE texture_formats = rb_ary_new();
256
256
  unsigned int i;
257
-
257
+
258
258
  rb_iv_set(rinfo, "@name", rb_usascii_str_new_cstr(info->name));
259
259
  rb_iv_set(rinfo, "@texture_formats", texture_formats);
260
260
  for (i=0; i<info->num_texture_formats; ++i)
261
261
  rb_ary_push(texture_formats, PixelFormat_new(info->texture_formats[i]));
262
262
  rb_iv_set(rinfo, "@max_texture_width", INT2NUM(info->max_texture_width));
263
263
  rb_iv_set(rinfo, "@max_texture_height", INT2NUM(info->max_texture_height));
264
-
264
+
265
265
  return rinfo;
266
266
  }
267
267
 
@@ -273,7 +273,7 @@ SDL_Color Array_to_SDL_Color(VALUE ary)
273
273
  color.r = color.g = color.b = 0; color.a = 255;
274
274
  return color;
275
275
  }
276
-
276
+
277
277
  Check_Type(ary, T_ARRAY);
278
278
  if (RARRAY_LEN(ary) != 3 && RARRAY_LEN(ary) != 4)
279
279
  rb_raise(rb_eArgError, "wrong number of Array elements (%ld for 3 or 4)",
@@ -293,7 +293,7 @@ SDL_Color Array_to_SDL_Color(VALUE ary)
293
293
  * Get the names of all video drivers.
294
294
  *
295
295
  * You can use the name as an argument of {.video_init}.
296
- *
296
+ *
297
297
  * @return [Array<String>]
298
298
  */
299
299
  static VALUE SDL2_s_video_drivers(VALUE self)
@@ -322,12 +322,12 @@ static VALUE SDL2_s_current_video_driver(VALUE self)
322
322
  }
323
323
 
324
324
  /*
325
- * @overload video_init(driver_name)
325
+ * @overload video_init(driver_name)
326
326
  * Initialize the video subsystem, specifying a video driver.
327
- *
327
+ *
328
328
  * {.init} cannot specify a video driver, so you need to use
329
329
  * this method to specify a driver.
330
- *
330
+ *
331
331
  * @param driver_name [String]
332
332
  * @return [nil]
333
333
  *
@@ -341,12 +341,12 @@ static VALUE SDL2_s_video_init(VALUE self, VALUE driver_name)
341
341
 
342
342
  /*
343
343
  * Document-class: SDL2::Window
344
- *
344
+ *
345
345
  * This class represents a window.
346
346
  *
347
347
  * If you want to create graphical application using Ruby/SDL, first you need to
348
348
  * create a window.
349
- *
349
+ *
350
350
  * All of methods/class methods are available only after initializing video
351
351
  * subsystem by {SDL2.init}.
352
352
  *
@@ -364,9 +364,9 @@ static VALUE SDL2_s_video_init(VALUE self, VALUE driver_name)
364
364
  * @param [Integer] w the width of the window
365
365
  * @param [Integer] h the height of the window
366
366
  * @param [Integer] flags 0, or one or more {Flags} OR'd together
367
- *
367
+ *
368
368
  * @return [SDL2::Window] created window
369
- *
369
+ *
370
370
  */
371
371
  static VALUE Window_s_create(VALUE self, VALUE title, VALUE x, VALUE y, VALUE w, VALUE h,
372
372
  VALUE flags)
@@ -421,7 +421,7 @@ VALUE find_window_by_id(Uint32 id)
421
421
  *
422
422
  * You cannot call almost all methods after calling this method.
423
423
  * The exception is {#destroy?}.
424
- *
424
+ *
425
425
  * @return [void]
426
426
  */
427
427
  static VALUE Window_destroy(VALUE self)
@@ -445,10 +445,10 @@ static VALUE Window_create_renderer(VALUE self, VALUE index, VALUE flags)
445
445
  SDL_Renderer* sdl_renderer;
446
446
  VALUE renderer;
447
447
  sdl_renderer = SDL_CreateRenderer(Get_SDL_Window(self), NUM2INT(index), NUM2UINT(flags));
448
-
448
+
449
449
  if (sdl_renderer == NULL)
450
450
  HANDLE_ERROR(-1);
451
-
451
+
452
452
  renderer = Renderer_new(sdl_renderer, Get_Window(self));
453
453
  rb_iv_set(self, "renderer", renderer);
454
454
  return renderer;
@@ -568,7 +568,7 @@ static VALUE Window_gamma_ramp(VALUE self)
568
568
  * @overload icon=(icon)
569
569
  *
570
570
  * Set the window icon.
571
- *
571
+ *
572
572
  * @param icon [SDL2::Surface] the icon for the window
573
573
  * @return [icon]
574
574
  */
@@ -589,7 +589,7 @@ static VALUE Window_input_is_grabbed_p(VALUE self)
589
589
  }
590
590
 
591
591
  /*
592
- * @overload input_is_grabbed=(grabbed)
592
+ * @overload input_is_grabbed=(grabbed)
593
593
  * Set the window's input grab mode.
594
594
  *
595
595
  * @param grabbed [Boolean] true to grub input, and false to release input
@@ -632,7 +632,7 @@ static VALUE Window_maximum_size(VALUE self)
632
632
  }
633
633
 
634
634
  /*
635
- * @overload maximum_size=(size)
635
+ * @overload maximum_size=(size)
636
636
  * Set the maximum size of the window's client area.
637
637
  *
638
638
  * @param size [[Integer, Integer]] maximum width and maximum height,
@@ -660,7 +660,7 @@ static VALUE Window_minimum_size(VALUE self)
660
660
  }
661
661
 
662
662
  /*
663
- * @overload minimum_size=(size)
663
+ * @overload minimum_size=(size)
664
664
  * Set the minimum size of the window's client area.
665
665
  *
666
666
  * @param size [[Integer, Integer]] minimum width and minimum height,
@@ -688,7 +688,7 @@ static VALUE Window_position(VALUE self)
688
688
  }
689
689
 
690
690
  /*
691
- * @overload position=(xy)
691
+ * @overload position=(xy)
692
692
  * Set the position of the window
693
693
  *
694
694
  * @param xy [[Integer, Integer]] the x position and the y position,
@@ -708,7 +708,7 @@ static VALUE Window_set_position(VALUE self, VALUE xy)
708
708
  * Get the size of the window.
709
709
  *
710
710
  * @return [[Integer, Integer]] the width and the height
711
- *
711
+ *
712
712
  * @see size=
713
713
  */
714
714
  static VALUE Window_size(VALUE self)
@@ -723,7 +723,7 @@ static VALUE Window_size(VALUE self)
723
723
  * @param wh [[Integer, Integer]] new width and new height
724
724
  *
725
725
  * @return [size]
726
- *
726
+ *
727
727
  * @see #size
728
728
  */
729
729
  static VALUE Window_set_size(VALUE self, VALUE size)
@@ -756,7 +756,7 @@ static VALUE Window_bordered(VALUE self)
756
756
  }
757
757
 
758
758
  /*
759
- * @overload bordered=(bordered)
759
+ * @overload bordered=(bordered)
760
760
  * Set the border state of the window.
761
761
  *
762
762
  * @param bordered [Boolean] true for bordered window, anad false for
@@ -847,7 +847,7 @@ SIMPLE_WINDOW_METHOD(Restore, restore);
847
847
  /*
848
848
  * Get the fullscreen stete of the window
849
849
  *
850
- * @return [Integer] 0 for window mode, {SDL2::Window::Flags::FULLSCREEN} for
850
+ * @return [Integer] 0 for window mode, {SDL2::Window::Flags::FULLSCREEN} for
851
851
  * fullscreen mode, and {SDL2::Window::Flags::FULLSCREEN_DESKTOP} for fullscreen
852
852
  * at the current desktop resolution.
853
853
  *
@@ -864,11 +864,11 @@ static VALUE Window_fullscreen_mode(VALUE self)
864
864
  * @overload fullscreen_mode=(flag)
865
865
  * Set the fullscreen state of the window
866
866
  *
867
- * @param flag [Integer] 0 for window mode, {SDL2::Window::Flags::FULLSCREEN} for
867
+ * @param flag [Integer] 0 for window mode, {SDL2::Window::Flags::FULLSCREEN} for
868
868
  * fullscreen mode, and {SDL2::Flags::Window::FULLSCREEN_DESKTOP} for fullscreen
869
869
  * at the current desktop resolution.
870
870
  * @return [flag]
871
- *
871
+ *
872
872
  * @see #fullscreen_mode
873
873
  */
874
874
  static VALUE Window_set_fullscreen_mode(VALUE self, VALUE flags)
@@ -928,7 +928,7 @@ static VALUE Window_debug_info(VALUE self)
928
928
  if (w->renderers[i]->renderer)
929
929
  ++num_active_renderers;
930
930
  rb_hash_aset(info, rb_str_new2("num_active_renderers"), INT2NUM(num_active_renderers));
931
-
931
+
932
932
  return info;
933
933
  }
934
934
 
@@ -936,7 +936,7 @@ static VALUE Window_debug_info(VALUE self)
936
936
  * Document-module: SDL2::Window::Flags
937
937
  *
938
938
  * OR'd bits of the constants of this module represents window states.
939
- *
939
+ *
940
940
  * You can see a window state using {SDL2::Window#flags}
941
941
  * and create a window with a specified
942
942
  * state using flag parameter of {SDL2::Window.create}.
@@ -967,7 +967,7 @@ static VALUE Window_debug_info(VALUE self)
967
967
  * Get all connected displays.
968
968
  *
969
969
  * @return [Array<SDL2::Display>]
970
- *
970
+ *
971
971
  */
972
972
  static VALUE Display_s_displays(VALUE self)
973
973
  {
@@ -988,7 +988,7 @@ static int Display_index_int(VALUE display)
988
988
  * Get available display modes of the display.
989
989
  *
990
990
  * @return [Array<SDL2::Display::Mode>]
991
- *
991
+ *
992
992
  */
993
993
  static VALUE Display_modes(VALUE self)
994
994
  {
@@ -1008,7 +1008,7 @@ static VALUE Display_modes(VALUE self)
1008
1008
  * Get the current display mode.
1009
1009
  *
1010
1010
  * @return [SDL2::Display::Mode]
1011
- *
1011
+ *
1012
1012
  * @see #desktop_mode
1013
1013
  */
1014
1014
  static VALUE Display_current_mode(VALUE self)
@@ -1022,7 +1022,7 @@ static VALUE Display_current_mode(VALUE self)
1022
1022
  * Get the desktop display mode.
1023
1023
  *
1024
1024
  * Normally, the return value of this method is
1025
- * same as {#current_mode}. However,
1025
+ * same as {#current_mode}. However,
1026
1026
  * when you use fullscreen and chagne the resolution,
1027
1027
  * this method returns the previous native display mode,
1028
1028
  * and not the current mode.
@@ -1037,12 +1037,12 @@ static VALUE Display_desktop_mode(VALUE self)
1037
1037
  }
1038
1038
 
1039
1039
  /*
1040
- * @overload closest_mode(mode)
1040
+ * @overload closest_mode(mode)
1041
1041
  * Get the available display mode closest match to **mode**.
1042
- *
1042
+ *
1043
1043
  * @param mode [SDL2::Display::Mode] the desired display mode
1044
1044
  * @return [SDL2::Display::Mode]
1045
- *
1045
+ *
1046
1046
  */
1047
1047
  static VALUE Display_closest_mode(VALUE self, VALUE mode)
1048
1048
  {
@@ -1111,7 +1111,7 @@ static VALUE DisplayMode_inspect(VALUE self)
1111
1111
  return rb_sprintf("<%s: format=%s w=%d h=%d refresh_rate=%d>",
1112
1112
  rb_obj_classname(self), SDL_GetPixelFormatName(mode->format),
1113
1113
  mode->w, mode->h, mode->refresh_rate);
1114
-
1114
+
1115
1115
  }
1116
1116
 
1117
1117
  /* @return [SDL2::PixelFormat] the pixel format of the display mode */
@@ -1145,7 +1145,7 @@ static VALUE DisplayMode_refresh_rate(VALUE self)
1145
1145
  *
1146
1146
  * You can create a renderer using {SDL2::Window#create_renderer} and
1147
1147
  * use it to draw figures on the window.
1148
- *
1148
+ *
1149
1149
  *
1150
1150
  * @!method destroy?
1151
1151
  * Return true if the renderer is {#destroy destroyed}.
@@ -1157,7 +1157,7 @@ static VALUE DisplayMode_refresh_rate(VALUE self)
1157
1157
  * @overload drivers_info
1158
1158
  * Return information of all available rendering contexts.
1159
1159
  * @return [Array<SDL2::Renderer::Info>] information about rendering contexts
1160
- *
1160
+ *
1161
1161
  */
1162
1162
  static VALUE Renderer_s_drivers_info(VALUE self)
1163
1163
  {
@@ -1189,16 +1189,16 @@ static VALUE Renderer_destroy(VALUE self)
1189
1189
  * Create a new texture for the rendering context.
1190
1190
  *
1191
1191
  * You can use the following constants to specify access pattern
1192
- *
1192
+ *
1193
1193
  * * {SDL2::Texture::ACCESS_STATIC}
1194
1194
  * * {SDL2::Texture::ACCESS_STREAMING}
1195
1195
  * * {SDL2::Texture::ACCESS_TARGET}
1196
- *
1196
+ *
1197
1197
  * @param [SDL2::PixelFormat,Integer] format format of the texture
1198
1198
  * @param [Integer] access texture access pattern
1199
1199
  * @param [Integer] w the width ofthe texture in pixels
1200
1200
  * @param [Integer] h the height ofthe texture in pixels
1201
- *
1201
+ *
1202
1202
  * @return [SDL2::Texture] the created texture
1203
1203
  *
1204
1204
  * @raise [SDL2::Error] raised when the texture cannot be created
@@ -1233,7 +1233,7 @@ static VALUE Renderer_create_texture_from(VALUE self, VALUE surface)
1233
1233
  Get_SDL_Surface(surface));
1234
1234
  if (texture == NULL)
1235
1235
  SDL_ERROR();
1236
-
1236
+
1237
1237
  return Texture_new(texture, Get_Renderer(self));
1238
1238
  }
1239
1239
 
@@ -1257,7 +1257,7 @@ static SDL_Point* Get_SDL_Point_or_NULL(VALUE point)
1257
1257
  * rendering target; the texture will be stretched to fill the given rectangle
1258
1258
  *
1259
1259
  * @return [void]
1260
- *
1260
+ *
1261
1261
  * @see #copy_ex
1262
1262
  */
1263
1263
  static VALUE Renderer_copy(VALUE self, VALUE texture, VALUE srcrect, VALUE dstrect)
@@ -1276,12 +1276,12 @@ static VALUE Renderer_copy(VALUE self, VALUE texture, VALUE srcrect, VALUE dstre
1276
1276
  * it top-bottom and/or left-right.
1277
1277
  *
1278
1278
  * You can use the following constants to specify the horizontal/vertical flip:
1279
- *
1279
+ *
1280
1280
  * * {SDL2::Renderer::FLIP_HORIZONTAL} - flip horizontally
1281
1281
  * * {SDL2::Renderer::FLIP_VERTICAL} - flip vertically
1282
1282
  * * {SDL2::Renderer::FLIP_NONE} - do not flip, equal to zero
1283
1283
  *
1284
- *
1284
+ *
1285
1285
  * @param [SDL2::Texture] texture the source texture
1286
1286
  * @param [SDL2::Rect,nil] srcrect the source rectangle, or nil for the entire texture
1287
1287
  * @param [SDL2::Rect,nil] dstrect the destination rectangle, or nil for the entire
@@ -1322,7 +1322,7 @@ static VALUE Renderer_present(VALUE self)
1322
1322
  /*
1323
1323
  * Crear the rendering target with the drawing color.
1324
1324
  * @return [nil]
1325
- *
1325
+ *
1326
1326
  * @see #draw_color=
1327
1327
  */
1328
1328
  static VALUE Renderer_clear(VALUE self)
@@ -1331,12 +1331,12 @@ static VALUE Renderer_clear(VALUE self)
1331
1331
  return Qnil;
1332
1332
  }
1333
1333
 
1334
- /*
1334
+ /*
1335
1335
  * Get the color used for drawing operations
1336
1336
  * @return [[Integer,Integer,Integer,Integer]]
1337
1337
  * red, green, blue, and alpha components of the drawing color
1338
1338
  * (all components are more than or equal to 0 and less than and equal to 255)
1339
- *
1339
+ *
1340
1340
  * @see #draw_color=
1341
1341
  */
1342
1342
  static VALUE Renderer_draw_color(VALUE self)
@@ -1354,29 +1354,29 @@ static VALUE Renderer_draw_color(VALUE self)
1354
1354
  * and less than and equal to 255
1355
1355
  *
1356
1356
  * This method effects the following methods.
1357
- *
1357
+ *
1358
1358
  * * {#draw_line}
1359
1359
  * * {#draw_point}
1360
1360
  * * {#draw_rect}
1361
1361
  * * {#fill_rect}
1362
1362
  * * {#clear}
1363
- *
1363
+ *
1364
1364
  * @param [[Integer, Integer, Integer]] color
1365
1365
  * red, green, and blue components used for drawing
1366
1366
  * @param [[Integer, Integer, Integer, Integer]] color
1367
1367
  * red, green, blue, and alpha components used for drawing
1368
1368
  *
1369
1369
  * @return [color]
1370
- *
1370
+ *
1371
1371
  * @see #draw_color
1372
1372
  */
1373
1373
  static VALUE Renderer_set_draw_color(VALUE self, VALUE rgba)
1374
1374
  {
1375
1375
  SDL_Color color = Array_to_SDL_Color(rgba);
1376
-
1376
+
1377
1377
  HANDLE_ERROR(SDL_SetRenderDrawColor(Get_SDL_Renderer(self),
1378
1378
  color.r, color.g, color.b, color.a));
1379
-
1379
+
1380
1380
  return rgba;
1381
1381
  }
1382
1382
 
@@ -1418,7 +1418,7 @@ static VALUE Renderer_draw_point(VALUE self, VALUE x, VALUE y)
1418
1418
  * Draw a rectangle using drawing color given by {#draw_color=}.
1419
1419
  *
1420
1420
  * @param [SDL2::Rect] rect the drawing rectangle
1421
- *
1421
+ *
1422
1422
  * @return [nil]
1423
1423
  */
1424
1424
  static VALUE Renderer_draw_rect(VALUE self, VALUE rect)
@@ -1432,7 +1432,7 @@ static VALUE Renderer_draw_rect(VALUE self, VALUE rect)
1432
1432
  * Draw a filled rectangle using drawing color given by {#draw_color=}.
1433
1433
  *
1434
1434
  * @param [SDL2::Rect] rect the drawing rectangle
1435
- *
1435
+ *
1436
1436
  * @return [nil]
1437
1437
  */
1438
1438
  static VALUE Renderer_fill_rect(VALUE self, VALUE rect)
@@ -1458,7 +1458,7 @@ static VALUE Renderer_info(VALUE self)
1458
1458
  * {#fill_rect} and {#draw_line}.
1459
1459
  *
1460
1460
  * @return [Integer]
1461
- *
1461
+ *
1462
1462
  * @see #draw_blend_mode=
1463
1463
  * @see SDL2::BlendMode
1464
1464
  */
@@ -1474,7 +1474,7 @@ static VALUE Renderer_draw_blend_mode(VALUE self)
1474
1474
  * Set the blend mode used for drawing operations.
1475
1475
  *
1476
1476
  * This method effects the following methods.
1477
- *
1477
+ *
1478
1478
  * * {#draw_line}
1479
1479
  * * {#draw_point}
1480
1480
  * * {#draw_rect}
@@ -1549,7 +1549,7 @@ static VALUE Renderer_logical_size(VALUE self)
1549
1549
  * @overload logical_size=(w_and_h)
1550
1550
  *
1551
1551
  * Set a device indepndent resolution for rendering.
1552
- *
1552
+ *
1553
1553
  * @param w_and_h [[Integer, Integer]] the width and height of the logical resolution
1554
1554
  * @return [w_and_h]
1555
1555
  * @see #logical_size
@@ -1582,7 +1582,7 @@ static VALUE Renderer_scale(VALUE self)
1582
1582
  *
1583
1583
  * The drawing coordinates are scaled by the x/y scaling factors before they are used by the renderer.
1584
1584
  * This allows resolution independent drawing with a single coordinate system.
1585
- *
1585
+ *
1586
1586
  * If this results in scaling or subpixel drawing by the rendering backend,
1587
1587
  * it will be handled using the appropriate
1588
1588
  * quality hints. For best results use integer scaling factors.
@@ -1614,7 +1614,7 @@ static VALUE Renderer_viewport(VALUE self)
1614
1614
  }
1615
1615
 
1616
1616
  /*
1617
- * @overload viewport=(area)
1617
+ * @overload viewport=(area)
1618
1618
  * Set the drawing area for rendering on the current target.
1619
1619
  *
1620
1620
  * @param area [SDL2::Rect,nil] the drawing area, or nil to set the viewport to the entire target
@@ -1652,19 +1652,19 @@ static VALUE Renderer_output_size(VALUE self)
1652
1652
  /*
1653
1653
  * @overload render_target=(target)
1654
1654
  * Set a texture as the current render target.
1655
- *
1655
+ *
1656
1656
  * Some renderers have ability to render to a texture instead of a screen.
1657
1657
  * You can judge whether your renderer has this ability using
1658
1658
  * {#support_render_target?}.
1659
- *
1659
+ *
1660
1660
  * The target texture musbe be {#create_texture created} with the
1661
1661
  * {SDL2::Texture::ACCESS_TARGET} flag.
1662
- *
1662
+ *
1663
1663
  * @param [SDL2::Texture,nil] target the targeted texture, or nil
1664
1664
  * for the default render target(i.e. screen)
1665
1665
  *
1666
1666
  * @return [target]
1667
- *
1667
+ *
1668
1668
  * @see #render_target
1669
1669
  */
1670
1670
  static VALUE Renderer_set_render_target(VALUE self, VALUE target)
@@ -1714,7 +1714,7 @@ static VALUE Renderer_debug_info(VALUE self)
1714
1714
  ++num_active_textures;
1715
1715
  rb_hash_aset(info, rb_str_new2("num_active_textures"), INT2NUM(num_active_textures));
1716
1716
  rb_hash_aset(info, rb_str_new2("refcount"), INT2NUM(r->refcount));
1717
-
1717
+
1718
1718
  return info;
1719
1719
  }
1720
1720
 
@@ -1731,7 +1731,7 @@ static VALUE Renderer_debug_info(VALUE self)
1731
1731
  *
1732
1732
  * @!attribute [r] max_texture_width
1733
1733
  * @return [Integer] maximum texture width
1734
- *
1734
+ *
1735
1735
  * @!attribute [r] max_texture_height
1736
1736
  * @return [Integer] maximum texture height
1737
1737
  */
@@ -1741,7 +1741,7 @@ static VALUE Renderer_debug_info(VALUE self)
1741
1741
  *
1742
1742
  * The OR'd bits of the constants of this module represents
1743
1743
  * the state of renderers.
1744
- *
1744
+ *
1745
1745
  * You can use this flag
1746
1746
  * {SDL2::Window#create_renderer when you create a new renderer}.
1747
1747
  * No flags(==0) gives priority to available ACCELERATED renderers.
@@ -1785,7 +1785,7 @@ static VALUE Texture_destroy(VALUE self)
1785
1785
  * Get the blending mode of the texture.
1786
1786
  *
1787
1787
  * @return [Integer] blend mode
1788
- *
1788
+ *
1789
1789
  * @see #blend_mode=
1790
1790
  */
1791
1791
  static VALUE Texture_blend_mode(VALUE self)
@@ -1825,7 +1825,7 @@ static VALUE Texture_alpha_mod(VALUE self)
1825
1825
  }
1826
1826
 
1827
1827
  /*
1828
- * @overload alpha_mod=(alpha)
1828
+ * @overload alpha_mod=(alpha)
1829
1829
  * Set an additional alpha value used in render copy operations.
1830
1830
  *
1831
1831
  * @param alpha [Integer] the alpha value multiplied into copy operation,
@@ -1854,9 +1854,9 @@ static VALUE Texture_color_mod(VALUE self)
1854
1854
  }
1855
1855
 
1856
1856
  /*
1857
- * @overload color_mod=(rgb)
1857
+ * @overload color_mod=(rgb)
1858
1858
  * Set an additional color value used in render copy operations.
1859
- *
1859
+ *
1860
1860
  * @param rgb [[Integer, Integer, Integer]] the red, green, and blue
1861
1861
  * color value multiplied into copy operations.
1862
1862
  * @return [rgb]
@@ -1885,13 +1885,13 @@ static VALUE Texture_format(VALUE self)
1885
1885
  * Get the access pattern allowed for the texture.
1886
1886
  *
1887
1887
  * The return value is one of the following:
1888
- *
1888
+ *
1889
1889
  * * {SDL2::Texture::ACCESS_STATIC}
1890
1890
  * * {SDL2::Texture::ACCESS_STREAMING}
1891
1891
  * * {SDL2::Texture::ACCESS_TARGET}
1892
1892
  *
1893
1893
  * @return [Integer]
1894
- *
1894
+ *
1895
1895
  * @see SDL2::Renderer#create_texture
1896
1896
  */
1897
1897
  static VALUE Texture_access_pattern(VALUE self)
@@ -1905,7 +1905,7 @@ static VALUE Texture_access_pattern(VALUE self)
1905
1905
  * Get the width of the texture.
1906
1906
  *
1907
1907
  * @return [Integer]
1908
- *
1908
+ *
1909
1909
  * @see SDL2::Renderer#create_texture
1910
1910
  */
1911
1911
  static VALUE Texture_w(VALUE self)
@@ -1919,7 +1919,7 @@ static VALUE Texture_w(VALUE self)
1919
1919
  * Get the height of the texture.
1920
1920
  *
1921
1921
  * @return [Integer]
1922
- *
1922
+ *
1923
1923
  * @see SDL2::Renderer#create_texture
1924
1924
  */
1925
1925
  static VALUE Texture_h(VALUE self)
@@ -1937,7 +1937,7 @@ static VALUE Texture_inspect(VALUE self)
1937
1937
  int access, w, h;
1938
1938
  if (!t->texture)
1939
1939
  return rb_sprintf("<%s: (destroyed)>", rb_obj_classname(self));
1940
-
1940
+
1941
1941
  HANDLE_ERROR(SDL_QueryTexture(t->texture, &format, &access, &w, &h));
1942
1942
  return rb_sprintf("<%s:%p format=%s access=%d w=%d h=%d>",
1943
1943
  rb_obj_classname(self), (void*)self, SDL_GetPixelFormatName(format),
@@ -1994,6 +1994,26 @@ static VALUE Surface_s_load_bmp(VALUE self, VALUE fname)
1994
1994
  return Surface_new(surface);
1995
1995
  }
1996
1996
 
1997
+ /*
1998
+ * @overload save_bmp(src, path)
1999
+ * Save a surface to bmp file.
2000
+ *
2001
+ * @param src [SDL2::Surface] surface source
2002
+ * @param path [String] bmp file path
2003
+ * @return [Integer]
2004
+ * @raise [SDL2::Error] raised when an error occurs.
2005
+ *
2006
+ */
2007
+ static VALUE Surface_s_save_bmp(VALUE self, VALUE src, VALUE fname)
2008
+ {
2009
+ SDL_Surface* surface = Get_SDL_Surface(src);
2010
+
2011
+ if (surface == NULL)
2012
+ HANDLE_ERROR(-1);
2013
+
2014
+ return INT2NUM(SDL_SaveBMP(surface, StringValueCStr(fname)));
2015
+ }
2016
+
1997
2017
  /*
1998
2018
  * @overload from_string(string, width, heigth, depth, pitch=nil, rmask=nil, gmask=nil, bmask=nil, amask=nil)
1999
2019
  *
@@ -2001,7 +2021,7 @@ static VALUE Surface_s_load_bmp(VALUE self, VALUE fname)
2001
2021
  *
2002
2022
  * If rmask, gmask, bmask are omitted, the default masks are used.
2003
2023
  * If amask is omitted, alpha mask is considered to be zero.
2004
- *
2024
+ *
2005
2025
  * @param string [String] the pixel data
2006
2026
  * @param width [Integer] the width of the creating surface
2007
2027
  * @param height [Integer] the height of the creating surface
@@ -2014,7 +2034,7 @@ static VALUE Surface_s_load_bmp(VALUE self, VALUE fname)
2014
2034
  * @param amask [Integer] the alpha mask of a pixel
2015
2035
  * @return [SDL2::Surface] a new surface
2016
2036
  * @raise [SDL2::Error] raised when an error occurs in C SDL library
2017
- *
2037
+ *
2018
2038
  */
2019
2039
  static VALUE Surface_s_from_string(int argc, VALUE* argv, VALUE self)
2020
2040
  {
@@ -2023,7 +2043,7 @@ static VALUE Surface_s_from_string(int argc, VALUE* argv, VALUE self)
2023
2043
  SDL_Surface* surface;
2024
2044
  void* pixels;
2025
2045
  Surface* s;
2026
-
2046
+
2027
2047
  rb_scan_args(argc, argv, "45", &string, &width, &height, &depth,
2028
2048
  &pitch, &Rmask, &Gmask, &Bmask, &Amask);
2029
2049
  StringValue(string);
@@ -2046,7 +2066,7 @@ static VALUE Surface_s_from_string(int argc, VALUE* argv, VALUE self)
2046
2066
  surface = SDL_CreateRGBSurfaceFrom(pixels, w, h, d, p, r, g, b, a);
2047
2067
  if (!surface)
2048
2068
  SDL_ERROR();
2049
-
2069
+
2050
2070
  RB_GC_GUARD(string);
2051
2071
 
2052
2072
  s = ALLOC(Surface);
@@ -2115,7 +2135,7 @@ static VALUE Surface_must_lock_p(VALUE self)
2115
2135
  * Lock the surface.
2116
2136
  *
2117
2137
  * @return [nil]
2118
- *
2138
+ *
2119
2139
  * @see #unlock
2120
2140
  * @see #must_lock?
2121
2141
  */
@@ -2129,7 +2149,7 @@ static VALUE Surface_lock(VALUE self)
2129
2149
  * Unlock the surface.
2130
2150
  *
2131
2151
  * @return [nil]
2132
- *
2152
+ *
2133
2153
  * @see #lock
2134
2154
  */
2135
2155
  static VALUE Surface_unlock(VALUE self)
@@ -2139,7 +2159,7 @@ static VALUE Surface_unlock(VALUE self)
2139
2159
  }
2140
2160
 
2141
2161
  /*
2142
- * @overload pixel(x, y)
2162
+ * @overload pixel(x, y)
2143
2163
  * Get a pixel data at (**x**, **y**)
2144
2164
  *
2145
2165
  * @param x [Integer] the x coordinate
@@ -2147,7 +2167,7 @@ static VALUE Surface_unlock(VALUE self)
2147
2167
  * @return [Integer] pixel data
2148
2168
  *
2149
2169
  * @see #pixel_color
2150
- *
2170
+ *
2151
2171
  */
2152
2172
  static VALUE Surface_pixel(VALUE self, VALUE x_coord, VALUE y_coord)
2153
2173
  {
@@ -2157,7 +2177,7 @@ static VALUE Surface_pixel(VALUE self, VALUE x_coord, VALUE y_coord)
2157
2177
  int offset;
2158
2178
  Uint32 pixel = 0;
2159
2179
  int i;
2160
-
2180
+
2161
2181
  if (x < 0 || x >= surface->w || y < 0 || y >= surface->h)
2162
2182
  rb_raise(rb_eArgError, "(%d, %d) out of range for %dx%d",
2163
2183
  x, y, surface->w, surface->h);
@@ -2271,7 +2291,7 @@ static VALUE Surface_unset_color_key(VALUE self)
2271
2291
  }
2272
2292
 
2273
2293
  /*
2274
- * @overload color_key=(key)
2294
+ * @overload color_key=(key)
2275
2295
  * Set the color key of the surface
2276
2296
  *
2277
2297
  * @param key [Integer, Array<Integer>]
@@ -2288,9 +2308,9 @@ static VALUE Surface_set_color_key(VALUE self, VALUE key)
2288
2308
  SDL_Surface* surface = Get_SDL_Surface(self);
2289
2309
  if (key == Qnil)
2290
2310
  return Surface_unset_color_key(self);
2291
-
2311
+
2292
2312
  HANDLE_ERROR(SDL_SetColorKey(surface, SDL_TRUE, pixel_value(key, surface->format)));
2293
-
2313
+
2294
2314
  return key;
2295
2315
  }
2296
2316
 
@@ -2374,7 +2394,7 @@ static VALUE Surface_s_blit(VALUE self, VALUE src, VALUE srcrect, VALUE dst, VAL
2374
2394
  * @param gmask [Integer] the green mask of a pixel
2375
2395
  * @param bmask [Integer] the blue mask of a pixel
2376
2396
  * @param amask [Integer] the alpha mask of a pixel
2377
- *
2397
+ *
2378
2398
  * @return [SDL2::Surface]
2379
2399
  */
2380
2400
  static VALUE Surface_s_new(int argc, VALUE* argv, VALUE self)
@@ -2382,14 +2402,14 @@ static VALUE Surface_s_new(int argc, VALUE* argv, VALUE self)
2382
2402
  VALUE width, height, depth;
2383
2403
  Uint32 Rmask, Gmask, Bmask, Amask;
2384
2404
  SDL_Surface * surface;
2385
-
2405
+
2386
2406
  if (argc == 3) {
2387
2407
  rb_scan_args(argc, argv, "30", &width, &height, &depth);
2388
2408
  Rmask = Gmask = Bmask = Amask = 0;
2389
2409
  } else if (argc == 7) {
2390
2410
  VALUE rm, gm, bm, am;
2391
2411
  rb_scan_args(argc, argv, "70", &width, &height, &depth, &rm, &gm, &bm, &am);
2392
- Rmask = NUM2UINT(rm); Gmask = NUM2UINT(gm);
2412
+ Rmask = NUM2UINT(rm); Gmask = NUM2UINT(gm);
2393
2413
  Bmask = NUM2UINT(bm); Amask = NUM2UINT(am);
2394
2414
  } else {
2395
2415
  rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 7)", argc);
@@ -2447,23 +2467,23 @@ static VALUE Rect_s_allocate(VALUE klass)
2447
2467
  {
2448
2468
  SDL_Rect* rect = ALLOC(SDL_Rect);
2449
2469
  rect->x = rect->y = rect->w = rect->h = 0;
2450
-
2470
+
2451
2471
  return Data_Wrap_Struct(cRect, 0, free, rect);
2452
2472
  }
2453
2473
 
2454
- /*
2474
+ /*
2455
2475
  * Create a new SDL2::Rect object
2456
2476
  *
2457
2477
  * @return [SDL2::Rect]
2458
- *
2478
+ *
2459
2479
  * @overload initialze(x, y, w, h)
2460
2480
  * Create a new SDL2::Rect object
2461
- *
2481
+ *
2462
2482
  * @param x [Integer] X coordiante of the left-top point of the rectangle
2463
2483
  * @param y [Integer] Y coordiante of the left-top point of the rectangle
2464
2484
  * @param w [Integer] Width of the rectangle
2465
2485
  * @param h [Integer] Height of the rectangle
2466
- *
2486
+ *
2467
2487
  * @overload initialize
2468
2488
  * Create a new SDL2::Rect object whose x, w, w, and h are all
2469
2489
  * zero.
@@ -2506,7 +2526,7 @@ FIELD_ACCESSOR(Rect, SDL_Rect, h);
2506
2526
  * Returns the intersection rect of self and other.
2507
2527
  *
2508
2528
  * If there is no intersection, returns nil.
2509
- *
2529
+ *
2510
2530
  * @return [SDL2::Rect, nil]
2511
2531
  * @param [SDL2::Rect] other rectangle
2512
2532
  */
@@ -2534,10 +2554,10 @@ static VALUE Rect_union(VALUE self, VALUE other)
2534
2554
  return result;
2535
2555
  }
2536
2556
 
2537
- /*
2557
+ /*
2538
2558
  * Document-class: SDL2::Point
2539
2559
  *
2540
- * This class represents a point in SDL library.
2560
+ * This class represents a point in SDL library.
2541
2561
  * Some method requires this method.
2542
2562
  *
2543
2563
  * @!attribute [rw] x
@@ -2556,16 +2576,16 @@ static VALUE Point_s_allocate(VALUE klass)
2556
2576
 
2557
2577
  /*
2558
2578
  * Create a new point object.
2559
- *
2579
+ *
2560
2580
  * @overload initialize(x, y)
2561
2581
  * @param x the x coordinate of the point
2562
2582
  * @param y the y coordinate of the point
2563
- *
2583
+ *
2564
2584
  * @overload initialize
2565
2585
  * x and y of the created point object are initialized by 0
2566
2586
  *
2567
2587
  * @return [SDL2::Point]
2568
- *
2588
+ *
2569
2589
  */
2570
2590
  static VALUE Point_initialize(int argc, VALUE* argv, VALUE self)
2571
2591
  {
@@ -2609,7 +2629,7 @@ FIELD_ACCESSOR(Point, SDL_Point, y);
2609
2629
  * @overload initialze(format)
2610
2630
  *
2611
2631
  * Initialize pixel format from the given integer representing a fomrmat.
2612
- *
2632
+ *
2613
2633
  * @param format [Integer] an unsigned integer as a pixel formats
2614
2634
  */
2615
2635
  static VALUE PixelForamt_initialize(VALUE self, VALUE format)
@@ -2638,7 +2658,7 @@ define(`PIXELFORMAT_ATTR_READER',
2638
2658
 
2639
2659
  /*
2640
2660
  * Get the human readable name of the pixel format
2641
- *
2661
+ *
2642
2662
  * @return [String]
2643
2663
  */
2644
2664
  PIXELFORMAT_ATTR_READER(name, SDL_GetPixelFormatName, utf8str_new_cstr);
@@ -2687,7 +2707,7 @@ PIXELFORMAT_ATTR_READER(alpha_p, SDL_ISPIXELFORMAT_ALPHA, INT2BOOL);
2687
2707
  */
2688
2708
  PIXELFORMAT_ATTR_READER(fourcc_p, SDL_ISPIXELFORMAT_FOURCC, INT2BOOL);
2689
2709
 
2690
- /*
2710
+ /*
2691
2711
  * @overload ==(other)
2692
2712
  * Return true if two pixel format is the same format.
2693
2713
  *
@@ -2763,15 +2783,15 @@ static VALUE ScreenSaver_enabled_p(VALUE self)
2763
2783
  define(`DEFINE_C_ACCESSOR',`rb_define_method($2, "$3", $1_$3, 0);
2764
2784
  rb_define_method($2, "$3=", $1_set_$3, 1)')
2765
2785
  */
2766
-
2786
+
2767
2787
  void rubysdl2_init_video(void)
2768
2788
  {
2769
2789
  rb_define_module_function(mSDL2, "video_drivers", SDL2_s_video_drivers, 0);
2770
2790
  rb_define_module_function(mSDL2, "current_video_driver", SDL2_s_current_video_driver, 0);
2771
2791
  rb_define_module_function(mSDL2, "video_init", SDL2_s_video_init, 1);
2772
-
2792
+
2773
2793
  cWindow = rb_define_class_under(mSDL2, "Window", rb_cObject);
2774
-
2794
+
2775
2795
  rb_undef_alloc_func(cWindow);
2776
2796
  rb_define_singleton_method(cWindow, "create", Window_s_create, 6);
2777
2797
  rb_define_singleton_method(cWindow, "all_windows", Window_s_all_windows, 0);
@@ -2817,11 +2837,11 @@ void rubysdl2_init_video(void)
2817
2837
 
2818
2838
  mWindowFlags = rb_define_module_under(cWindow, "Flags");
2819
2839
  /* define(`DEFINE_WINDOW_FLAGS_CONST',`rb_define_const(mWindowFlags, "$1", UINT2NUM(SDL_WINDOW_$1))') */
2820
- /* fullscreen window */
2840
+ /* fullscreen window */
2821
2841
  DEFINE_WINDOW_FLAGS_CONST(FULLSCREEN);
2822
2842
  /* fullscreen window at the current desktop resolution */
2823
2843
  DEFINE_WINDOW_FLAGS_CONST(FULLSCREEN_DESKTOP);
2824
- /* window usable with OpenGL context */
2844
+ /* window usable with OpenGL context */
2825
2845
  DEFINE_WINDOW_FLAGS_CONST(OPENGL);
2826
2846
  /* window is visible */
2827
2847
  DEFINE_WINDOW_FLAGS_CONST(SHOWN);
@@ -2829,7 +2849,7 @@ void rubysdl2_init_video(void)
2829
2849
  DEFINE_WINDOW_FLAGS_CONST(HIDDEN);
2830
2850
  /* no window decoration */
2831
2851
  DEFINE_WINDOW_FLAGS_CONST(BORDERLESS);
2832
- /* window is resizable */
2852
+ /* window is resizable */
2833
2853
  DEFINE_WINDOW_FLAGS_CONST(RESIZABLE);
2834
2854
  /* window is minimized */
2835
2855
  DEFINE_WINDOW_FLAGS_CONST(MINIMIZED);
@@ -2853,17 +2873,17 @@ void rubysdl2_init_video(void)
2853
2873
  #endif
2854
2874
 
2855
2875
  cDisplay = rb_define_class_under(mSDL2, "Display", rb_cObject);
2856
-
2876
+
2857
2877
  rb_define_module_function(cDisplay, "displays", Display_s_displays, 0);
2858
2878
  rb_define_attr(cDisplay, "index", 1, 0);
2859
2879
  rb_define_attr(cDisplay, "name", 1, 0);
2860
- rb_define_method(cDisplay, "modes", Display_modes, 0);
2880
+ rb_define_method(cDisplay, "modes", Display_modes, 0);
2861
2881
  rb_define_method(cDisplay, "current_mode", Display_current_mode, 0);
2862
2882
  rb_define_method(cDisplay, "desktop_mode", Display_desktop_mode, 0);
2863
2883
  rb_define_method(cDisplay, "closest_mode", Display_closest_mode, 1);
2864
2884
  rb_define_method(cDisplay, "bounds", Display_bounds, 0);
2865
2885
 
2866
-
2886
+
2867
2887
  cDisplayMode = rb_define_class_under(cDisplay, "Mode", rb_cObject);
2868
2888
 
2869
2889
  rb_define_alloc_func(cDisplayMode, DisplayMode_s_allocate);
@@ -2873,10 +2893,10 @@ void rubysdl2_init_video(void)
2873
2893
  rb_define_method(cDisplayMode, "w", DisplayMode_w, 0);
2874
2894
  rb_define_method(cDisplayMode, "h", DisplayMode_h, 0);
2875
2895
  rb_define_method(cDisplayMode, "refresh_rate", DisplayMode_refresh_rate, 0);
2876
-
2877
-
2896
+
2897
+
2878
2898
  cRenderer = rb_define_class_under(mSDL2, "Renderer", rb_cObject);
2879
-
2899
+
2880
2900
  rb_undef_alloc_func(cRenderer);
2881
2901
  rb_define_singleton_method(cRenderer, "drivers_info", Renderer_s_drivers_info, 0);
2882
2902
  rb_define_method(cRenderer, "destroy?", Renderer_destroy_p, 0);
@@ -2912,11 +2932,11 @@ void rubysdl2_init_video(void)
2912
2932
  rb_define_method(cRenderer, "render_target", Renderer_render_target, 0);
2913
2933
  rb_define_method(cRenderer, "render_target=", Renderer_set_render_target, 1);
2914
2934
  rb_define_method(cRenderer, "reset_render_target", Renderer_reset_render_target, 0);
2915
-
2935
+
2916
2936
  rb_define_method(cRenderer, "info", Renderer_info, 0);
2917
2937
 
2918
2938
  mRendererFlags = rb_define_module_under(cRenderer, "Flags");
2919
-
2939
+
2920
2940
  /* define(`DEFINE_RENDERER_FLAGS_CONST',`rb_define_const(mRendererFlags, "$1", UINT2NUM(SDL_RENDERER_$1))') */
2921
2941
  /* the renderer is a software fallback */
2922
2942
  DEFINE_RENDERER_FLAGS_CONST(SOFTWARE);
@@ -2926,7 +2946,7 @@ void rubysdl2_init_video(void)
2926
2946
  /* present is synchronized with the refresh rate */
2927
2947
  DEFINE_RENDERER_FLAGS_CONST(PRESENTVSYNC);
2928
2948
  #endif
2929
- /* the renderer supports rendering to texture */
2949
+ /* the renderer supports rendering to texture */
2930
2950
  DEFINE_RENDERER_FLAGS_CONST(TARGETTEXTURE);
2931
2951
  /* define(`DEFINE_SDL_FLIP_CONST',`rb_define_const(cRenderer, "FLIP_$1", INT2FIX(SDL_FLIP_$1))') */
2932
2952
  /* Do not flip, used in {Renderer#copy_ex} */
@@ -2935,7 +2955,7 @@ void rubysdl2_init_video(void)
2935
2955
  DEFINE_SDL_FLIP_CONST(HORIZONTAL);
2936
2956
  /* Flip vertically, used in {Renderer#copy_ex} */
2937
2957
  DEFINE_SDL_FLIP_CONST(VERTICAL);
2938
-
2958
+
2939
2959
  mBlendMode = rb_define_module_under(mSDL2, "BlendMode");
2940
2960
  /* define(`DEFINE_BLENDMODE_CONST',`rb_define_const(mBlendMode, "$1", INT2FIX(SDL_BLENDMODE_$1))') */
2941
2961
  /* no blending (dstRGBA = srcRGBA) */
@@ -2946,9 +2966,9 @@ void rubysdl2_init_video(void)
2946
2966
  DEFINE_BLENDMODE_CONST(ADD);
2947
2967
  /* color modulate (multiplicative) (dstRGB = srcRGB * dstRGB, dstA = dstA) */
2948
2968
  DEFINE_BLENDMODE_CONST(MOD);
2949
-
2969
+
2950
2970
  cTexture = rb_define_class_under(mSDL2, "Texture", rb_cObject);
2951
-
2971
+
2952
2972
  rb_undef_alloc_func(cTexture);
2953
2973
  rb_define_method(cTexture, "destroy?", Texture_destroy_p, 0);
2954
2974
  rb_define_method(cTexture, "destroy", Texture_destroy, 0);
@@ -2969,11 +2989,12 @@ void rubysdl2_init_video(void)
2969
2989
  /* texture access pattern - can be used as a render target */
2970
2990
  DEFINE_TEXTUREAH_ACCESS_CONST(TARGET);
2971
2991
 
2972
-
2992
+
2973
2993
  cSurface = rb_define_class_under(mSDL2, "Surface", rb_cObject);
2974
-
2994
+
2975
2995
  rb_undef_alloc_func(cSurface);
2976
2996
  rb_define_singleton_method(cSurface, "load_bmp", Surface_s_load_bmp, 1);
2997
+ rb_define_singleton_method(cSurface, "save_bmp", Surface_s_save_bmp, 2);
2977
2998
  rb_define_singleton_method(cSurface, "blit", Surface_s_blit, 4);
2978
2999
  rb_define_singleton_method(cSurface, "new", Surface_s_new, -1);
2979
3000
  rb_define_singleton_method(cSurface, "from_string", Surface_s_from_string, -1);
@@ -2994,7 +3015,7 @@ void rubysdl2_init_video(void)
2994
3015
  rb_define_method(cSurface, "pitch", Surface_pitch, 0);
2995
3016
  rb_define_method(cSurface, "bits_per_pixel", Surface_bits_per_pixel, 0);
2996
3017
  rb_define_method(cSurface, "bytes_per_pixel", Surface_bytes_per_pixel, 0);
2997
-
3018
+
2998
3019
  cRect = rb_define_class_under(mSDL2, "Rect", rb_cObject);
2999
3020
 
3000
3021
  rb_define_alloc_func(cRect, Rect_s_allocate);
@@ -3007,7 +3028,7 @@ void rubysdl2_init_video(void)
3007
3028
  DEFINE_C_ACCESSOR(Rect, cRect, h);
3008
3029
  rb_define_method(cRect, "union", Rect_union, 1);
3009
3030
  rb_define_method(cRect, "intersection", Rect_intersection, 1);
3010
-
3031
+
3011
3032
  cPoint = rb_define_class_under(mSDL2, "Point", rb_cObject);
3012
3033
 
3013
3034
  rb_define_alloc_func(cPoint, Point_s_allocate);
@@ -3017,14 +3038,14 @@ void rubysdl2_init_video(void)
3017
3038
  DEFINE_C_ACCESSOR(Point, cPoint, x);
3018
3039
  DEFINE_C_ACCESSOR(Point, cPoint, y);
3019
3040
 
3020
-
3041
+
3021
3042
  cRendererInfo = rb_define_class_under(cRenderer, "Info", rb_cObject);
3022
3043
  define_attr_readers(cRendererInfo, "name", "flags", "texture_formats",
3023
3044
  "max_texture_width", "max_texture_height", NULL);
3024
-
3025
-
3045
+
3046
+
3026
3047
  cPixelFormat = rb_define_class_under(mSDL2, "PixelFormat", rb_cObject);
3027
-
3048
+
3028
3049
  rb_define_method(cPixelFormat, "initialize", PixelForamt_initialize, 1);
3029
3050
  rb_define_attr(cPixelFormat, "format", 1, 0);
3030
3051
  rb_define_method(cPixelFormat, "name", PixelFormat_name, 0);
@@ -3059,7 +3080,7 @@ void rubysdl2_init_video(void)
3059
3080
  rb_define_const(mBitmapOrder, "NONE", UINT2NUM(SDL_BITMAPORDER_NONE));
3060
3081
  rb_define_const(mBitmapOrder, "O_1234", UINT2NUM(SDL_BITMAPORDER_1234));
3061
3082
  rb_define_const(mBitmapOrder, "O_4321", UINT2NUM(SDL_BITMAPORDER_4321));
3062
-
3083
+
3063
3084
  mPackedOrder = rb_define_module_under(cPixelFormat, "PackedOrder");
3064
3085
  /* define(`DEFINE_PACKEDORDER_CONST',`rb_define_const(mPackedOrder, "$1", UINT2NUM(SDL_PACKEDORDER_$1))') */
3065
3086
  DEFINE_PACKEDORDER_CONST(NONE);
@@ -3093,7 +3114,7 @@ void rubysdl2_init_video(void)
3093
3114
  DEFINE_PACKEDLAYOUT_CONST(8888);
3094
3115
  DEFINE_PACKEDLAYOUT_CONST(2101010);
3095
3116
  DEFINE_PACKEDLAYOUT_CONST(1010102);
3096
-
3117
+
3097
3118
  {
3098
3119
  VALUE formats = rb_ary_new();
3099
3120
  /* -: Array of all available formats */
@@ -3105,7 +3126,7 @@ void rubysdl2_init_video(void)
3105
3126
  rb_ary_push(formats, format);
3106
3127
  } while (0)')
3107
3128
  */
3108
-
3129
+
3109
3130
  DEFINE_PIXELFORMAT_CONST(UNKNOWN, /* -: PixelFormat: Unused - reserved by SDL */);
3110
3131
  DEFINE_PIXELFORMAT_CONST(INDEX1LSB);
3111
3132
  DEFINE_PIXELFORMAT_CONST(INDEX1MSB);
@@ -3149,12 +3170,12 @@ void rubysdl2_init_video(void)
3149
3170
  rb_define_module_function(mScreenSaver, "enable", ScreenSaver_enable, 0);
3150
3171
  rb_define_module_function(mScreenSaver, "disable", ScreenSaver_disable, 0);
3151
3172
  rb_define_module_function(mScreenSaver, "enabled?", ScreenSaver_enabled_p, 0);
3152
-
3153
-
3173
+
3174
+
3154
3175
  rb_gc_register_address(&hash_windowid_to_window);
3155
3176
  hash_windowid_to_window = rb_hash_new();
3156
3177
  }
3157
-
3178
+
3158
3179
  #ifdef HAVE_SDL_IMAGE_H
3159
3180
  #include <SDL_image.h>
3160
3181
 
@@ -3165,15 +3186,15 @@ static VALUE mIMG;
3165
3186
  *
3166
3187
  * This module provides the interface to SDL_image. You can load
3167
3188
  * many kinds of image files using this modules.
3168
- *
3189
+ *
3169
3190
  * This module provides only initialization interface {SDL2::IMG.init}.
3170
3191
  * After calling init, you can load image files using {SDL2::Surface.load}.
3171
3192
  */
3172
3193
 
3173
3194
  /*
3174
3195
  * @overload init(flags)
3175
- * Initialize SDL_image.
3176
- *
3196
+ * Initialize SDL_image.
3197
+ *
3177
3198
  * You can specify the supporting image formats by bitwise OR'd of the
3178
3199
  * following constants.
3179
3200
  *
@@ -3185,7 +3206,7 @@ static VALUE mIMG;
3185
3206
  * You need to initialize SDL_image to check whether specified format
3186
3207
  * is supported by your environment. If your environment does not
3187
3208
  * support required support format, you have a {SDL2::Error} exception.
3188
- *
3209
+ *
3189
3210
  * @param [Integer] flags submodule bits
3190
3211
  * @return [nil]
3191
3212
  *
@@ -3194,18 +3215,18 @@ static VALUE mIMG;
3194
3215
  static VALUE IMG_s_init(VALUE self, VALUE f)
3195
3216
  {
3196
3217
  int flags = NUM2INT(f);
3197
- if (IMG_Init(flags) & flags != flags)
3218
+ if ((IMG_Init(flags) & flags) != flags)
3198
3219
  rb_raise(eSDL2Error, "Couldn't initialze SDL_image");
3199
3220
  return Qnil;
3200
3221
  }
3201
3222
 
3202
3223
  /*
3203
- * @overload load(file)
3224
+ * @overload load(file)
3204
3225
  * Load file and create a new {SDL2::Surface}.
3205
3226
  *
3206
3227
  * This method uses SDL_image. SDL_image supports following formats:
3207
3228
  * BMP, CUR, GIF, ICO, JPG, LBP, PCX, PNG, PNM, TGA, TIF, XCF, XPM, and XV.
3208
- *
3229
+ *
3209
3230
  * @param [String] file the image file name to load a surface from
3210
3231
  * @return [SDL2::Surface] Created surface
3211
3232
  *
@@ -3219,7 +3240,7 @@ static VALUE Surface_s_load(VALUE self, VALUE fname)
3219
3240
  {
3220
3241
  SDL_Surface* surface = IMG_Load(StringValueCStr(fname));
3221
3242
  if (!surface) {
3222
- SDL_SetError(IMG_GetError());
3243
+ SDL_SetError("%s", IMG_GetError());
3223
3244
  SDL_ERROR();
3224
3245
  }
3225
3246
  return Surface_new(surface);
@@ -3246,7 +3267,7 @@ static VALUE Renderer_load_texture(VALUE self, VALUE fname)
3246
3267
  {
3247
3268
  SDL_Texture* texture = IMG_LoadTexture(Get_SDL_Renderer(self), StringValueCStr(fname));
3248
3269
  if (!texture) {
3249
- SDL_SetError(IMG_GetError());
3270
+ SDL_SetError("%s", IMG_GetError());
3250
3271
  SDL_ERROR();
3251
3272
  }
3252
3273
  return Texture_new(texture, Get_Renderer(self));
@@ -3259,7 +3280,7 @@ void rubysdl2_init_image(void)
3259
3280
 
3260
3281
  rb_define_singleton_method(cSurface, "load", Surface_s_load, 1);
3261
3282
  rb_define_method(cRenderer, "load_texture", Renderer_load_texture, 1);
3262
-
3283
+
3263
3284
 
3264
3285
  /* Initialize the JPEG loader */
3265
3286
  rb_define_const(mIMG, "INIT_JPG", INT2NUM(IMG_INIT_JPG));