sfml3-rb 0.0.1 → 0.2.2

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +342 -0
  3. data/README.md +51 -14
  4. data/TODO.md +199 -0
  5. data/ext/audio/audio_enums.c +131 -0
  6. data/ext/audio/audio_enums.h +18 -0
  7. data/ext/audio/effect_processor.c +233 -0
  8. data/ext/audio/effect_processor.h +25 -0
  9. data/ext/audio/listener.c +83 -0
  10. data/ext/audio/listener.h +8 -0
  11. data/ext/audio/music.c +174 -0
  12. data/ext/audio/music.h +14 -0
  13. data/ext/audio/sound.c +139 -0
  14. data/ext/audio/sound.h +14 -0
  15. data/ext/audio/sound_buffer.c +274 -0
  16. data/ext/audio/sound_buffer.h +18 -0
  17. data/ext/audio/sound_buffer_recorder.c +109 -0
  18. data/ext/audio/sound_buffer_recorder.h +14 -0
  19. data/ext/audio/sound_recorder.c +268 -0
  20. data/ext/audio/sound_recorder.h +14 -0
  21. data/ext/audio/sound_source.h +13 -0
  22. data/ext/audio/sound_source.inc +271 -0
  23. data/ext/audio/sound_source_cone.c +138 -0
  24. data/ext/audio/sound_source_cone.h +20 -0
  25. data/ext/audio/sound_stream.c +294 -0
  26. data/ext/audio/sound_stream.h +14 -0
  27. data/ext/{exceptions.c → core/exceptions.c} +10 -8
  28. data/ext/{ext → core}/exceptions.h +3 -3
  29. data/ext/core/foreign_thread.c +149 -0
  30. data/ext/core/foreign_thread.h +31 -0
  31. data/ext/core/macros.h +8 -0
  32. data/ext/{ext → core}/sfml.h +5 -3
  33. data/ext/core/unicode.c +46 -0
  34. data/ext/core/unicode.h +25 -0
  35. data/ext/ext.c +125 -14
  36. data/ext/extconf.rb +51 -6
  37. data/ext/graphics/blend_mode.c +261 -0
  38. data/ext/graphics/blend_mode.h +18 -0
  39. data/ext/graphics/circle.c +319 -0
  40. data/ext/{ext/klass/drawable → graphics}/circle.h +3 -3
  41. data/ext/graphics/color.c +318 -0
  42. data/ext/graphics/color.h +37 -0
  43. data/ext/{drawable.c → graphics/drawable.c} +11 -11
  44. data/ext/graphics/drawable.h +10 -0
  45. data/ext/graphics/enums.c +123 -0
  46. data/ext/graphics/enums.h +20 -0
  47. data/ext/graphics/font.c +148 -0
  48. data/ext/graphics/font.h +14 -0
  49. data/ext/graphics/glyph.c +60 -0
  50. data/ext/graphics/glyph.h +14 -0
  51. data/ext/graphics/image.c +205 -0
  52. data/ext/graphics/image.h +16 -0
  53. data/ext/graphics/polygon.c +300 -0
  54. data/ext/graphics/polygon.h +10 -0
  55. data/ext/graphics/rect.c +287 -0
  56. data/ext/graphics/rect.h +30 -0
  57. data/ext/graphics/rectangle.c +302 -0
  58. data/ext/graphics/rectangle.h +10 -0
  59. data/ext/graphics/render_state.c +204 -0
  60. data/ext/graphics/render_state.h +18 -0
  61. data/ext/graphics/render_target.inc +181 -0
  62. data/ext/graphics/render_texture.c +182 -0
  63. data/ext/graphics/render_texture.h +14 -0
  64. data/ext/graphics/shader.c +540 -0
  65. data/ext/graphics/shader.h +14 -0
  66. data/ext/graphics/shape.c +311 -0
  67. data/ext/graphics/shape.h +10 -0
  68. data/ext/graphics/sprite.c +249 -0
  69. data/ext/graphics/sprite.h +10 -0
  70. data/ext/graphics/stencil_mode.c +211 -0
  71. data/ext/graphics/stencil_mode.h +18 -0
  72. data/ext/graphics/target.c +133 -0
  73. data/ext/graphics/target.h +40 -0
  74. data/ext/graphics/text.c +344 -0
  75. data/ext/graphics/text.h +10 -0
  76. data/ext/graphics/texture.c +379 -0
  77. data/ext/graphics/texture.h +16 -0
  78. data/ext/graphics/transform.c +372 -0
  79. data/ext/graphics/transform.h +35 -0
  80. data/ext/{transformable.c → graphics/transformable.c} +168 -144
  81. data/ext/{ext/klass → graphics}/transformable.h +3 -3
  82. data/ext/graphics/vertex.c +179 -0
  83. data/ext/graphics/vertex.h +23 -0
  84. data/ext/graphics/vertex_array.c +127 -0
  85. data/ext/graphics/vertex_array.h +10 -0
  86. data/ext/graphics/vertex_buffer.c +211 -0
  87. data/ext/graphics/vertex_buffer.h +14 -0
  88. data/ext/{view.c → graphics/view.c} +168 -169
  89. data/ext/{ext/klass → graphics}/view.h +3 -3
  90. data/ext/network/ftp.c +405 -0
  91. data/ext/network/ftp.h +20 -0
  92. data/ext/network/http.c +243 -0
  93. data/ext/network/http.h +18 -0
  94. data/ext/network/ip_address.c +164 -0
  95. data/ext/network/ip_address.h +20 -0
  96. data/ext/network/network_enums.c +298 -0
  97. data/ext/network/network_enums.h +26 -0
  98. data/ext/network/packet.c +189 -0
  99. data/ext/network/packet.h +14 -0
  100. data/ext/network/socket_selector.c +142 -0
  101. data/ext/network/socket_selector.h +14 -0
  102. data/ext/network/tcp_listener.c +115 -0
  103. data/ext/network/tcp_listener.h +14 -0
  104. data/ext/network/tcp_socket.c +199 -0
  105. data/ext/network/tcp_socket.h +17 -0
  106. data/ext/network/udp_socket.c +190 -0
  107. data/ext/network/udp_socket.h +14 -0
  108. data/ext/ports.rb +97 -21
  109. data/ext/system/buffer.c +77 -0
  110. data/ext/system/buffer.h +14 -0
  111. data/ext/system/clock.c +100 -0
  112. data/ext/{ext/klass → system}/clock.h +3 -3
  113. data/ext/system/input_stream.c +229 -0
  114. data/ext/system/input_stream.h +23 -0
  115. data/ext/system/sleep.c +16 -0
  116. data/ext/system/sleep.h +8 -0
  117. data/ext/system/time.c +218 -0
  118. data/ext/system/time.h +18 -0
  119. data/ext/system/vec2.c +251 -0
  120. data/ext/system/vec2.h +55 -0
  121. data/ext/system/vec3.c +219 -0
  122. data/ext/system/vec3.h +18 -0
  123. data/ext/window/clipboard.c +89 -0
  124. data/ext/window/clipboard.h +8 -0
  125. data/ext/window/context.c +70 -0
  126. data/ext/window/context.h +8 -0
  127. data/ext/window/context_settings.c +220 -0
  128. data/ext/window/context_settings.h +18 -0
  129. data/ext/window/cursor.c +56 -0
  130. data/ext/window/cursor.h +14 -0
  131. data/ext/window/event.c +216 -0
  132. data/ext/window/event.h +14 -0
  133. data/ext/{event_name.c → window/event_name.c} +2 -2
  134. data/ext/window/event_name.h +8 -0
  135. data/ext/window/input_enums.c +261 -0
  136. data/ext/window/input_enums.h +36 -0
  137. data/ext/window/joystick.c +60 -0
  138. data/ext/window/joystick.h +8 -0
  139. data/ext/{keyboard.c → window/keyboard.c} +74 -2
  140. data/ext/window/keyboard.h +12 -0
  141. data/ext/window/mouse.c +70 -0
  142. data/ext/window/mouse.h +8 -0
  143. data/ext/window/sensor.c +30 -0
  144. data/ext/window/sensor.h +8 -0
  145. data/ext/window/touch.c +49 -0
  146. data/ext/window/touch.h +8 -0
  147. data/ext/window/video_mode.c +133 -0
  148. data/ext/window/video_mode.h +14 -0
  149. data/ext/window/vulkan.c +44 -0
  150. data/ext/window/vulkan.h +8 -0
  151. data/ext/window/window.c +414 -0
  152. data/ext/{ext/klass → window}/window.h +3 -3
  153. data/lib/sfml/version.rb +4 -2
  154. data/lib/sfml.rb +2 -0
  155. metadata +163 -56
  156. data/ext/circle.c +0 -198
  157. data/ext/clock.c +0 -65
  158. data/ext/color.c +0 -43
  159. data/ext/event.c +0 -148
  160. data/ext/ext/klass/color.h +0 -26
  161. data/ext/ext/klass/drawable/image.h +0 -4
  162. data/ext/ext/klass/drawable/polygon.h +0 -4
  163. data/ext/ext/klass/drawable/rectangle.h +0 -4
  164. data/ext/ext/klass/drawable/sprite.h +0 -4
  165. data/ext/ext/klass/drawable/texture.h +0 -4
  166. data/ext/ext/klass/event/event_name.h +0 -8
  167. data/ext/ext/klass/event.h +0 -12
  168. data/ext/ext/klass/keyboard.h +0 -8
  169. data/ext/ext/klass/render_state.h +0 -16
  170. data/ext/ext/klass/target.h +0 -18
  171. data/ext/ext/klass/transform.h +0 -17
  172. data/ext/ext/klass/video_mode.h +0 -12
  173. data/ext/ext/module/drawable/drawable.h +0 -10
  174. data/ext/ext/module/transform.h +0 -18
  175. data/ext/ext/module.h +0 -10
  176. data/ext/ext/rect.h +0 -16
  177. data/ext/ext/style_name.h +0 -11
  178. data/ext/ext/vec2.h +0 -38
  179. data/ext/image.c +0 -5
  180. data/ext/polygon.c +0 -5
  181. data/ext/rect.c +0 -26
  182. data/ext/rectangle.c +0 -5
  183. data/ext/render_state.c +0 -109
  184. data/ext/sprite.c +0 -5
  185. data/ext/style_name.c +0 -15
  186. data/ext/target.c +0 -106
  187. data/ext/texture.c +0 -5
  188. data/ext/transform.c +0 -107
  189. data/ext/vec2.c +0 -42
  190. data/ext/video_mode.c +0 -78
  191. data/ext/window.c +0 -274
