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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.dir-locals.el +2 -0
  3. data/.github/workflows/gempush.yml +29 -0
  4. data/.gitignore +14 -0
  5. data/COPYING.txt +165 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +24 -0
  8. data/Makefile +4 -0
  9. data/README.md +36 -0
  10. data/Rakefile +51 -0
  11. data/doc/po/ja.po +10357 -0
  12. data/ext/sdl2_ext/clipboard.c +61 -0
  13. data/ext/sdl2_ext/color.c +103 -0
  14. data/ext/sdl2_ext/color.h +4 -0
  15. data/ext/sdl2_ext/event.c +1298 -0
  16. data/ext/sdl2_ext/extconf.rb +22 -0
  17. data/ext/sdl2_ext/filesystem.c +63 -0
  18. data/ext/sdl2_ext/gamecontroller.c +408 -0
  19. data/ext/sdl2_ext/gamecontroller.c.m4 +408 -0
  20. data/ext/sdl2_ext/gl.c +351 -0
  21. data/ext/sdl2_ext/gl.c.m4 +351 -0
  22. data/ext/sdl2_ext/hint.c +99 -0
  23. data/ext/sdl2_ext/joystick.c +339 -0
  24. data/ext/sdl2_ext/joystick.c.m4 +339 -0
  25. data/ext/sdl2_ext/key.c +1302 -0
  26. data/ext/sdl2_ext/key.c.m4 +833 -0
  27. data/ext/sdl2_ext/main.c +258 -0
  28. data/ext/sdl2_ext/messagebox.c +233 -0
  29. data/ext/sdl2_ext/mixer.c +1205 -0
  30. data/ext/sdl2_ext/mixer.c.m4 +1205 -0
  31. data/ext/sdl2_ext/mouse.c +286 -0
  32. data/ext/sdl2_ext/rubysdl2_internal.h +127 -0
  33. data/ext/sdl2_ext/timer.c +63 -0
  34. data/ext/sdl2_ext/ttf.c +376 -0
  35. data/ext/sdl2_ext/ttf.c.m4 +376 -0
  36. data/ext/sdl2_ext/video.c +4093 -0
  37. data/ext/sdl2_ext/video.c.m4 +3867 -0
  38. data/lib/sdl2.rb +3 -0
  39. data/lib/sdl2/event.rb +55 -0
  40. data/lib/sdl2/version.rb +8 -0
  41. data/sample/chunk_destroy.rb +16 -0
  42. data/sample/gfxprimitives.rb +54 -0
  43. data/sample/icon.bmp +0 -0
  44. data/sample/memory_test/m1.rb +28 -0
  45. data/sample/memory_test/m2.rb +18 -0
  46. data/sample/memory_test/m3.rb +12 -0
  47. data/sample/message_box.rb +33 -0
  48. data/sample/music_player.rb +137 -0
  49. data/sample/playwave.rb +19 -0
  50. data/sample/primitives.rb +32 -0
  51. data/sample/test_clipboard.rb +16 -0
  52. data/sample/test_controller.rb +62 -0
  53. data/sample/test_joystick.rb +53 -0
  54. data/sample/test_keyboard.rb +52 -0
  55. data/sample/test_mouse.rb +50 -0
  56. data/sample/test_surface.rb +13 -0
  57. data/sample/test_ttf.rb +82 -0
  58. data/sample/test_video.rb +59 -0
  59. data/sample/testgl.rb +175 -0
  60. data/sample/testsprite.rb +296 -0
  61. data/sample/testspriteminimal.rb +75 -0
  62. data/sample/timer.rb +11 -0
  63. data/sample/version.rb +12 -0
  64. data/sample/video_info.rb +64 -0
  65. data/sdl2-win93.gemspec +31 -0
  66. metadata +158 -0
