ray 0.0.0.pre2 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +3 -0
  3. data/README.md +62 -0
  4. data/Rakefile +33 -23
  5. data/VERSION +1 -1
  6. data/ext/audio.c +473 -0
  7. data/ext/color.c +4 -4
  8. data/ext/event.c +25 -3
  9. data/ext/extconf.rb +35 -22
  10. data/ext/font.c +287 -0
  11. data/ext/image.c +682 -33
  12. data/ext/joystick.c +9 -9
  13. data/ext/ray.c +166 -55
  14. data/ext/ray.h +120 -9
  15. data/ext/ray_osx.m +161 -0
  16. data/ext/rect.c +31 -4
  17. data/lib/ray/audio.rb +52 -0
  18. data/lib/ray/color.rb +16 -0
  19. data/lib/ray/dsl.rb +1 -3
  20. data/lib/ray/dsl/event.rb +1 -39
  21. data/lib/ray/dsl/event_listener.rb +38 -0
  22. data/lib/ray/dsl/event_runner.rb +3 -1
  23. data/lib/ray/dsl/event_translator.rb +74 -8
  24. data/lib/ray/dsl/handler.rb +3 -33
  25. data/lib/ray/dsl/matcher.rb +129 -23
  26. data/lib/ray/font.rb +108 -0
  27. data/lib/ray/font_set.rb +37 -0
  28. data/lib/ray/game.rb +171 -34
  29. data/lib/ray/helper.rb +43 -5
  30. data/lib/ray/image.rb +90 -3
  31. data/lib/ray/image_set.rb +35 -0
  32. data/lib/ray/joystick.rb +30 -0
  33. data/lib/ray/music_set.rb +35 -0
  34. data/lib/ray/ray.rb +17 -9
  35. data/lib/ray/rect.rb +51 -0
  36. data/lib/ray/resource_set.rb +92 -0
  37. data/lib/ray/scene.rb +220 -51
  38. data/lib/ray/sound_set.rb +35 -0
  39. data/lib/ray/sprite.rb +184 -0
  40. data/psp/ext.c +4 -0
  41. data/samples/hello_world/hello.rb +35 -0
  42. data/samples/hello_world/hello_dsl.rb +24 -0
  43. data/samples/pong/pong.rb +128 -0
  44. data/samples/sokoban/level_1 +7 -0
  45. data/samples/sokoban/sokoban.rb +370 -0
  46. data/spec/ray/audio_spec.rb +146 -0
  47. data/spec/ray/color_spec.rb +13 -0
  48. data/spec/ray/event_spec.rb +57 -168
  49. data/spec/ray/font_spec.rb +93 -0
  50. data/spec/ray/image_set_spec.rb +48 -0
  51. data/spec/ray/image_spec.rb +130 -44
  52. data/spec/ray/joystick_spec.rb +13 -9
  53. data/spec/ray/matcher_spec.rb +32 -55
  54. data/spec/ray/ray_spec.rb +33 -31
  55. data/spec/ray/rect_spec.rb +80 -0
  56. data/spec/ray/resource_set_spec.rb +105 -0
  57. data/spec/ray/sprite_spec.rb +163 -0
  58. data/spec/res/VeraMono.ttf +0 -0
  59. data/spec/res/aqua2.bmp +0 -0
  60. data/spec/res/pop.wav +0 -0
  61. data/spec/spec.opts +4 -0
  62. data/spec/spec_helper.rb +8 -0
  63. data/yard_ext.rb +91 -0
  64. metadata +104 -38
  65. data/bin/ray +0 -5
  66. data/bin/ray_irb +0 -4
  67. data/ext/SDLMain.h +0 -17
  68. data/ext/SDLMain.m +0 -381
  69. data/lib/ray/config.rb +0 -84
  70. data/lib/ray/dsl/converter.rb +0 -65
  71. data/lib/ray/dsl/listener.rb +0 -30
  72. data/lib/ray/dsl/type.rb +0 -58
  73. data/spec/ray/config_spec.rb +0 -90
  74. data/spec/ray/conversion_spec.rb +0 -43
  75. data/spec/ray/type_spec.rb +0 -17
  76. data/spec_runner.rb +0 -27
data/ext/color.c CHANGED
@@ -55,7 +55,7 @@ VALUE ray_init_color(int argc, VALUE *argv, VALUE self) {
55
55
  return Qnil;
56
56
  }
57
57
 