@@ -0,0 +1,211 @@
1
+ #include "graphics/stencil_mode.h"
2
+
3
+ #include <ruby.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+
7
+ #include "core/exceptions.h"
8
+ #include "core/macros.h"
9
+
10
+ typedef struct {
11
+ sfStencilMode mode;
12
+ } StencilMode;
13
+
14
+ static VALUE rb_cStencilMode;
15
+
16
+ static const char *comparison_names[] = {
17
+ "never", "less", "less_equal", "greater", "greater_equal", "equal", "not_equal", "always"
18
+ };
19
+
20
+ static const char *operation_names[] = {
21
+ "keep", "zero", "replace", "increment", "decrement", "invert"
22
+ };
23
+
24
+ static void StencilMode_free(void *ptr) {
25
+ free(ptr);
26
+ }
27
+
28
+ static const rb_data_type_t StencilMode_data_type = {
29
+ .wrap_struct_name = "SFML::StencilMode",
30
+ .function = {.dmark = NULL, .dfree = StencilMode_free, .dsize = NULL},
31
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
32
+ };
33
+
34
+ static VALUE StencilMode_wrap(sfStencilMode mode) {
35
+ StencilMode *ptr = malloc(sizeof(StencilMode));
36
+
37
+ ptr->mode = mode;
38
+
39
+ return TypedData_Wrap_Struct(rb_cStencilMode, &StencilMode_data_type, ptr);
40
+ }
41
+
42
+ static sfStencilComparison comparison_from_rb(VALUE rb_value) {
43
+ size_t i;
44
+
45
+ if (RB_INTEGER_TYPE_P(rb_value)) {
46
+ return (sfStencilComparison) NUM2INT(rb_value);
47
+ }
48
+
49
+ if (SYMBOL_P(rb_value)) {
50
+ const char *name = rb_id2name(SYM2ID(rb_value));
51
+
52
+ for (i = 0; i < sizeof(comparison_names) / sizeof(comparison_names[0]); i++) {
53
+ if (strcmp(name, comparison_names[i]) == 0) {
54
+ return (sfStencilComparison) i;
55
+ }
56
+ }
57
+ }
58
+
59
+ rb_raise(rb_eArgError, "unknown stencil comparison");
60
+ return sfStencilComparisonAlways;
61
+ }
62
+
63
+ static sfStencilUpdateOperation operation_from_rb(VALUE rb_value) {
64
+ size_t i;
65
+
66
+ if (RB_INTEGER_TYPE_P(rb_value)) {
67
+ return (sfStencilUpdateOperation) NUM2INT(rb_value);
68
+ }
69
+
70
+ if (SYMBOL_P(rb_value)) {
71
+ const char *name = rb_id2name(SYM2ID(rb_value));
72
+
73
+ for (i = 0; i < sizeof(operation_names) / sizeof(operation_names[0]); i++) {
74
+ if (strcmp(name, operation_names[i]) == 0) {
75
+ return (sfStencilUpdateOperation) i;
76
+ }
77
+ }
78
+ }
79
+
80
+ rb_raise(rb_eArgError, "unknown stencil update operation");
81
+ return sfStencilUpdateOperationKeep;
82
+ }
83
+
84
+ static VALUE StencilMode_new(int argc, VALUE *argv, VALUE klass) {
85
+ VALUE self;
86
+ StencilMode *ptr;
87
+ sfStencilMode mode = sfStencilMode_default;
88
+
89
+ if (argc == 5) {
90
+ mode.stencilComparison = comparison_from_rb(argv[0]);
91
+ mode.stencilUpdateOperation = operation_from_rb(argv[1]);
92
+ mode.stencilReference.value = (unsigned int) NUM2UINT(argv[2]);
93
+ mode.stencilMask.value = (unsigned int) NUM2UINT(argv[3]);
94
+ mode.stencilOnly = RTEST(argv[4]);
95
+ } else if (argc != 0) {
96
+ raise_invalid_arguments_excepted(5, argc);
97
+ }
98
+
99
+ ptr = malloc(sizeof(StencilMode));
100
+ ptr->mode = mode;
101
+
102
+ self = TypedData_Wrap_Struct(klass, &StencilMode_data_type, ptr);
103
+
104
+ return self;
105
+ }
106
+
107
+ static VALUE StencilMode_get_comparison(VALUE self) {
108
+ return ID2SYM(rb_intern(comparison_names[((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilComparison]));
109
+ }
110
+
111
+ static VALUE StencilMode_get_operation(VALUE self) {
112
+ sfStencilMode mode = ((StencilMode *) Get_StencilMode_Struct(self))->mode;
113
+
114
+ return ID2SYM(rb_intern(operation_names[mode.stencilUpdateOperation]));
115
+ }
116
+
117
+ static VALUE StencilMode_get_reference(VALUE self) {
118
+ return UINT2NUM(((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilReference.value);
119
+ }
120
+
121
+ static VALUE StencilMode_get_mask(VALUE self) {
122
+ return UINT2NUM(((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilMask.value);
123
+ }
124
+
125
+ static VALUE StencilMode_get_only(VALUE self) {
126
+ return BOOL2RB(((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilOnly);
127
+ }
128
+
129
+ static VALUE StencilMode_set_comparison(VALUE self, VALUE rb_value) {
130
+ ((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilComparison = comparison_from_rb(rb_value);
131
+ return rb_value;
132
+ }
133
+
134
+ static VALUE StencilMode_set_operation(VALUE self, VALUE rb_value) {
135
+ ((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilUpdateOperation = operation_from_rb(rb_value);
136
+ return rb_value;
137
+ }
138
+
139
+ static VALUE StencilMode_set_reference(VALUE self, VALUE rb_value) {
140
+ ((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilReference.value = (unsigned int) NUM2UINT(rb_value);
141
+ return rb_value;
142
+ }
143
+
144
+ static VALUE StencilMode_set_mask(VALUE self, VALUE rb_value) {
145
+ ((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilMask.value = (unsigned int) NUM2UINT(rb_value);
146
+ return rb_value;
147
+ }
148
+
149
+ static VALUE StencilMode_set_only(VALUE self, VALUE rb_value) {
150
+ ((StencilMode *) Get_StencilMode_Struct(self))->mode.stencilOnly = RTEST(rb_value);
151
+ return rb_value;
152
+ }
153
+
154
+ static VALUE StencilMode_eql(VALUE self, VALUE rb_other) {
155
+ sfStencilMode a = ((StencilMode *) Get_StencilMode_Struct(self))->mode;
156
+ sfStencilMode b;
157
+
158
+ if (!rb_obj_is_kind_of(rb_other, rb_cStencilMode)) {
159
+ return Qfalse;
160
+ }
161
+
162
+ b = ((StencilMode *) Get_StencilMode_Struct(rb_other))->mode;
163
+
164
+ return BOOL2RB(a.stencilComparison == b.stencilComparison &&
165
+ a.stencilUpdateOperation == b.stencilUpdateOperation &&
166
+ a.stencilReference.value == b.stencilReference.value &&
167
+ a.stencilMask.value == b.stencilMask.value &&
168
+ a.stencilOnly == b.stencilOnly);
169
+ }
170
+
171
+ void Init_StencilMode(VALUE rb_module) {
172
+ rb_cStencilMode = rb_define_class_under(rb_module, "StencilMode", rb_cObject);
173
+
174
+ rb_define_singleton_method(rb_cStencilMode, "new", StencilMode_new, -1);
175
+
176
+ rb_define_method(rb_cStencilMode, "comparison", StencilMode_get_comparison, 0);
177
+ rb_define_method(rb_cStencilMode, "update_operation", StencilMode_get_operation, 0);
178
+ rb_define_method(rb_cStencilMode, "reference", StencilMode_get_reference, 0);
179
+ rb_define_method(rb_cStencilMode, "mask", StencilMode_get_mask, 0);
180
+ rb_define_method(rb_cStencilMode, "stencil_only", StencilMode_get_only, 0);
181
+
182
+ rb_define_method(rb_cStencilMode, "comparison=", StencilMode_set_comparison, 1);
183
+ rb_define_method(rb_cStencilMode, "update_operation=", StencilMode_set_operation, 1);
184
+ rb_define_method(rb_cStencilMode, "reference=", StencilMode_set_reference, 1);
185
+ rb_define_method(rb_cStencilMode, "mask=", StencilMode_set_mask, 1);
186
+ rb_define_method(rb_cStencilMode, "stencil_only=", StencilMode_set_only, 1);
187
+
188
+ rb_define_method(rb_cStencilMode, "==", StencilMode_eql, 1);
189
+ }
190
+
191
+ VALUE Get_Klass_StencilMode(void) {
192
+ return rb_cStencilMode;
193
+ }
194
+
195
+ void *Get_StencilMode_Struct(VALUE self) {
196
+ StencilMode *ptr;
197
+ TypedData_Get_Struct(self, StencilMode, &StencilMode_data_type, ptr);
198
+ return ptr;
199
+ }
200
+
201
+ sfStencilMode stencil_mode_from_rb(VALUE rb_mode) {
202
+ if (rb_obj_is_kind_of(rb_mode, rb_cStencilMode)) {
203
+ return ((StencilMode *) Get_StencilMode_Struct(rb_mode))->mode;
204
+ }
205
+
206
+ return sfStencilMode_default;
207
+ }
208
+
209
+ VALUE stencil_mode_to_rb(sfStencilMode mode) {
210
+ return StencilMode_wrap(mode);
211
+ }
@@ -0,0 +1,18 @@
1
+ #ifndef SFML_RB_GRAPHICS_STENCIL_MODE_H
2
+ #define SFML_RB_GRAPHICS_STENCIL_MODE_H
3
+
4
+ #include <ruby.h>
5
+
6
+ #include "core/sfml.h"
7
+
8
+ void Init_StencilMode(VALUE rb_module);
9
+
10
+ VALUE Get_Klass_StencilMode(void);
11
+
12
+ void *Get_StencilMode_Struct(VALUE self);
13
+
14
+ sfStencilMode stencil_mode_from_rb(VALUE rb_mode);
15
+
16
+ VALUE stencil_mode_to_rb(sfStencilMode mode);
17
+
18
+ #endif //SFML_RB_GRAPHICS_STENCIL_MODE_H
@@ -0,0 +1,133 @@
1
+ #include "graphics/target.h"
2
+
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+ #include "graphics/render_state.h"
7
+ #include "graphics/render_texture.h"
8
+ #include "graphics/view.h"
9
+ #include "window/window.h"
10
+ #include "core/exceptions.h"
11
+ #include "core/macros.h"
12
+
13
+ static VALUE rb_cTarget;
14
+
15
+ static Target *Target_create(TargetType type, void *handle) {
16
+ Target *target = malloc(sizeof(Target));
17
+
18
+ target->type = type;
19
+ target->handle = handle;
20
+
21
+ return target;
22
+ }
23
+
24
+ static void RenderTarget_free(void *ptr) {
25
+ free(ptr);
26
+ }
27
+
28
+ static const rb_data_type_t RenderTarget_data_type = {
29
+ .wrap_struct_name = "SFML::Target",
30
+ .function = {.dmark = NULL, .dfree = RenderTarget_free, .dsize = NULL},
31
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
32
+ };
33
+
34
+ static VALUE RenderTarget_new(VALUE klass, VALUE rb_window) {
35
+ VALUE self;
36
+ Target *target;
37
+
38
+ if (!rb_obj_is_kind_of(rb_window, Get_Klass_Window())) {
39
+ raise_invalid_argument_class(Get_Klass_Window());
40
+ }
41
+
42
+ target = Target_create(SFML_TARGET_WINDOW, Get_Window_Struct(rb_window));
43
+ self = TypedData_Wrap_Struct(klass, &RenderTarget_data_type, target);
44
+
45
+ rb_obj_call_init(self, 0, NULL);
46
+
47
+ return self;
48
+ }
49
+
50
+ static VALUE RenderTarget_init(VALUE self) {
51
+ return self;
52
+ }
53
+
54
+ static VALUE RenderTarget_draw(VALUE self, VALUE rb_drawable, VALUE rb_state) {
55
+ if (!rb_obj_is_kind_of(rb_state, Get_Klass_RenderState())) {
56
+ raise_invalid_argument_class(Get_Klass_RenderState());
57
+ }
58
+
59
+ return rb_funcall(rb_drawable, rb_intern("draw"), 2, self, rb_state);
60
+ }
61
+
62
+ static VALUE RenderTarget_set_view(VALUE self, VALUE rb_view) {
63
+ Target *target = Get_Target_Struct(self);
64
+
65
+ if (!rb_obj_is_kind_of(rb_view, Get_Klass_View())) {
66
+ raise_invalid_argument_class(Get_Klass_View());
67
+ }
68
+
69
+ if (target->type == SFML_TARGET_WINDOW) {
70
+ sfRenderWindow_setView((sfRenderWindow *) target->handle, Get_View_Struct(rb_view));
71
+ } else {
72
+ sfRenderTexture_setView((sfRenderTexture *) target->handle, Get_View_Struct(rb_view));
73
+ }
74
+
75
+ return Qnil;
76
+ }
77
+
78
+ static VALUE RenderTarget_get_view(VALUE self) {
79
+ Target *target = Get_Target_Struct(self);
80
+ sfView *view;
81
+
82
+ if (target->type == SFML_TARGET_WINDOW) {
83
+ view = sfView_copy(sfRenderWindow_getView((sfRenderWindow *) target->handle));
84
+ } else {
85
+ view = sfView_copy(sfRenderTexture_getView((sfRenderTexture *) target->handle));
86
+ }
87
+
88
+ return Get_Casting_View(view);
89
+ }
90
+
91
+ void Init_Target(VALUE rb_module) {
92
+ rb_cTarget = rb_define_class_under(rb_module, "Target", rb_cObject);
93
+
94
+ rb_define_singleton_method(rb_cTarget, "new", RenderTarget_new, 1);
95
+
96
+ // methods
97
+ rb_define_method(rb_cTarget, "initialize", RenderTarget_init, 0);
98
+ rb_define_method(rb_cTarget, "draw", RenderTarget_draw, 2);
99
+
100
+ // setters
101
+ rb_define_method(rb_cTarget, "view=", RenderTarget_set_view, 1);
102
+
103
+ // getters
104
+ rb_define_method(rb_cTarget, "view", RenderTarget_get_view, 0);
105
+ }
106
+
107
+ VALUE Get_Klass_Target(void) {
108
+ return rb_cTarget;
109
+ }
110
+
111
+ Target *Get_Target_Struct(VALUE self) {
112
+ Target *ptr;
113
+ TypedData_Get_Struct(self, Target, &RenderTarget_data_type, ptr);
114
+ return ptr;
115
+ }
116
+
117
+ VALUE Get_New_Target(VALUE rb_window) {
118
+ return RenderTarget_new(Get_Klass_Target(), rb_window);
119
+ }
120
+
121
+ VALUE Get_New_Target_From_RenderTexture(VALUE rb_render_texture) {
122
+ VALUE self;
123
+ Target *target;
124
+
125
+ if (!rb_obj_is_kind_of(rb_render_texture, Get_Klass_RenderTexture())) {
126
+ raise_invalid_argument_class(Get_Klass_RenderTexture());
127
+ }
128
+
129
+ target = Target_create(SFML_TARGET_TEXTURE, Get_RenderTexture_Struct(rb_render_texture));
130
+ self = TypedData_Wrap_Struct(rb_cTarget, &RenderTarget_data_type, target);
131
+
132
+ return self;
133
+ }
@@ -0,0 +1,40 @@
1
+ #ifndef SFML_RB_GRAPHICS_TARGET_H
2
+ #define SFML_RB_GRAPHICS_TARGET_H
3
+
4
+ #include <ruby.h>
5
+
6
+ #include "core/sfml.h"
7
+
8
+ typedef enum {
9
+ SFML_TARGET_WINDOW,
10
+ SFML_TARGET_TEXTURE
11
+ } TargetType;
12
+
13
+ typedef struct {
14
+ TargetType type;
15
+ void *handle;
16
+ } Target;
17
+
18
+ /* Dispatch a draw call to whichever underlying render surface this target
19
+ wraps. Pass NULL states to use the defaults; never hand CSFML a NULL. */
20
+ #define TARGET_DRAW(target, window_fn, texture_fn, object, states) \
21
+ do { \
22
+ const sfRenderStates *sfml_states = (states) ? (states) : &sfRenderStates_default; \
23
+ if ((target)->type == SFML_TARGET_WINDOW) { \
24
+ window_fn((sfRenderWindow *) (target)->handle, (object), sfml_states); \
25
+ } else { \
26
+ texture_fn((sfRenderTexture *) (target)->handle, (object), sfml_states); \
27
+ } \
28
+ } while (0)
29
+
30
+ void Init_Target(VALUE rb_module);
31
+
32
+ VALUE Get_Klass_Target(void);
33
+
34
+ Target *Get_Target_Struct(VALUE self);
35
+
36
+ VALUE Get_New_Target(VALUE rb_window);
37
+
38
+ VALUE Get_New_Target_From_RenderTexture(VALUE rb_render_texture);
39
+
40
+ #endif //SFML_RB_GRAPHICS_TARGET_H