rubygame 2.5.3 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/CREDITS +6 -4
  2. data/NEWS +79 -0
  3. data/README +55 -72
  4. data/ROADMAP +20 -13
  5. data/doc/custom_sdl_load_paths.rdoc +79 -0
  6. data/doc/getting_started.rdoc +65 -36
  7. data/doc/keyboard_symbols.rdoc +243 -0
  8. data/doc/macosx_install.rdoc +49 -35
  9. data/doc/windows_install.rdoc +36 -108
  10. data/lib/rubygame.rb +62 -24
  11. data/lib/rubygame/audio.rb +147 -0
  12. data/lib/rubygame/clock.rb +164 -1
  13. data/lib/rubygame/color.rb +40 -7
  14. data/lib/rubygame/color/models/hsl.rb +1 -1
  15. data/lib/rubygame/color/models/hsv.rb +1 -1
  16. data/lib/rubygame/color/models/rgb.rb +1 -1
  17. data/lib/rubygame/color/palettes/css.rb +1 -3
  18. data/lib/rubygame/color/palettes/x11.rb +1 -2
  19. data/lib/rubygame/constants.rb +297 -0
  20. data/lib/rubygame/deprecated_mixer.rb +555 -0
  21. data/lib/rubygame/event.rb +122 -6
  22. data/lib/rubygame/event_handler.rb +3 -1
  23. data/lib/rubygame/event_hook.rb +6 -2
  24. data/lib/rubygame/event_triggers.rb +1 -1
  25. data/lib/rubygame/events.rb +416 -1
  26. data/lib/rubygame/ftor.rb +1 -7
  27. data/lib/rubygame/gfx.rb +583 -0
  28. data/lib/rubygame/gl.rb +107 -0
  29. data/lib/rubygame/image.rb +140 -0
  30. data/lib/rubygame/joystick.rb +184 -0
  31. data/lib/rubygame/main.rb +82 -0
  32. data/lib/rubygame/mediabag.rb +1 -1
  33. data/lib/rubygame/mixer.rb +30 -0
  34. data/lib/rubygame/music.rb +493 -0
  35. data/lib/rubygame/queue.rb +3 -1
  36. data/lib/rubygame/rect.rb +9 -9
  37. data/lib/rubygame/screen.rb +357 -0
  38. data/lib/rubygame/shared.rb +40 -4
  39. data/lib/rubygame/sound.rb +428 -0
  40. data/lib/rubygame/surface.rb +626 -0
  41. data/lib/rubygame/ttf.rb +311 -0
  42. data/samples/FreeSans.ttf +0 -0
  43. data/samples/README +6 -5
  44. data/samples/demo_draw.rb +1 -1
  45. data/samples/demo_gl.rb +3 -1
  46. data/samples/demo_gl_tex.rb +4 -2
  47. data/samples/demo_rubygame.rb +114 -105
  48. data/samples/demo_sfont.rb +1 -1
  49. data/samples/demo_ttf.rb +3 -1
  50. data/samples/demo_utf8.rb +1 -1
  51. data/samples/image_viewer.rb +118 -0
  52. data/samples/load_and_blit.rb +1 -1
  53. data/samples/rubygame.png +0 -0
  54. metadata +34 -40
  55. data/Rakefile +0 -537
  56. data/doc/extended_readme.rdoc +0 -49
  57. data/ext/body/rubygame_body.so +0 -0
  58. data/ext/rubygame/rubygame_clock.c +0 -301
  59. data/ext/rubygame/rubygame_clock.h +0 -32
  60. data/ext/rubygame/rubygame_event.c +0 -760
  61. data/ext/rubygame/rubygame_event.h +0 -48
  62. data/ext/rubygame/rubygame_event2.c +0 -661
  63. data/ext/rubygame/rubygame_event2.h +0 -29
  64. data/ext/rubygame/rubygame_gfx.c +0 -942
  65. data/ext/rubygame/rubygame_gfx.h +0 -101
  66. data/ext/rubygame/rubygame_gl.c +0 -154
  67. data/ext/rubygame/rubygame_gl.h +0 -32
  68. data/ext/rubygame/rubygame_image.c +0 -252
  69. data/ext/rubygame/rubygame_image.h +0 -41
  70. data/ext/rubygame/rubygame_joystick.c +0 -336
  71. data/ext/rubygame/rubygame_joystick.h +0 -41
  72. data/ext/rubygame/rubygame_main.c +0 -158
  73. data/ext/rubygame/rubygame_main.h +0 -36
  74. data/ext/rubygame/rubygame_mixer.c +0 -1024
  75. data/ext/rubygame/rubygame_mixer.h +0 -36
  76. data/ext/rubygame/rubygame_music.c +0 -1017
  77. data/ext/rubygame/rubygame_music.h +0 -29
  78. data/ext/rubygame/rubygame_screen.c +0 -572
  79. data/ext/rubygame/rubygame_screen.h +0 -45
  80. data/ext/rubygame/rubygame_shared.c +0 -269
  81. data/ext/rubygame/rubygame_shared.h +0 -69
  82. data/ext/rubygame/rubygame_sound.c +0 -863
  83. data/ext/rubygame/rubygame_sound.h +0 -29
  84. data/ext/rubygame/rubygame_surface.c +0 -1153
  85. data/ext/rubygame/rubygame_surface.h +0 -62
  86. data/ext/rubygame/rubygame_ttf.c +0 -599
  87. data/ext/rubygame/rubygame_ttf.h +0 -69
  88. data/samples/keys.rb +0 -52
