sdl2-win93 1.0.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.
- checksums.yaml +7 -0
- data/.dir-locals.el +2 -0
- data/.github/workflows/gempush.yml +29 -0
- data/.gitignore +14 -0
- data/COPYING.txt +165 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +24 -0
- data/Makefile +4 -0
- data/README.md +36 -0
- data/Rakefile +51 -0
- data/doc/po/ja.po +10357 -0
- data/ext/sdl2_ext/clipboard.c +61 -0
- data/ext/sdl2_ext/color.c +103 -0
- data/ext/sdl2_ext/color.h +4 -0
- data/ext/sdl2_ext/event.c +1298 -0
- data/ext/sdl2_ext/extconf.rb +22 -0
- data/ext/sdl2_ext/filesystem.c +63 -0
- data/ext/sdl2_ext/gamecontroller.c +408 -0
- data/ext/sdl2_ext/gamecontroller.c.m4 +408 -0
- data/ext/sdl2_ext/gl.c +351 -0
- data/ext/sdl2_ext/gl.c.m4 +351 -0
- data/ext/sdl2_ext/hint.c +99 -0
- data/ext/sdl2_ext/joystick.c +339 -0
- data/ext/sdl2_ext/joystick.c.m4 +339 -0
- data/ext/sdl2_ext/key.c +1302 -0
- data/ext/sdl2_ext/key.c.m4 +833 -0
- data/ext/sdl2_ext/main.c +258 -0
- data/ext/sdl2_ext/messagebox.c +233 -0
- data/ext/sdl2_ext/mixer.c +1205 -0
- data/ext/sdl2_ext/mixer.c.m4 +1205 -0
- data/ext/sdl2_ext/mouse.c +286 -0
- data/ext/sdl2_ext/rubysdl2_internal.h +127 -0
- data/ext/sdl2_ext/timer.c +63 -0
- data/ext/sdl2_ext/ttf.c +376 -0
- data/ext/sdl2_ext/ttf.c.m4 +376 -0
- data/ext/sdl2_ext/video.c +4093 -0
- data/ext/sdl2_ext/video.c.m4 +3867 -0
- data/lib/sdl2.rb +3 -0
- data/lib/sdl2/event.rb +55 -0
- data/lib/sdl2/version.rb +8 -0
- data/sample/chunk_destroy.rb +16 -0
- data/sample/gfxprimitives.rb +54 -0
- data/sample/icon.bmp +0 -0
- data/sample/memory_test/m1.rb +28 -0
- data/sample/memory_test/m2.rb +18 -0
- data/sample/memory_test/m3.rb +12 -0
- data/sample/message_box.rb +33 -0
- data/sample/music_player.rb +137 -0
- data/sample/playwave.rb +19 -0
- data/sample/primitives.rb +32 -0
- data/sample/test_clipboard.rb +16 -0
- data/sample/test_controller.rb +62 -0
- data/sample/test_joystick.rb +53 -0
- data/sample/test_keyboard.rb +52 -0
- data/sample/test_mouse.rb +50 -0
- data/sample/test_surface.rb +13 -0
- data/sample/test_ttf.rb +82 -0
- data/sample/test_video.rb +59 -0
- data/sample/testgl.rb +175 -0
- data/sample/testsprite.rb +296 -0
- data/sample/testspriteminimal.rb +75 -0
- data/sample/timer.rb +11 -0
- data/sample/version.rb +12 -0
- data/sample/video_info.rb +64 -0
- data/sdl2-win93.gemspec +31 -0
- metadata +158 -0
data/ext/sdl2_ext/ttf.c
ADDED
@@ -0,0 +1,376 @@
|
|
1
|
+
/* -*- mode: C -*- */
|
2
|
+
#ifdef HAVE_SDL_TTF_H
|
3
|
+
#include "rubysdl2_internal.h"
|
4
|
+
#include <SDL_ttf.h>
|
5
|
+
#include <ruby/encoding.h>
|
6
|
+
|
7
|
+
static VALUE cTTF;
|
8
|
+
static VALUE mStyle;
|
9
|
+
static VALUE mHinting;
|
10
|
+
|
11
|
+
#define TTF_ERROR() do { HANDLE_ERROR(SDL_SetError("%s", TTF_GetError())); } while (0)
|
12
|
+
#define HANDLE_TTF_ERROR(code) \
|
13
|
+
do { if ((code) < 0) { TTF_ERROR(); } } while (0)
|
14
|
+
|
15
|
+
typedef struct TTF {
|
16
|
+
TTF_Font* font;
|
17
|
+
} TTF;
|
18
|
+
|
19
|
+
#define TTF_ATTRIBUTE(attr, capitalized_attr, ruby2c, c2ruby) \
|
20
|
+
static VALUE TTF_##attr(VALUE self) \
|
21
|
+
{ \
|
22
|
+
return c2ruby(TTF_Get##capitalized_attr(Get_TTF_Font(self))); \
|
23
|
+
} \
|
24
|
+
static VALUE TTF_set_##attr(VALUE self, VALUE val) \
|
25
|
+
{ \
|
26
|
+
TTF_Set##capitalized_attr(Get_TTF_Font(self), ruby2c(val)); \
|
27
|
+
return Qnil; \
|
28
|
+
}
|
29
|
+
|
30
|
+
#define TTF_ATTRIBUTE_INT(attr, capitalized_attr) \
|
31
|
+
TTF_ATTRIBUTE(attr, capitalized_attr, NUM2INT, INT2NUM)
|
32
|
+
|
33
|
+
#define TTF_ATTR_READER(attr, capitalized_attr, c2ruby) \
|
34
|
+
static VALUE TTF_##attr(VALUE self) \
|
35
|
+
{ \
|
36
|
+
return c2ruby(TTF_Font##capitalized_attr(Get_TTF_Font(self))); \
|
37
|
+
}
|
38
|
+
|
39
|
+
static void TTF_free(TTF* f)
|
40
|
+
{
|
41
|
+
if (rubysdl2_is_active() && f->font)
|
42
|
+
TTF_CloseFont(f->font);
|
43
|
+
free(f);
|
44
|
+
}
|
45
|
+
|
46
|
+
static VALUE TTF_new(TTF_Font* font)
|
47
|
+
{
|
48
|
+
TTF* f = ALLOC(TTF);
|
49
|
+
f->font = font;
|
50
|
+
return Data_Wrap_Struct(cTTF, 0, TTF_free, f);
|
51
|
+
}
|
52
|
+
|
53
|
+
DEFINE_WRAPPER(TTF_Font, TTF, font, cTTF, "SDL2::TTF");
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Document-class: SDL2::TTF
|
57
|
+
*
|
58
|
+
* This class represents font information.
|
59
|
+
*
|
60
|
+
* You can render TrueType fonts using [SDL_ttf](https://www.libsdl.org/projects/SDL_ttf/)
|
61
|
+
* and this class.
|
62
|
+
*
|
63
|
+
* @!attribute style
|
64
|
+
* Font style.
|
65
|
+
* The OR'd bits of the constants of {SDL2::TTF::Style}.
|
66
|
+
* @return [Integer]
|
67
|
+
*
|
68
|
+
* @!attribute outline
|
69
|
+
* The outline pixel width of the font.
|
70
|
+
* @return [Integer]
|
71
|
+
*
|
72
|
+
* @!attribute hinting
|
73
|
+
* Font hinting.
|
74
|
+
* One of the constants of {SDL2::TTF::Hinting}.
|
75
|
+
* @return [Integer]
|
76
|
+
*
|
77
|
+
* @!attribute kerning
|
78
|
+
* True if kerning is enabled.
|
79
|
+
* @return [Booelan]
|
80
|
+
*
|
81
|
+
* @!attribute [r] height
|
82
|
+
* The maximum pixel height of all glyphs of the font.
|
83
|
+
* You can use this height to render text as close together vertically
|
84
|
+
* as possible.
|
85
|
+
* @return [Integer]
|
86
|
+
* @see #line_skip
|
87
|
+
*
|
88
|
+
* @!attribute [r] ascent
|
89
|
+
* The maximum pixel ascent of all glyphs of the font.
|
90
|
+
* The distance from the top of the font to the baseline.
|
91
|
+
* @return [Integer]
|
92
|
+
* @see #descent
|
93
|
+
*
|
94
|
+
* @!attribute [r] descent
|
95
|
+
* The maximum pixel descent of all glyphs of the font.
|
96
|
+
* The distance from the bottom of the font to the baseline.
|
97
|
+
* @return [Integer]
|
98
|
+
* @see #ascent
|
99
|
+
*
|
100
|
+
* @!attribute [r] line_skip
|
101
|
+
* The recommended pixel height of rendered line of text
|
102
|
+
* of the font. Normally, this value is larger than {#height}.
|
103
|
+
* @return [Integer]
|
104
|
+
*
|
105
|
+
* @!attribute [r] num_faces
|
106
|
+
* The number of faces available in the font.
|
107
|
+
* @return [Integer]
|
108
|
+
*
|
109
|
+
* @!attribute [r] face_family_name
|
110
|
+
* The current font face family name of the font.
|
111
|
+
* @return [String]
|
112
|
+
*
|
113
|
+
* @!attribute [r] face_style_name
|
114
|
+
* The current font face style name of the font.
|
115
|
+
* @return [String]
|
116
|
+
*
|
117
|
+
*/
|
118
|
+
|
119
|
+
/*
|
120
|
+
* Initialize TrueType font rendering submodule.
|
121
|
+
*
|
122
|
+
* This function must be called before calling other methods/class methods
|
123
|
+
* of {TTF}.
|
124
|
+
*
|
125
|
+
* @return [nil]
|
126
|
+
*/
|
127
|
+
static VALUE TTF_s_init(VALUE self)
|
128
|
+
{
|
129
|
+
HANDLE_TTF_ERROR(TTF_Init());
|
130
|
+
return Qnil;
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* Open a font data from file.
|
135
|
+
*
|
136
|
+
* @overload open(fname, ptsize, index=0)
|
137
|
+
* @param fname [String] the path of the font file
|
138
|
+
* @param ptsize [Integer] the point size of the font (72DPI).
|
139
|
+
* @param index [Integer] the index of the font faces.
|
140
|
+
* Some font files have multiple font faces, and you
|
141
|
+
* can select one of them using **index**. 0 origin.
|
142
|
+
* If a font have only one font face, 0 is the only
|
143
|
+
* valid index.
|
144
|
+
*
|
145
|
+
* @return [SDL2::TTF] opened font information
|
146
|
+
* @raise [SDL2::Error] occurs when you fail to open a file.
|
147
|
+
*
|
148
|
+
*/
|
149
|
+
static VALUE TTF_s_open(int argc, VALUE* argv, VALUE self)
|
150
|
+
{
|
151
|
+
TTF_Font* font;
|
152
|
+
VALUE fname, ptsize, index;
|
153
|
+
rb_scan_args(argc, argv, "21", &fname, &ptsize, &index);
|
154
|
+
|
155
|
+
font = TTF_OpenFontIndex(StringValueCStr(fname), NUM2INT(ptsize),
|
156
|
+
index == Qnil ? 0 : NUM2LONG(index));
|
157
|
+
if (!font)
|
158
|
+
TTF_ERROR();
|
159
|
+
|
160
|
+
return TTF_new(font);
|
161
|
+
}
|
162
|
+
|
163
|
+
/*
|
164
|
+
* Destroy the font data and release memory.
|
165
|
+
*
|
166
|
+
* @return [nil]
|
167
|
+
*/
|
168
|
+
static VALUE TTF_destroy(VALUE self)
|
169
|
+
{
|
170
|
+
TTF* f = Get_TTF(self);
|
171
|
+
if (f->font)
|
172
|
+
TTF_CloseFont(f->font);
|
173
|
+
f->font = NULL;
|
174
|
+
return Qnil;
|
175
|
+
}
|
176
|
+
|
177
|
+
TTF_ATTRIBUTE_INT(style, FontStyle);
|
178
|
+
TTF_ATTRIBUTE_INT(outline, FontOutline);
|
179
|
+
TTF_ATTRIBUTE_INT(hinting, FontHinting);
|
180
|
+
TTF_ATTRIBUTE(kerning, FontKerning, RTEST, INT2BOOL);
|
181
|
+
TTF_ATTR_READER(height, Height, INT2FIX);
|
182
|
+
TTF_ATTR_READER(ascent, Ascent, INT2FIX);
|
183
|
+
TTF_ATTR_READER(descent, Descent, INT2FIX);
|
184
|
+
TTF_ATTR_READER(line_skip, LineSkip, INT2FIX);
|
185
|
+
TTF_ATTR_READER(num_faces, Faces, LONG2NUM);
|
186
|
+
TTF_ATTR_READER(face_is_fixed_width_p, FaceIsFixedWidth, INT2BOOL);
|
187
|
+
TTF_ATTR_READER(face_family_name, FaceFamilyName, utf8str_new_cstr);
|
188
|
+
TTF_ATTR_READER(face_style_name, FaceStyleName, utf8str_new_cstr);
|
189
|
+
|
190
|
+
/*
|
191
|
+
* @overload size_text(text)
|
192
|
+
* Calculate the size of rendered surface of **text** using the font.
|
193
|
+
*
|
194
|
+
* @param text [String] the string to size up
|
195
|
+
*
|
196
|
+
* @return [[Integer, Integer]] a pair of width and height of the rendered surface
|
197
|
+
*
|
198
|
+
* @raise [SDL2::Error] It is raised when an error occurs, such as a glyph ins the
|
199
|
+
* string not being found.
|
200
|
+
*/
|
201
|
+
static VALUE TTF_size_text(VALUE self, VALUE text)
|
202
|
+
{
|
203
|
+
int w, h;
|
204
|
+
Check_Type(text, T_STRING);
|
205
|
+
text = rb_str_export_to_enc(text, rb_utf8_encoding());
|
206
|
+
HANDLE_TTF_ERROR(TTF_SizeUTF8(Get_TTF_Font(self), StringValueCStr(text), &w, &h));
|
207
|
+
return rb_ary_new3(2, INT2NUM(w), INT2NUM(h));
|
208
|
+
}
|
209
|
+
|
210
|
+
static SDL_Surface* render_solid(TTF_Font* font, const char* text, SDL_Color fg, SDL_Color bg)
|
211
|
+
{
|
212
|
+
return TTF_RenderUTF8_Solid(font, text, fg);
|
213
|
+
}
|
214
|
+
|
215
|
+
static SDL_Surface* render_blended(TTF_Font* font, const char* text, SDL_Color fg, SDL_Color bg)
|
216
|
+
{
|
217
|
+
return TTF_RenderUTF8_Blended(font, text, fg);
|
218
|
+
}
|
219
|
+
|
220
|
+
static VALUE render(SDL_Surface* (*renderer)(TTF_Font*, const char*, SDL_Color, SDL_Color),
|
221
|
+
VALUE font, VALUE text, VALUE fg, VALUE bg)
|
222
|
+
{
|
223
|
+
SDL_Surface* surface;
|
224
|
+
text = rb_str_export_to_enc(text, rb_utf8_encoding());
|
225
|
+
surface = renderer(Get_TTF_Font(font), StringValueCStr(text),
|
226
|
+
Color_to_SDL_Color(fg), Color_to_SDL_Color(bg));
|
227
|
+
if (!surface)
|
228
|
+
TTF_ERROR();
|
229
|
+
|
230
|
+
return Surface_new(surface);
|
231
|
+
}
|
232
|
+
|
233
|
+
/*
|
234
|
+
* @overload render_solid(text, fg)
|
235
|
+
* Render **text** using the font with fg color on a new surface, using
|
236
|
+
* *Solid* mode.
|
237
|
+
*
|
238
|
+
* Solid mode rendering is quick but dirty.
|
239
|
+
*
|
240
|
+
* @param text [String] the text to render
|
241
|
+
* @param fg [[Integer, Integer, Integer]]
|
242
|
+
* the color to render. An array of r, g, and b components.
|
243
|
+
*
|
244
|
+
* @return [SDL2::Surface]
|
245
|
+
*
|
246
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
247
|
+
*/
|
248
|
+
static VALUE TTF_render_solid(VALUE self, VALUE text, VALUE fg)
|
249
|
+
{
|
250
|
+
return render(render_solid, self, text, fg, Qnil);
|
251
|
+
}
|
252
|
+
|
253
|
+
/*
|
254
|
+
* @overload render_shaded(text, fg, bg)
|
255
|
+
* Render **text** using the font with fg color on a new surface, using
|
256
|
+
* *Shaded* mode.
|
257
|
+
*
|
258
|
+
* Shaded mode rendering is slow and nice, but with a solid box filled by
|
259
|
+
* the background color.
|
260
|
+
*
|
261
|
+
* @param text [String] the text to render
|
262
|
+
* @param fg [[Integer, Integer, Integer]]
|
263
|
+
* the color to render. An array of r, g, and b components.
|
264
|
+
* @param bg [[Integer, Integer, Integer]]
|
265
|
+
* the background color. An array of r, g, and b components.
|
266
|
+
*
|
267
|
+
* @return [SDL2::Surface]
|
268
|
+
*
|
269
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
270
|
+
*/
|
271
|
+
static VALUE TTF_render_shaded(VALUE self, VALUE text, VALUE fg, VALUE bg)
|
272
|
+
{
|
273
|
+
return render(TTF_RenderUTF8_Shaded, self, text, fg, bg);
|
274
|
+
}
|
275
|
+
|
276
|
+
/*
|
277
|
+
* @overload render_blended(text, fg)
|
278
|
+
* Render **text** using the font with fg color on a new surface, using
|
279
|
+
* *Blended* mode.
|
280
|
+
*
|
281
|
+
* Blended mode rendering is very slow but very nice.
|
282
|
+
* The rendered surface has an alpha channel,
|
283
|
+
*
|
284
|
+
* @param text [String] the text to render
|
285
|
+
* @param fg [[Integer, Integer, Integer]]
|
286
|
+
* the color to render. An array of r, g, and b components.
|
287
|
+
*
|
288
|
+
* @return [SDL2::Surface]
|
289
|
+
*
|
290
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
291
|
+
*/
|
292
|
+
static VALUE TTF_render_blended(VALUE self, VALUE text, VALUE fg)
|
293
|
+
{
|
294
|
+
return render(render_blended, self, text, fg, Qnil);
|
295
|
+
}
|
296
|
+
|
297
|
+
/*
|
298
|
+
* Document-module: SDL2::TTF::Style
|
299
|
+
*
|
300
|
+
* Constants represents font styles.
|
301
|
+
*/
|
302
|
+
|
303
|
+
/* Document-module: SDL2::TTF::Hinting
|
304
|
+
*
|
305
|
+
* Constants represents font hinting for FreeType.
|
306
|
+
*/
|
307
|
+
void rubysdl2_init_ttf(void)
|
308
|
+
{
|
309
|
+
cTTF = rb_define_class_under(mSDL2, "TTF", rb_cObject);
|
310
|
+
rb_undef_alloc_func(cTTF);
|
311
|
+
|
312
|
+
rb_define_singleton_method(cTTF, "init", TTF_s_init, 0);
|
313
|
+
rb_define_singleton_method(cTTF, "open", TTF_s_open, -1);
|
314
|
+
/* Return true if the font is destroyed by {#destroy}. */
|
315
|
+
rb_define_method(cTTF, "destroy?", TTF_destroy_p, 0);
|
316
|
+
rb_define_method(cTTF, "destroy", TTF_destroy, 0);
|
317
|
+
|
318
|
+
#define DEFINE_TTF_ATTRIBUTE(attr) do { \
|
319
|
+
rb_define_method(cTTF, #attr, TTF_##attr, 0); \
|
320
|
+
rb_define_method(cTTF, #attr "=", TTF_set_##attr, 1); \
|
321
|
+
} while (0)
|
322
|
+
|
323
|
+
DEFINE_TTF_ATTRIBUTE(style);
|
324
|
+
DEFINE_TTF_ATTRIBUTE(outline);
|
325
|
+
DEFINE_TTF_ATTRIBUTE(hinting);
|
326
|
+
DEFINE_TTF_ATTRIBUTE(kerning);
|
327
|
+
|
328
|
+
#define DEFINE_TTF_ATTR_READER(attr) \
|
329
|
+
rb_define_method(cTTF, #attr, TTF_##attr, 0)
|
330
|
+
|
331
|
+
DEFINE_TTF_ATTR_READER(height);
|
332
|
+
DEFINE_TTF_ATTR_READER(ascent);
|
333
|
+
DEFINE_TTF_ATTR_READER(descent);
|
334
|
+
DEFINE_TTF_ATTR_READER(line_skip);
|
335
|
+
DEFINE_TTF_ATTR_READER(num_faces);
|
336
|
+
/* Return true if the font is fixed width. */
|
337
|
+
rb_define_method(cTTF, "face_is_fixed_width?", TTF_face_is_fixed_width_p, 0);
|
338
|
+
DEFINE_TTF_ATTR_READER(face_family_name);
|
339
|
+
DEFINE_TTF_ATTR_READER(face_style_name);
|
340
|
+
|
341
|
+
rb_define_method(cTTF, "size_text", TTF_size_text, 1);
|
342
|
+
rb_define_method(cTTF, "render_solid", TTF_render_solid, 2);
|
343
|
+
rb_define_method(cTTF, "render_shaded", TTF_render_shaded, 3);
|
344
|
+
rb_define_method(cTTF, "render_blended", TTF_render_blended, 2);
|
345
|
+
|
346
|
+
mStyle = rb_define_module_under(cTTF, "Style");
|
347
|
+
/* */
|
348
|
+
/* normal style */
|
349
|
+
rb_define_const(mStyle, "NORMAL", INT2NUM((TTF_STYLE_NORMAL)));
|
350
|
+
/* bold style */
|
351
|
+
rb_define_const(mStyle, "BOLD", INT2NUM((TTF_STYLE_BOLD)));
|
352
|
+
/* italic style */
|
353
|
+
rb_define_const(mStyle, "ITALIC", INT2NUM((TTF_STYLE_ITALIC)));
|
354
|
+
/* underline style */
|
355
|
+
rb_define_const(mStyle, "UNDERLINE", INT2NUM((TTF_STYLE_UNDERLINE)));
|
356
|
+
/* strikethrough style */
|
357
|
+
rb_define_const(mStyle, "STRIKETHROUGH", INT2NUM((TTF_STYLE_STRIKETHROUGH)));
|
358
|
+
|
359
|
+
mHinting = rb_define_module_under(cTTF, "Hinting");
|
360
|
+
/* */
|
361
|
+
/* normal hinting, default */
|
362
|
+
rb_define_const(mHinting, "NORMAL", INT2NUM((TTF_HINTING_NORMAL)));
|
363
|
+
/* lighter hinting for non-monochrome modes */
|
364
|
+
rb_define_const(mHinting, "LIGHT", INT2NUM((TTF_HINTING_LIGHT)));
|
365
|
+
/* strong hinting only used for monochrome output */
|
366
|
+
rb_define_const(mHinting, "MONO", INT2NUM((TTF_HINTING_MONO)));
|
367
|
+
/* no hinting */
|
368
|
+
rb_define_const(mHinting, "NONE", INT2NUM((TTF_HINTING_NONE)));
|
369
|
+
}
|
370
|
+
|
371
|
+
#else /* HAVE_SDL_TTF_H */
|
372
|
+
void rubysdl2_init_ttf(void)
|
373
|
+
{
|
374
|
+
}
|
375
|
+
#endif /* HAVE_SDL_TTF_H */
|
376
|
+
|
@@ -0,0 +1,376 @@
|
|
1
|
+
/* -*- mode: C -*- */
|
2
|
+
#ifdef HAVE_SDL_TTF_H
|
3
|
+
#include "rubysdl2_internal.h"
|
4
|
+
#include <SDL_ttf.h>
|
5
|
+
#include <ruby/encoding.h>
|
6
|
+
|
7
|
+
static VALUE cTTF;
|
8
|
+
static VALUE mStyle;
|
9
|
+
static VALUE mHinting;
|
10
|
+
|
11
|
+
#define TTF_ERROR() do { HANDLE_ERROR(SDL_SetError("%s", TTF_GetError())); } while (0)
|
12
|
+
#define HANDLE_TTF_ERROR(code) \
|
13
|
+
do { if ((code) < 0) { TTF_ERROR(); } } while (0)
|
14
|
+
|
15
|
+
typedef struct TTF {
|
16
|
+
TTF_Font* font;
|
17
|
+
} TTF;
|
18
|
+
|
19
|
+
#define TTF_ATTRIBUTE(attr, capitalized_attr, ruby2c, c2ruby) \
|
20
|
+
static VALUE TTF_##attr(VALUE self) \
|
21
|
+
{ \
|
22
|
+
return c2ruby(TTF_Get##capitalized_attr(Get_TTF_Font(self))); \
|
23
|
+
} \
|
24
|
+
static VALUE TTF_set_##attr(VALUE self, VALUE val) \
|
25
|
+
{ \
|
26
|
+
TTF_Set##capitalized_attr(Get_TTF_Font(self), ruby2c(val)); \
|
27
|
+
return Qnil; \
|
28
|
+
}
|
29
|
+
|
30
|
+
#define TTF_ATTRIBUTE_INT(attr, capitalized_attr) \
|
31
|
+
TTF_ATTRIBUTE(attr, capitalized_attr, NUM2INT, INT2NUM)
|
32
|
+
|
33
|
+
#define TTF_ATTR_READER(attr, capitalized_attr, c2ruby) \
|
34
|
+
static VALUE TTF_##attr(VALUE self) \
|
35
|
+
{ \
|
36
|
+
return c2ruby(TTF_Font##capitalized_attr(Get_TTF_Font(self))); \
|
37
|
+
}
|
38
|
+
|
39
|
+
static void TTF_free(TTF* f)
|
40
|
+
{
|
41
|
+
if (rubysdl2_is_active() && f->font)
|
42
|
+
TTF_CloseFont(f->font);
|
43
|
+
free(f);
|
44
|
+
}
|
45
|
+
|
46
|
+
static VALUE TTF_new(TTF_Font* font)
|
47
|
+
{
|
48
|
+
TTF* f = ALLOC(TTF);
|
49
|
+
f->font = font;
|
50
|
+
return Data_Wrap_Struct(cTTF, 0, TTF_free, f);
|
51
|
+
}
|
52
|
+
|
53
|
+
DEFINE_WRAPPER(TTF_Font, TTF, font, cTTF, "SDL2::TTF");
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Document-class: SDL2::TTF
|
57
|
+
*
|
58
|
+
* This class represents font information.
|
59
|
+
*
|
60
|
+
* You can render TrueType fonts using [SDL_ttf](https://www.libsdl.org/projects/SDL_ttf/)
|
61
|
+
* and this class.
|
62
|
+
*
|
63
|
+
* @!attribute style
|
64
|
+
* Font style.
|
65
|
+
* The OR'd bits of the constants of {SDL2::TTF::Style}.
|
66
|
+
* @return [Integer]
|
67
|
+
*
|
68
|
+
* @!attribute outline
|
69
|
+
* The outline pixel width of the font.
|
70
|
+
* @return [Integer]
|
71
|
+
*
|
72
|
+
* @!attribute hinting
|
73
|
+
* Font hinting.
|
74
|
+
* One of the constants of {SDL2::TTF::Hinting}.
|
75
|
+
* @return [Integer]
|
76
|
+
*
|
77
|
+
* @!attribute kerning
|
78
|
+
* True if kerning is enabled.
|
79
|
+
* @return [Booelan]
|
80
|
+
*
|
81
|
+
* @!attribute [r] height
|
82
|
+
* The maximum pixel height of all glyphs of the font.
|
83
|
+
* You can use this height to render text as close together vertically
|
84
|
+
* as possible.
|
85
|
+
* @return [Integer]
|
86
|
+
* @see #line_skip
|
87
|
+
*
|
88
|
+
* @!attribute [r] ascent
|
89
|
+
* The maximum pixel ascent of all glyphs of the font.
|
90
|
+
* The distance from the top of the font to the baseline.
|
91
|
+
* @return [Integer]
|
92
|
+
* @see #descent
|
93
|
+
*
|
94
|
+
* @!attribute [r] descent
|
95
|
+
* The maximum pixel descent of all glyphs of the font.
|
96
|
+
* The distance from the bottom of the font to the baseline.
|
97
|
+
* @return [Integer]
|
98
|
+
* @see #ascent
|
99
|
+
*
|
100
|
+
* @!attribute [r] line_skip
|
101
|
+
* The recommended pixel height of rendered line of text
|
102
|
+
* of the font. Normally, this value is larger than {#height}.
|
103
|
+
* @return [Integer]
|
104
|
+
*
|
105
|
+
* @!attribute [r] num_faces
|
106
|
+
* The number of faces available in the font.
|
107
|
+
* @return [Integer]
|
108
|
+
*
|
109
|
+
* @!attribute [r] face_family_name
|
110
|
+
* The current font face family name of the font.
|
111
|
+
* @return [String]
|
112
|
+
*
|
113
|
+
* @!attribute [r] face_style_name
|
114
|
+
* The current font face style name of the font.
|
115
|
+
* @return [String]
|
116
|
+
*
|
117
|
+
*/
|
118
|
+
|
119
|
+
/*
|
120
|
+
* Initialize TrueType font rendering submodule.
|
121
|
+
*
|
122
|
+
* This function must be called before calling other methods/class methods
|
123
|
+
* of {TTF}.
|
124
|
+
*
|
125
|
+
* @return [nil]
|
126
|
+
*/
|
127
|
+
static VALUE TTF_s_init(VALUE self)
|
128
|
+
{
|
129
|
+
HANDLE_TTF_ERROR(TTF_Init());
|
130
|
+
return Qnil;
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* Open a font data from file.
|
135
|
+
*
|
136
|
+
* @overload open(fname, ptsize, index=0)
|
137
|
+
* @param fname [String] the path of the font file
|
138
|
+
* @param ptsize [Integer] the point size of the font (72DPI).
|
139
|
+
* @param index [Integer] the index of the font faces.
|
140
|
+
* Some font files have multiple font faces, and you
|
141
|
+
* can select one of them using **index**. 0 origin.
|
142
|
+
* If a font have only one font face, 0 is the only
|
143
|
+
* valid index.
|
144
|
+
*
|
145
|
+
* @return [SDL2::TTF] opened font information
|
146
|
+
* @raise [SDL2::Error] occurs when you fail to open a file.
|
147
|
+
*
|
148
|
+
*/
|
149
|
+
static VALUE TTF_s_open(int argc, VALUE* argv, VALUE self)
|
150
|
+
{
|
151
|
+
TTF_Font* font;
|
152
|
+
VALUE fname, ptsize, index;
|
153
|
+
rb_scan_args(argc, argv, "21", &fname, &ptsize, &index);
|
154
|
+
|
155
|
+
font = TTF_OpenFontIndex(StringValueCStr(fname), NUM2INT(ptsize),
|
156
|
+
index == Qnil ? 0 : NUM2LONG(index));
|
157
|
+
if (!font)
|
158
|
+
TTF_ERROR();
|
159
|
+
|
160
|
+
return TTF_new(font);
|
161
|
+
}
|
162
|
+
|
163
|
+
/*
|
164
|
+
* Destroy the font data and release memory.
|
165
|
+
*
|
166
|
+
* @return [nil]
|
167
|
+
*/
|
168
|
+
static VALUE TTF_destroy(VALUE self)
|
169
|
+
{
|
170
|
+
TTF* f = Get_TTF(self);
|
171
|
+
if (f->font)
|
172
|
+
TTF_CloseFont(f->font);
|
173
|
+
f->font = NULL;
|
174
|
+
return Qnil;
|
175
|
+
}
|
176
|
+
|
177
|
+
TTF_ATTRIBUTE_INT(style, FontStyle);
|
178
|
+
TTF_ATTRIBUTE_INT(outline, FontOutline);
|
179
|
+
TTF_ATTRIBUTE_INT(hinting, FontHinting);
|
180
|
+
TTF_ATTRIBUTE(kerning, FontKerning, RTEST, INT2BOOL);
|
181
|
+
TTF_ATTR_READER(height, Height, INT2FIX);
|
182
|
+
TTF_ATTR_READER(ascent, Ascent, INT2FIX);
|
183
|
+
TTF_ATTR_READER(descent, Descent, INT2FIX);
|
184
|
+
TTF_ATTR_READER(line_skip, LineSkip, INT2FIX);
|
185
|
+
TTF_ATTR_READER(num_faces, Faces, LONG2NUM);
|
186
|
+
TTF_ATTR_READER(face_is_fixed_width_p, FaceIsFixedWidth, INT2BOOL);
|
187
|
+
TTF_ATTR_READER(face_family_name, FaceFamilyName, utf8str_new_cstr);
|
188
|
+
TTF_ATTR_READER(face_style_name, FaceStyleName, utf8str_new_cstr);
|
189
|
+
|
190
|
+
/*
|
191
|
+
* @overload size_text(text)
|
192
|
+
* Calculate the size of rendered surface of **text** using the font.
|
193
|
+
*
|
194
|
+
* @param text [String] the string to size up
|
195
|
+
*
|
196
|
+
* @return [[Integer, Integer]] a pair of width and height of the rendered surface
|
197
|
+
*
|
198
|
+
* @raise [SDL2::Error] It is raised when an error occurs, such as a glyph ins the
|
199
|
+
* string not being found.
|
200
|
+
*/
|
201
|
+
static VALUE TTF_size_text(VALUE self, VALUE text)
|
202
|
+
{
|
203
|
+
int w, h;
|
204
|
+
Check_Type(text, T_STRING);
|
205
|
+
text = rb_str_export_to_enc(text, rb_utf8_encoding());
|
206
|
+
HANDLE_TTF_ERROR(TTF_SizeUTF8(Get_TTF_Font(self), StringValueCStr(text), &w, &h));
|
207
|
+
return rb_ary_new3(2, INT2NUM(w), INT2NUM(h));
|
208
|
+
}
|
209
|
+
|
210
|
+
static SDL_Surface* render_solid(TTF_Font* font, const char* text, SDL_Color fg, SDL_Color bg)
|
211
|
+
{
|
212
|
+
return TTF_RenderUTF8_Solid(font, text, fg);
|
213
|
+
}
|
214
|
+
|
215
|
+
static SDL_Surface* render_blended(TTF_Font* font, const char* text, SDL_Color fg, SDL_Color bg)
|
216
|
+
{
|
217
|
+
return TTF_RenderUTF8_Blended(font, text, fg);
|
218
|
+
}
|
219
|
+
|
220
|
+
static VALUE render(SDL_Surface* (*renderer)(TTF_Font*, const char*, SDL_Color, SDL_Color),
|
221
|
+
VALUE font, VALUE text, VALUE fg, VALUE bg)
|
222
|
+
{
|
223
|
+
SDL_Surface* surface;
|
224
|
+
text = rb_str_export_to_enc(text, rb_utf8_encoding());
|
225
|
+
surface = renderer(Get_TTF_Font(font), StringValueCStr(text),
|
226
|
+
Color_to_SDL_Color(fg), Color_to_SDL_Color(bg));
|
227
|
+
if (!surface)
|
228
|
+
TTF_ERROR();
|
229
|
+
|
230
|
+
return Surface_new(surface);
|
231
|
+
}
|
232
|
+
|
233
|
+
/*
|
234
|
+
* @overload render_solid(text, fg)
|
235
|
+
* Render **text** using the font with fg color on a new surface, using
|
236
|
+
* *Solid* mode.
|
237
|
+
*
|
238
|
+
* Solid mode rendering is quick but dirty.
|
239
|
+
*
|
240
|
+
* @param text [String] the text to render
|
241
|
+
* @param fg [[Integer, Integer, Integer]]
|
242
|
+
* the color to render. An array of r, g, and b components.
|
243
|
+
*
|
244
|
+
* @return [SDL2::Surface]
|
245
|
+
*
|
246
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
247
|
+
*/
|
248
|
+
static VALUE TTF_render_solid(VALUE self, VALUE text, VALUE fg)
|
249
|
+
{
|
250
|
+
return render(render_solid, self, text, fg, Qnil);
|
251
|
+
}
|
252
|
+
|
253
|
+
/*
|
254
|
+
* @overload render_shaded(text, fg, bg)
|
255
|
+
* Render **text** using the font with fg color on a new surface, using
|
256
|
+
* *Shaded* mode.
|
257
|
+
*
|
258
|
+
* Shaded mode rendering is slow and nice, but with a solid box filled by
|
259
|
+
* the background color.
|
260
|
+
*
|
261
|
+
* @param text [String] the text to render
|
262
|
+
* @param fg [[Integer, Integer, Integer]]
|
263
|
+
* the color to render. An array of r, g, and b components.
|
264
|
+
* @param bg [[Integer, Integer, Integer]]
|
265
|
+
* the background color. An array of r, g, and b components.
|
266
|
+
*
|
267
|
+
* @return [SDL2::Surface]
|
268
|
+
*
|
269
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
270
|
+
*/
|
271
|
+
static VALUE TTF_render_shaded(VALUE self, VALUE text, VALUE fg, VALUE bg)
|
272
|
+
{
|
273
|
+
return render(TTF_RenderUTF8_Shaded, self, text, fg, bg);
|
274
|
+
}
|
275
|
+
|
276
|
+
/*
|
277
|
+
* @overload render_blended(text, fg)
|
278
|
+
* Render **text** using the font with fg color on a new surface, using
|
279
|
+
* *Blended* mode.
|
280
|
+
*
|
281
|
+
* Blended mode rendering is very slow but very nice.
|
282
|
+
* The rendered surface has an alpha channel,
|
283
|
+
*
|
284
|
+
* @param text [String] the text to render
|
285
|
+
* @param fg [[Integer, Integer, Integer]]
|
286
|
+
* the color to render. An array of r, g, and b components.
|
287
|
+
*
|
288
|
+
* @return [SDL2::Surface]
|
289
|
+
*
|
290
|
+
* @raise [SDL2::Error] raised when the randering fails.
|
291
|
+
*/
|
292
|
+
static VALUE TTF_render_blended(VALUE self, VALUE text, VALUE fg)
|
293
|
+
{
|
294
|
+
return render(render_blended, self, text, fg, Qnil);
|
295
|
+
}
|
296
|
+
|
297
|
+
/*
|
298
|
+
* Document-module: SDL2::TTF::Style
|
299
|
+
*
|
300
|
+
* Constants represents font styles.
|
301
|
+
*/
|
302
|
+
|
303
|
+
/* Document-module: SDL2::TTF::Hinting
|
304
|
+
*
|
305
|
+
* Constants represents font hinting for FreeType.
|
306
|
+
*/
|
307
|
+
void rubysdl2_init_ttf(void)
|
308
|
+
{
|
309
|
+
cTTF = rb_define_class_under(mSDL2, "TTF", rb_cObject);
|
310
|
+
rb_undef_alloc_func(cTTF);
|
311
|
+
|
312
|
+
rb_define_singleton_method(cTTF, "init", TTF_s_init, 0);
|
313
|
+
rb_define_singleton_method(cTTF, "open", TTF_s_open, -1);
|
314
|
+
/* Return true if the font is destroyed by {#destroy}. */
|
315
|
+
rb_define_method(cTTF, "destroy?", TTF_destroy_p, 0);
|
316
|
+
rb_define_method(cTTF, "destroy", TTF_destroy, 0);
|
317
|
+
|
318
|
+
#define DEFINE_TTF_ATTRIBUTE(attr) do { \
|
319
|
+
rb_define_method(cTTF, #attr, TTF_##attr, 0); \
|
320
|
+
rb_define_method(cTTF, #attr "=", TTF_set_##attr, 1); \
|
321
|
+
} while (0)
|
322
|
+
|
323
|
+
DEFINE_TTF_ATTRIBUTE(style);
|
324
|
+
DEFINE_TTF_ATTRIBUTE(outline);
|
325
|
+
DEFINE_TTF_ATTRIBUTE(hinting);
|
326
|
+
DEFINE_TTF_ATTRIBUTE(kerning);
|
327
|
+
|
328
|
+
#define DEFINE_TTF_ATTR_READER(attr) \
|
329
|
+
rb_define_method(cTTF, #attr, TTF_##attr, 0)
|
330
|
+
|
331
|
+
DEFINE_TTF_ATTR_READER(height);
|
332
|
+
DEFINE_TTF_ATTR_READER(ascent);
|
333
|
+
DEFINE_TTF_ATTR_READER(descent);
|
334
|
+
DEFINE_TTF_ATTR_READER(line_skip);
|
335
|
+
DEFINE_TTF_ATTR_READER(num_faces);
|
336
|
+
/* Return true if the font is fixed width. */
|
337
|
+
rb_define_method(cTTF, "face_is_fixed_width?", TTF_face_is_fixed_width_p, 0);
|
338
|
+
DEFINE_TTF_ATTR_READER(face_family_name);
|
339
|
+
DEFINE_TTF_ATTR_READER(face_style_name);
|
340
|
+
|
341
|
+
rb_define_method(cTTF, "size_text", TTF_size_text, 1);
|
342
|
+
rb_define_method(cTTF, "render_solid", TTF_render_solid, 2);
|
343
|
+
rb_define_method(cTTF, "render_shaded", TTF_render_shaded, 3);
|
344
|
+
rb_define_method(cTTF, "render_blended", TTF_render_blended, 2);
|
345
|
+
|
346
|
+
mStyle = rb_define_module_under(cTTF, "Style");
|
347
|
+
/* define(`DEFINE_TTF_STYLE_CONST',`rb_define_const(mStyle, "$1", INT2NUM((TTF_STYLE_$1)))') */
|
348
|
+
/* normal style */
|
349
|
+
DEFINE_TTF_STYLE_CONST(NORMAL);
|
350
|
+
/* bold style */
|
351
|
+
DEFINE_TTF_STYLE_CONST(BOLD);
|
352
|
+
/* italic style */
|
353
|
+
DEFINE_TTF_STYLE_CONST(ITALIC);
|
354
|
+
/* underline style */
|
355
|
+
DEFINE_TTF_STYLE_CONST(UNDERLINE);
|
356
|
+
/* strikethrough style */
|
357
|
+
DEFINE_TTF_STYLE_CONST(STRIKETHROUGH);
|
358
|
+
|
359
|
+
mHinting = rb_define_module_under(cTTF, "Hinting");
|
360
|
+
/* define(`DEFINE_TTF_HINTING_CONST',`rb_define_const(mHinting, "$1", INT2NUM((TTF_HINTING_$1)))') */
|
361
|
+
/* normal hinting, default */
|
362
|
+
DEFINE_TTF_HINTING_CONST(NORMAL);
|
363
|
+
/* lighter hinting for non-monochrome modes */
|
364
|
+
DEFINE_TTF_HINTING_CONST(LIGHT);
|
365
|
+
/* strong hinting only used for monochrome output */
|
366
|
+
DEFINE_TTF_HINTING_CONST(MONO);
|
367
|
+
/* no hinting */
|
368
|
+
DEFINE_TTF_HINTING_CONST(NONE);
|
369
|
+
}
|
370
|
+
|
371
|
+
#else /* HAVE_SDL_TTF_H */
|
372
|
+
void rubysdl2_init_ttf(void)
|
373
|
+
{
|
374
|
+
}
|
375
|
+
#endif /* HAVE_SDL_TTF_H */
|
376
|
+
|