rubysdl 1.3.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.
- data/LICENSE +505 -0
- data/MANIFEST +81 -0
- data/NEWS.en +144 -0
- data/NEWS.ja +151 -0
- data/README.en +117 -0
- data/README.ja +166 -0
- data/SDL_kanji.c +403 -0
- data/SDL_kanji.h +48 -0
- data/depend +18 -0
- data/doc/Makefile +18 -0
- data/doc/cdrom.rsd +431 -0
- data/doc/collision.rsd +162 -0
- data/doc/event.rsd +1487 -0
- data/doc/font.rsd +839 -0
- data/doc/general.rsd +49 -0
- data/doc/init.rsd +175 -0
- data/doc/joystick.rsd +387 -0
- data/doc/mixer.rsd +837 -0
- data/doc/mpeg.rsd +595 -0
- data/doc/rsd.rb +125 -0
- data/doc/sdlskk.rsd +496 -0
- data/doc/time.rsd +45 -0
- data/doc/video.rsd +2499 -0
- data/doc/wm.rsd +113 -0
- data/extconf.rb +92 -0
- data/lib/rubysdl_aliases.rb +431 -0
- data/lib/sdl.rb +271 -0
- data/rubysdl.h +109 -0
- data/rubysdl_cdrom.c +176 -0
- data/rubysdl_const_list.txt +280 -0
- data/rubysdl_doc.en.rd +2180 -0
- data/rubysdl_doc_old.rd +2402 -0
- data/rubysdl_event.c +346 -0
- data/rubysdl_event2.c +417 -0
- data/rubysdl_event_key.c +356 -0
- data/rubysdl_image.c +53 -0
- data/rubysdl_joystick.c +156 -0
- data/rubysdl_kanji.c +135 -0
- data/rubysdl_main.c +202 -0
- data/rubysdl_mixer.c +422 -0
- data/rubysdl_mouse.c +96 -0
- data/rubysdl_opengl.c +63 -0
- data/rubysdl_pixel.c +133 -0
- data/rubysdl_ref.html +5550 -0
- data/rubysdl_ref.rd +6163 -0
- data/rubysdl_rwops.c +90 -0
- data/rubysdl_sdlskk.c +312 -0
- data/rubysdl_sge_video.c +622 -0
- data/rubysdl_smpeg.c +341 -0
- data/rubysdl_time.c +36 -0
- data/rubysdl_ttf.c +324 -0
- data/rubysdl_video.c +749 -0
- data/rubysdl_wm.c +71 -0
- data/sample/aadraw.rb +24 -0
- data/sample/alpha.rb +27 -0
- data/sample/alphadraw.rb +25 -0
- data/sample/bfont.rb +24 -0
- data/sample/cdrom.rb +17 -0
- data/sample/collision.rb +97 -0
- data/sample/cursor.bmp +0 -0
- data/sample/cursor.rb +22 -0
- data/sample/ellipses.rb +35 -0
- data/sample/event2.rb +32 -0
- data/sample/font.bmp +0 -0
- data/sample/font.rb +25 -0
- data/sample/fpstimer.rb +175 -0
- data/sample/icon.bmp +0 -0
- data/sample/joy2.rb +81 -0
- data/sample/kanji.rb +36 -0
- data/sample/movesp.rb +93 -0
- data/sample/playmod.rb +14 -0
- data/sample/plaympeg.rb +48 -0
- data/sample/playwave.rb +16 -0
- data/sample/randrect.rb +40 -0
- data/sample/sample.ttf +0 -0
- data/sample/sdlskk.rb +70 -0
- data/sample/sgetest.rb +31 -0
- data/sample/stetris.rb +275 -0
- data/sample/testgl.rb +166 -0
- data/sample/testsprite.rb +68 -0
- data/sample/transformblit.rb +41 -0
- metadata +121 -0
data/rubysdl_smpeg.c
ADDED
@@ -0,0 +1,341 @@
|
|
1
|
+
/*
|
2
|
+
Ruby/SDL Ruby extension library for SDL
|
3
|
+
|
4
|
+
Copyright (C) 2001-2007 Ohbayashi Ippei
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License as published by the Free Software Foundation; either
|
9
|
+
version 2.1 of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This library is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public
|
17
|
+
License along with this library; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
*/
|
20
|
+
#ifdef HAVE_SMPEG
|
21
|
+
#include "rubysdl.h"
|
22
|
+
#include "smpeg/smpeg.h"
|
23
|
+
|
24
|
+
#ifdef HAVE_SDL_MIXER
|
25
|
+
#include "SDL_mixer.h"
|
26
|
+
#endif
|
27
|
+
|
28
|
+
static SMPEG_Filter* filters[3];
|
29
|
+
#define NULL_FILTER 0
|
30
|
+
#define BILINEAR_FILTER 1
|
31
|
+
#define DEBLOCKING_FILTER 2
|
32
|
+
#define NUM_FILTERS 3
|
33
|
+
|
34
|
+
static void setInfoToSMPEGInfo(VALUE obj,SMPEG_Info info)
|
35
|
+
{
|
36
|
+
rb_iv_set(obj,"@has_audio",BOOL(info.has_audio));
|
37
|
+
rb_iv_set(obj,"@has_video",BOOL(info.has_video));
|
38
|
+
rb_iv_set(obj,"@width",INT2NUM(info.width));
|
39
|
+
rb_iv_set(obj,"@height",INT2NUM(info.height));
|
40
|
+
rb_iv_set(obj,"@current_frame",INT2NUM(info.current_frame));
|
41
|
+
rb_iv_set(obj,"@current_fps",INT2NUM(info.current_fps));
|
42
|
+
rb_iv_set(obj,"@audio_string",rb_str_new2(info.audio_string));
|
43
|
+
rb_iv_set(obj,"@audio_current_frame",INT2NUM(info.audio_current_frame));
|
44
|
+
rb_iv_set(obj,"@current_offset",UINT2NUM(info.current_offset));
|
45
|
+
rb_iv_set(obj,"@total_size",UINT2NUM(info.total_size));
|
46
|
+
rb_iv_set(obj,"@current_time",UINT2NUM(info.current_time));
|
47
|
+
rb_iv_set(obj,"@total_time",UINT2NUM(info.total_time));
|
48
|
+
}
|
49
|
+
|
50
|
+
static VALUE smpeg_load(VALUE class,VALUE filename)
|
51
|
+
{
|
52
|
+
SMPEG *mpeg;
|
53
|
+
VALUE obj;
|
54
|
+
char error_msg[2048];
|
55
|
+
|
56
|
+
mpeg = SMPEG_new(GETCSTR(filename),NULL,0);
|
57
|
+
if( SMPEG_error(mpeg) ){
|
58
|
+
snprintf(error_msg,sizeof(error_msg),"Couldn't load %s: %s",
|
59
|
+
GETCSTR(filename),SMPEG_error(mpeg));
|
60
|
+
SMPEG_delete(mpeg);
|
61
|
+
rb_raise(eSDLError,"%s",error_msg);
|
62
|
+
}
|
63
|
+
|
64
|
+
obj = Data_Wrap_Struct(cMPEG,0,SMPEG_delete,mpeg);
|
65
|
+
rb_iv_set(obj,"enable_audio",Qtrue);
|
66
|
+
return obj;
|
67
|
+
}
|
68
|
+
|
69
|
+
static VALUE smpeg_getInfo(VALUE obj,VALUE infoObj)
|
70
|
+
{
|
71
|
+
SMPEG *mpeg;
|
72
|
+
SMPEG_Info info;
|
73
|
+
|
74
|
+
if( !rb_obj_is_kind_of(infoObj,cMPEGInfo) )
|
75
|
+
rb_raise(rb_eArgError,"type mismatch(expect SDL::MPEG::Info)");
|
76
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
77
|
+
|
78
|
+
SMPEG_getinfo(mpeg,&info);
|
79
|
+
setInfoToSMPEGInfo(infoObj,info);
|
80
|
+
|
81
|
+
return Qnil;
|
82
|
+
}
|
83
|
+
|
84
|
+
static VALUE smpeg_enableAudio(VALUE obj,VALUE enable)
|
85
|
+
{
|
86
|
+
SMPEG *mpeg;
|
87
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
88
|
+
rb_iv_set(obj,"enable_audio",enable);
|
89
|
+
return Qnil;
|
90
|
+
}
|
91
|
+
|
92
|
+
static VALUE smpeg_enableVideo(VALUE obj,VALUE enable)
|
93
|
+
{
|
94
|
+
SMPEG *mpeg;
|
95
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
96
|
+
SMPEG_enablevideo(mpeg,RTEST(enable));
|
97
|
+
return Qnil;
|
98
|
+
}
|
99
|
+
|
100
|
+
static VALUE smpeg_status(VALUE obj)
|
101
|
+
{
|
102
|
+
SMPEG *mpeg;
|
103
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
104
|
+
return INT2FIX(SMPEG_status(mpeg));
|
105
|
+
}
|
106
|
+
|
107
|
+
static VALUE smpeg_setVolume(VALUE obj,VALUE volume)
|
108
|
+
{
|
109
|
+
SMPEG *mpeg;
|
110
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
111
|
+
SMPEG_setvolume(mpeg,NUM2INT(volume));
|
112
|
+
return Qnil;
|
113
|
+
}
|
114
|
+
|
115
|
+
static VALUE smpeg_setDisplay(VALUE obj,VALUE dst)
|
116
|
+
{
|
117
|
+
SMPEG *mpeg;
|
118
|
+
SDL_Surface *surface;
|
119
|
+
if( !rb_obj_is_kind_of(dst,cSurface) )
|
120
|
+
rb_raise(rb_eArgError,"type mismatchi(expect Surface)");
|
121
|
+
|
122
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
123
|
+
Data_Get_Struct(dst,SDL_Surface,surface);
|
124
|
+
|
125
|
+
SMPEG_setdisplay(mpeg,surface,NULL,NULL);
|
126
|
+
rb_iv_set(obj,"surface",dst);
|
127
|
+
return Qnil;
|
128
|
+
}
|
129
|
+
|
130
|
+
static VALUE smpeg_setLoop(VALUE obj,VALUE repeat)
|
131
|
+
{
|
132
|
+
SMPEG *mpeg;
|
133
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
134
|
+
SMPEG_loop(mpeg,RTEST(repeat));
|
135
|
+
return Qnil;
|
136
|
+
}
|
137
|
+
|
138
|
+
static VALUE smpeg_scaleXY(VALUE obj,VALUE w,VALUE h)
|
139
|
+
{
|
140
|
+
SMPEG *mpeg;
|
141
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
142
|
+
SMPEG_scaleXY(mpeg,NUM2INT(w),NUM2INT(h));
|
143
|
+
return Qnil;
|
144
|
+
}
|
145
|
+
|
146
|
+
static VALUE smpeg_scale(VALUE obj,VALUE scale)
|
147
|
+
{
|
148
|
+
SMPEG *mpeg;
|
149
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
150
|
+
SMPEG_scale(mpeg,NUM2INT(scale));
|
151
|
+
return Qnil;
|
152
|
+
}
|
153
|
+
|
154
|
+
static VALUE smpeg_move(VALUE obj,VALUE x,VALUE y)
|
155
|
+
{
|
156
|
+
SMPEG *mpeg;
|
157
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
158
|
+
SMPEG_move(mpeg,NUM2INT(x),NUM2INT(y));
|
159
|
+
return Qnil;
|
160
|
+
}
|
161
|
+
|
162
|
+
static VALUE smpeg_setDisplayRegion(VALUE obj,VALUE x,VALUE y,VALUE w,
|
163
|
+
VALUE h)
|
164
|
+
{
|
165
|
+
SMPEG *mpeg;
|
166
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
167
|
+
SMPEG_setdisplayregion(mpeg,NUM2INT(x),NUM2INT(y),NUM2INT(w),NUM2INT(h));
|
168
|
+
return Qnil;
|
169
|
+
}
|
170
|
+
|
171
|
+
static VALUE smpeg_play(VALUE obj)
|
172
|
+
{
|
173
|
+
SMPEG *mpeg;
|
174
|
+
int use_audio;
|
175
|
+
|
176
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
177
|
+
|
178
|
+
#if HAVE_SDL_MIXER
|
179
|
+
use_audio = RTEST(rb_iv_get(obj,"enable_audio")) &&
|
180
|
+
Mix_QuerySpec( NULL, NULL, NULL );
|
181
|
+
|
182
|
+
if( use_audio ){
|
183
|
+
SDL_AudioSpec audiofmt;
|
184
|
+
Uint16 format;
|
185
|
+
int freq, channels;
|
186
|
+
|
187
|
+
SMPEG_enableaudio(mpeg, 0);
|
188
|
+
/* Tell SMPEG what the audio format is */
|
189
|
+
Mix_QuerySpec(&freq, &format, &channels);
|
190
|
+
audiofmt.format = format;
|
191
|
+
audiofmt.freq = freq;
|
192
|
+
audiofmt.channels = channels;
|
193
|
+
SMPEG_actualSpec(mpeg, &audiofmt);
|
194
|
+
|
195
|
+
/* Hook in the MPEG music mixer */
|
196
|
+
Mix_HookMusic(NULL,NULL);
|
197
|
+
Mix_HookMusic(SMPEG_playAudioSDL, mpeg);
|
198
|
+
SMPEG_enableaudio(mpeg, 1);
|
199
|
+
}
|
200
|
+
#else
|
201
|
+
SMPEG_enableaudio(mpeg, RTEST(rb_iv_get(obj,"enable_audio")));
|
202
|
+
#endif
|
203
|
+
|
204
|
+
SMPEG_play(mpeg);
|
205
|
+
return Qnil;
|
206
|
+
}
|
207
|
+
|
208
|
+
static VALUE smpeg_pause(VALUE obj)
|
209
|
+
{
|
210
|
+
SMPEG *mpeg;
|
211
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
212
|
+
SMPEG_pause(mpeg);
|
213
|
+
return Qnil;
|
214
|
+
}
|
215
|
+
|
216
|
+
static VALUE smpeg_stop(VALUE obj)
|
217
|
+
{
|
218
|
+
SMPEG *mpeg;
|
219
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
220
|
+
SMPEG_stop(mpeg);
|
221
|
+
Mix_HookMusic(NULL,NULL);
|
222
|
+
return Qnil;
|
223
|
+
}
|
224
|
+
|
225
|
+
static VALUE smpeg_rewind(VALUE obj)
|
226
|
+
{
|
227
|
+
SMPEG *mpeg;
|
228
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
229
|
+
SMPEG_rewind(mpeg);
|
230
|
+
return Qnil;
|
231
|
+
}
|
232
|
+
|
233
|
+
static VALUE smpeg_seek(VALUE obj,VALUE bytes)
|
234
|
+
{
|
235
|
+
SMPEG *mpeg;
|
236
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
237
|
+
SMPEG_seek(mpeg,NUM2INT(bytes));
|
238
|
+
return Qnil;
|
239
|
+
}
|
240
|
+
|
241
|
+
static VALUE smpeg_skip(VALUE obj,VALUE seconds)
|
242
|
+
{
|
243
|
+
SMPEG *mpeg;
|
244
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
245
|
+
SMPEG_skip(mpeg,NUM2DBL(seconds));
|
246
|
+
return Qnil;
|
247
|
+
}
|
248
|
+
|
249
|
+
static VALUE smpeg_renderFrame(VALUE obj,VALUE framenum)
|
250
|
+
{
|
251
|
+
SMPEG *mpeg;
|
252
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
253
|
+
SMPEG_renderFrame(mpeg,NUM2INT(framenum));
|
254
|
+
return Qnil;
|
255
|
+
}
|
256
|
+
|
257
|
+
static VALUE smpeg_renderFinal(VALUE obj,VALUE dst, VALUE x, VALUE y)
|
258
|
+
{
|
259
|
+
SMPEG *mpeg;
|
260
|
+
SDL_Surface *surface;
|
261
|
+
if( !rb_obj_is_kind_of(dst,cSurface) )
|
262
|
+
rb_raise(rb_eArgError,"type mismatchi(expect Surface)");
|
263
|
+
|
264
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
265
|
+
Data_Get_Struct(dst,SDL_Surface,surface);
|
266
|
+
|
267
|
+
SMPEG_renderFinal(mpeg, surface, NUM2INT(x), NUM2INT(y));
|
268
|
+
return Qnil;
|
269
|
+
}
|
270
|
+
|
271
|
+
static VALUE smpeg_setFilter(VALUE obj,VALUE filter)
|
272
|
+
{
|
273
|
+
SMPEG *mpeg;
|
274
|
+
|
275
|
+
Data_Get_Struct(obj,SMPEG,mpeg);
|
276
|
+
if( (NUM2INT(filter)<0) || (NUM2INT(filter)>=NUM_FILTERS) )
|
277
|
+
rb_raise(eSDLError,"There isn't that filter");
|
278
|
+
SMPEG_filter(mpeg,filters[NUM2INT(filter)]);
|
279
|
+
return Qnil;
|
280
|
+
}
|
281
|
+
|
282
|
+
static void defineConstForSMPEG()
|
283
|
+
{
|
284
|
+
rb_define_const(cMPEG,"ERROR",INT2FIX(SMPEG_ERROR));
|
285
|
+
rb_define_const(cMPEG,"STOPPED",INT2FIX(SMPEG_STOPPED));
|
286
|
+
rb_define_const(cMPEG,"PLAYING",INT2FIX(SMPEG_PLAYING));
|
287
|
+
rb_define_const(cMPEG,"NULL_FILTER",INT2FIX(NULL_FILTER));
|
288
|
+
rb_define_const(cMPEG,"BILINEAR_FILTER",INT2FIX(BILINEAR_FILTER));
|
289
|
+
rb_define_const(cMPEG,"DEBLOCKING_FILTER",INT2FIX(DEBLOCKING_FILTER));
|
290
|
+
}
|
291
|
+
|
292
|
+
void init_smpeg()
|
293
|
+
{
|
294
|
+
cMPEG = rb_define_class_under(mSDL,"MPEG",rb_cObject);
|
295
|
+
cMPEGInfo = rb_define_class_under(cMPEG,"Info",rb_cObject);
|
296
|
+
|
297
|
+
filters[NULL_FILTER] = SMPEGfilter_null();
|
298
|
+
filters[BILINEAR_FILTER] = SMPEGfilter_bilinear();
|
299
|
+
filters[DEBLOCKING_FILTER] = SMPEGfilter_deblocking();
|
300
|
+
|
301
|
+
defineConstForSMPEG();
|
302
|
+
|
303
|
+
rb_define_attr(cMPEGInfo,"has_audio",1,0);
|
304
|
+
rb_define_attr(cMPEGInfo,"has_video",1,0);
|
305
|
+
rb_define_attr(cMPEGInfo,"width",1,0);
|
306
|
+
rb_define_attr(cMPEGInfo,"height",1,0);
|
307
|
+
rb_define_attr(cMPEGInfo,"current_frame",1,0);
|
308
|
+
rb_define_attr(cMPEGInfo,"current_fps",1,0);
|
309
|
+
rb_define_attr(cMPEGInfo,"audio_string",1,0);
|
310
|
+
rb_define_attr(cMPEGInfo,"audio_current_frame",1,0);
|
311
|
+
rb_define_attr(cMPEGInfo,"current_offset",1,0);
|
312
|
+
rb_define_attr(cMPEGInfo,"total_size",1,0);
|
313
|
+
rb_define_attr(cMPEGInfo,"current_time",1,0);
|
314
|
+
rb_define_attr(cMPEGInfo,"total_time",1,0);
|
315
|
+
|
316
|
+
rb_define_singleton_method(cMPEG,"load",smpeg_load,1);
|
317
|
+
rb_define_singleton_method(cMPEG,"new",smpeg_load,1);
|
318
|
+
|
319
|
+
rb_define_method(cMPEG,"info",smpeg_getInfo,1);
|
320
|
+
rb_define_method(cMPEG,"enableAudio",smpeg_enableAudio,1);
|
321
|
+
rb_define_method(cMPEG,"enableVideo",smpeg_enableVideo,1);
|
322
|
+
rb_define_method(cMPEG,"status",smpeg_status,0);
|
323
|
+
rb_define_method(cMPEG,"setVolume",smpeg_setVolume,1);
|
324
|
+
rb_define_method(cMPEG,"setDisplay",smpeg_setDisplay,1);
|
325
|
+
rb_define_method(cMPEG,"setLoop",smpeg_setLoop,1);
|
326
|
+
rb_define_method(cMPEG,"scaleXY",smpeg_scaleXY,2);
|
327
|
+
rb_define_method(cMPEG,"scale",smpeg_scale,1);
|
328
|
+
rb_define_method(cMPEG,"move",smpeg_move,1);
|
329
|
+
rb_define_method(cMPEG,"setDisplayRegion",smpeg_setDisplayRegion,4);
|
330
|
+
rb_define_method(cMPEG,"play",smpeg_play,0);
|
331
|
+
rb_define_method(cMPEG,"pause",smpeg_pause,0);
|
332
|
+
rb_define_method(cMPEG,"stop",smpeg_stop,0);
|
333
|
+
rb_define_method(cMPEG,"rewind",smpeg_rewind,0);
|
334
|
+
rb_define_method(cMPEG,"seek",smpeg_seek,1);
|
335
|
+
rb_define_method(cMPEG,"skip",smpeg_skip,1);
|
336
|
+
rb_define_method(cMPEG,"renderFrame",smpeg_renderFrame,1);
|
337
|
+
rb_define_method(cMPEG,"renderFinal",smpeg_renderFinal,3);
|
338
|
+
rb_define_method(cMPEG,"setFilter",smpeg_setFilter,1);
|
339
|
+
|
340
|
+
}
|
341
|
+
#endif /* HAVE_SMPEG */
|
data/rubysdl_time.c
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
/*
|
2
|
+
Ruby/SDL Ruby extension library for SDL
|
3
|
+
|
4
|
+
Copyright (C) 2001-2007 Ohbayashi Ippei
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License as published by the Free Software Foundation; either
|
9
|
+
version 2.1 of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This library is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public
|
17
|
+
License along with this library; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
*/
|
20
|
+
#include "rubysdl.h"
|
21
|
+
|
22
|
+
static VALUE sdl_getTicks(VALUE mod)
|
23
|
+
{
|
24
|
+
return UINT2NUM(SDL_GetTicks());
|
25
|
+
}
|
26
|
+
static VALUE sdl_delay(VALUE mod,VALUE ms)
|
27
|
+
{
|
28
|
+
SDL_Delay(NUM2UINT(ms));
|
29
|
+
return Qnil;
|
30
|
+
}
|
31
|
+
|
32
|
+
void init_time()
|
33
|
+
{
|
34
|
+
rb_define_module_function(mSDL,"getTicks",sdl_getTicks,0);
|
35
|
+
rb_define_module_function(mSDL,"delay",sdl_delay,1);
|
36
|
+
}
|
data/rubysdl_ttf.c
ADDED
@@ -0,0 +1,324 @@
|
|
1
|
+
/*
|
2
|
+
Ruby/SDL Ruby extension library for SDL
|
3
|
+
|
4
|
+
Copyright (C) 2001-2007 Ohbayashi Ippei
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License as published by the Free Software Foundation; either
|
9
|
+
version 2.1 of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This library is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public
|
17
|
+
License along with this library; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
*/
|
20
|
+
#ifdef HAVE_SDL_TTF
|
21
|
+
#include "rubysdl.h"
|
22
|
+
#include <SDL_ttf.h>
|
23
|
+
|
24
|
+
typedef SDL_Surface* (*RenderFunc)(TTF_Font *,const char *,SDL_Color,SDL_Color);
|
25
|
+
|
26
|
+
static int ttf_initialized=0;
|
27
|
+
static int ttf_finalized=0;
|
28
|
+
|
29
|
+
static void ttf_closeFont(TTF_Font *font)
|
30
|
+
{
|
31
|
+
if( !ttf_finalized )
|
32
|
+
TTF_CloseFont(font);
|
33
|
+
}
|
34
|
+
static VALUE sdl_ttf_init(VALUE class)
|
35
|
+
{
|
36
|
+
if( TTF_Init()== -1 )
|
37
|
+
rb_raise(eSDLError,"Couldn't initialize TTF engine: %s",TTF_GetError());
|
38
|
+
ttf_initialized=1;
|
39
|
+
return Qnil;
|
40
|
+
}
|
41
|
+
static VALUE sdl_ttf_wasInit(VALUE class)
|
42
|
+
{
|
43
|
+
return BOOL(TTF_WasInit());
|
44
|
+
}
|
45
|
+
|
46
|
+
static VALUE sdl_ttf_open(int argc, VALUE *argv, VALUE class)
|
47
|
+
{
|
48
|
+
TTF_Font *font;
|
49
|
+
VALUE filename, size, index;
|
50
|
+
rb_scan_args( argc, argv, "21", &filename, &size, &index );
|
51
|
+
if( NIL_P(index) )
|
52
|
+
font=TTF_OpenFont( GETCSTR(filename),NUM2INT(size) );
|
53
|
+
else
|
54
|
+
#ifdef HAVE_TTF_OPENFONTINDEX
|
55
|
+
font=TTF_OpenFontIndex( GETCSTR(filename),NUM2INT(size),NUM2INT(index) );
|
56
|
+
#else
|
57
|
+
if( index != 0)
|
58
|
+
rb_raise(rb_eRuntimeError,"Not supported for selecting indivisual font face by SDL_ttf. The feature is in SDL_ttf 2.0.4 or later.");
|
59
|
+
else
|
60
|
+
font=TTF_OpenFont( GETCSTR(filename),NUM2INT(size) );
|
61
|
+
#endif
|
62
|
+
if( font==NULL )
|
63
|
+
rb_raise(eSDLError,"Couldn't open font %s: %s",GETCSTR(filename),
|
64
|
+
TTF_GetError());
|
65
|
+
return Data_Wrap_Struct(class,0,ttf_closeFont,font);
|
66
|
+
}
|
67
|
+
static VALUE sdl_ttf_getFontStyle(VALUE obj)
|
68
|
+
{
|
69
|
+
TTF_Font *font;
|
70
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
71
|
+
return INT2FIX( TTF_GetFontStyle(font) );
|
72
|
+
}
|
73
|
+
static VALUE sdl_ttf_setFontStyle(VALUE obj,VALUE style)
|
74
|
+
{
|
75
|
+
TTF_Font *font;
|
76
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
77
|
+
TTF_SetFontStyle(font,NUM2UINT(style));
|
78
|
+
return Qnil;
|
79
|
+
}
|
80
|
+
static VALUE sdl_ttf_getFontFaces(VALUE obj)
|
81
|
+
{
|
82
|
+
#ifdef TTF_FONTFACES
|
83
|
+
TTF_Font *font;
|
84
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
85
|
+
return UINT2NUM( TTF_FontFaces(font) );
|
86
|
+
#else
|
87
|
+
rb_raise(rb_eRuntimeError,"Not supported. The feature is in SDL_ttf 2.0.4 or later.");
|
88
|
+
#endif
|
89
|
+
}
|
90
|
+
static VALUE sdl_ttf_FontFaceIsFixedWidth(VALUE obj)
|
91
|
+
{
|
92
|
+
#ifdef TTF_FONTISFIXEDWIDTH
|
93
|
+
TTF_Font *font;
|
94
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
95
|
+
if( TTF_FontFaceIsFixedWidth(font) )
|
96
|
+
return Qtrue;
|
97
|
+
else
|
98
|
+
return Qfalse;
|
99
|
+
#else
|
100
|
+
rb_raise(rb_eRuntimeError,"Not supported. The feature is in SDL_ttf 2.0.4 or later.");
|
101
|
+
#endif
|
102
|
+
}
|
103
|
+
static VALUE sdl_ttf_FontFaceFamilyName(VALUE obj)
|
104
|
+
{
|
105
|
+
#ifdef TTF_FONTFACEFAMILYNAME
|
106
|
+
TTF_Font *font;
|
107
|
+
char* name;
|
108
|
+
|
109
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
110
|
+
name = TTF_FontFaceFamilyName(font);
|
111
|
+
if(name == NULL)
|
112
|
+
return Qnil;
|
113
|
+
else
|
114
|
+
return rb_str_new2(name);
|
115
|
+
#else
|
116
|
+
rb_raise(rb_eRuntimeError,"Not supported. The feature is in SDL_ttf 2.0.4 or later.");
|
117
|
+
#endif
|
118
|
+
}
|
119
|
+
static VALUE sdl_ttf_FontFaceStyleName(VALUE obj)
|
120
|
+
{
|
121
|
+
#ifdef TTF_FONTFACESTYLENAME
|
122
|
+
TTF_Font *font;
|
123
|
+
char* name;
|
124
|
+
|
125
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
126
|
+
name = TTF_FontFaceStyleName(font);
|
127
|
+
if(name == NULL)
|
128
|
+
return Qnil;
|
129
|
+
else
|
130
|
+
return rb_str_new2( (const char *) );
|
131
|
+
#else
|
132
|
+
rb_raise(rb_eRuntimeError,"Not supported. The feature is in SDL_ttf 2.0.4 or later.");
|
133
|
+
#endif
|
134
|
+
}
|
135
|
+
static VALUE sdl_ttf_sizeText(VALUE obj,VALUE text)
|
136
|
+
{
|
137
|
+
TTF_Font *font;
|
138
|
+
int w,h;
|
139
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
140
|
+
TTF_SizeUTF8(font,GETCSTR(text),&w,&h);
|
141
|
+
return rb_ary_new3(2,INT2FIX(w),INT2FIX(h));
|
142
|
+
}
|
143
|
+
|
144
|
+
static VALUE sdl_ttf_fontHeight(VALUE obj)
|
145
|
+
{
|
146
|
+
TTF_Font *font;
|
147
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
148
|
+
return INT2FIX(TTF_FontHeight(font));
|
149
|
+
}
|
150
|
+
|
151
|
+
static VALUE sdl_ttf_fontAscent(VALUE obj)
|
152
|
+
{
|
153
|
+
TTF_Font *font;
|
154
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
155
|
+
return INT2FIX(TTF_FontAscent(font));
|
156
|
+
}
|
157
|
+
|
158
|
+
static VALUE sdl_ttf_fontDescent(VALUE obj)
|
159
|
+
{
|
160
|
+
TTF_Font *font;
|
161
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
162
|
+
return INT2FIX(TTF_FontDescent(font));
|
163
|
+
}
|
164
|
+
|
165
|
+
static VALUE sdl_ttf_fontLineSkip(VALUE obj)
|
166
|
+
{
|
167
|
+
TTF_Font *font;
|
168
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
169
|
+
return INT2FIX(TTF_FontLineSkip(font));
|
170
|
+
}
|
171
|
+
|
172
|
+
static VALUE ttf_draw(VALUE obj,VALUE dest,VALUE text,VALUE x,
|
173
|
+
VALUE y,VALUE fgr,VALUE fgg,VALUE fgb,
|
174
|
+
VALUE bgr,VALUE bgg,VALUE bgb,RenderFunc render)
|
175
|
+
{
|
176
|
+
TTF_Font *font;
|
177
|
+
SDL_Surface *destSurface, *tmpSurface;
|
178
|
+
SDL_Color fg,bg;
|
179
|
+
SDL_Rect destRect;
|
180
|
+
int result;
|
181
|
+
char *ctext=GETCSTR(text);
|
182
|
+
/* If text=="" , TTF_RenderUTF8_Solid() and etc fail to render */
|
183
|
+
if( ctext[0]=='\0' )return INT2FIX(0);
|
184
|
+
|
185
|
+
if( !rb_obj_is_kind_of( dest,cSurface ) )
|
186
|
+
rb_raise( rb_eArgError,"type mismatch(expect Surface)");
|
187
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
188
|
+
Data_Get_Struct(dest,SDL_Surface,destSurface);
|
189
|
+
fg.r=NUM2UINT(fgr); fg.g=NUM2UINT(fgg); fg.b=NUM2UINT(fgb);
|
190
|
+
bg.r=NUM2UINT(bgr); bg.g=NUM2UINT(bgg); bg.b=NUM2UINT(bgb);
|
191
|
+
SetRect(destRect,x,y,1,1);
|
192
|
+
|
193
|
+
tmpSurface=render(font,ctext,fg,bg);
|
194
|
+
if( tmpSurface==NULL )
|
195
|
+
rb_raise(eSDLError,"Text Render fail: %s",TTF_GetError());
|
196
|
+
|
197
|
+
result=SDL_BlitSurface(tmpSurface,NULL,destSurface,&destRect);
|
198
|
+
SDL_FreeSurface(tmpSurface);
|
199
|
+
if( result == -1 ){
|
200
|
+
rb_raise(eSDLError,"SDL_BlitSurface fail: %s",SDL_GetError());
|
201
|
+
}
|
202
|
+
return INT2NUM(result);
|
203
|
+
}
|
204
|
+
|
205
|
+
|
206
|
+
static SDL_Surface* ttf_wrap_RenderUTF8_Solid(TTF_Font *font,
|
207
|
+
const char *text,
|
208
|
+
SDL_Color fg,
|
209
|
+
SDL_Color bg)
|
210
|
+
{
|
211
|
+
return TTF_RenderUTF8_Solid(font,text,fg);
|
212
|
+
}
|
213
|
+
|
214
|
+
static VALUE sdl_ttf_drawSolidUTF8(VALUE obj,VALUE dest,VALUE text,VALUE x,
|
215
|
+
VALUE y,VALUE r,VALUE g,VALUE b)
|
216
|
+
{
|
217
|
+
return ttf_draw(obj,dest,text,x,y,r,g,b,1,1,1,ttf_wrap_RenderUTF8_Solid);
|
218
|
+
}
|
219
|
+
static SDL_Surface* ttf_wrap_RenderUTF8_Blended(TTF_Font *font,
|
220
|
+
const char *text,
|
221
|
+
SDL_Color fg,
|
222
|
+
SDL_Color bg)
|
223
|
+
{
|
224
|
+
return TTF_RenderUTF8_Blended(font,text,fg);
|
225
|
+
}
|
226
|
+
|
227
|
+
static VALUE sdl_ttf_drawBlendedUTF8(VALUE obj,VALUE dest,VALUE text,VALUE x,
|
228
|
+
VALUE y,VALUE r,VALUE g,VALUE b)
|
229
|
+
{
|
230
|
+
return ttf_draw(obj,dest,text,x,y,r,g,b,1,1,1,ttf_wrap_RenderUTF8_Blended);
|
231
|
+
}
|
232
|
+
|
233
|
+
static VALUE sdl_ttf_drawShadedUTF8(VALUE obj,VALUE dest, VALUE text,VALUE x,
|
234
|
+
VALUE y,VALUE fgr,VALUE fgg,VALUE fgb,
|
235
|
+
VALUE bgr,VALUE bgg,VALUE bgb)
|
236
|
+
{
|
237
|
+
return ttf_draw(obj,dest,text,x,y,fgr,fgg,fgb,bgr,bgg,bgb,
|
238
|
+
TTF_RenderUTF8_Shaded);
|
239
|
+
}
|
240
|
+
|
241
|
+
static VALUE ttf_render(VALUE obj,VALUE text,VALUE fgr,VALUE fgg,VALUE fgb,
|
242
|
+
VALUE bgr,VALUE bgg,VALUE bgb,RenderFunc render)
|
243
|
+
{
|
244
|
+
TTF_Font *font;
|
245
|
+
SDL_Surface *surface;
|
246
|
+
SDL_Color fg,bg;
|
247
|
+
|
248
|
+
Data_Get_Struct(obj,TTF_Font,font);
|
249
|
+
fg.r=NUM2UINT(fgr); fg.g=NUM2UINT(fgg); fg.b=NUM2UINT(fgb);
|
250
|
+
bg.r=NUM2UINT(bgr); bg.g=NUM2UINT(bgg); bg.b=NUM2UINT(bgb);
|
251
|
+
|
252
|
+
surface = render( font, GETCSTR(text), fg, bg );
|
253
|
+
|
254
|
+
if( surface == NULL )
|
255
|
+
return Qnil;
|
256
|
+
|
257
|
+
return Data_Wrap_Struct(cSurface,0,sdl_freeSurface,surface);
|
258
|
+
}
|
259
|
+
|
260
|
+
static VALUE sdl_ttf_renderSolidUTF8(VALUE obj,VALUE text,VALUE r,
|
261
|
+
VALUE g,VALUE b)
|
262
|
+
{
|
263
|
+
return ttf_render(obj,text,r,g,b,1,1,1,ttf_wrap_RenderUTF8_Solid);
|
264
|
+
}
|
265
|
+
|
266
|
+
static VALUE sdl_ttf_renderBlendedUTF8(VALUE obj,VALUE text,VALUE r,
|
267
|
+
VALUE g,VALUE b)
|
268
|
+
{
|
269
|
+
return ttf_render(obj,text,r,g,b,1,1,1,ttf_wrap_RenderUTF8_Blended);
|
270
|
+
}
|
271
|
+
|
272
|
+
static VALUE sdl_ttf_renderShadedUTF8(VALUE obj,VALUE text,
|
273
|
+
VALUE fgr,VALUE fgg,VALUE fgb,
|
274
|
+
VALUE bgr,VALUE bgg,VALUE bgb)
|
275
|
+
{
|
276
|
+
return ttf_render(obj,text,fgr,fgg,fgb,bgr,bgg,bgb,TTF_RenderUTF8_Shaded);
|
277
|
+
}
|
278
|
+
|
279
|
+
static void defineConstForTTF()
|
280
|
+
{
|
281
|
+
rb_define_const(cTTF,"STYLE_NORMAL",UINT2NUM(TTF_STYLE_NORMAL));
|
282
|
+
rb_define_const(cTTF,"STYLE_BOLD",UINT2NUM(TTF_STYLE_BOLD));
|
283
|
+
rb_define_const(cTTF,"STYLE_ITALIC",UINT2NUM(TTF_STYLE_ITALIC));
|
284
|
+
rb_define_const(cTTF,"STYLE_UNDERLINE",UINT2NUM(TTF_STYLE_UNDERLINE));
|
285
|
+
}
|
286
|
+
void init_ttf()
|
287
|
+
{
|
288
|
+
cTTF=rb_define_class_under(mSDL,"TTF",rb_cObject);
|
289
|
+
rb_define_singleton_method(cTTF,"init",sdl_ttf_init,0);
|
290
|
+
rb_define_singleton_method(cTTF,"init?",sdl_ttf_wasInit,0);
|
291
|
+
rb_define_singleton_method(cTTF,"open",sdl_ttf_open,-1);
|
292
|
+
|
293
|
+
rb_define_method(cTTF,"style",sdl_ttf_getFontStyle,0);
|
294
|
+
rb_define_method(cTTF,"style=",sdl_ttf_setFontStyle,1);
|
295
|
+
rb_define_method(cTTF,"textSize",sdl_ttf_sizeText,1);
|
296
|
+
rb_define_method(cTTF,"faces",sdl_ttf_getFontFaces,0);
|
297
|
+
rb_define_method(cTTF,"fixedWidth?",sdl_ttf_FontFaceIsFixedWidth,0);
|
298
|
+
rb_define_method(cTTF,"familyName",sdl_ttf_FontFaceFamilyName,0);
|
299
|
+
rb_define_method(cTTF,"styleName",sdl_ttf_FontFaceStyleName,0);
|
300
|
+
|
301
|
+
rb_define_method(cTTF,"height",sdl_ttf_fontHeight,0);
|
302
|
+
rb_define_method(cTTF,"ascent",sdl_ttf_fontAscent,0);
|
303
|
+
rb_define_method(cTTF,"descent",sdl_ttf_fontDescent,0);
|
304
|
+
rb_define_method(cTTF,"lineSkip",sdl_ttf_fontLineSkip,0);
|
305
|
+
|
306
|
+
rb_define_method(cTTF,"drawSolidUTF8",sdl_ttf_drawSolidUTF8,7);
|
307
|
+
rb_define_method(cTTF,"drawBlendedUTF8",sdl_ttf_drawBlendedUTF8,7);
|
308
|
+
rb_define_method(cTTF,"drawShadedUTF8",sdl_ttf_drawShadedUTF8,10);
|
309
|
+
|
310
|
+
rb_define_method(cTTF,"renderSolidUTF8",sdl_ttf_renderSolidUTF8,4);
|
311
|
+
rb_define_method(cTTF,"renderBlendedUTF8",sdl_ttf_renderBlendedUTF8,4);
|
312
|
+
rb_define_method(cTTF,"renderShadedUTF8",sdl_ttf_renderShadedUTF8,7);
|
313
|
+
|
314
|
+
defineConstForTTF();
|
315
|
+
}
|
316
|
+
void quit_ttf()
|
317
|
+
{
|
318
|
+
if(ttf_initialized){
|
319
|
+
TTF_Quit();
|
320
|
+
ttf_finalized=1;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
324
|
+
#endif /* HAVE_SDL_TTF */
|