rubygame 2.3.0-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/CREDITS +60 -0
  2. data/LICENSE +504 -0
  3. data/NEWS +252 -0
  4. data/README +123 -0
  5. data/ROADMAP +109 -0
  6. data/Rakefile +440 -0
  7. data/doc/extended_readme.rdoc +49 -0
  8. data/doc/getting_started.rdoc +47 -0
  9. data/doc/macosx_install.rdoc +70 -0
  10. data/doc/windows_install.rdoc +123 -0
  11. data/ext/rubygame/rubygame_core.so +0 -0
  12. data/ext/rubygame/rubygame_event.c +644 -0
  13. data/ext/rubygame/rubygame_event.h +48 -0
  14. data/ext/rubygame/rubygame_event.obj +0 -0
  15. data/ext/rubygame/rubygame_gfx.c +942 -0
  16. data/ext/rubygame/rubygame_gfx.h +101 -0
  17. data/ext/rubygame/rubygame_gfx.obj +0 -0
  18. data/ext/rubygame/rubygame_gfx.so +0 -0
  19. data/ext/rubygame/rubygame_gl.c +154 -0
  20. data/ext/rubygame/rubygame_gl.h +32 -0
  21. data/ext/rubygame/rubygame_gl.obj +0 -0
  22. data/ext/rubygame/rubygame_image.c +252 -0
  23. data/ext/rubygame/rubygame_image.h +41 -0
  24. data/ext/rubygame/rubygame_image.obj +0 -0
  25. data/ext/rubygame/rubygame_image.so +0 -0
  26. data/ext/rubygame/rubygame_joystick.c +247 -0
  27. data/ext/rubygame/rubygame_joystick.h +41 -0
  28. data/ext/rubygame/rubygame_joystick.obj +0 -0
  29. data/ext/rubygame/rubygame_main.c +155 -0
  30. data/ext/rubygame/rubygame_main.h +36 -0
  31. data/ext/rubygame/rubygame_main.obj +0 -0
  32. data/ext/rubygame/rubygame_mixer.c +1024 -0
  33. data/ext/rubygame/rubygame_mixer.h +36 -0
  34. data/ext/rubygame/rubygame_mixer.obj +0 -0
  35. data/ext/rubygame/rubygame_mixer.so +0 -0
  36. data/ext/rubygame/rubygame_music.c +1017 -0
  37. data/ext/rubygame/rubygame_music.h +29 -0
  38. data/ext/rubygame/rubygame_music.obj +0 -0
  39. data/ext/rubygame/rubygame_screen.c +448 -0
  40. data/ext/rubygame/rubygame_screen.h +43 -0
  41. data/ext/rubygame/rubygame_screen.obj +0 -0
  42. data/ext/rubygame/rubygame_shared.c +272 -0
  43. data/ext/rubygame/rubygame_shared.h +68 -0
  44. data/ext/rubygame/rubygame_shared.obj +0 -0
  45. data/ext/rubygame/rubygame_sound.c +863 -0
  46. data/ext/rubygame/rubygame_sound.h +29 -0
  47. data/ext/rubygame/rubygame_sound.obj +0 -0
  48. data/ext/rubygame/rubygame_surface.c +1151 -0
  49. data/ext/rubygame/rubygame_surface.h +62 -0
  50. data/ext/rubygame/rubygame_surface.obj +0 -0
  51. data/ext/rubygame/rubygame_time.c +183 -0
  52. data/ext/rubygame/rubygame_time.h +32 -0
  53. data/ext/rubygame/rubygame_time.obj +0 -0
  54. data/ext/rubygame/rubygame_ttf.c +599 -0
  55. data/ext/rubygame/rubygame_ttf.h +69 -0
  56. data/ext/rubygame/rubygame_ttf.obj +0 -0
  57. data/ext/rubygame/rubygame_ttf.so +0 -0
  58. data/lib/rubygame.rb +41 -0
  59. data/lib/rubygame/clock.rb +128 -0
  60. data/lib/rubygame/color.rb +79 -0
  61. data/lib/rubygame/color/models/base.rb +111 -0
  62. data/lib/rubygame/color/models/hsl.rb +153 -0
  63. data/lib/rubygame/color/models/hsv.rb +149 -0
  64. data/lib/rubygame/color/models/rgb.rb +78 -0
  65. data/lib/rubygame/color/palettes/css.rb +49 -0
  66. data/lib/rubygame/color/palettes/palette.rb +100 -0
  67. data/lib/rubygame/color/palettes/x11.rb +177 -0
  68. data/lib/rubygame/constants.rb +238 -0
  69. data/lib/rubygame/event.rb +313 -0
  70. data/lib/rubygame/ftor.rb +370 -0
  71. data/lib/rubygame/hotspot.rb +265 -0
  72. data/lib/rubygame/keyconstants.rb +237 -0
  73. data/lib/rubygame/mediabag.rb +94 -0
  74. data/lib/rubygame/named_resource.rb +254 -0
  75. data/lib/rubygame/queue.rb +288 -0
  76. data/lib/rubygame/rect.rb +612 -0
  77. data/lib/rubygame/sfont.rb +223 -0
  78. data/lib/rubygame/sprite.rb +511 -0
  79. data/samples/FreeSans.ttf +0 -0
  80. data/samples/GPL.txt +340 -0
  81. data/samples/README +40 -0
  82. data/samples/chimp.bmp +0 -0
  83. data/samples/chimp.rb +302 -0
  84. data/samples/demo_gl.rb +151 -0
  85. data/samples/demo_gl_tex.rb +197 -0
  86. data/samples/demo_music.rb +77 -0
  87. data/samples/demo_rubygame.rb +296 -0
  88. data/samples/demo_sfont.rb +52 -0
  89. data/samples/demo_ttf.rb +193 -0
  90. data/samples/demo_utf8.rb +53 -0
  91. data/samples/fist.bmp +0 -0
  92. data/samples/load_and_blit.rb +22 -0
  93. data/samples/panda.png +0 -0
  94. data/samples/punch.wav +0 -0
  95. data/samples/ruby.png +0 -0
  96. data/samples/song.ogg +0 -0
  97. data/samples/term16.png +0 -0
  98. data/samples/whiff.wav +0 -0
  99. metadata +164 -0
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Interface to SDL_mixer sound playback and mixing.
3
+ *--
4
+ * Rubygame -- Ruby code and bindings to SDL to facilitate game creation
5
+ * Copyright (C) 2004-2008 John Croisant
6
+ *
7
+ * This library is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ *++
21
+ */
22
+
23
+
24
+ #ifndef _RUBYGAME_SOUND_H
25
+ #define _RUBYGAME_SOUND_H
26
+
27
+ extern void Rubygame_Init_Sound();
28
+
29
+ #endif
Binary file
@@ -0,0 +1,1151 @@
1
+ /*
2
+ * Rubygame binding to SDL Surface class.
3
+ *--
4
+ * Rubygame -- Ruby code and bindings to SDL to facilitate game creation
5
+ * Copyright (C) 2004-2007 John Croisant
6
+ *
7
+ * This library is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ *++
21
+ */
22
+
23
+ #include "rubygame_shared.h"
24
+ #include "rubygame_surface.h"
25
+
26
+ void Rubygame_Init_Surface();
27
+
28
+ VALUE rbgm_surface_new(int, VALUE*, VALUE);
29
+
30
+ VALUE rbgm_surface_get_w(VALUE);
31
+ VALUE rbgm_surface_get_h(VALUE);
32
+ VALUE rbgm_surface_get_size(VALUE);
33
+
34
+ VALUE rbgm_surface_get_depth(VALUE);
35
+ VALUE rbgm_surface_get_flags(VALUE);
36
+ VALUE rbgm_surface_get_masks(VALUE);
37
+
38
+ VALUE rbgm_surface_get_alpha(VALUE);
39
+ VALUE rbgm_surface_set_alpha(int, VALUE*, VALUE);
40
+
41
+ VALUE rbgm_surface_get_colorkey(VALUE);
42
+ VALUE rbgm_surface_set_colorkey(int, VALUE*, VALUE);
43
+
44
+ VALUE rbgm_surface_blit(int, VALUE*, VALUE);
45
+
46
+ VALUE rbgm_surface_fill(int, VALUE*, VALUE);
47
+
48
+ VALUE rbgm_surface_getat(int, VALUE*, VALUE);
49
+
50
+ VALUE rbgm_surface_pixels(VALUE);
51
+
52
+ VALUE rbgm_surface_get_cliprect(VALUE);
53
+ VALUE rbgm_surface_set_cliprect(VALUE, VALUE);
54
+
55
+ VALUE rbgm_surface_convert(int, VALUE*, VALUE);
56
+ VALUE rbgm_surface_displayformat(VALUE);
57
+ VALUE rbgm_surface_displayformatalpha(VALUE);
58
+
59
+ VALUE rbgm_image_savebmp(VALUE, VALUE);
60
+
61
+ VALUE rbgm_transform_flip(VALUE, VALUE, VALUE);
62
+
63
+ /*
64
+ * call-seq:
65
+ * new(size, depth=0, flags=0) -> Surface
66
+ *
67
+ * Create and initialize a new Surface object.
68
+ *
69
+ * A Surface is a grid of image data which you blit (i.e. copy) onto other
70
+ * Surfaces. Since the Rubygame display is also a Surface (see the Screen
71
+ * class), Surfaces can be blit to the screen; this is the most common way
72
+ * to display images on the screen.
73
+ *
74
+ * This method may raise SDLError if the SDL video subsystem could
75
+ * not be initialized for some reason.
76
+ *
77
+ * This function takes these arguments:
78
+ * size:: requested surface size; an array of the form [width, height].
79
+ * depth:: requested color depth (in bits per pixel). If depth is 0 (default),
80
+ * automatically choose a color depth: either the depth of the Screen
81
+ * mode (if one has been set), or the greatest color depth available
82
+ * on the system.
83
+ * flags:: an Array or Bitwise-OR'd list of zero or more of the following
84
+ * flags (located in the Rubygame module, e.g. Rubygame::SWSURFACE).
85
+ * This argument may be omitted, in which case the Surface
86
+ * will be a normal software surface (this is not necessarily a bad
87
+ * thing).
88
+ * SWSURFACE:: (default) request a software surface.
89
+ * HWSURFACE:: request a hardware-accelerated surface (using a
90
+ * graphics card), if available. Creates a software
91
+ * surface if hardware surfaces are not available.
92
+ * SRCCOLORKEY:: request a colorkeyed surface. #set_colorkey will
93
+ * also enable colorkey as needed. For a description
94
+ * of colorkeys, see #set_colorkey.
95
+ * SRCALPHA:: request an alpha channel. #set_alpha will
96
+ * also enable alpha. as needed. For a description
97
+ * of alpha, see #alpha.
98
+ */
99
+ VALUE rbgm_surface_new(int argc, VALUE *argv, VALUE class)
100
+ {
101
+ VALUE self;
102
+ SDL_Surface *self_surf;
103
+ SDL_PixelFormat* pixformat;
104
+ Uint32 flags, Rmask, Gmask, Bmask, Amask;
105
+ int w, h, depth;
106
+ VALUE vsize, vdepth, vflags;
107
+
108
+ rb_scan_args(argc, argv, "12", &vsize, &vdepth, &vflags);
109
+
110
+ if( SDL_GetVideoSurface() )
111
+ {
112
+ /* Pixel format is retrieved from the video surface. */
113
+ pixformat = (SDL_GetVideoSurface())->format;
114
+ }
115
+ else
116
+ {
117
+ /* We can only get the system color depth when the video system
118
+ * has been initialized. */
119
+ if( init_video_system() == 0 )
120
+ {
121
+ pixformat = SDL_GetVideoInfo()->vfmt;
122
+ }
123
+ else
124
+ {
125
+ rb_raise(eSDLError,"Could not initialize SDL video subsystem.");
126
+ return Qnil;
127
+ }
128
+ }
129
+
130
+ Rmask = pixformat->Rmask;
131
+ Gmask = pixformat->Gmask;
132
+ Bmask = pixformat->Bmask;
133
+ Amask = pixformat->Amask;
134
+
135
+ if( !NIL_P(vdepth) && NUM2INT(vdepth) > 0 )
136
+ {
137
+ /* TODO: We might want to check that the requested depth makes sense. */
138
+ depth = NUM2INT(vdepth);
139
+ }
140
+ else
141
+ {
142
+ depth = pixformat->BitsPerPixel;
143
+ }
144
+
145
+
146
+ /* Get width and height for new surface from vsize */
147
+ vsize = convert_to_array(vsize);
148
+
149
+ if(RARRAY(vsize)->len >= 2)
150
+ {
151
+ w = NUM2INT(rb_ary_entry(vsize,0));
152
+ h = NUM2INT(rb_ary_entry(vsize,1));
153
+ }
154
+ else
155
+ rb_raise(rb_eArgError,"Array is too short for Surface size (%d for 2)",\
156
+ RARRAY(vsize)->len);
157
+
158
+ flags = collapse_flags(vflags); /* in rubygame_shared */
159
+
160
+ /* Finally, we can create the new Surface! Or try, anyway... */
161
+ self_surf = SDL_CreateRGBSurface(flags,w,h,depth,Rmask,Gmask,Bmask,Amask);
162
+
163
+ if( self_surf == NULL )
164
+ rb_raise(eSDLError,"Could not create new surface: %s",SDL_GetError());
165
+
166
+
167
+ /* Wrap the new surface in a crunchy candy VALUE shell. */
168
+ self = Data_Wrap_Struct( cSurface,0,SDL_FreeSurface,self_surf );
169
+ /* The default initialize() does nothing, but may be overridden. */
170
+ rb_obj_call_init(self,argc,argv);
171
+ return self;
172
+ }
173
+
174
+ /* :nodoc: */
175
+ VALUE rbgm_surface_initialize(int argc, VALUE *argv, VALUE self)
176
+ {
177
+ return self;
178
+ }
179
+
180
+
181
+ /*
182
+ * call-seq:
183
+ * width
184
+ * w
185
+ *
186
+ * Return the width (in pixels) of the surface.
187
+ */
188
+ VALUE rbgm_surface_get_w(VALUE self)
189
+ {
190
+ SDL_Surface *surf;
191
+ Data_Get_Struct(self, SDL_Surface, surf);
192
+ return INT2NUM(surf->w);
193
+ }
194
+
195
+ /*
196
+ * call-seq:
197
+ * height
198
+ * h
199
+ *
200
+ * Return the height (in pixels) of the surface.
201
+ */
202
+ VALUE rbgm_surface_get_h(VALUE self)
203
+ {
204
+ SDL_Surface *surf;
205
+ Data_Get_Struct(self, SDL_Surface, surf);
206
+ return INT2NUM(surf->h);
207
+ }
208
+
209
+ /* call-seq:
210
+ * size -> [w,h]
211
+ *
212
+ * Return the surface's width and height (in pixels) in an Array.
213
+ */
214
+ VALUE rbgm_surface_get_size(VALUE self)
215
+ {
216
+ SDL_Surface *surf;
217
+ Data_Get_Struct(self, SDL_Surface, surf);
218
+ return rb_ary_new3( 2, INT2NUM(surf->w), INT2NUM(surf->h) );
219
+ }
220
+
221
+ /* call-seq:
222
+ * depth
223
+ *
224
+ * Return the color depth (in bits per pixel) of the surface.
225
+ */
226
+ VALUE rbgm_surface_get_depth(VALUE self)
227
+ {
228
+ SDL_Surface *surf;
229
+ Data_Get_Struct(self, SDL_Surface, surf);
230
+ return UINT2NUM(surf->format->BitsPerPixel);
231
+ }
232
+
233
+ /* call-seq:
234
+ * flags
235
+ *
236
+ * Return any flags the surface was initialized with
237
+ * (as a bitwise OR'd integer).
238
+ */
239
+ VALUE rbgm_surface_get_flags(VALUE self)
240
+ {
241
+ SDL_Surface *surf;
242
+ Data_Get_Struct(self, SDL_Surface, surf);
243
+ return UINT2NUM(surf->flags);
244
+ }
245
+
246
+ /*
247
+ * call-seq:
248
+ * masks -> [r,g,b,a]
249
+ *
250
+ * Return the color masks [r,g,b,a] of the surface. Almost everyone can
251
+ * ignore this function. Color masks are used to separate an
252
+ * integer representation of a color into its seperate channels.
253
+ */
254
+ VALUE rbgm_surface_get_masks(VALUE self)
255
+ {
256
+ SDL_Surface *surf;
257
+ SDL_PixelFormat *format;
258
+
259
+ Data_Get_Struct(self, SDL_Surface, surf);
260
+ format = surf->format;
261
+ return rb_ary_new3(4,\
262
+ UINT2NUM(format->Rmask),\
263
+ UINT2NUM(format->Gmask),\
264
+ UINT2NUM(format->Bmask),\
265
+ UINT2NUM(format->Amask));
266
+ }
267
+
268
+ /*
269
+ * call-seq:
270
+ * alpha
271
+ *
272
+ * Return the per-surface alpha (opacity; non-transparency) of the surface.
273
+ * It can range from 0 (full transparent) to 255 (full opaque).
274
+ */
275
+ VALUE rbgm_surface_get_alpha(VALUE self)
276
+ {
277
+ SDL_Surface *surf;
278
+ Data_Get_Struct(self, SDL_Surface, surf);
279
+ return INT2NUM(surf->format->alpha);
280
+ }
281
+
282
+ /*
283
+ * call-seq:
284
+ * set_alpha(alpha, flags=Rubygame::SRC_ALPHA)
285
+ *
286
+ * Set the per-surface alpha (opacity; non-transparency) of the surface.
287
+ *
288
+ * This function takes these arguments:
289
+ * alpha:: requested opacity of the surface. Alpha must be from 0
290
+ * (fully transparent) to 255 (fully opaque).
291
+ * flags:: 0 or Rubygame::SRC_ALPHA (default). Most people will want the
292
+ * default, in which case this argument can be omitted. For advanced
293
+ * users: this flag affects the surface as described in the docs for
294
+ * the SDL C function, SDL_SetAlpha.
295
+ */
296
+ VALUE rbgm_surface_set_alpha(int argc, VALUE *argv, VALUE self)
297
+ {
298
+ SDL_Surface *surf;
299
+ Uint8 alpha;
300
+ Uint32 flags = SDL_SRCALPHA;
301
+ VALUE valpha, vflags;
302
+
303
+ rb_scan_args(argc, argv, "11", &valpha, &vflags);
304
+
305
+ if( !NIL_P(vflags) )
306
+ {
307
+ flags = NUM2UINT(vflags);
308
+ }
309
+
310
+ alpha = NUM2UINT(valpha);
311
+
312
+ Data_Get_Struct(self, SDL_Surface, surf);
313
+ if( SDL_SetAlpha(surf,flags,alpha) != 0 )
314
+ rb_raise(eSDLError, "%s", SDL_GetError());
315
+ return self;
316
+ }
317
+
318
+ /*
319
+ * call-seq:
320
+ * colorkey -> [r,g,b] or nil
321
+ *
322
+ * Return the colorkey of the surface in the form [r,g,b] (or +nil+ if there
323
+ * is no key). The colorkey of a surface is the exact color which will be
324
+ * ignored when the surface is blitted, effectively turning that color
325
+ * transparent. This is often used to make a blue (for example) background
326
+ * on an image seem transparent.
327
+ */
328
+ VALUE rbgm_surface_get_colorkey( VALUE self )
329
+ {
330
+ SDL_Surface *surf;
331
+ Uint32 colorkey;
332
+ Uint8 r,g,b;
333
+
334
+ Data_Get_Struct(self, SDL_Surface, surf);
335
+ colorkey = surf->format->colorkey;
336
+ if((int *)colorkey == NULL)
337
+ return Qnil;
338
+ SDL_GetRGB(colorkey, surf->format, &r, &g, &b);
339
+ return rb_ary_new3(3,UINT2NUM(r),UINT2NUM(g),UINT2NUM(b));
340
+ }
341
+
342
+ /*
343
+ * call-seq:
344
+ * set_colorkey(color,flags=0)
345
+ *
346
+ * Set the colorkey of the surface. See Surface#colorkey for a description
347
+ * of colorkeys.
348
+ *
349
+ * This method takes these arguments:
350
+ * color:: color to use as the key, in the form [r,g,b]. Can be +nil+ to
351
+ * un-set the colorkey.
352
+ * flags:: 0 or Rubygame::SRC_COLORKEY (default) or
353
+ * Rubygame::SRC_COLORKEY|Rubygame::SDL_RLEACCEL. Most people will
354
+ * want the default, in which case this argument can be omitted. For
355
+ * advanced users: this flag affects the surface as described in the
356
+ * docs for the SDL C function, SDL_SetColorkey.
357
+ */
358
+ VALUE rbgm_surface_set_colorkey( int argc, VALUE *argv, VALUE self)
359
+ {
360
+ SDL_Surface *surf;
361
+ Uint32 color;
362
+ Uint32 flags;
363
+ Uint8 r,g,b;
364
+ VALUE vcolor, vflags;
365
+
366
+ Data_Get_Struct(self, SDL_Surface, surf);
367
+
368
+ rb_scan_args(argc, argv, "11", &vcolor, &vflags);
369
+
370
+ if( !NIL_P(vflags) )
371
+ {
372
+ flags = NUM2UINT(vflags);
373
+ }
374
+ else
375
+ {
376
+ flags = SDL_SRCCOLORKEY;
377
+ }
378
+
379
+
380
+ if( RTEST(vcolor) )
381
+ {
382
+ vcolor = convert_color(vcolor);
383
+ extract_rgb_u8_as_u8(vcolor, &r, &g, &b);
384
+ color = SDL_MapRGB(surf->format, r,g,b);
385
+ }
386
+ else
387
+ {
388
+ flags = 0;
389
+ color = 0;
390
+ }
391
+
392
+ if(SDL_SetColorKey(surf,flags,color)!=0)
393
+ rb_raise(eSDLError,"could not set colorkey: %s",SDL_GetError());
394
+ return self;
395
+ }
396
+
397
+ /*
398
+ * call-seq:
399
+ * blit(target,dest,source=nil) -> Rect
400
+ *
401
+ * Blit (copy) all or part of the surface's image to another surface,
402
+ * at a given position. Returns a Rect representing the area of
403
+ * +target+ which was affected by the blit.
404
+ *
405
+ * This method takes these arguments:
406
+ * target:: the target Surface on which to paste the image.
407
+ * dest:: the coordinates of the top-left corner of the blit. Affects the
408
+ * area of +other+ the image data is /pasted/ over.
409
+ * Can also be a Rect or an Array larger than 2, but
410
+ * width and height will be ignored.
411
+ * source:: a Rect representing the area of the source surface to get data
412
+ * from. Affects where the image data is /copied/ from.
413
+ * Can also be an Array of no less than 4 values.
414
+ */
415
+ VALUE rbgm_surface_blit(int argc, VALUE *argv, VALUE self)
416
+ {
417
+ int left, top, right, bottom;
418
+ int blit_x,blit_y,blit_w,blit_h;
419
+ //int dest_x,dest_y,dest_w,dest_h;
420
+ int src_x,src_y,src_w,src_h;
421
+ VALUE returnrect;
422
+ SDL_Surface *src, *dest;
423
+ SDL_Rect *src_rect, *blit_rect;
424
+
425
+ VALUE vtarget, vdest, vsource;
426
+
427
+ rb_scan_args( argc, argv, "21", &vtarget, &vdest, &vsource );
428
+
429
+ Data_Get_Struct(self, SDL_Surface, src);
430
+ Data_Get_Struct(vtarget, SDL_Surface, dest);
431
+
432
+ vdest = convert_to_array(vdest);
433
+ blit_x = NUM2INT(rb_ary_entry(vdest,0));
434
+ blit_y = NUM2INT(rb_ary_entry(vdest,1));
435
+
436
+ /* did we get a src_rect argument or not? */
437
+ if( !NIL_P(vsource) )
438
+ {
439
+ /* it might be good to check that it's actually a rect */
440
+ vsource = convert_to_array(vsource);
441
+ src_x = NUM2INT( rb_ary_entry(vsource,0) );
442
+ src_y = NUM2INT( rb_ary_entry(vsource,1) );
443
+ src_w = NUM2INT( rb_ary_entry(vsource,2) );
444
+ src_h = NUM2INT( rb_ary_entry(vsource,3) );
445
+ }
446
+ else
447
+ {
448
+ src_x = 0;
449
+ src_y = 0;
450
+ src_w = src->w;
451
+ src_h = src->h;
452
+ }
453
+ src_rect = make_rect( src_x, src_y, src_w, src_h );
454
+
455
+ /* experimental (broken) rectangle cropping code */
456
+ /* crop if it went off left/top/right/bottom */
457
+ //left = max(blit_x,0);
458
+ //top = max(blit_y,0);
459
+ //right = min(blit_x+src_w,dest->w);
460
+ //bottom = min(blit_y+src_h,dest->h);
461
+
462
+ left = blit_x;
463
+ top = blit_y;
464
+ right = blit_x+src_w;
465
+ bottom = blit_y+src_h;
466
+
467
+ //blit_w = min(blit_x+blit_w,dest->w) - max(blit_x,0);
468
+ //blit_h = min(blit_y+blit_h,dest->h) - max(blit_y,0);
469
+ blit_w = right - left;
470
+ blit_h = bottom - top;
471
+
472
+ blit_rect = make_rect( left, top, blit_w, blit_h );
473
+
474
+ SDL_BlitSurface(src,src_rect,dest,blit_rect);
475
+
476
+ returnrect = rb_funcall(cRect,rb_intern("new"),4,
477
+ INT2NUM(left),INT2NUM(top),\
478
+ INT2NUM(blit_w),INT2NUM(blit_h));
479
+
480
+ free(blit_rect);
481
+ free(src_rect);
482
+ return returnrect;
483
+ }
484
+
485
+ /*
486
+ * call-seq:
487
+ * fill(color,rect=nil)
488
+ *
489
+ * Fill all or part of a Surface with a color.
490
+ *
491
+ * This method takes these arguments:
492
+ * color:: color to fill with, in the form +[r,g,b]+ or +[r,g,b,a]+ (for
493
+ * partially transparent fills).
494
+ * rect:: a Rubygame::Rect representing the area of the surface to fill
495
+ * with color. Omit to fill the entire surface.
496
+ */
497
+ VALUE rbgm_surface_fill( int argc, VALUE *argv, VALUE self )
498
+ {
499
+ SDL_Surface *surf;
500
+ SDL_Rect *rect;
501
+ Uint32 color;
502
+ Uint8 r,g,b,a;
503
+ VALUE vcolor, vrect;
504
+
505
+ Data_Get_Struct(self, SDL_Surface, surf);
506
+
507
+ rb_scan_args(argc, argv, "11", &vcolor, &vrect);
508
+
509
+ vcolor = convert_color(vcolor);
510
+ extract_rgba_u8_as_u8(vcolor, &r, &g, &b, &a);
511
+ color = SDL_MapRGBA(surf->format, r,g,b,a);
512
+
513
+ if( NIL_P(vrect) )
514
+ {
515
+ SDL_FillRect(surf,NULL,color);
516
+ }
517
+ else
518
+ {
519
+ vrect = convert_to_array(vrect);
520
+
521
+ rect = make_rect(\
522
+ NUM2INT(rb_ary_entry(vrect,0)),\
523
+ NUM2INT(rb_ary_entry(vrect,1)),\
524
+ NUM2INT(rb_ary_entry(vrect,2)),\
525
+ NUM2INT(rb_ary_entry(vrect,3))\
526
+ );
527
+ SDL_FillRect(surf,rect,color);
528
+ free(rect);
529
+ }
530
+
531
+ return self;
532
+ }
533
+
534
+ /*
535
+ * call-seq:
536
+ * get_at(x,y)
537
+ * get_at([x,y]) # deprecated
538
+ *
539
+ * Return the color [r,g,b,a] of the pixel at the given coordinate.
540
+ *
541
+ * Raises IndexError if the coordinates are out of bounds.
542
+ */
543
+ VALUE rbgm_surface_getat( int argc, VALUE *argv, VALUE self )
544
+ {
545
+ SDL_Surface *surf;
546
+ int x, y, locked;
547
+ Uint32 color;
548
+ Uint8 *pixels, *pix;
549
+ Uint8 r,g,b,a;
550
+ VALUE vx, vy;
551
+
552
+ Data_Get_Struct(self, SDL_Surface, surf);
553
+
554
+ rb_scan_args(argc, argv, "11", &vx, &vy);
555
+
556
+ /* Still support passing position as an Array... for now. */
557
+ switch( TYPE(vx) )
558
+ {
559
+ case T_ARRAY: {
560
+ x = NUM2INT( rb_ary_entry(vx,0) );
561
+ y = NUM2INT( rb_ary_entry(vx,1) );
562
+ break;
563
+ }
564
+ default: {
565
+ x = NUM2INT(vx);
566
+ y = NUM2INT(vy);
567
+ break;
568
+ }
569
+ }
570
+
571
+ if( x < 0 || x > surf->w )
572
+ rb_raise(rb_eIndexError,"x index out of bounds (%d, min 0, max %d)",\
573
+ x,surf->w);
574
+ if( y < 0 || y > surf->h )
575
+ rb_raise(rb_eIndexError,"y index out of bounds (%d, min 0, max %d)",\
576
+ y,surf->h);
577
+
578
+ locked = 0;
579
+ /* lock surface */
580
+ if(SDL_MUSTLOCK(surf))
581
+ {
582
+ if(SDL_LockSurface(surf)==0)
583
+ locked += 1;
584
+ else
585
+ rb_raise(eSDLError,"could not lock surface: %s",SDL_GetError());
586
+ }
587
+
588
+ /* borrowed from pygame */
589
+ pixels = (Uint8 *) surf->pixels;
590
+
591
+ switch(surf->format->BytesPerPixel)
592
+ {
593
+ case 1:
594
+ color = (Uint32)*((Uint8 *)(pixels + y * surf->pitch) + x);
595
+ break;
596
+ case 2:
597
+ color = (Uint32)*((Uint16 *)(pixels + y * surf->pitch) + x);
598
+ break;
599
+ case 3:
600
+ pix = ((Uint8 *)(pixels + y * surf->pitch) + x * 3);
601
+ #if SDL_BYTEORDER == SDL_LIL_ENDIAN
602
+ color = (pix[0]) + (pix[1]<<8) + (pix[2]<<16);
603
+ #else
604
+ color = (pix[2]) + (pix[1]<<8) + (pix[0]<<16);
605
+ #endif
606
+ break;
607
+ default: /*case 4:*/
608
+ color = *((Uint32*)(pixels + y * surf->pitch) + x);
609
+ break;
610
+ }
611
+
612
+ /* end borrowed from pygame */
613
+
614
+ /* recursively unlock surface*/
615
+ while(locked>1)
616
+ {
617
+ SDL_UnlockSurface(surf);
618
+ locked -= 1;
619
+ }
620
+
621
+ if((int *)color == NULL)
622
+ {
623
+ VALUE zero = INT2NUM(0);
624
+ return rb_ary_new3(4,zero,zero,zero,zero);
625
+ }
626
+
627
+ SDL_GetRGBA(color, surf->format, &r, &g, &b, &a);
628
+ return rb_ary_new3(4,UINT2NUM(r),UINT2NUM(g),UINT2NUM(b),UINT2NUM(a));
629
+ }
630
+
631
+
632
+ /*
633
+ * call-seq:
634
+ * set_at([x,y], color)
635
+ *
636
+ * Set the color of the pixel at the given coordinate.
637
+ *
638
+ * color can be one of:
639
+ * * an Array, [r,g,b] or [r,g,b,a] with each component in 0-255
640
+ * * an instance of ColorRGB, ColorHSV, etc.
641
+ * * the name of a color in Rubygame::Color, as a Symbol or String
642
+ *
643
+ * Raises IndexError if the coordinates are out of bounds.
644
+ *
645
+ *--
646
+ *
647
+ * I'm lazy and just using SDL_FillRect. ;-P
648
+ * It's easier and less bug-prone this way.
649
+ * I have no idea about speed comparisons.
650
+ *
651
+ */
652
+ VALUE rbgm_surface_setat( int argc, VALUE *argv, VALUE self )
653
+ {
654
+ SDL_Surface *surf;
655
+ SDL_Rect *rect;
656
+ Uint32 color;
657
+ Uint8 r,g,b,a;
658
+ VALUE vpos, vcolor;
659
+
660
+ Data_Get_Struct(self, SDL_Surface, surf);
661
+
662
+ rb_scan_args(argc, argv, "2", &vpos, &vcolor);
663
+
664
+ vcolor = convert_color(vcolor);
665
+ extract_rgba_u8_as_u8(vcolor, &r, &g, &b, &a);
666
+ color = SDL_MapRGBA(surf->format, r,g,b,a);
667
+
668
+ vpos = convert_to_array(vpos);
669
+ rect = make_rect( NUM2INT(rb_ary_entry(vpos,0)),
670
+ NUM2INT(rb_ary_entry(vpos,1)),
671
+ 1, 1 );
672
+
673
+ SDL_FillRect(surf,rect,color);
674
+
675
+ free(rect);
676
+
677
+ return self;
678
+ }
679
+
680
+
681
+
682
+ /*
683
+ * call-seq:
684
+ * pixels -> String
685
+ *
686
+ * Return a string of pixel data for the Surface. Most users will not
687
+ * need to use this method. If you want to convert a Surface into an
688
+ * OpenGL texture, pass the returned string to the TexImage2D method
689
+ * of the ruby-opengl library. (See samples/demo_gl_tex.rb for an example.)
690
+ *
691
+ * (Please note that the dimensions of OpenGL textures must be powers of 2
692
+ * (e.g. 64x128, 512x512), so if you want to use a Surface as an OpenGL
693
+ * texture, the Surface's dimensions must also be powers of 2!)
694
+ */
695
+ VALUE rbgm_surface_pixels( VALUE self )
696
+ {
697
+ SDL_Surface *surf;
698
+ Data_Get_Struct(self, SDL_Surface, surf);
699
+ return rb_str_new(surf->pixels, (long)surf->pitch * surf->h);
700
+ }
701
+
702
+ /*
703
+ * call-seq:
704
+ * clip -> Rect
705
+ *
706
+ * Return the clipping area for this Surface. See also #cliprect=.
707
+ *
708
+ * The clipping area of a Surface is the only part which can be drawn upon
709
+ * by other Surface's #blits. By default, the clipping area is the entire area
710
+ * of the Surface.
711
+ */
712
+ VALUE rbgm_surface_get_clip( VALUE self )
713
+ {
714
+ SDL_Rect rect;
715
+ SDL_Surface *surf;
716
+ Data_Get_Struct(self, SDL_Surface, surf);
717
+
718
+ SDL_GetClipRect(surf, &rect);
719
+
720
+ return rb_funcall(cRect,rb_intern("new"),4,
721
+ INT2NUM(rect.x),INT2NUM(rect.y),
722
+ INT2NUM(rect.w),INT2NUM(rect.h));
723
+ }
724
+
725
+ /*
726
+ * call-seq:
727
+ * clip = Rect or nil
728
+ *
729
+ * Set the current clipping area of the Surface. See also #cliprect.
730
+ *
731
+ * The clipping area of a Surface is the only part which can be drawn upon
732
+ * by other Surface's #blits. The clipping area will be clipped to the edges
733
+ * of the surface so that the clipping area for a Surface can never fall
734
+ * outside the edges of the Surface.
735
+ *
736
+ * By default, the clipping area is the entire area of the Surface.
737
+ * You may set clip to +nil+, which will reset the clipping area to cover
738
+ * the entire Surface.
739
+ */
740
+ VALUE rbgm_surface_set_clip( VALUE self, VALUE clip )
741
+ {
742
+ SDL_Rect *rect;
743
+ SDL_Surface *surf;
744
+ Data_Get_Struct(self, SDL_Surface, surf);
745
+
746
+
747
+ if( NIL_P(clip) )
748
+ {
749
+ SDL_SetClipRect(surf,NULL);
750
+ }
751
+ else
752
+ {
753
+ clip = convert_to_array(clip);
754
+ rect = make_rect(\
755
+ NUM2INT(rb_ary_entry(clip,0)),\
756
+ NUM2INT(rb_ary_entry(clip,1)),\
757
+ NUM2INT(rb_ary_entry(clip,2)),\
758
+ NUM2INT(rb_ary_entry(clip,3))\
759
+ );
760
+
761
+ SDL_SetClipRect(surf,rect);
762
+ free(rect);
763
+ }
764
+
765
+ return self;
766
+ }
767
+
768
+ /*
769
+ * call-seq:
770
+ * convert( other=nil, flags=nil ) -> Surface
771
+ *
772
+ * Copies the Surface to a new Surface with the pixel format of another
773
+ * Surface, for fast blitting. May raise SDLError if a problem occurs.
774
+ *
775
+ * This method takes these arguments:
776
+ * - other:: The Surface to match pixel format against. If +nil+, the
777
+ * display surface (i.e. Screen) is used, if available; if no
778
+ * display surface is available, raises SDLError.
779
+ * - flags:: An array of flags to pass when the new Surface is created.
780
+ * See Surface#new.
781
+ *
782
+ */
783
+ VALUE rbgm_surface_convert(int argc, VALUE *argv, VALUE self)
784
+ {
785
+ SDL_Surface *surf, *othersurf, *newsurf;
786
+ Uint32 flags = 0;
787
+ VALUE vother, vflags;
788
+
789
+ Data_Get_Struct(self, SDL_Surface, surf);
790
+
791
+ rb_scan_args(argc, argv, "02", &vother, &vflags );
792
+
793
+ if( !NIL_P(vother) )
794
+ {
795
+ Data_Get_Struct(vother, SDL_Surface, othersurf);
796
+ }
797
+ else
798
+ {
799
+ othersurf = SDL_GetVideoSurface();
800
+ if( othersurf == NULL )
801
+ {
802
+ rb_raise(eSDLError, "Cannot convert Surface with no target given and no Screen made: %s", SDL_GetError());
803
+ }
804
+ }
805
+
806
+ flags = collapse_flags(vflags); /* in rubygame_shared.c */
807
+
808
+ if( init_video_system() == 0 )
809
+ {
810
+ newsurf = SDL_ConvertSurface( surf, othersurf->format, flags );
811
+ }
812
+ else
813
+ {
814
+ newsurf = NULL;
815
+ }
816
+
817
+ if( newsurf == NULL )
818
+ {
819
+ rb_raise(eSDLError,\
820
+ "Could not convert the Surface: %s",\
821
+ SDL_GetError());
822
+ }
823
+
824
+ return Data_Wrap_Struct( cSurface,0,SDL_FreeSurface,newsurf );
825
+ }
826
+
827
+ /*
828
+ * call-seq:
829
+ * to_display() -> Surface
830
+ *
831
+ * Copies the Surface to a new Surface with the pixel format of the display,
832
+ * suitable for fast blitting to the display surface (i.e. Screen).
833
+ * May raise SDLError if a problem occurs.
834
+ *
835
+ * If you want to take advantage of hardware colorkey or alpha blit
836
+ * acceleration, you should set the colorkey and alpha value before calling
837
+ * this function.
838
+ *
839
+ */
840
+ VALUE rbgm_surface_dispform(VALUE self)
841
+ {
842
+ SDL_Surface *surf, *newsurf;
843
+ Data_Get_Struct(self, SDL_Surface, surf);
844
+
845
+ if( init_video_system() == 0 )
846
+ {
847
+ newsurf = SDL_DisplayFormat( surf );
848
+ }
849
+ else
850
+ {
851
+ newsurf = NULL;
852
+ }
853
+
854
+ if( newsurf == NULL )
855
+ {
856
+ rb_raise(eSDLError,\
857
+ "Could not convert the Surface to display format: %s",\
858
+ SDL_GetError());
859
+ }
860
+
861
+ return Data_Wrap_Struct( cSurface,0,SDL_FreeSurface,newsurf );
862
+ }
863
+
864
+ /*
865
+ * call-seq:
866
+ * to_display_alpha() -> Surface
867
+ *
868
+ * Like #to_display except the Surface has an extra channel for alpha (i.e.
869
+ * opacity). May raise SDLError if a problem occurs.
870
+ *
871
+ * This function can be used to convert a colorkey to an alpha channel, if the
872
+ * SRCCOLORKEY flag is set on the surface. The generated surface will then be
873
+ * transparent (alpha=0) where the pixels match the colorkey, and opaque
874
+ * (alpha=255) elsewhere.
875
+ */
876
+ VALUE rbgm_surface_dispformalpha(VALUE self)
877
+ {
878
+ SDL_Surface *surf, *newsurf;
879
+ Data_Get_Struct(self, SDL_Surface, surf);
880
+
881
+ if( init_video_system() == 0 )
882
+ {
883
+ newsurf = SDL_DisplayFormatAlpha( surf );
884
+ }
885
+ else
886
+ {
887
+ newsurf = NULL;
888
+ }
889
+
890
+ if( newsurf == NULL )
891
+ {
892
+ rb_raise(eSDLError,\
893
+ "Could not convert the Surface to display format with alpha channel: %s",\
894
+ SDL_GetError());
895
+ }
896
+
897
+ return Data_Wrap_Struct( cSurface,0,SDL_FreeSurface,newsurf );
898
+ }
899
+
900
+
901
+ /*
902
+ * call-seq:
903
+ * savebmp( filename ) -> nil
904
+ *
905
+ * Save the Surface as a Windows Bitmap (BMP) file with the given filename.
906
+ */
907
+ VALUE rbgm_image_savebmp( VALUE self, VALUE filename )
908
+ {
909
+ char *name;
910
+ SDL_Surface *surf;
911
+
912
+ name = StringValuePtr(filename);
913
+ Data_Get_Struct(self,SDL_Surface,surf);
914
+ if(SDL_SaveBMP(surf,name)!=0)
915
+ {
916
+ rb_raise(eSDLError,\
917
+ "Couldn't save surface to file %s: %s",name,SDL_GetError());
918
+ }
919
+ return Qnil;
920
+ }
921
+
922
+
923
+ /* --
924
+ * Borrowed from Pygame:
925
+ * ++
926
+ */
927
+ static SDL_Surface* newsurf_fromsurf(SDL_Surface* surf, int width, int height)
928
+ {
929
+ SDL_Surface* newsurf;
930
+
931
+ if(surf->format->BytesPerPixel <= 0 || surf->format->BytesPerPixel > 4)
932
+ rb_raise(eSDLError,"unsupported Surface bit depth for transform");
933
+
934
+ newsurf = SDL_CreateRGBSurface(surf->flags, width, height, surf->format->BitsPerPixel,
935
+ surf->format->Rmask, surf->format->Gmask, surf->format->Bmask, surf->format->Amask);
936
+ if(!newsurf)
937
+ rb_raise(eSDLError,"%s",SDL_GetError());
938
+
939
+ /* Copy palette, colorkey, etc info */
940
+ if(surf->format->BytesPerPixel==1 && surf->format->palette)
941
+ SDL_SetColors(newsurf, surf->format->palette->colors, 0, surf->format->palette->ncolors);
942
+ if(surf->flags & SDL_SRCCOLORKEY)
943
+ SDL_SetColorKey(newsurf, (surf->flags&SDL_RLEACCEL)|SDL_SRCCOLORKEY, surf->format->colorkey);
944
+
945
+ return newsurf;
946
+ }
947
+
948
+ /*
949
+ * call-seq:
950
+ * flip(horz, vert) -> Surface
951
+ *
952
+ * Flips the source surface horizontally (if +horz+ is true), vertically
953
+ * (if +vert+ is true), or both (if both are true). This operation is
954
+ * non-destructive; the original image can be perfectly reconstructed by
955
+ * flipping the resultant image again.
956
+ *
957
+ * This operation does NOT require SDL_gfx.
958
+ *
959
+ * A similar effect can (supposedly) be achieved by giving X or Y zoom
960
+ * factors of -1 to #rotozoom (only if compiled with SDL_gfx 2.0.13 or
961
+ * greater). Your mileage may vary.
962
+ */
963
+ VALUE rbgm_transform_flip(VALUE self, VALUE vhorz, VALUE vvert)
964
+ {
965
+ SDL_Surface *surf, *newsurf;
966
+ int xaxis, yaxis;
967
+
968
+ int loopx, loopy;
969
+ int pixsize, srcpitch, dstpitch;
970
+ Uint8 *srcpix, *dstpix;
971
+
972
+ xaxis = RTEST(vhorz);
973
+ yaxis = RTEST(vvert);
974
+
975
+ Data_Get_Struct(self,SDL_Surface,surf);
976
+
977
+ /* Borrowed from Pygame: */
978
+ newsurf = newsurf_fromsurf(surf, surf->w, surf->h);
979
+ if(!newsurf)
980
+ return Qnil;
981
+
982
+ pixsize = surf->format->BytesPerPixel;
983
+ srcpitch = surf->pitch;
984
+ dstpitch = newsurf->pitch;
985
+
986
+ SDL_LockSurface(newsurf);
987
+
988
+ srcpix = (Uint8*)surf->pixels;
989
+ dstpix = (Uint8*)newsurf->pixels;
990
+
991
+ if(!xaxis)
992
+ {
993
+ if(!yaxis)
994
+ {
995
+ for(loopy = 0; loopy < surf->h; ++loopy)
996
+ memcpy(dstpix+loopy*dstpitch, srcpix+loopy*srcpitch, surf->w*surf->format->BytesPerPixel);
997
+ }
998
+ else
999
+ {
1000
+ for(loopy = 0; loopy < surf->h; ++loopy)
1001
+ memcpy(dstpix+loopy*dstpitch, srcpix+(surf->h-1-loopy)*srcpitch, surf->w*surf->format->BytesPerPixel);
1002
+ }
1003
+ }
1004
+ else /*if (xaxis)*/
1005
+ {
1006
+ if(yaxis)
1007
+ {
1008
+ switch(surf->format->BytesPerPixel)
1009
+ {
1010
+ case 1:
1011
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1012
+ Uint8* dst = (Uint8*)(dstpix+loopy*dstpitch);
1013
+ Uint8* src = ((Uint8*)(srcpix+(surf->h-1-loopy)*srcpitch)) + surf->w - 1;
1014
+ for(loopx = 0; loopx < surf->w; ++loopx)
1015
+ *dst++ = *src--;
1016
+ }break;
1017
+ case 2:
1018
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1019
+ Uint16* dst = (Uint16*)(dstpix+loopy*dstpitch);
1020
+ Uint16* src = ((Uint16*)(srcpix+(surf->h-1-loopy)*srcpitch)) + surf->w - 1;
1021
+ for(loopx = 0; loopx < surf->w; ++loopx)
1022
+ *dst++ = *src--;
1023
+ }break;
1024
+ case 4:
1025
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1026
+ Uint32* dst = (Uint32*)(dstpix+loopy*dstpitch);
1027
+ Uint32* src = ((Uint32*)(srcpix+(surf->h-1-loopy)*srcpitch)) + surf->w - 1;
1028
+ for(loopx = 0; loopx < surf->w; ++loopx)
1029
+ *dst++ = *src--;
1030
+ }break;
1031
+ case 3:
1032
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1033
+ Uint8* dst = (Uint8*)(dstpix+loopy*dstpitch);
1034
+ Uint8* src = ((Uint8*)(srcpix+(surf->h-1-loopy)*srcpitch)) + surf->w*3 - 3;
1035
+ for(loopx = 0; loopx < surf->w; ++loopx)
1036
+ {
1037
+ dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];
1038
+ dst += 3;
1039
+ src -= 3;
1040
+ }
1041
+ }break;
1042
+ }
1043
+ }
1044
+ else
1045
+ {
1046
+ switch(surf->format->BytesPerPixel)
1047
+ {
1048
+ case 1:
1049
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1050
+ Uint8* dst = (Uint8*)(dstpix+loopy*dstpitch);
1051
+ Uint8* src = ((Uint8*)(srcpix+loopy*srcpitch)) + surf->w - 1;
1052
+ for(loopx = 0; loopx < surf->w; ++loopx)
1053
+ *dst++ = *src--;
1054
+ }break;
1055
+ case 2:
1056
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1057
+ Uint16* dst = (Uint16*)(dstpix+loopy*dstpitch);
1058
+ Uint16* src = ((Uint16*)(srcpix+loopy*srcpitch)) + surf->w - 1;
1059
+ for(loopx = 0; loopx < surf->w; ++loopx)
1060
+ *dst++ = *src--;
1061
+ }break;
1062
+ case 4:
1063
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1064
+ Uint32* dst = (Uint32*)(dstpix+loopy*dstpitch);
1065
+ Uint32* src = ((Uint32*)(srcpix+loopy*srcpitch)) + surf->w - 1;
1066
+ for(loopx = 0; loopx < surf->w; ++loopx)
1067
+ *dst++ = *src--;
1068
+ }break;
1069
+ case 3:
1070
+ for(loopy = 0; loopy < surf->h; ++loopy) {
1071
+ Uint8* dst = (Uint8*)(dstpix+loopy*dstpitch);
1072
+ Uint8* src = ((Uint8*)(srcpix+loopy*srcpitch)) + surf->w*3 - 3;
1073
+ for(loopx = 0; loopx < surf->w; ++loopx)
1074
+ {
1075
+ dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];
1076
+ dst += 3;
1077
+ src -= 3;
1078
+ }
1079
+ }break;
1080
+ }
1081
+ }
1082
+ }
1083
+
1084
+ SDL_UnlockSurface(newsurf);
1085
+ /* Thanks, Pygame :) */
1086
+
1087
+
1088
+ if(newsurf == NULL)
1089
+ rb_raise(eSDLError,"Could not flip surface: %s",SDL_GetError());
1090
+ return Data_Wrap_Struct(cSurface,0,SDL_FreeSurface,newsurf);
1091
+ }
1092
+
1093
+ /*
1094
+ * See rubygame_image.c for the Surface class overview docs.
1095
+ * I hate RDoc's C parser.
1096
+ *
1097
+ */
1098
+ void Rubygame_Init_Surface()
1099
+ {
1100
+
1101
+ #if 0
1102
+ mRubygame = rb_define_module("Rubygame");
1103
+ cSurface = rb_define_class_under(mRubygame,"Surface",rb_cObject);
1104
+ #endif
1105
+
1106
+ rb_define_singleton_method(cSurface,"new",rbgm_surface_new,-1);
1107
+ rb_define_method(cSurface,"initialize",rbgm_surface_initialize,-1);
1108
+ rb_define_method(cSurface,"w",rbgm_surface_get_w,0);
1109
+ rb_define_alias(cSurface,"width","w");
1110
+ rb_define_method(cSurface,"h",rbgm_surface_get_h,0);
1111
+ rb_define_alias(cSurface,"height","h");
1112
+ rb_define_method(cSurface,"size",rbgm_surface_get_size,0);
1113
+ rb_define_method(cSurface,"depth",rbgm_surface_get_depth,0);
1114
+ rb_define_method(cSurface,"flags",rbgm_surface_get_flags,0);
1115
+ rb_define_method(cSurface,"masks",rbgm_surface_get_masks,0);
1116
+ rb_define_method(cSurface,"alpha",rbgm_surface_get_alpha,0);
1117
+ rb_define_method(cSurface,"set_alpha",rbgm_surface_set_alpha,-1);
1118
+ rb_define_method(cSurface,"colorkey",rbgm_surface_get_colorkey,0);
1119
+ rb_define_method(cSurface,"set_colorkey",rbgm_surface_set_colorkey,-1);
1120
+ rb_define_method(cSurface,"blit",rbgm_surface_blit,-1);
1121
+ rb_define_method(cSurface,"fill",rbgm_surface_fill,-1);
1122
+ rb_define_method(cSurface,"get_at",rbgm_surface_getat,-1);
1123
+ rb_define_method(cSurface,"set_at",rbgm_surface_setat,-1);
1124
+ rb_define_method(cSurface,"pixels",rbgm_surface_pixels,0);
1125
+ rb_define_method(cSurface,"clip",rbgm_surface_get_clip,0);
1126
+ rb_define_method(cSurface,"clip=",rbgm_surface_set_clip,1);
1127
+ rb_define_method(cSurface,"convert",rbgm_surface_convert,-1);
1128
+ rb_define_method(cSurface,"to_display",rbgm_surface_dispform,0);
1129
+ rb_define_method(cSurface,"to_display_alpha",rbgm_surface_dispformalpha,0);
1130
+ rb_define_method(cSurface,"savebmp",rbgm_image_savebmp,1);
1131
+ rb_define_method(cSurface,"flip",rbgm_transform_flip,2);
1132
+
1133
+
1134
+ /* Include the Rubygame::NamedResource mixin module. */
1135
+ rg_include_named_resource(cSurface);
1136
+
1137
+
1138
+ /* Surface initialization flags */
1139
+ rb_define_const(mRubygame,"SWSURFACE",UINT2NUM(SDL_SWSURFACE));
1140
+ rb_define_const(mRubygame,"HWSURFACE",UINT2NUM(SDL_HWSURFACE));
1141
+ rb_define_const(mRubygame,"ASYNCBLIT",UINT2NUM(SDL_ASYNCBLIT));
1142
+ rb_define_const(mRubygame,"ANYFORMAT",UINT2NUM(SDL_ANYFORMAT));
1143
+ rb_define_const(mRubygame,"HWPALETTE",UINT2NUM(SDL_HWPALETTE));
1144
+ rb_define_const(mRubygame,"HWACCEL",UINT2NUM(SDL_HWACCEL));
1145
+ rb_define_const(mRubygame,"SRCCOLORKEY",UINT2NUM(SDL_SRCCOLORKEY));
1146
+ rb_define_const(mRubygame,"RLEACCELOK",UINT2NUM(SDL_RLEACCELOK));
1147
+ rb_define_const(mRubygame,"RLEACCEL",UINT2NUM(SDL_RLEACCEL));
1148
+ rb_define_const(mRubygame,"SRCALPHA",UINT2NUM(SDL_SRCALPHA));
1149
+ rb_define_const(mRubygame,"PREALLOC",UINT2NUM(SDL_PREALLOC));
1150
+
1151
+ }