58
- /* @return [Integer] red level */
58
+ /* @return [Integer] red intensity */
59
59
  VALUE ray_color_r(VALUE self) {
60
60
  ray_color *ret;
61
61
  Data_Get_Struct(self, ray_color, ret);
@@ -63,7 +63,7 @@ VALUE ray_color_r(VALUE self) {
63
63
  return INT2FIX(ret->r);
64
64
  }
65
65
 
66
- /* @return [Integer] green level */
66
+ /* @return [Integer] green intensity */
67
67
  VALUE ray_color_g(VALUE self) {
68
68
  ray_color *ret;
69
69
  Data_Get_Struct(self, ray_color, ret);
@@ -71,7 +71,7 @@ VALUE ray_color_g(VALUE self) {
71
71
  return INT2FIX(ret->g);
72
72
  }
73
73
 
74
- /* @return [Integer] blue level */
74
+ /* @return [Integer] blue intensity */
75
75
  VALUE ray_color_b(VALUE self) {
76
76
  ray_color *ret;
77
77
  Data_Get_Struct(self, ray_color, ret);
@@ -79,7 +79,7 @@ VALUE ray_color_b(VALUE self) {
79
79
  return INT2FIX(ret->b);
80
80
  }
81
81
 
82
- /* @return [Integer] alpha level */
82
+ /* @return [Integer] alpha intensity */
83
83
  VALUE ray_color_a(VALUE self) {
84
84
  ray_color *ret;
85
85
  Data_Get_Struct(self, ray_color, ret);
data/ext/event.c CHANGED
@@ -26,7 +26,7 @@ VALUE ray_alloc_event(VALUE self) {
26
26
  }
27
27
 
28
28
  /*
29
- Creates the event according to what's happening now.
29
+ Creates the event according to the next event of the stack.
30
30
  */
31
31
  VALUE ray_init_event(VALUE self) {
32
32
  SDL_Event *event = ray_rb2event(self);
@@ -105,10 +105,11 @@ VALUE ray_event_mod_keys(VALUE self) {
105
105
  }
106
106
 
107
107
  /*
108
- @return [Integer, nil] A mask of the focus states, for active event.
108
+ @return [Integer, nil] A mask of the focus states, for active events
109
+ (when type is TYPE_ACTIVEEVENT)
109
110
  */
110
111
  VALUE ray_event_focus_state(VALUE self) {
111
- SDL_Event *ev = ray_rb2event(self);
112
+ SDL_Event *ev = ray_rb2event(self);
112
113
  if (ev->type != SDL_ACTIVEEVENT)
113
114
  return Qnil;
114
115
  return INT2FIX(ev->active.state);
@@ -200,6 +201,24 @@ VALUE ray_event_joystick_button(VALUE self) {
200
201
  return Qnil;
201
202
  }
202
203
 
204
+ /* @return [Integer, nil] The new width of the window */
205
+ VALUE ray_event_window_w(VALUE self) {
206
+ SDL_Event *ev = ray_rb2event(self);
207
+ if (ev->type == SDL_VIDEORESIZE)
208
+ return INT2FIX(ev->resize.w);
209
+
210
+ return Qnil;
211
+ }
212
+
213
+ /* @return [Integer, nil] The new height of the window */
214
+ VALUE ray_event_window_h(VALUE self) {
215
+ SDL_Event *ev = ray_rb2event(self);
216
+ if (ev->type == SDL_VIDEORESIZE)
217
+ return INT2FIX(ev->resize.h);
218
+
219
+ return Qnil;
220
+ }
221
+
203
222
  void Init_ray_event() {
204
223
  ray_cEvent = rb_define_class_under(ray_mRay, "Event", rb_cObject);
205
224
  rb_define_alloc_func(ray_cEvent, ray_alloc_event);
@@ -228,6 +247,9 @@ void Init_ray_event() {
228
247
  rb_define_method(ray_cEvent, "axis_value", ray_event_axis_value, 0);
229
248
  rb_define_method(ray_cEvent, "joystick_button", ray_event_joystick_button, 0);
230
249
 
250
+ rb_define_method(ray_cEvent, "window_w", ray_event_window_w, 0);
251
+ rb_define_method(ray_cEvent, "window_h", ray_event_window_h, 0);
252
+
231
253
  rb_define_const(ray_cEvent, "TYPE_NOEVENT", INT2FIX(SDL_NOEVENT));
232
254
  rb_define_const(ray_cEvent, "TYPE_ACTIVEEVENT", INT2FIX(SDL_ACTIVEEVENT));
233
255
  rb_define_const(ray_cEvent, "TYPE_KEYDOWN", INT2FIX(SDL_KEYDOWN));
data/ext/extconf.rb CHANGED
@@ -36,8 +36,22 @@ def have_framework(name)
36
36
  ret
37
37
  end
38
38
 
39
- has_run_node = have_func("ruby_run_node")
40
- has_run = have_func("ruby_run")
39
+ def have_sdl_ext(name, header)
40
+ if res = have_framework(name)
41
+ ending = header.upcase.tr('/', '_').gsub(/\.H$/, "_H")
42
+ $CFLAGS << " -DHAVE_#{ending}"
43
+
44
+ return res
45
+ end
46
+
47
+ if res = have_library(name)
48
+ unless have_header(header) or have_header("SDL/#{header}")
49
+ return false
50
+ end
51
+
52
+ return res
53
+ end
54
+ end
41
55
 
42
56
  $CFLAGS << " -pedantic -Wall -std=c99 -Wno-unused-parameter"
43
57
 
@@ -60,16 +74,25 @@ unless RUBY_PLATFORM =~ /darwin/
60
74
  have_header("SDL/SDL_image.h") or have_header("SDL_image.h")
61
75
  end
62
76
 
77
+ if have_library("SDL_gfx")
78
+ have_header("SDL/SDL_rotozoom.h") or have_header("SDL_rotozoom.h")
79
+ end
80
+
81
+ if have_library("SDL_ttf")
82
+ have_header("SDL/SDL_ttf.h") or have_header("SDL_ttf.h")
83
+ end
84
+
85
+ if have_library("SDL_mixer")
86
+ have_header("SDL/SDL_mixer.h") or have_header("SDL_mixer.h")
87
+ end
88
+
63
89
  create_makefile("ray_ext")
64
90
 
65
- data = File.read("Makefile").gsub("SDLMain.o", "")
91
+ data = File.read("Makefile").gsub("ray_osx.o", "")
66
92
  open("Makefile", 'w') { |f| f.write(data) }
67
93
  else
68
- if !has_run and !has_run_node
69
- $stderr.puts "Unsupported configuration: Mac OS X and a ruby " +
70
- "implementation that does not implement ruby_run"
71
- exit 1
72
- end
94
+ $CFLAGS << " #{ENV["CFLAGS"]}"
95
+ $LDFLAGS << " #{ENV["LDFLAGS"]}"
73
96
 
74
97
  $CFLAGS << " -DRAY_USE_FRAMEWORK"
75
98
 
@@ -79,20 +102,10 @@ else
79
102
  exit 1
80
103
  end
81
104
 
82
- have_framework("SDL_image")
83
-
84
- have_library("ruby", "ruby_init")
105
+ have_sdl_ext("SDL_image", "SDL_image.h")
106
+ have_sdl_ext("SDL_gfx", "SDL_rotozoom.h")
107
+ have_sdl_ext("SDL_ttf", "SDL_ttf.h")
108
+ have_sdl_ext("SDL_mixer", "SDL_mixer.h")
85
109
 
86
110
  create_makefile("ray_ext")
87
111
  end
88
-
89
- if has_run or has_run_node
90
- open("Makefile", 'a') do |file|
91
- file.puts "ray: $(OBJS)"
92
- file.puts "\t$(CC) -o ray $(OBJS) $(LIBPATH) $(DLDFLAGS) " +
93
- "$(LOCAL_LIBS) $(LIBS) -lruby"
94
- end
95
-
96
- data = File.read("Makefile").gsub("all:", "all: ray")
97
- open("Makefile", 'w') { |f| f.write(data) }
98
- end
data/ext/font.c ADDED
@@ -0,0 +1,287 @@
1
+ #include "ray.h"
2
+
3
+ #ifdef HAVE_SDL_TTF
4
+
5
+ enum ray_encoding {
6
+ RAY_ENCODING_LATIN1,
7
+ RAY_ENCODING_UTF8,
8
+ RAY_ENCODING_UNICODE
9
+ };
10
+
11
+ VALUE ray_cFont = Qnil;
12
+
13
+ TTF_Font *ray_rb2font(VALUE object) {
14
+ if (!RAY_IS_A(object, ray_cFont)) {
15
+ rb_raise(rb_eTypeError, "Can't convert %s into Ray::Font",
16
+ RAY_OBJ_CLASSNAME(object));
17
+ }
18
+
19
+ ray_font *ptr = NULL;
20
+ Data_Get_Struct(object, ray_font, ptr);
21
+
22
+ return ptr->font;
23
+ }
24
+
25
+ void ray_free_font(ray_font *font) {
26
+ if (font->font) TTF_CloseFont(font->font);
27
+ free(font);
28
+ }
29
+
30
+ VALUE ray_alloc_font(VALUE self) {
31
+ ray_font *ptr = malloc(sizeof(ray_font));
32
+ VALUE ret = Data_Wrap_Struct(self, 0, ray_free_font, ptr);
33
+
34
+ ptr->font = NULL;
35
+ return ret;
36
+ }
37
+
38
+ void ray_init_font_with_filename(VALUE self, VALUE filename, int size) {
39
+ ray_font *font = NULL;
40
+ Data_Get_Struct(self, ray_font, font);
41
+
42
+ font->font = TTF_OpenFont(StringValuePtr(filename), size);
43
+ if (!font->font) {
44
+ rb_raise(rb_eRuntimeError, "Could not load the font (%s)",
45
+ TTF_GetError());
46
+ }
47
+ }
48
+
49
+ void ray_init_font_with_io(VALUE self, VALUE io, int size) {
50
+ ray_font *font = NULL;
51
+ Data_Get_Struct(self, ray_font, font);
52
+
53
+ VALUE string = rb_funcall2(io, RAY_METH("read"), 0, NULL);
54
+ char *content = StringValuePtr(string);
55
+
56
+ SDL_RWops *data = SDL_RWFromMem(content, (int)RSTRING_LEN(string));
57
+ if (!data) {
58
+ rb_raise(rb_eRuntimeError, "Could not create image data (%s)",
59
+ SDL_GetError());
60
+ }
61
+
62
+ font->font = TTF_OpenFontRW(data, 1, size);
63
+ if (!font->font) {
64
+ printf("Could not load the font (%s)\n", TTF_GetError());
65
+ rb_raise(rb_eRuntimeError, "Could not load the font (%s)",
66
+ TTF_GetError());
67
+ }
68
+ }
69
+
70
+ /*
71
+ Creates a new font.
72
+
73
+ @param [String, #read] arg Filename of the font or IO object containing
74
+ the content of the font.
75
+ @param [Integer] size Point size (based on 72DPI).
76
+ */
77
+ VALUE ray_init_font(VALUE self, VALUE arg, VALUE size) {
78
+ if (rb_respond_to(arg, RAY_METH("to_str")))
79
+ ray_init_font_with_filename(self, rb_String(arg), NUM2INT(size));
80
+ else if (rb_respond_to(arg, RAY_METH("read")))
81
+ ray_init_font_with_io(self, arg, NUM2INT(size));
82
+ else {
83
+ rb_raise(rb_eTypeError, "Can't convert %s into String",
84
+ RAY_OBJ_CLASSNAME(arg));
85
+ }
86
+
87
+ return Qnil;
88
+ }
89
+
90
+ /*
91
+ @return [Integer] Bitmask describing the style of the font.
92
+ STYLE_NORMAL for a normal font.
93
+ */
94
+ VALUE ray_font_style(VALUE self) {
95
+ TTF_Font *font = ray_rb2font(self);
96
+ return INT2FIX(TTF_GetFontStyle(font));
97
+ }
98
+
99
+ /* Sets the font style. */
100
+ VALUE ray_font_set_style(VALUE self, VALUE style) {
101
+ TTF_Font *font = ray_rb2font(self);
102
+ TTF_SetFontStyle(font, NUM2INT(style));
103
+ return style;
104
+ }
105
+
106
+ /* @return [Integer] the height of the font */
107
+ VALUE ray_font_height(VALUE self) {
108
+ TTF_Font *font = ray_rb2font(self);
109
+ return INT2FIX(TTF_FontHeight(font));
110
+ }
111
+
112
+ /* @return [Integer] the recommended spacing between lines for this font */
113
+ VALUE ray_font_line_skip(VALUE self) {
114
+ TTF_Font *font = ray_rb2font(self);
115
+ return INT2FIX(TTF_FontLineSkip(font));
116
+ }
117
+
118
+ /*
119
+ @overload size_of(text, encoding = nil)
120
+ @param [Symbol, nil] encoding nil (for Latin1), :latin1, :utf8, or :unicode.
121
+ @return [Ray::Rect] Size of the text.
122
+ */
123
+ VALUE ray_font_size_of(int argc, VALUE *argv, VALUE self) {
124
+ TTF_Font *font = ray_rb2font(self);
125
+
126
+ VALUE string = Qnil, encoding = Qnil;
127
+ rb_scan_args(argc, argv, "11", &string, &encoding);
128
+
129
+ char *c_string = StringValuePtr(string);
130
+
131
+ int w, h;
132
+
133
+ if (NIL_P(encoding) || encoding == RAY_SYM("latin1"))
134
+ TTF_SizeText(font, c_string, &w, &h);
135
+ else if (encoding == RAY_SYM("utf8"))
136
+ TTF_SizeUTF8(font, c_string, &w, &h);
137
+ else if (encoding == RAY_SYM("unicode"))
138
+ TTF_SizeUNICODE(font, (uint16_t*)c_string, &w, &h);
139
+ else
140
+ rb_raise(rb_eArgError, "Invalid encoding.");
141
+
142
+ SDL_Rect rect = {0, 0, w, h};
143
+ return ray_rect2rb(rect);
144
+ }
145
+
146
+ /*
147
+ @overload draw(string, opts = {})
148
+ @param [String] string The string which should be drawn.
149
+
150
+ @option opts [Symbol] :mode Drawing mode. :solid (fastest),
151
+ :shaded (requires a background set
152
+ with :background) or :blended
153
+ @option opts [Symbol] :encoding :latin1, :utf8, or :unicode. Defaults
154
+ to :latin1.
155
+ @option opts [Ray::Color] :color Color to draw the text in. Defaults to
156
+ white.
157
+ @option opts [Ray::Color] :background The background color in :shaded mode.
158
+ defaults to black.
159
+ @option opts [Ray::Image] :on The image to draw on. In this case,
160
+ it will directly draw instead of returning
161
+ an image containing nothing but the string.
162
+ @option opts [Ray::Rect, Array<Integer>] :to, :at where to draw on the image.
163
+
164
+ @return The surface it drew the string on.
165
+ */
166
+ VALUE ray_font_draw(int argc, VALUE *argv, VALUE self) {
167
+ VALUE string, hash;
168
+ rb_scan_args(argc, argv, "11", &string, &hash);
169
+
170
+ if (NIL_P(hash))
171
+ hash = rb_hash_new();
172
+
173
+ TTF_Font *font = ray_rb2font(self);
174
+
175
+ char *c_string = StringValuePtr(string);
176
+
177
+ /* solid, shaded, blended */
178
+ VALUE drawing_mode = rb_hash_aref(hash, RAY_SYM("mode"));
179
+
180
+ VALUE encoding = rb_hash_aref(hash, RAY_SYM("encoding"));
181
+ int c_encoding = 0;
182
+
183
+ if (NIL_P(encoding) || encoding == RAY_SYM("latin1"))
184
+ c_encoding = RAY_ENCODING_LATIN1;
185
+ else if (encoding == RAY_SYM("utf8"))
186
+ c_encoding = RAY_ENCODING_UTF8;
187
+ else if (encoding == RAY_SYM("unicode"))
188
+ c_encoding = RAY_ENCODING_UNICODE;
189
+ else
190
+ rb_raise(rb_eArgError, "Invalid encoding.");
191
+
192
+ VALUE rb_color = rb_hash_aref(hash, RAY_SYM("color"));
193
+ ray_color c_color = {255, 255, 255, 255};
194
+ if (!NIL_P(rb_color))
195
+ c_color = ray_rb2col(rb_color);
196
+
197
+ SDL_Color color = {c_color.r, c_color.g, c_color.b};
198
+
199
+ SDL_Surface *surface = NULL;
200
+
201
+ if (NIL_P(drawing_mode) || drawing_mode == RAY_SYM("solid")) {
202
+ if (c_encoding == RAY_ENCODING_LATIN1)
203
+ surface = TTF_RenderText_Solid(font, c_string, color);
204
+ else if (c_encoding == RAY_ENCODING_UTF8)
205
+ surface = TTF_RenderUTF8_Solid(font, c_string, color);
206
+ else
207
+ surface = TTF_RenderUNICODE_Solid(font, (uint16_t*)c_string, color);
208
+ }
209
+ else if (drawing_mode == RAY_SYM("shaded")) {
210
+ VALUE rb_bg = rb_hash_aref(hash, RAY_SYM("background"));
211
+ ray_color c_bg = {0, 0, 0, 255};
212
+ if (!NIL_P(rb_bg))
213
+ c_bg = ray_rb2col(rb_bg);
214
+ SDL_Color bg = {c_bg.r, c_bg.g, c_bg.b};
215
+
216
+ if (c_encoding == RAY_ENCODING_LATIN1)
217
+ surface = TTF_RenderText_Shaded(font, c_string, color, bg);
218
+ else if (c_encoding == RAY_ENCODING_UTF8)
219
+ surface = TTF_RenderUTF8_Shaded(font, c_string, color, bg);
220
+ else
221
+ surface = TTF_RenderUNICODE_Shaded(font, (uint16_t*)c_string, color, bg);
222
+ }
223
+ else if (drawing_mode == RAY_SYM("blended")) {
224
+ if (c_encoding == RAY_ENCODING_LATIN1)
225
+ surface = TTF_RenderText_Blended(font, c_string, color);
226
+ else if (c_encoding == RAY_ENCODING_UTF8)
227
+ surface = TTF_RenderUTF8_Blended(font, c_string, color);
228
+ else
229
+ surface = TTF_RenderUNICODE_Blended(font, (uint16_t*)c_string, color);
230
+ }
231
+ else
232
+ rb_raise(rb_eArgError, "Invalid drawing mode.");
233
+
234
+ if (!surface) {
235
+ rb_raise(rb_eRuntimeError, "Could not drawstring (%s)",
236
+ TTF_GetError());
237
+ }
238
+
239
+ VALUE on = rb_hash_aref(hash, RAY_SYM("on"));
240
+ if (NIL_P(on))
241
+ return ray_create_gc_image(surface);
242
+
243
+ SDL_Surface *target = ray_rb2surface(on);
244
+
245
+ VALUE rb_rect = rb_hash_aref(hash, RAY_SYM("at"));
246
+ if (NIL_P(rb_rect))
247
+ rb_rect = rb_hash_aref(hash, RAY_SYM("to"));
248
+
249
+ SDL_Rect rect;
250
+
251
+ if (RTEST(rb_obj_is_kind_of(rb_rect, ray_cRect)))
252
+ rect = ray_rb2rect(rb_rect);
253
+ else if (RTEST(rb_obj_is_kind_of(rb_rect, rb_cArray)))
254
+ rect = ray_rb2rect(rb_apply(ray_cRect, RAY_METH("new"), rb_rect));
255
+ else {
256
+ rb_raise(rb_eTypeError, "Can't convert %s into Ray::Rect",
257
+ RAY_OBJ_CLASSNAME(rb_rect));
258
+ }
259
+
260
+ SDL_BlitSurface(surface, NULL, target, &rect);
261
+ SDL_FreeSurface(surface);
262
+
263
+ return on;
264
+ }
265
+
266
+ void Init_ray_font() {
267
+ ray_cFont = rb_define_class_under(ray_mRay, "Font", rb_cObject);
268
+ rb_define_alloc_func(ray_cFont, ray_alloc_font);
269
+ rb_define_method(ray_cFont, "initialize", ray_init_font, 2);
270
+
271
+ rb_define_method(ray_cFont, "style", ray_font_style, 0);
272
+ rb_define_method(ray_cFont, "style=", ray_font_set_style, 1);
273
+
274
+ rb_define_method(ray_cFont, "height", ray_font_height, 0);
275
+ rb_define_method(ray_cFont, "line_skip", ray_font_line_skip, 0);
276
+
277
+ rb_define_method(ray_cFont, "size_of", ray_font_size_of, -1);
278
+
279
+ rb_define_method(ray_cFont, "draw", ray_font_draw, -1);
280
+
281
+ rb_define_const(ray_cFont, "STYLE_NORMAL", INT2FIX(TTF_STYLE_NORMAL));
282
+ rb_define_const(ray_cFont, "STYLE_ITALIC", INT2FIX(TTF_STYLE_ITALIC));
283
+ rb_define_const(ray_cFont, "STYLE_BOLD", INT2FIX(TTF_STYLE_BOLD));
284
+ rb_define_const(ray_cFont, "STYLE_UNDERLINE", INT2FIX(TTF_STYLE_UNDERLINE));
285
+ }
286
+
287
+ #endif