@@ -0,0 +1,408 @@
1
+ /* -*- mode: C -*- */
2
+ #include "rubysdl2_internal.h"
3
+ #include <SDL_gamecontroller.h>
4
+
5
+ static VALUE cGameController;
6
+ static VALUE mAxis;
7
+ static VALUE mButton;
8
+
9
+ typedef struct GameController {
10
+ SDL_GameController* controller;
11
+ } GameController;
12
+
13
+ static void GameController_free(GameController* g)
14
+ {
15
+ if (rubysdl2_is_active() && g->controller)
16
+ SDL_GameControllerClose(g->controller);
17
+ free(g);
18
+ }
19
+
20
+ /*
21
+ * Document-class: SDL2::GameController
22
+ *
23
+ * This class represents a "Game Controller".
24
+ *
25
+ * In SDL2, there is a gamecontroller framework to
26
+ * hide the details of joystick types. This framework
27
+ * is built on the existing joystick API.
28
+ *
29
+ * The framework consists of two parts:
30
+ *
31
+ * * Mapping joysticks to game controllers
32
+ * * Aquire input from game controllers
33
+ *
34
+ * Mapping information is a string, and described as:
35
+ *
36
+ * GUID,name,mapping
37
+ *
38
+ * GUID is a unique ID of a type of joystick and
39
+ * given by {Joystick#GUID}. name is the human readable
40
+ * string for the device, and mappings are contorller mappings
41
+ * to joystick ones.
42
+ *
43
+ * This mappings abstract the details of joysticks, for exmaple,
44
+ * the number of buttons, the number of axes, and the position
45
+ * of these buttons a on pad.
46
+ * You can use unified interface
47
+ * with this framework theoretically.
48
+ * Howerver, we need to prepare the
49
+ * database of many joysticks that users will use. A database
50
+ * is available at https://github.com/gabomdq/SDL_GameControllerDB,
51
+ * but perhaps this is not sufficient for your usage.
52
+ * In fact, Steam prepares its own database for Steam games,
53
+ * so if you will create a game for Steam, this framework is
54
+ * useful. Otherwise, it is a better way to use joystick API
55
+ * directly.
56
+ *
57
+ * @!method destroy?
58
+ * Return true if the gamecontroller is already closed.
59
+ */
60
+
61
+ static VALUE GameController_new(SDL_GameController* controller)
62
+ {
63
+ GameController* g = ALLOC(GameController);
64
+ g->controller = controller;
65
+ return Data_Wrap_Struct(cGameController, 0, GameController_free, g);
66
+ }
67
+
68
+ DEFINE_WRAPPER(SDL_GameController, GameController, controller, cGameController,
69
+ "SDL2::GameController");
70
+
71
+
72
+ /*
73
+ * @overload add_mapping(string)
74
+ *
75
+ * Add suuport for controolers that SDL is unaware of or to cause an
76
+ * existing controller to have a different binding.
77
+ *
78
+ * "GUID,name,mapping", where GUID is
79
+ * the string value from SDL_JoystickGetGUIDString(), name is the human
80
+ * readable string for the device and mappings are controller mappings to
81
+ * joystick ones. Under Windows there is a reserved GUID of "xinput" that
82
+ * covers all XInput devices. The mapping format for joystick is:
83
+ *
84
+ * * bX: a joystick button, index X
85
+ * * hX.Y: hat X with value Y
86
+ * * aX: axis X of the joystick
87
+ *
88
+ * Buttons can be used as a controller axes and vice versa.
89
+ *
90
+ * This string shows an example of a valid mapping for a controller:
91
+ * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7"
92
+ *
93
+ * @param string [String] mapping string
94
+ * @return [Integer] 1 if a new mapping, 0 if an existing mapping is updated.
95
+ */
96
+ static VALUE GameController_s_add_mapping(VALUE self, VALUE string)
97
+ {
98
+ int ret = HANDLE_ERROR(SDL_GameControllerAddMapping(StringValueCStr(string)));
99
+ return INT2NUM(ret);
100
+ }
101
+
102
+ /*
103
+ * @overload axis_name_of(axis)
104
+ *
105
+ * Get a string representing **axis**.
106
+ *
107
+ * @param axis [Integer] axis constant in {Axis}
108
+ * @return [String]
109
+ */
110
+ static VALUE GameController_s_axis_name_of(VALUE self, VALUE axis)
111
+ {
112
+ const char* name = SDL_GameControllerGetStringForAxis(NUM2INT(axis));
113
+ if (!name) {
114
+ SDL_SetError("Unknown axis %d", NUM2INT(axis));
115
+ SDL_ERROR();
116
+ }
117
+ return utf8str_new_cstr(name);
118
+ }
119
+
120
+ /*
121
+ * @overload button_name_of(button)
122
+ *
123
+ * Get a string representing **button**.
124
+ *
125
+ * @param button [Integer] button constant in {Button}
126
+ * @return [String]
127
+ */
128
+ static VALUE GameController_s_button_name_of(VALUE self, VALUE button)
129
+ {
130
+ const char* name = SDL_GameControllerGetStringForButton(NUM2INT(button));
131
+ if (!name) {
132
+ SDL_SetError("Unknown axis %d", NUM2INT(button));
133
+ SDL_ERROR();
134
+ }
135
+ return utf8str_new_cstr(name);
136
+ }
137
+
138
+ /*
139
+ * @overload axis_from_name(name)
140
+ *
141
+ * Get a integer representation of the axis
142
+ * whose string representation is **name**.
143
+ *
144
+ * The return value is the value of one of the constants in {Axis}
145
+ *
146
+ * @param name [String] a string representing an axis
147
+ * @return [Integer]
148
+ */
149
+ static VALUE GameController_s_axis_from_name(VALUE self, VALUE name)
150
+ {
151
+ int axis = SDL_GameControllerGetAxisFromString(StringValueCStr(name));
152
+ if (axis < 0) {
153
+ SDL_SetError("Unknown axis name \"%s\"", StringValueCStr(name));
154
+ SDL_ERROR();
155
+ }
156
+ return INT2FIX(axis);
157
+ }
158
+
159
+ /*
160
+ * @overload button_from_name(name)
161
+ *
162
+ * Get a integer representation of the button
163
+ * whose string representation is **name**.
164
+ *
165
+ * The return value is the value of one of the constants in {Button}
166
+ *
167
+ * @param name [String] a string representing a button
168
+ * @return [Integer]
169
+ */
170
+ static VALUE GameController_s_button_from_name(VALUE self, VALUE name)
171
+ {
172
+ int button = SDL_GameControllerGetButtonFromString(StringValueCStr(name));
173
+ if (button < 0) {
174
+ SDL_SetError("Unknown button name \"%s\"", StringValueCStr(name));
175
+ SDL_ERROR();
176
+ }
177
+ return INT2FIX(button);
178
+ }
179
+
180
+ /*
181
+ * Get the implementation dependent name for the game controllers
182
+ * connected to the machine.
183
+ *
184
+ * The number of elements of returning array is same as
185
+ * {Joystick.num_connected_joysticks}.
186
+ *
187
+ * @return [Array<String,nil>]
188
+ */
189
+ static VALUE GameController_s_device_names(VALUE self)
190
+ {
191
+ int num_joysticks = SDL_NumJoysticks();
192
+ int i;
193
+ VALUE device_names = rb_ary_new2(num_joysticks);
194
+ for (i=0; i<num_joysticks; ++i) {
195
+ const char* name = SDL_GameControllerNameForIndex(i);
196
+ if (name)
197
+ rb_ary_push(device_names, utf8str_new_cstr(name));
198
+ else
199
+ rb_ary_push(device_names, Qnil);
200
+ }
201
+ return device_names;
202
+ }
203
+
204
+ /*
205
+ * @overload mapping_for(guid_string)
206
+ * Get the game controller mapping string for a given GUID.
207
+ *
208
+ * @param guid_string [String] GUID string
209
+ *
210
+ * @return [String]
211
+ */
212
+ static VALUE GameController_s_mapping_for(VALUE self, VALUE guid_string)
213
+ {
214
+ SDL_JoystickGUID guid = SDL_JoystickGetGUIDFromString(StringValueCStr(guid_string));
215
+ return utf8str_new_cstr(SDL_GameControllerMappingForGUID(guid));
216
+ }
217
+
218
+ /*
219
+ * @overload open(index)
220
+ * Open a game controller and return the opened GameController object.
221
+ *
222
+ * @param index [Integer] device index, up to the return value of {Joystick.num_connected_joysticks}.
223
+ * @return [SDL2::GameController]
224
+ *
225
+ * @raise [SDL2::Error] raised when device open is failed.
226
+ * For exmaple, **index** is out of range.
227
+ */
228
+ static VALUE GameController_s_open(VALUE self, VALUE index)
229
+ {
230
+ SDL_GameController* controller = SDL_GameControllerOpen(NUM2INT(index));
231
+ if (!controller)
232
+ SDL_ERROR();
233
+ return GameController_new(controller);
234
+ }
235
+
236
+ /*
237
+ * Get the name of an opened game controller.
238
+ *
239
+ * @return [String]
240
+ */
241
+ static VALUE GameController_name(VALUE self)
242
+ {
243
+ const char* name = SDL_GameControllerName(Get_SDL_GameController(self));
244
+ if (!name)
245
+ SDL_ERROR();
246
+
247
+ return utf8str_new_cstr(name);
248
+ }
249
+
250
+ /*
251
+ * Return true if **self** is opened and attached.
252
+ */
253
+ static VALUE GameController_attached_p(VALUE self)
254
+ {
255
+ return INT2BOOL(SDL_GameControllerGetAttached(Get_SDL_GameController(self)));
256
+ }
257
+
258
+ /*
259
+ * Close the game controller.
260
+ *
261
+ * @return nil
262
+ */
263
+ static VALUE GameController_destroy(VALUE self)
264
+ {
265
+ GameController* g = Get_GameController(self);
266
+ if (g->controller)
267
+ SDL_GameControllerClose(g->controller);
268
+ g->controller = NULL;
269
+ return Qnil;
270
+ }
271
+
272
+ /*
273
+ * Get the mapping string of **self**.
274
+ *
275
+ * @return [String]
276
+ * @see .add_mapping
277
+ * @see .mapping_for
278
+ */
279
+ static VALUE GameController_mapping(VALUE self)
280
+ {
281
+ return utf8str_new_cstr(SDL_GameControllerMapping(Get_SDL_GameController(self)));
282
+ }
283
+
284
+ /*
285
+ * @overload axis(axis)
286
+ * Get the state of an axis control.
287
+ *
288
+ * The state is an integer from -32768 to 32767.
289
+ * The state of trigger never returns negative value (from 0 to 32767).
290
+ *
291
+ * @param axis [Integer] the index of an axis, one of the constants in {Axis}
292
+ * @return [Integer]
293
+ */
294
+ static VALUE GameController_axis(VALUE self, VALUE axis)
295
+ {
296
+ return INT2FIX(SDL_GameControllerGetAxis(Get_SDL_GameController(self),
297
+ NUM2INT(axis)));
298
+ }
299
+
300
+ /*
301
+ * @overload button_pressed?(button)
302
+ * Return true if a button is pressed.
303
+ *
304
+ * @param button [Integer] the index of a button, one of the constants in {Button}
305
+ */
306
+ static VALUE GameController_button_pressed_p(VALUE self, VALUE button)
307
+ {
308
+ return INT2BOOL(SDL_GameControllerGetButton(Get_SDL_GameController(self),
309
+ NUM2INT(button)));
310
+ }
311
+
312
+ /*
313
+ * Document-module: SDL2::GameController::Axis
314
+ *
315
+ * This module provides constants of gamecontroller's axis indices used by
316
+ * {SDL2::GameController} class.
317
+ */
318
+
319
+ /*
320
+ * Document-module: SDL2::GameController::Button
321
+ *
322
+ * This module provides constants of gamecontroller's button indices used by
323
+ * {SDL2::GameController} class.
324
+ */
325
+ void rubysdl2_init_gamecontorller(void)
326
+ {
327
+ cGameController = rb_define_class_under(mSDL2, "GameController", rb_cObject);
328
+
329
+ rb_define_singleton_method(cGameController, "add_mapping",
330
+ GameController_s_add_mapping, 1);
331
+ rb_define_singleton_method(cGameController, "device_names",
332
+ GameController_s_device_names, 0);
333
+ rb_define_singleton_method(cGameController, "axis_name_of",
334
+ GameController_s_axis_name_of, 1);
335
+ rb_define_singleton_method(cGameController, "button_name_of",
336
+ GameController_s_button_name_of, 1);
337
+ rb_define_singleton_method(cGameController, "mapping_for",
338
+ GameController_s_mapping_for, 1);
339
+ rb_define_singleton_method(cGameController, "button_from_name",
340
+ GameController_s_button_from_name, 1);
341
+ rb_define_singleton_method(cGameController, "axis_from_name",
342
+ GameController_s_axis_from_name, 1);
343
+ rb_define_singleton_method(cGameController, "open", GameController_s_open, 1);
344
+ rb_define_method(cGameController, "destroy?", GameController_destroy_p, 0);
345
+ rb_define_method(cGameController, "destroy", GameController_destroy, 0);
346
+ rb_define_method(cGameController, "name", GameController_name, 0);
347
+ rb_define_method(cGameController, "attached?", GameController_attached_p, 0);
348
+ rb_define_method(cGameController, "mapping", GameController_mapping, 0);
349
+ rb_define_method(cGameController, "axis", GameController_axis, 1);
350
+ rb_define_method(cGameController, "button_pressed?", GameController_button_pressed_p, 1);
351
+
352
+ mAxis = rb_define_module_under(cGameController, "Axis");
353
+ mButton = rb_define_module_under(cGameController, "Button");
354
+
355
+ /* define(`DEFINE_CONTROLLER_AXIS_CONST',`rb_define_const(mAxis, "$1", INT2NUM(SDL_CONTROLLER_AXIS_$1))') */
356
+ /* Invalid axis index */
357
+ DEFINE_CONTROLLER_AXIS_CONST(INVALID);
358
+ /* Left X axis */
359
+ DEFINE_CONTROLLER_AXIS_CONST(LEFTX);
360
+ /* Left Y axis */
361
+ DEFINE_CONTROLLER_AXIS_CONST(LEFTY);
362
+ /* Right X axis */
363
+ DEFINE_CONTROLLER_AXIS_CONST(RIGHTX);
364
+ /* Right Y axis */
365
+ DEFINE_CONTROLLER_AXIS_CONST(RIGHTY);
366
+ /* Left trigger axis */
367
+ DEFINE_CONTROLLER_AXIS_CONST(TRIGGERLEFT);
368
+ /* Right trigger axis */
369
+ DEFINE_CONTROLLER_AXIS_CONST(TRIGGERRIGHT);
370
+ /* The max of an axis index */
371
+ DEFINE_CONTROLLER_AXIS_CONST(MAX);
372
+
373
+ /* define(`DEFINE_CONTROLLER_BUTTON_CONST',`rb_define_const(mButton, "$1", INT2NUM(SDL_CONTROLLER_BUTTON_$1))') */
374
+ /* Invalid button index */
375
+ DEFINE_CONTROLLER_BUTTON_CONST(INVALID);
376
+ /* Button A */
377
+ DEFINE_CONTROLLER_BUTTON_CONST(A);
378
+ /* Button B */
379
+ DEFINE_CONTROLLER_BUTTON_CONST(B);
380
+ /* Button X */
381
+ DEFINE_CONTROLLER_BUTTON_CONST(X);
382
+ /* Button Y */
383
+ DEFINE_CONTROLLER_BUTTON_CONST(Y);
384
+ /* Back Button */
385
+ DEFINE_CONTROLLER_BUTTON_CONST(BACK);
386
+ /* Guide Button */
387
+ DEFINE_CONTROLLER_BUTTON_CONST(GUIDE);
388
+ /* Start Button */
389
+ DEFINE_CONTROLLER_BUTTON_CONST(START);
390
+ /* Left stick Button */
391
+ DEFINE_CONTROLLER_BUTTON_CONST(LEFTSTICK);
392
+ /* Right stick Button */
393
+ DEFINE_CONTROLLER_BUTTON_CONST(RIGHTSTICK);
394
+ /* Left shoulder Button */
395
+ DEFINE_CONTROLLER_BUTTON_CONST(LEFTSHOULDER);
396
+ /* Right shoulder Button */
397
+ DEFINE_CONTROLLER_BUTTON_CONST(RIGHTSHOULDER);
398
+ /* D-pad UP Button */
399
+ DEFINE_CONTROLLER_BUTTON_CONST(DPAD_UP);
400
+ /* D-pad DOWN Button */
401
+ DEFINE_CONTROLLER_BUTTON_CONST(DPAD_DOWN);
402
+ /* D-pad LEFT Button */
403
+ DEFINE_CONTROLLER_BUTTON_CONST(DPAD_LEFT);
404
+ /* D-pad RIGHT Button */
405
+ DEFINE_CONTROLLER_BUTTON_CONST(DPAD_RIGHT);
406
+ /* The max of a button index */
407
+ DEFINE_CONTROLLER_BUTTON_CONST(MAX);
408
+ }
@@ -0,0 +1,351 @@
1
+ /* -*- mode: C -*- */
2
+ #include "rubysdl2_internal.h"
3
+ #include <SDL_video.h>
4
+ #include <SDL_version.h>
5
+
6
+ static VALUE mGL;
7
+ static VALUE cGLContext;
8
+
9
+ static VALUE current_context = Qnil;
10
+
11
+ typedef struct GLContext {
12
+ SDL_GLContext context;
13
+ } GLContext;
14
+
15
+ DEFINE_WRAPPER(SDL_GLContext, GLContext, context, cGLContext, "SDL2::GL::Context");
16
+
17
+ static void GLContext_free(GLContext* c)
18
+ {
19
+ if (c->context)
20
+ SDL_GL_DeleteContext(c->context);
21
+ free(c);
22
+ }
23
+
24
+ static VALUE GLContext_new(SDL_GLContext context)
25
+ {
26
+ GLContext* c = ALLOC(GLContext);
27
+ c->context = context;
28
+ return Data_Wrap_Struct(cGLContext, 0, GLContext_free, c);
29
+ }
30
+
31
+ /*
32
+ * Document-module: SDL2::GL
33
+ *
34
+ * This module provides the initialize/shutdown functions of OpenGL.
35
+ *
36
+ */
37
+
38
+ /*
39
+ * Document-class: SDL2::GL::Context
40
+ *
41
+ * This class represents an OpenGL context.
42
+ *
43
+ * You must create a new OpenGL context before using
44
+ * OpenGL functions.
45
+ *
46
+ * @!method destroy?
47
+ * Return true if the context is {#destroy destroyed}.
48
+ */
49
+
50
+ /*
51
+ * @overload create(window)
52
+ * Create an OpenGL context for use with an OpenGL window, and make it
53
+ * current.
54
+ *
55
+ * @param window [SDL2::Window] the window associate with a new context
56
+ * @return [SDL2::GL::Context]
57
+ *
58
+ * @see #delete
59
+ *
60
+ * @example
61
+ *
62
+ * SDL2.init(SDL2::INIT_EVERYTHING)
63
+ * # You need to create a window with `OPENGL' flag
64
+ * window = SDL2::Window.create("testgl", 0, 0, WINDOW_W, WINDOW_H,
65
+ * SDL2::Window::Flags::OPENGL)
66
+ *
67
+ * # Create a OpenGL context attached to the window
68
+ * context = SDL2::GL::Context.create(window)
69
+ *
70
+ * # You can use OpenGL functions
71
+ * :
72
+ *
73
+ * # Delete the context after using OpenGL functions
74
+ * context.destroy
75
+ */
76
+ static VALUE GLContext_s_create(VALUE self, VALUE window)
77
+ {
78
+ SDL_GLContext context = SDL_GL_CreateContext(Get_SDL_Window(window));
79
+ if (!context)
80
+ SDL_ERROR();
81
+
82
+ return (current_context = GLContext_new(context));
83
+ }
84
+
85
+ /*
86
+ * Delete the OpenGL context.
87
+ *
88
+ * @return [nil]
89
+ *
90
+ * @see #destroy?
91
+ */
92
+ static VALUE GLContext_destroy(VALUE self)
93
+ {
94
+ GLContext* c = Get_GLContext(self);
95
+ if (c->context)
96
+ SDL_GL_DeleteContext(c->context);
97
+ c->context = NULL;
98
+ return Qnil;
99
+ }
100
+
101
+ /*
102
+ * @overload make_current(window)
103
+ * Set the OpenGL context for rendering into an OpenGL window.
104
+ *
105
+ * @param window [SDL2::Window] the window to associate with the context
106
+ * @return [nil]
107
+ */
108
+ static VALUE GLContext_make_current(VALUE self, VALUE window)
109
+ {
110
+ HANDLE_ERROR(SDL_GL_MakeCurrent(Get_SDL_Window(window), Get_SDL_GLContext(self)));
111
+ current_context = self;
112
+ return Qnil;
113
+ }
114
+
115
+ /*
116
+ * Get the current OpenGL context.
117
+ *
118
+ * @return [SDL2::GL::Context] the curren context
119
+ * @return [nil] if there is no current context
120
+ *
121
+ * @see #make_current
122
+ */
123
+ static VALUE GLContext_s_current(VALUE self)
124
+ {
125
+ return current_context;
126
+ }
127
+
128
+ /*
129
+ * @overload extension_supported?(extension)
130
+ * Return true if the current context supports **extension**
131
+ *
132
+ * @param extension [String] the name of an extension
133
+ * @example
134
+ * SDL2::GL.extension_supported?("GL_EXT_framebuffer_blit")
135
+ */
136
+ static VALUE GL_s_extension_supported_p(VALUE self, VALUE extension)
137
+ {
138
+ return INT2BOOL(SDL_GL_ExtensionSupported(StringValueCStr(extension)));
139
+ }
140
+
141
+ /*
142
+ * Get the state of swap interval of the current context.
143
+ *
144
+ * @return [Integer]
145
+ * return 0 when vsync is not used,
146
+ * return 1 when vsync is used,
147
+ * and return -1 when vsync is not supported by the system (OS).
148
+ *
149
+ */
150
+ static VALUE GL_s_swap_interval(VALUE self)
151
+ {
152
+ return INT2NUM(SDL_GL_GetSwapInterval());
153
+ }
154
+
155
+
156
+ /*
157
+ * @overload swap_interval=(interval)
158
+ * Set the state of swap interval of the current context.
159
+ *
160
+ * @param interval [Integer]
161
+ * 0 if you don't want to wait for vsync,
162
+ * 1 if you want to wait for vsync,
163
+ * -1 if you want to use late swap tearing
164
+ * @return [nil]
165
+ *
166
+ */
167
+ static VALUE GL_s_set_swap_interval(VALUE self, VALUE interval)
168
+ {
169
+ HANDLE_ERROR(SDL_GL_SetSwapInterval(NUM2INT(interval)));
170
+ return Qnil;
171
+ }
172
+
173
+ /*
174
+ * @overload get_attribute(attr)
175
+ * Get the acutal value for an attribute from current context.
176
+ *
177
+ * @param attr [Integer] the OpenGL attribute to query
178
+ * @return [Integer]
179
+ */
180
+ static VALUE GL_s_get_attribute(VALUE self, VALUE attr)
181
+ {
182
+ int value;
183
+ HANDLE_ERROR(SDL_GL_GetAttribute(NUM2INT(attr), &value));
184
+ return INT2NUM(value);
185
+ }
186
+
187
+ /*
188
+ * @overload set_attribute(attr, value)
189
+ * Set an OpenGL window attribute before window creation.
190
+ *
191
+ * @param attr [Integer] the OpenGL attribute to set
192
+ * @param value [Integer] the desired value for the attribute
193
+ * @return [value]
194
+ */
195
+ static VALUE GL_s_set_attribute(VALUE self, VALUE attr, VALUE value)
196
+ {
197
+ HANDLE_ERROR(SDL_GL_SetAttribute(NUM2INT(attr), NUM2INT(value)));
198
+ return value;
199
+ }
200
+
201
+ void rubysdl2_init_gl(void)
202
+ {
203
+ mGL = rb_define_module_under(mSDL2, "GL");
204
+ cGLContext = rb_define_class_under(mGL, "Context", rb_cObject);
205
+
206
+ rb_define_singleton_method(cGLContext, "create", GLContext_s_create, 1);
207
+ rb_define_singleton_method(cGLContext, "current", GLContext_s_current, 0);
208
+
209
+ rb_define_method(cGLContext, "destroy?", GLContext_destroy_p, 0);
210
+ rb_define_method(cGLContext, "destroy", GLContext_destroy, 0);
211
+ rb_define_method(cGLContext, "make_current", GLContext_make_current, 1);
212
+
213
+ rb_define_module_function(mGL, "extension_supported?", GL_s_extension_supported_p, 1);
214
+ rb_define_module_function(mGL, "swap_interval", GL_s_swap_interval, 0);
215
+ rb_define_module_function(mGL, "swap_interval=", GL_s_set_swap_interval, 1);
216
+ rb_define_module_function(mGL, "get_attribute", GL_s_get_attribute, 1);
217
+ rb_define_module_function(mGL, "set_attribute", GL_s_set_attribute, 2);
218
+
219
+ /* */
220
+ /* OpenGL attribute - minimal bits of red channel in color buffer, default is 3 */
221
+ rb_define_const(mGL, "RED_SIZE", INT2NUM(SDL_GL_RED_SIZE));
222
+ /* OpenGL attribute - minimal bits of green channel in color buffer, default is 3 */
223
+ rb_define_const(mGL, "GREEN_SIZE", INT2NUM(SDL_GL_GREEN_SIZE));
224
+ /* OpenGL attribute - minimal bits of blue channel in color buffer, default is 2 */
225
+ rb_define_const(mGL, "BLUE_SIZE", INT2NUM(SDL_GL_BLUE_SIZE));
226
+ /* OpenGL attribute - minimal bits of alpha channel in color buffer, default is 0 */
227
+ rb_define_const(mGL, "ALPHA_SIZE", INT2NUM(SDL_GL_ALPHA_SIZE));
228
+ /* OpenGL attribute - minimal bits of framebufer, default is 0 */
229
+ rb_define_const(mGL, "BUFFER_SIZE", INT2NUM(SDL_GL_BUFFER_SIZE));
230
+ /* OpenGL attribute - whether the single buffer (0) or double buffer (1), default
231
+ is double buffer */
232
+ rb_define_const(mGL, "DOUBLEBUFFER", INT2NUM(SDL_GL_DOUBLEBUFFER));
233
+ /* OpenGL attribute - bits of depth buffer, default is 16 */
234
+ rb_define_const(mGL, "DEPTH_SIZE", INT2NUM(SDL_GL_DEPTH_SIZE));
235
+ /* OpenGL attribute - bits of stencil buffer, default is 0 */
236
+ rb_define_const(mGL, "STENCIL_SIZE", INT2NUM(SDL_GL_STENCIL_SIZE));
237
+ /* OpenGL attribute - minimal bits of red channel in accumlation buffer,
238
+ default is 0 */
239
+ rb_define_const(mGL, "ACCUM_RED_SIZE", INT2NUM(SDL_GL_ACCUM_RED_SIZE));
240
+ /* OpenGL attribute - minimal bits of green channel in accumlation buffer,
241
+ default is 0 */
242
+ rb_define_const(mGL, "ACCUM_GREEN_SIZE", INT2NUM(SDL_GL_ACCUM_GREEN_SIZE));
243
+ /* OpenGL attribute - minimal bits of blue channel in accumlation buffer,
244
+ default is 0 */
245
+ rb_define_const(mGL, "ACCUM_BLUE_SIZE", INT2NUM(SDL_GL_ACCUM_BLUE_SIZE));
246
+ /* OpenGL attribute - minimal bits of alpha channel in accumlation buffer,
247
+ default is 0 */
248
+ rb_define_const(mGL, "ACCUM_ALPHA_SIZE", INT2NUM(SDL_GL_ACCUM_ALPHA_SIZE));
249
+ /* OpenGL attribute - whether output is stereo (1) or not (0), default is 0 */
250
+ rb_define_const(mGL, "STEREO", INT2NUM(SDL_GL_STEREO));
251
+ /* OpenGL attribuite - the number of buffers used for multisampe anti-aliasing,
252
+ default is 0 */
253
+ rb_define_const(mGL, "MULTISAMPLEBUFFERS", INT2NUM(SDL_GL_MULTISAMPLEBUFFERS));
254
+ /* OpenGL attribute - the number of samples used around the current pixel
255
+ use for multisample anti-aliasing, default is 0 */
256
+ rb_define_const(mGL, "MULTISAMPLESAMPLES", INT2NUM(SDL_GL_MULTISAMPLESAMPLES));
257
+ /* OpenGL attribute - 1 for requiring hardware acceleration, 0 for software rendering,
258
+ default is allowing either */
259
+ rb_define_const(mGL, "ACCELERATED_VISUAL", INT2NUM(SDL_GL_ACCELERATED_VISUAL));
260
+ /* OpenGL attribute - not used (deprecated) */
261
+ rb_define_const(mGL, "RETAINED_BACKING", INT2NUM(SDL_GL_RETAINED_BACKING));
262
+ /* OpenGL attribute - OpenGL context major version */
263
+ rb_define_const(mGL, "CONTEXT_MAJOR_VERSION", INT2NUM(SDL_GL_CONTEXT_MAJOR_VERSION));
264
+ /* OpenGL attribute - OpenGL context minor version */
265
+ rb_define_const(mGL, "CONTEXT_MINOR_VERSION", INT2NUM(SDL_GL_CONTEXT_MINOR_VERSION));
266
+ /*
267
+ * INT2NUM(SDL_GL_CONTEXT_FLAGS):
268
+ *
269
+ * OpenGL attribute - the bit combination of following constants, or 0.
270
+ * default is 0
271
+ *
272
+ * * {SDL2::GL::CONTEXT_DEBUG_FLAG}
273
+ * * {SDL2::GL::CONTEXT_FORWARD_COMPATIBLE_FLAG}
274
+ * * {SDL2::GL::CONTEXT_ROBUST_ACCESS_FLAG}
275
+ * * {SDL2::GL::CONTEXT_RESET_ISOLATION_FLAG}
276
+ *
277
+ * These flags are mapped to some OpenGL extensions. Please see
278
+ * the documentation of each constant for more details.
279
+ *
280
+ * https://wiki.libsdl.org/SDL_GLcontextFlag
281
+ */
282
+ rb_define_const(mGL, "CONTEXT_FLAGS", INT2NUM(SDL_GL_CONTEXT_FLAGS));
283
+ /* INT2NUM(SDL_GL_CONTEXT_PROFILE_MASK):
284
+ *
285
+ * OpenGL attribute - type of GL context, one of the following constants,
286
+ * defaults depends on platform
287
+ *
288
+ * * {CONTEXT_PROFILE_CORE}
289
+ * * {CONTEXT_PROFILE_COMPATIBILITY}
290
+ * * {CONTEXT_PROFILE_ES}
291
+ *
292
+ * https://wiki.libsdl.org/SDL_GLprofile
293
+ */
294
+ rb_define_const(mGL, "CONTEXT_PROFILE_MASK", INT2NUM(SDL_GL_CONTEXT_PROFILE_MASK));
295
+ /* OpenGL attribute - OpenGL context sharing, default is 0 */
296
+ rb_define_const(mGL, "SHARE_WITH_CURRENT_CONTEXT", INT2NUM(SDL_GL_SHARE_WITH_CURRENT_CONTEXT));
297
+ #if SDL_VERSION_ATLEAST(2,0,1)
298
+ /* OpenGL attribute - 1 for requesting sRGB capable visual, default to 0 */
299
+ rb_define_const(mGL, "FRAMEBUFFER_SRGB_CAPABLE", INT2NUM(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE));
300
+ #endif
301
+ /* OpenGL attribute - not used (deprecated) */
302
+ rb_define_const(mGL, "CONTEXT_EGL", INT2NUM(SDL_GL_CONTEXT_EGL));
303
+
304
+ /* */
305
+
306
+ /* This flag maps to GLX_CONTEXT_DEBUG_BIT_ARB in
307
+ * the GLX_ARB_create_context extension for X11
308
+ * and WGL_CONTEXT_DEBUG_BIT_ARB in the WGL_ARB_create_context
309
+ * extension for Windows.
310
+ */
311
+ rb_define_const(mGL, "CONTEXT_DEBUG_FLAG", INT2NUM(SDL_GL_CONTEXT_DEBUG_FLAG));
312
+ /*
313
+ * This flag maps to GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the
314
+ * GLX_ARB_create_context extension for X11 and
315
+ * WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the WGL_ARB_create_context
316
+ * extension for Windows.
317
+ */
318
+ rb_define_const(mGL, "CONTEXT_FORWARD_COMPATIBLE_FLAG", INT2NUM(SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG));
319
+ /*
320
+ * This flag maps to GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB in the
321
+ * GLX_ARB_create_context_robustness extension for X11 and
322
+ * WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB in the WGL_ARB_create_context_robustness
323
+ * extension for Windows.
324
+ */
325
+ rb_define_const(mGL, "CONTEXT_ROBUST_ACCESS_FLAG", INT2NUM(SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG));
326
+ /*
327
+ * This flag maps to GLX_CONTEXT_RESET_ISOLATION_BIT_ARB in the
328
+ * GLX_ARB_robustness_isolation extension for X11 and
329
+ * WGL_CONTEXT_RESET_ISOLATION_BIT_ARB in the WGL_ARB_create_context_robustness
330
+ * extension for Windows.
331
+ */
332
+ rb_define_const(mGL, "CONTEXT_RESET_ISOLATION_FLAG", INT2NUM(SDL_GL_CONTEXT_RESET_ISOLATION_FLAG));
333
+
334
+ /*
335
+ * OpenGL core profile - deprecated
336
+ * functions are disabled
337
+ */
338
+ rb_define_const(mGL, "CONTEXT_PROFILE_CORE", INT2NUM(SDL_GL_CONTEXT_PROFILE_CORE));
339
+ /*
340
+ * OpenGL compatibility profile -
341
+ * deprecated functions are allowed
342
+ */
343
+ rb_define_const(mGL, "CONTEXT_PROFILE_COMPATIBILITY", INT2NUM(SDL_GL_CONTEXT_PROFILE_COMPATIBILITY));
344
+ /*
345
+ * OpenGL ES profile - only a subset of the
346
+ * base OpenGL functionality is available
347
+ */
348
+ rb_define_const(mGL, "CONTEXT_PROFILE_ES", INT2NUM(SDL_GL_CONTEXT_PROFILE_ES));
349
+
350
+ rb_gc_register_address(&current_context);
351
+ }