@@ -18,13 +18,6 @@
18
18
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
19
  #++
20
20
 
21
- require "rubygame"
22
-
23
- #--
24
- # Ftor is DEPRECATED and will be removed in Rubygame 3.0!
25
- # Warn the user when this file is loaded.
26
- #++
27
- Rubygame.deprecated("Rubygame::Ftor", "3.0")
28
21
 
29
22
 
30
23
  module Rubygame
@@ -87,6 +80,7 @@ class Ftor
87
80
  # Create a new Ftor by specifying its x and y components. See also #new_am
88
81
  # and #new_from_to.
89
82
  def initialize(x,y)
83
+ Rubygame.deprecated("Rubygame::Ftor", "3.0")
90
84
  @x, @y = x, y
91
85
  end
92
86
 
@@ -0,0 +1,583 @@
1
+ #--
2
+ # Rubygame -- Ruby code and bindings to SDL to facilitate game creation
3
+ # Copyright (C) 2004-2009 John Croisant
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ #++
19
+
20
+
21
+
22
+ require "ruby-sdl-ffi/gfx"
23
+
24
+ # SDL_gfx has no function to get the version number.
25
+ Rubygame::VERSIONS[:sdl_gfx] = [0, 0, 0]
26
+
27
+
28
+ class Rubygame::Surface
29
+
30
+
31
+ def _draw_line(pt1, pt2, color, smooth) # :nodoc:
32
+ x1, y1 = pt1.to_a.collect{|n| n.round}
33
+ x2, y2 = pt2.to_a.collect{|n| n.round}
34
+
35
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
36
+
37
+ if( y1 == y2 )
38
+ SDL::Gfx.hlineRGBA(@struct, x1, x2, y1, r,g,b,a)
39
+ elsif( x1 == x2 )
40
+ SDL::Gfx.vlineRGBA(@struct, x1, y1, y2, r,g,b,a)
41
+ else
42
+ if smooth
43
+ SDL::Gfx.aalineRGBA(@struct, x1, y1, x2, y2, r,g,b,a)
44
+ else
45
+ SDL::Gfx.lineRGBA(@struct, x1, y1, x2, y2, r,g,b,a)
46
+ end
47
+ end
48
+ end
49
+
50
+ private :_draw_line
51
+
52
+
53
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
54
+ # Your code should check "surface.respond_to?(:draw_line)" to see if
55
+ # you can use this method, or be prepared to rescue from NameError.
56
+ #
57
+ # Draw a line segment between two points on the Surface.
58
+ # See also #draw_line_a
59
+ #
60
+ # This method takes these arguments:
61
+ # point1:: the coordinates of one end of the line, [x1,y1].
62
+ # point2:: the coordinates of the other end of the line, [x2,y2].
63
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
64
+ # color name, or Rubygame::Color.
65
+ #
66
+ def draw_line( point1, point2, color )
67
+ _draw_line( point1, point2, color, false )
68
+ return self
69
+ end
70
+
71
+
72
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
73
+ # Your code should check "surface.respond_to?(:draw_line_a)" to see if
74
+ # you can use this method, or be prepared to rescue from NameError.
75
+ #
76
+ # Like #draw_line, but the line will be anti-aliased.
77
+ #
78
+ def draw_line_a( point1, point2, color )
79
+ _draw_line( point1, point2, color, true )
80
+ return self
81
+ end
82
+
83
+
84
+
85
+ def _draw_box(pt1, pt2, color, solid) # :nodoc:
86
+ x1, y1 = pt1.to_a.collect{|n| n.round}
87
+ x2, y2 = pt2.to_a.collect{|n| n.round}
88
+
89
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
90
+
91
+ if solid
92
+ SDL::Gfx.boxRGBA(@struct, x1, y1, x2, y2, r,g,b,a)
93
+ else
94
+ SDL::Gfx.rectangleRGBA(@struct, x1, y1, x2, y2, r,g,b,a)
95
+ end
96
+ end
97
+
98
+ private :_draw_box
99
+
100
+
101
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
102
+ # Your code should check "surface.respond_to?(:draw_box)" to see if
103
+ # you can use this method, or be prepared to rescue from NameError.
104
+ #
105
+ # Draw a non-solid box (rectangle) on the Surface, given the
106
+ # coordinates of its top-left corner and bottom-right corner. See
107
+ # also #draw_box_s
108
+ #
109
+ # This method takes these arguments:
110
+ # point1:: the coordinates of top-left corner, [x1,y1].
111
+ # point2:: the coordinates of bottom-right corner, [x2,y2].
112
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
113
+ # color name, or Rubygame::Color.
114
+ #
115
+ def draw_box( point1, point2, color )
116
+ _draw_box( point1, point2, color, false )
117
+ return self
118
+ end
119
+
120
+
121
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
122
+ # Your code should check "surface.respond_to?(:draw_box_s)" to see
123
+ # if you can use this method, or be prepared to rescue from
124
+ # NameError.
125
+ #
126
+ # Like #draw_box, but the shape is solid, instead of an outline.
127
+ # (You may find using #fill to be more convenient and perhaps faster
128
+ # than this method.)
129
+ #
130
+ def draw_box_s( point1, point2, color )
131
+ _draw_box( point1, point2, color, true )
132
+ return self
133
+ end
134
+
135
+
136
+
137
+ def _draw_circle(center, radius, color, smooth, solid) # :nodoc:
138
+ x, y = center.to_a.collect{|n| n.round}
139
+ radius = radius.to_i
140
+
141
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
142
+
143
+ if solid
144
+ SDL::Gfx.filledCircleRGBA(@struct, x, y, radius, r,g,b,a)
145
+ elsif smooth
146
+ SDL::Gfx.aacircleRGBA(@struct, x, y, radius, r,g,b,a)
147
+ else
148
+ SDL::Gfx.circleRGBA(@struct, x, y, radius, r,g,b,a)
149
+ end
150
+ end
151
+
152
+ private :_draw_circle
153
+
154
+
155
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
156
+ # Your code should check "surface.respond_to?(:draw_circle)" to see
157
+ # if you can use this method, or be prepared to rescue from
158
+ # NameError.
159
+ #
160
+ # Draw a non-solid circle on the Surface, given the coordinates of its
161
+ # center and its radius. See also #draw_circle_a and #draw_circle_s
162
+ #
163
+ # This method takes these arguments:
164
+ # center:: the coordinates of circle's center, [x,y].
165
+ # radius:: the radius (pixels) of the circle.
166
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
167
+ # color name, or Rubygame::Color.
168
+ #
169
+ def draw_circle( center, radius, color )
170
+ _draw_circle( center, radius, color, false, false )
171
+ return self
172
+ end
173
+
174
+
175
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
176
+ # Your code should check "surface.respond_to?(:draw_circle_a)" to see if
177
+ # you can use this method, or be prepared to rescue from NameError.
178
+ #
179
+ # Like #draw_circle, but the outline is anti-aliased.
180
+ #
181
+ def draw_circle_a( center, radius, color )
182
+ _draw_circle( center, radius, color, true, false )
183
+ return self
184
+ end
185
+
186
+
187
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
188
+ # Your code should check "surface.respond_to?(:draw_circle_s)" to
189
+ # see if you can use this method, or be prepared to rescue from
190
+ # NameError.
191
+ #
192
+ # Like #draw_circle, but the shape is solid, instead of an outline.
193
+ #
194
+ def draw_circle_s( center, radius, color )
195
+ _draw_circle( center, radius, color, false, true )
196
+ return self
197
+ end
198
+
199
+
200
+
201
+ def _draw_ellipse(center, radii, color, smooth, solid) # :nodoc:
202
+ x, y = center.to_a.collect{|n| n.round}
203
+ radx, rady = radii.to_a.collect{|n| n.round}
204
+
205
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
206
+
207
+ if solid
208
+ SDL::Gfx.filledEllipseRGBA(@struct, x, y, radx, rady, r,g,b,a)
209
+ elsif smooth
210
+ SDL::Gfx.aaellipseRGBA(@struct, x, y, radx, rady, r,g,b,a)
211
+ else
212
+ SDL::Gfx.ellipseRGBA(@struct, x, y, radx, rady, r,g,b,a)
213
+ end
214
+ end
215
+
216
+ private :_draw_ellipse
217
+
218
+
219
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
220
+ # Your code should check "surface.respond_to?(:draw_ellipse)" to see
221
+ # if you can use this method, or be prepared to rescue from
222
+ # NameError.
223
+ #
224
+ # Draw a non-solid ellipse (oval) on the Surface, given the
225
+ # coordinates of its center and its horizontal and vertical radii.
226
+ # See also #draw_ellipse_a and #draw_ellipse_s
227
+ #
228
+ # This method takes these arguments:
229
+ # center:: the coordinates of ellipse's center, [x,y].
230
+ # radii:: the x and y radii (pixels), [rx,ry].
231
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
232
+ # color name, or Rubygame::Color.
233
+ #
234
+ def draw_ellipse( center, radii, color )
235
+ _draw_ellipse( center, radii, color, false, false )
236
+ return self
237
+ end
238
+
239
+
240
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
241
+ # Your code should check "surface.respond_to?(:draw_ellipse_a)" to see if
242
+ # you can use this method, or be prepared to rescue from NameError.
243
+ #
244
+ # Like #draw_ellipse, but the ellipse border is anti-aliased.
245
+ #
246
+ def draw_ellipse_a( center, radii, color )
247
+ _draw_ellipse( center, radii, color, true, false )
248
+ return self
249
+ end
250
+
251
+
252
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
253
+ # Your code should check "surface.respond_to?(:draw_ellipse_s)" to
254
+ # see if you can use this method, or be prepared to rescue from
255
+ # NameError.
256
+ #
257
+ # Like #draw_ellipse, but the shape is solid, instead of an outline.
258
+ #
259
+ def draw_ellipse_s( center, radii, color )
260
+ _draw_ellipse( center, radii, color, false, true )
261
+ return self
262
+ end
263
+
264
+
265
+
266
+ def _draw_arc(center, radius, angles, color, solid) # :nodoc:
267
+ x, y = center.to_a.collect{|n| n.round}
268
+ radius = radius.round
269
+ ang1, ang2 = angles.to_a.collect{|n| n.round}
270
+
271
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
272
+
273
+ if solid
274
+ SDL::Gfx.filledPieRGBA(@struct, x, y, radius, ang1, ang2, r,g,b,a)
275
+ else
276
+ SDL::Gfx.pieRGBA(@struct, x, y, radius, ang1, ang2, r,g,b,a)
277
+ end
278
+ end
279
+
280
+ private :_draw_arc
281
+
282
+
283
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
284
+ # Your code should check "surface.respond_to?(:draw_arc)" to see if
285
+ # you can use this method, or be prepared to rescue from NameError.
286
+ #
287
+ # Draw a non-solid arc (part of a circle), given the coordinates of
288
+ # its center, radius, and starting/ending angles.
289
+ # See also #draw_arc_s
290
+ #
291
+ # This method takes these arguments:
292
+ # center:: the coordinates of circle's center, [x,y].
293
+ # radius:: the radius (pixels) of the circle.
294
+ # angles:: the start and end angles (in degrees) of the arc, [start,end].
295
+ # Angles are given *CLOCKWISE* from the positive x
296
+ # (remember that the positive Y direction is down, rather than up).
297
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
298
+ # color name, or Rubygame::Color.
299
+ #
300
+ def draw_arc( center, radius, angles, color )
301
+ _draw_arc( center, radius, angles, color, false )
302
+ return self
303
+ end
304
+
305
+
306
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
307
+ # Your code should check "surface.respond_to?(:draw_arc_s)" to see
308
+ # if you can use this method, or be prepared to rescue from
309
+ # NameError.
310
+ #
311
+ # Like #draw_arc, but the shape is solid, instead of an outline.
312
+ #
313
+ def draw_arc_s( center, radius, angles, color )
314
+ _draw_arc( center, radius, angles, color, true )
315
+ return self
316
+ end
317
+
318
+
319
+
320
+ def _draw_polygon(points, color, smooth, solid) # :nodoc:
321
+
322
+ len = points.length
323
+ xpts = FFI::Buffer.new(:int16, len)
324
+ ypts = FFI::Buffer.new(:int16, len)
325
+
326
+ points.each_with_index { |point, i|
327
+ xpts[i].put_int16( 0, point[0].round )
328
+ ypts[i].put_int16( 0, point[1].round )
329
+ }
330
+
331
+ r,g,b,a = Rubygame::Color.make_sdl_rgba( color )
332
+
333
+ if solid
334
+ SDL::Gfx.filledPolygonRGBA(@struct, xpts, ypts, len, r,g,b,a)
335
+ elsif smooth
336
+ SDL::Gfx.aapolygonRGBA(@struct, xpts, ypts, len, r,g,b,a)
337
+ else
338
+ SDL::Gfx.polygonRGBA(@struct, xpts, ypts, len, r,g,b,a)
339
+ end
340
+ end
341
+
342
+ private :_draw_polygon
343
+
344
+
345
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
346
+ # Your code should check "surface.respond_to?(:draw_polygon)" to see
347
+ # if you can use this method, or be prepared to rescue from
348
+ # NameError.
349
+ #
350
+ # Draw a non-solid polygon, given the coordinates of its vertices, in the
351
+ # order that they are connected. This is essentially a series of connected
352
+ # dots. See also #draw_polygon_a and #draw_polygon_s.
353
+ #
354
+ # This method takes these arguments:
355
+ # points:: an Array containing the coordinate pairs for each vertex of the
356
+ # polygon, in the order that they are connected, e.g.
357
+ # [ [x1,y1], [x2,y2], ..., [xn,yn] ].
358
+ # color:: the color of the shape. [r,g,b] or [r,g,b,a] (0-255),
359
+ # color name, or Rubygame::Color.
360
+ #
361
+ def draw_polygon( points, color )
362
+ _draw_polygon( points, color, false, false )
363
+ return self
364
+ end
365
+
366
+
367
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
368
+ # Your code should check "surface.respond_to?(:draw_polygon_a)" to
369
+ # see if you can use this method, or be prepared to rescue from
370
+ # NameError.
371
+ #
372
+ # Like #draw_polygon, but the lines are anti-aliased.
373
+ #
374
+ def draw_polygon_a( points, color )
375
+ _draw_polygon( points, color, true, false )
376
+ return self
377
+ end
378
+
379
+
380
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
381
+ # Your code should check "surface.respond_to?(:draw_polygon_s)" to
382
+ # see if you can use this method, or be prepared to rescue from
383
+ # NameError.
384
+ #
385
+ # Like #draw_polygon, but the shape is solid, instead of an outline.
386
+ #
387
+ def draw_polygon_s( points, color )
388
+ _draw_polygon( points, color, false, true )
389
+ return self
390
+ end
391
+
392
+
393
+
394
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
395
+ # Your code should check "surface.respond_to?(:rotozoom)" to see if
396
+ # you can use this method, or be prepared to rescue from NameError.
397
+ #
398
+ # Return a rotated and/or zoomed version of the given surface. Note
399
+ # that rotating a Surface anything other than a multiple of 90
400
+ # degrees will cause the new surface to be larger than the original
401
+ # to accomodate the corners (which would otherwise extend beyond the
402
+ # surface).
403
+ #
404
+ # May raise Rubygame::SDLError if the rotozoom fails.
405
+ #
406
+ # angle:: degrees to rotate counter-clockwise (negative for
407
+ # clockwise).
408
+ # zoom:: scaling factor(s). A number (to scale X and Y by the same
409
+ # factor) or an array of 2 numbers (to scale X and Y by
410
+ # different factors). Negative numbers flip the image.
411
+ # NOTE: Due to a quirk in SDL_gfx, if angle is not 0, the
412
+ # image is zoomed by the X factor on both X and Y, and the
413
+ # Y factor is only used for flipping (if it's negative).
414
+ # smooth:: whether to anti-alias the new surface.
415
+ # By the way, if true, the new surface will be 32bit RGBA.
416
+ #
417
+ def rotozoom( angle, zoom, smooth=false )
418
+ smooth = smooth ? 1 : 0
419
+
420
+ surf = case zoom
421
+ when Array
422
+ zx, zy = zoom.collect { |n| n.to_f }
423
+ SDL::Gfx.rotozoomSurfaceXY(@struct, angle, zx, zy, smooth)
424
+ when Numeric
425
+ zoom = zoom.to_f
426
+ SDL::Gfx.rotozoomSurface(@struct, angle, zoom, smooth)
427
+ else
428
+ raise ArgumentError, "Invalid zoom factor: #{zoom.inspect}"
429
+ end
430
+
431
+ if( surf.pointer.null? )
432
+ raise( Rubygame::SDLError,
433
+ "Rotozoom failed: " + SDL.GetError() )
434
+ end
435
+
436
+ return self.class.new(surf)
437
+ end
438
+
439
+
440
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
441
+ # Your code should check "surface.respond_to?(:rotozoom_size)" to
442
+ # see if you can use this method, or be prepared to rescue from
443
+ # NameError.
444
+ #
445
+ # Return the dimensions of the surface that would be returned if
446
+ # #rotozoom were called on a Surface of the given size, with
447
+ # the same angle and zoom factors.
448
+ #
449
+ # This method takes these arguments:
450
+ # size:: an Array with the hypothetical Surface width and height (pixels)
451
+ # angle:: degrees to rotate counter-clockwise (negative for clockwise).
452
+ # zoom:: scaling factor(s). A number (to scale X and Y by the same
453
+ # factor) or an array of 2 numbers (to scale X and Y by
454
+ # different factors). NOTE: Due to a quirk in SDL_gfx, if
455
+ # angle is not 0, the image is zoomed by the X factor on
456
+ # both X and Y, and the Y factor is only used for flipping
457
+ # (if it's negative).
458
+ #
459
+ def self.rotozoom_size( size, angle, zoom )
460
+ w, h = size
461
+
462
+ case zoom
463
+ when Array
464
+ zx, zy = zoom.collect { |n| n.to_f }
465
+ SDL::Gfx.rotozoomSurfaceSizeXY(w, h, angle, zx, zy)
466
+ when Numeric
467
+ zoom = zoom.to_f
468
+ SDL::Gfx.rotozoomSurfaceSize(w, h, angle, zoom)
469
+ else
470
+ raise ArgumentError, "Invalid zoom factor: #{zoom.inspect}"
471
+ end
472
+ end
473
+
474
+
475
+
476
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
477
+ # Your code should check "surface.respond_to?(:zoom)" to see if you
478
+ # can use this method, or be prepared to rescue from NameError.
479
+ #
480
+ # Return a zoomed version of the Surface.
481
+ #
482
+ # This method takes these arguments:
483
+ # zoom:: a Numeric factor to scale by in both x and y directions,
484
+ # or an Array with separate x and y scale factors.
485
+ # smooth:: whether to anti-alias the new surface.
486
+ # By the way, if true, the new surface will be 32bit RGBA.
487
+ #
488
+ def zoom( zoom, smooth=false )
489
+ smooth = smooth ? 1 : 0
490
+
491
+ surf = case zoom
492
+ when Array
493
+ zx, zy = zoom.collect { |n| n.to_f }
494
+ SDL::Gfx.zoomSurface(@struct, zx, zy, smooth)
495
+ when Numeric
496
+ zoom = zoom.to_f
497
+ SDL::Gfx.zoomSurface(@struct, zoom, zoom, smooth)
498
+ else
499
+ raise ArgumentError, "Invalid zoom factor: #{zoom.inspect}"
500
+ end
501
+
502
+ if( surf.pointer.null? )
503
+ raise( Rubygame::SDLError, "Zoom failed: " + SDL.GetError() )
504
+ end
505
+
506
+ return self.class.new(surf)
507
+ end
508
+
509
+
510
+
511
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
512
+ # Your code should check "surface.respond_to?(:zoom_size)" to see if
513
+ # you can use this method, or be prepared to rescue from NameError.
514
+ #
515
+ # Return the dimensions of the surface that would be returned if
516
+ # #zoom were called on a Surface of the given size, with the same
517
+ # zoom factors.
518
+ #
519
+ # This method takes these arguments:
520
+ # size:: an Array with the hypothetical Surface width and height (pixels)
521
+ # zoom:: scaling factor(s). A number (to scale X and Y by the same
522
+ # factor) or an array of 2 numbers (to scale X and Y by
523
+ # different factors).
524
+ #
525
+ def self.zoom_size( size, zoom )
526
+ w, h = size
527
+
528
+ case zoom
529
+ when Array
530
+ zx, zy = zoom.collect { |n| n.to_f }
531
+ SDL::Gfx.zoomSurfaceSize(w, h, zx, zy)
532
+ when Numeric
533
+ zoom = zoom.to_f
534
+ SDL::Gfx.zoomSurfaceSize(w, h, zoom, zoom)
535
+ else
536
+ raise ArgumentError, "Invalid zoom factor: #{zoom.inspect}"
537
+ end
538
+ end
539
+
540
+
541
+
542
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
543
+ # Your code should check "surface.respond_to?(:zoom_to)" to see if
544
+ # you can use this method, or be prepared to rescue from NameError.
545
+ #
546
+ # Return a version of the Surface zoomed to a new size.
547
+ #
548
+ # This method takes these arguments:
549
+ # width:: the desired width. If nil, the width will stay the same.
550
+ # height:: the desired height. If nil, the height will stay the same.
551
+ # smooth:: whether to anti-alias the new surface. This option can be
552
+ # omitted, in which case the surface will not be anti-aliased.
553
+ # If true, the new surface will be 32bit RGBA.
554
+ #
555
+ def zoom_to( width, height, smooth=false )
556
+ zoomx = case width
557
+ when nil; 1.0
558
+ when Numeric; width.to_f / @struct.w
559
+ end
560
+
561
+ zoomy = case height
562
+ when nil; 1.0
563
+ when Numeric; height.to_f / @struct.h
564
+ end
565
+
566
+ return self.zoom( [zoomx, zoomy], smooth )
567
+ end
568
+
569
+
570
+
571
+ # *IMPORTANT*: this method only exists if SDL_gfx is available!
572
+ # Your code should check "surface.respond_to?(:flip)" to see if you
573
+ # can use this method, or be prepared to rescue from NameError.
574
+ #
575
+ # Flips the source surface horizontally (if +horz+ is true), vertically
576
+ # (if +vert+ is true), or both (if both are true).
577
+ #
578
+ def flip( horz, vert )
579
+ self.zoom( [ (horz ? -1.0 : 1.0), (vert ? -1.0 : 1.0)], false )
580
+ end
581
+
582
+
583
+ end