gosu 0.7.10.1

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 (249) hide show
  1. data/COPYING.txt +29 -0
  2. data/Gosu/Async.hpp +48 -0
  3. data/Gosu/Audio.hpp +145 -0
  4. data/Gosu/AutoLink.hpp +16 -0
  5. data/Gosu/Bitmap.hpp +85 -0
  6. data/Gosu/ButtonsMac.hpp +114 -0
  7. data/Gosu/ButtonsWin.hpp +111 -0
  8. data/Gosu/ButtonsX.hpp +115 -0
  9. data/Gosu/Color.hpp +172 -0
  10. data/Gosu/Directories.hpp +36 -0
  11. data/Gosu/Font.hpp +59 -0
  12. data/Gosu/Fwd.hpp +31 -0
  13. data/Gosu/Gosu.hpp +26 -0
  14. data/Gosu/Graphics.hpp +86 -0
  15. data/Gosu/GraphicsBase.hpp +45 -0
  16. data/Gosu/IO.hpp +255 -0
  17. data/Gosu/Image.hpp +148 -0
  18. data/Gosu/ImageData.hpp +45 -0
  19. data/Gosu/Input.hpp +116 -0
  20. data/Gosu/Math.hpp +95 -0
  21. data/Gosu/Platform.hpp +61 -0
  22. data/Gosu/RotFlip.hpp +116 -0
  23. data/Gosu/Sockets.hpp +129 -0
  24. data/Gosu/Text.hpp +47 -0
  25. data/Gosu/TextInput.hpp +57 -0
  26. data/Gosu/Timing.hpp +16 -0
  27. data/Gosu/Utility.hpp +24 -0
  28. data/Gosu/WinUtility.hpp +76 -0
  29. data/Gosu/Window.hpp +84 -0
  30. data/GosuImpl/Async.cpp +37 -0
  31. data/GosuImpl/AudioFmod.cpp +417 -0
  32. data/GosuImpl/AudioSDL.cpp +255 -0
  33. data/GosuImpl/DirectoriesMac.mm +38 -0
  34. data/GosuImpl/DirectoriesUnix.cpp +48 -0
  35. data/GosuImpl/DirectoriesWin.cpp +42 -0
  36. data/GosuImpl/FileUnix.cpp +100 -0
  37. data/GosuImpl/FileWin.cpp +83 -0
  38. data/GosuImpl/Graphics/Bitmap.cpp +116 -0
  39. data/GosuImpl/Graphics/BitmapBMP.cpp +232 -0
  40. data/GosuImpl/Graphics/BitmapColorKey.cpp +39 -0
  41. data/GosuImpl/Graphics/BitmapPNG.cpp +276 -0
  42. data/GosuImpl/Graphics/BitmapUtils.cpp +67 -0
  43. data/GosuImpl/Graphics/BlockAllocator.cpp +127 -0
  44. data/GosuImpl/Graphics/BlockAllocator.hpp +34 -0
  45. data/GosuImpl/Graphics/Color.cpp +126 -0
  46. data/GosuImpl/Graphics/Common.hpp +21 -0
  47. data/GosuImpl/Graphics/DrawOp.hpp +154 -0
  48. data/GosuImpl/Graphics/Font.cpp +110 -0
  49. data/GosuImpl/Graphics/Graphics.cpp +295 -0
  50. data/GosuImpl/Graphics/Image.cpp +159 -0
  51. data/GosuImpl/Graphics/LargeImageData.cpp +115 -0
  52. data/GosuImpl/Graphics/LargeImageData.hpp +37 -0
  53. data/GosuImpl/Graphics/RotFlip.cpp +184 -0
  54. data/GosuImpl/Graphics/TexChunk.cpp +77 -0
  55. data/GosuImpl/Graphics/TexChunk.hpp +40 -0
  56. data/GosuImpl/Graphics/Text.cpp +223 -0
  57. data/GosuImpl/Graphics/TextMac.cpp +242 -0
  58. data/GosuImpl/Graphics/TextPangoFT.cpp +186 -0
  59. data/GosuImpl/Graphics/TextWin.cpp +172 -0
  60. data/GosuImpl/Graphics/Texture.cpp +104 -0
  61. data/GosuImpl/Graphics/Texture.hpp +34 -0
  62. data/GosuImpl/IO.cpp +48 -0
  63. data/GosuImpl/InputMac.mm +677 -0
  64. data/GosuImpl/InputWin.cpp +444 -0
  65. data/GosuImpl/InputX.cpp +158 -0
  66. data/GosuImpl/MacUtility.hpp +48 -0
  67. data/GosuImpl/Math.cpp +49 -0
  68. data/GosuImpl/RubyGosu.swg +474 -0
  69. data/GosuImpl/RubyGosuStub.mm +17 -0
  70. data/GosuImpl/RubyGosu_DllMain.cxx +30 -0
  71. data/GosuImpl/RubyGosu_wrap.cxx +8521 -0
  72. data/GosuImpl/RubyGosu_wrap.h +31 -0
  73. data/GosuImpl/Sockets/CommSocket.cpp +304 -0
  74. data/GosuImpl/Sockets/ListenerSocket.cpp +60 -0
  75. data/GosuImpl/Sockets/MessageSocket.cpp +136 -0
  76. data/GosuImpl/Sockets/Socket.cpp +145 -0
  77. data/GosuImpl/Sockets/Sockets.hpp +66 -0
  78. data/GosuImpl/TextInputMac.mm +207 -0
  79. data/GosuImpl/TextInputWin.cpp +197 -0
  80. data/GosuImpl/TextInputX.cpp +201 -0
  81. data/GosuImpl/TextTTFWin.cpp +247 -0
  82. data/GosuImpl/TimingUnix.cpp +17 -0
  83. data/GosuImpl/TimingWin.cpp +28 -0
  84. data/GosuImpl/Utility.cpp +140 -0
  85. data/GosuImpl/WinMain.cpp +69 -0
  86. data/GosuImpl/WinUtility.cpp +137 -0
  87. data/GosuImpl/WindowMac.mm +466 -0
  88. data/GosuImpl/WindowWin.cpp +447 -0
  89. data/GosuImpl/WindowX.cpp +392 -0
  90. data/GosuImpl/X11vroot.h +118 -0
  91. data/README.txt +13 -0
  92. data/Rakefile +178 -0
  93. data/examples/ChipmunkIntegration.rb +275 -0
  94. data/examples/CptnRuby.rb +231 -0
  95. data/examples/MoreChipmunkAndRMagick.rb +155 -0
  96. data/examples/OpenGLIntegration.rb +232 -0
  97. data/examples/RMagickIntegration.rb +449 -0
  98. data/examples/TextInput.cpp +170 -0
  99. data/examples/TextInput.rb +139 -0
  100. data/examples/Tutorial.cpp +215 -0
  101. data/examples/Tutorial.rb +137 -0
  102. data/examples/media/Beep.wav +0 -0
  103. data/examples/media/CptnRuby Gem.png +0 -0
  104. data/examples/media/CptnRuby Map.txt +25 -0
  105. data/examples/media/CptnRuby Tileset.png +0 -0
  106. data/examples/media/CptnRuby.png +0 -0
  107. data/examples/media/Cursor.png +0 -0
  108. data/examples/media/Earth.png +0 -0
  109. data/examples/media/Explosion.wav +0 -0
  110. data/examples/media/LargeStar.png +0 -0
  111. data/examples/media/Sky.jpg +0 -0
  112. data/examples/media/Smoke.png +0 -0
  113. data/examples/media/Soldier.png +0 -0
  114. data/examples/media/Space.png +0 -0
  115. data/examples/media/Star.png +0 -0
  116. data/examples/media/Starfighter.bmp +0 -0
  117. data/linux/Makefile.in +98 -0
  118. data/linux/configure +5658 -0
  119. data/linux/configure.ac +126 -0
  120. data/linux/extconf.rb +11 -0
  121. data/mac/English.lproj/InfoPlist.strings +0 -0
  122. data/mac/Gosu-Info.plist +26 -0
  123. data/mac/Gosu.xcodeproj/project.pbxproj +1194 -0
  124. data/mac/RubyGosu Template-Info.plist +26 -0
  125. data/mac/libboost_thread_1_34_1_universal.a +0 -0
  126. data/mac/libboost_thread_d_1_34_1_universal.a +0 -0
  127. data/mac/libfmod_universal.a +0 -0
  128. data/mac/libpng_universal.a +0 -0
  129. data/mac/libz_universal.a +0 -0
  130. data/reference/Async_8hpp-source.html +70 -0
  131. data/reference/Audio_8hpp-source.html +114 -0
  132. data/reference/Audio_8hpp.html +50 -0
  133. data/reference/AutoLink_8hpp-source.html +38 -0
  134. data/reference/AutoLink_8hpp.html +34 -0
  135. data/reference/Bitmap_8hpp-source.html +85 -0
  136. data/reference/Bitmap_8hpp.html +58 -0
  137. data/reference/ButtonsMac_8hpp-source.html +133 -0
  138. data/reference/ButtonsWin_8hpp-source.html +133 -0
  139. data/reference/ButtonsX_8hpp-source.html +134 -0
  140. data/reference/Color_8hpp-source.html +169 -0
  141. data/reference/Color_8hpp.html +85 -0
  142. data/reference/Directories_8hpp-source.html +42 -0
  143. data/reference/Directories_8hpp.html +46 -0
  144. data/reference/Font_8hpp-source.html +65 -0
  145. data/reference/Font_8hpp.html +41 -0
  146. data/reference/Fwd_8hpp-source.html +52 -0
  147. data/reference/Fwd_8hpp.html +37 -0
  148. data/reference/Gosu_8hpp-source.html +48 -0
  149. data/reference/Gosu_8hpp.html +34 -0
  150. data/reference/GraphicsBase_8hpp-source.html +57 -0
  151. data/reference/GraphicsBase_8hpp.html +56 -0
  152. data/reference/Graphics_8hpp-source.html +96 -0
  153. data/reference/Graphics_8hpp.html +53 -0
  154. data/reference/IO_8hpp-source.html +255 -0
  155. data/reference/IO_8hpp.html +74 -0
  156. data/reference/ImageData_8hpp-source.html +62 -0
  157. data/reference/ImageData_8hpp.html +43 -0
  158. data/reference/Image_8hpp-source.html +126 -0
  159. data/reference/Image_8hpp.html +48 -0
  160. data/reference/Input_8hpp-source.html +118 -0
  161. data/reference/Input_8hpp.html +50 -0
  162. data/reference/Math_8hpp-source.html +92 -0
  163. data/reference/Math_8hpp.html +74 -0
  164. data/reference/Platform_8hpp-source.html +83 -0
  165. data/reference/Platform_8hpp.html +73 -0
  166. data/reference/RotFlip_8hpp-source.html +138 -0
  167. data/reference/RotFlip_8hpp.html +77 -0
  168. data/reference/Sockets_8hpp-source.html +130 -0
  169. data/reference/Sockets_8hpp.html +66 -0
  170. data/reference/TextInput_8hpp-source.html +64 -0
  171. data/reference/TextInput_8hpp.html +41 -0
  172. data/reference/Text_8hpp-source.html +51 -0
  173. data/reference/Text_8hpp.html +46 -0
  174. data/reference/Timing_8hpp-source.html +36 -0
  175. data/reference/Timing_8hpp.html +42 -0
  176. data/reference/Utility_8hpp-source.html +44 -0
  177. data/reference/Utility_8hpp.html +48 -0
  178. data/reference/WinUtility_8hpp-source.html +79 -0
  179. data/reference/WinUtility_8hpp.html +64 -0
  180. data/reference/Window_8hpp-source.html +91 -0
  181. data/reference/Window_8hpp.html +41 -0
  182. data/reference/annotated.html +51 -0
  183. data/reference/classGosu_1_1Audio-members.html +34 -0
  184. data/reference/classGosu_1_1Audio.html +46 -0
  185. data/reference/classGosu_1_1Bitmap-members.html +44 -0
  186. data/reference/classGosu_1_1Bitmap.html +263 -0
  187. data/reference/classGosu_1_1Buffer-members.html +44 -0
  188. data/reference/classGosu_1_1Buffer.html +78 -0
  189. data/reference/classGosu_1_1Buffer.png +0 -0
  190. data/reference/classGosu_1_1Button-members.html +36 -0
  191. data/reference/classGosu_1_1Button.html +143 -0
  192. data/reference/classGosu_1_1Color-members.html +56 -0
  193. data/reference/classGosu_1_1Color.html +387 -0
  194. data/reference/classGosu_1_1File-members.html +41 -0
  195. data/reference/classGosu_1_1File.html +69 -0
  196. data/reference/classGosu_1_1File.png +0 -0
  197. data/reference/classGosu_1_1Font-members.html +39 -0
  198. data/reference/classGosu_1_1Font.html +309 -0
  199. data/reference/classGosu_1_1Graphics-members.html +50 -0
  200. data/reference/classGosu_1_1Graphics.html +234 -0
  201. data/reference/classGosu_1_1Image-members.html +45 -0
  202. data/reference/classGosu_1_1Image.html +518 -0
  203. data/reference/classGosu_1_1ImageData-members.html +37 -0
  204. data/reference/classGosu_1_1ImageData.html +60 -0
  205. data/reference/classGosu_1_1Input-members.html +44 -0
  206. data/reference/classGosu_1_1Input.html +223 -0
  207. data/reference/classGosu_1_1MessageSocket-members.html +40 -0
  208. data/reference/classGosu_1_1MessageSocket.html +233 -0
  209. data/reference/classGosu_1_1Resource-members.html +39 -0
  210. data/reference/classGosu_1_1Resource.html +116 -0
  211. data/reference/classGosu_1_1Resource.png +0 -0
  212. data/reference/classGosu_1_1Sample-members.html +37 -0
  213. data/reference/classGosu_1_1Sample.html +200 -0
  214. data/reference/classGosu_1_1SampleInstance-members.html +38 -0
  215. data/reference/classGosu_1_1SampleInstance.html +169 -0
  216. data/reference/classGosu_1_1Song-members.html +43 -0
  217. data/reference/classGosu_1_1Song.html +260 -0
  218. data/reference/classGosu_1_1TextInput-members.html +38 -0
  219. data/reference/classGosu_1_1TextInput.html +121 -0
  220. data/reference/classGosu_1_1Window-members.html +50 -0
  221. data/reference/classGosu_1_1Window.html +271 -0
  222. data/reference/doxyfile +233 -0
  223. data/reference/doxygen.css +433 -0
  224. data/reference/doxygen.png +0 -0
  225. data/reference/files.html +54 -0
  226. data/reference/functions.html +236 -0
  227. data/reference/functions_enum.html +45 -0
  228. data/reference/functions_func.html +227 -0
  229. data/reference/functions_vars.html +47 -0
  230. data/reference/hierarchy.html +53 -0
  231. data/reference/index.html +26 -0
  232. data/reference/namespaceGosu.html +2890 -0
  233. data/reference/namespaceGosu_1_1Colors.html +70 -0
  234. data/reference/namespaceGosu_1_1Win.html +275 -0
  235. data/reference/namespacemembers.html +216 -0
  236. data/reference/namespacemembers_enum.html +52 -0
  237. data/reference/namespacemembers_eval.html +54 -0
  238. data/reference/namespacemembers_func.html +185 -0
  239. data/reference/namespacemembers_type.html +46 -0
  240. data/reference/namespacemembers_vars.html +46 -0
  241. data/reference/namespaces.html +35 -0
  242. data/reference/tab_b.gif +0 -0
  243. data/reference/tab_l.gif +0 -0
  244. data/reference/tab_r.gif +0 -0
  245. data/reference/tabs.css +102 -0
  246. data/windows/Gosu.sln +29 -0
  247. data/windows/Gosu.vcproj +553 -0
  248. data/windows/RubyGosu.vcproj +138 -0
  249. metadata +305 -0
@@ -0,0 +1,48 @@
1
+ #ifndef GOSU_MACUTILITY_HPP
2
+ #define GOSU_MACUTILITY_HPP
3
+
4
+ #ifdef __OBJC__
5
+ #import <objc/objc.h>
6
+ #import <stdexcept>
7
+ #import <boost/utility.hpp>
8
+ namespace Gosu
9
+ {
10
+ template<typename T>
11
+ class ObjRef : boost::noncopyable
12
+ {
13
+ T* ptr;
14
+ public:
15
+ ObjRef(T* ptr = nil)
16
+ : ptr(ptr)
17
+ {
18
+ }
19
+
20
+ ~ObjRef()
21
+ {
22
+ if (ptr)
23
+ [ptr release];
24
+ }
25
+
26
+ void reset(T* newPtr = nil)
27
+ {
28
+ if (ptr)
29
+ [ptr release];
30
+ ptr = newPtr;
31
+ }
32
+
33
+ T* get() const
34
+ {
35
+ return ptr;
36
+ }
37
+
38
+ T* obj() const
39
+ {
40
+ if (!ptr)
41
+ throw std::logic_error("Tried dereferencing nil");
42
+ return ptr;
43
+ }
44
+ };
45
+ }
46
+ #endif
47
+
48
+ #endif
@@ -0,0 +1,49 @@
1
+ #include <Gosu/Math.hpp>
2
+ #include <cmath>
3
+ #include <cstdlib>
4
+
5
+ double Gosu::random(double min, double max)
6
+ {
7
+ double rnd = std::rand();
8
+ return rnd / RAND_MAX * (max - min) + min;
9
+ }
10
+
11
+ double Gosu::offsetX(double angle, double radius)
12
+ {
13
+ return +std::sin(angle / 180 * pi) * radius;
14
+ }
15
+
16
+ double Gosu::offsetY(double angle, double radius)
17
+ {
18
+ return -std::cos(angle / 180 * pi) * radius;
19
+ }
20
+
21
+ double Gosu::angle(double fromX, double fromY, double toX, double toY,
22
+ double def)
23
+ {
24
+ double distX = toX - fromX;
25
+ double distY = toY - fromY;
26
+
27
+ if (distX == 0 && distY == 0)
28
+ return def;
29
+ else
30
+ return std::atan2(distY, distX) / pi * 180 + 90;
31
+ }
32
+
33
+ double Gosu::angleDiff(double from, double to)
34
+ {
35
+ return normalizeAngle(std::fmod(to - from + 180, 360) - 180);
36
+ }
37
+
38
+ double Gosu::normalizeAngle(double angle)
39
+ {
40
+ double result = std::fmod(angle, 360);
41
+ if (result < 0)
42
+ result += 360;
43
+ return result;
44
+ }
45
+
46
+ double Gosu::distance(double x1, double y1, double x2, double y2)
47
+ {
48
+ return std::sqrt(distanceSqr(x1, y1, x2, y2));
49
+ }
@@ -0,0 +1,474 @@
1
+ // Mini Swig Style Improvement List:
2
+ // - %predicate instead of %rename
3
+ // - use Python names for op overloading
4
+
5
+ %trackobjects;
6
+ %include exception.i
7
+
8
+ // Don't complain about ignored operators.
9
+ #pragma SWIG nowarn=378
10
+
11
+ // The docs make it seem like this is a generally good idea.
12
+ %feature("compactdefaultargs");
13
+
14
+ // Overriding virtuals is only necessary in Gosu::Window.
15
+ %feature("director") Gosu::Window;
16
+
17
+ // Resolve typedefs that SWIG doesn't recognize.
18
+ %apply unsigned char { boost::uint8_t };
19
+ %apply unsigned long { boost::uint32_t };
20
+
21
+ // Custom typemaps for wchar/wstring.
22
+ #pragma SWIG nowarn=-490,-319
23
+ %typemap(in) wchar_t {
24
+ VALUE localTemporary = rb_obj_as_string($input);
25
+ std::wstring localTemporary2 = Gosu::utf8ToWstring(StringValueCStr(localTemporary));
26
+ $1 = localTemporary2.empty() ? 0 : localTemporary2.at(0);
27
+ }
28
+ %typemap(out) wchar_t {
29
+ $result = rb_str_new2(Gosu::wstringToUTF8(std::wstring(1, $1)).c_str());
30
+ }
31
+ %typemap(in) const std::wstring& (std::wstring temp) {
32
+ VALUE localTemporary = rb_obj_as_string($input);
33
+ temp = Gosu::utf8ToWstring(StringValueCStr(localTemporary));
34
+ $1 = &temp;
35
+ }
36
+ %apply const std::wstring& { std::wstring, const std::string };
37
+ %typemap(out) std::wstring {
38
+ $result = rb_str_new2(Gosu::wstringToUTF8($1).c_str());
39
+ }
40
+
41
+ %typemap(in) Gosu::Button {
42
+ $1 = Gosu::Button(NUM2LONG($input));
43
+ }
44
+ %typemap(out) Gosu::Button {
45
+ $result = LONG2NUM($1.getId());
46
+ }
47
+ %typemap(directorin) Gosu::Button {
48
+ $input = LONG2NUM($1.getId());
49
+ }
50
+
51
+ // Typemaps for enums that should be given in as symbols.
52
+ %typemap(in) Gosu::AlphaMode {
53
+ VALUE localTemporary = rb_obj_as_string($input);
54
+ if (!strcmp(StringValueCStr(localTemporary), "default"))
55
+ $1 = Gosu::amDefault;
56
+ else if (!strcmp(StringValueCStr(localTemporary), "additive"))
57
+ $1 = Gosu::amAdditive;
58
+ else
59
+ SWIG_exception_fail(SWIG_ValueError, "invalid alpha mode");
60
+ }
61
+ %typemap(in) Gosu::TextAlign {
62
+ VALUE localTemporary = rb_obj_as_string($input);
63
+ if (!strcmp(StringValueCStr(localTemporary), "left"))
64
+ $1 = Gosu::taLeft;
65
+ else if (!strcmp(StringValueCStr(localTemporary), "center"))
66
+ $1 = Gosu::taCenter;
67
+ else if (!strcmp(StringValueCStr(localTemporary), "right"))
68
+ $1 = Gosu::taRight;
69
+ else if (!strcmp(StringValueCStr(localTemporary), "justify"))
70
+ $1 = Gosu::taJustify;
71
+ else
72
+ SWIG_exception_fail(SWIG_ValueError, "invalid text align");
73
+ }
74
+ %typemap(in) Gosu::Song::Type {
75
+ VALUE localTemporary = rb_obj_as_string($input);
76
+ if (!strcmp(StringValueCStr(localTemporary), "stream"))
77
+ $1 = Gosu::Song::stStream;
78
+ else if (!strcmp(StringValueCStr(localTemporary), "module"))
79
+ $1 = Gosu::Song::stModule;
80
+ else
81
+ SWIG_exception_fail(SWIG_ValueError, "invalid song type");
82
+ }
83
+
84
+ // Allow integral constants to be passed in place of Color values.
85
+ %typemap(in) Gosu::Color {
86
+ void* ptr;
87
+ int res = SWIG_ConvertPtr($input, &ptr, SWIGTYPE_p_Gosu__Color, 0);
88
+ if (!SWIG_IsOK(res))
89
+ // TODO: error checking
90
+ $1 = Gosu::Color(NUM2UINT($input));
91
+ else if (!ptr)
92
+ SWIG_exception_fail(SWIG_ValueError, "invalid null reference of type Gosu::Color");
93
+ else
94
+ $1 = *reinterpret_cast<Gosu::Color*>(ptr);
95
+ }
96
+
97
+ // Header inclusion (order irrelevant)
98
+ %module(directors="1") gosu
99
+ %{
100
+ // Avoid Ruby Macro Hell on Windows...
101
+ #undef write
102
+ #undef close
103
+ #undef read
104
+ #undef sleep
105
+ #undef Sleep
106
+
107
+ //#ifndef WIN32
108
+ //#include <Gosu/Async.hpp>
109
+ //#endif
110
+
111
+ #include <Gosu/Audio.hpp>
112
+ #include <Gosu/Color.hpp>
113
+ #include <Gosu/Font.hpp>
114
+ #include <Gosu/GraphicsBase.hpp>
115
+ #include <Gosu/Graphics.hpp>
116
+ #include <Gosu/Image.hpp>
117
+ #include <Gosu/ImageData.hpp>
118
+ #include <Gosu/Input.hpp>
119
+ #include <Gosu/IO.hpp>
120
+ #include <Gosu/Math.hpp>
121
+ #include <Gosu/Text.hpp>
122
+ #include <Gosu/TextInput.hpp>
123
+ #include <Gosu/Timing.hpp>
124
+ #include <Gosu/Utility.hpp>
125
+ #include <Gosu/Window.hpp>
126
+
127
+ #include <sstream>
128
+
129
+ // New Ruby 1.9 syntax (for compilation with Ruby 1.8)
130
+ #ifndef RSTRING_LEN
131
+ # define RSTRING_LEN(x) RSTRING(x)->len
132
+ #endif
133
+ #ifndef RSTRING_PTR
134
+ # define RSTRING_PTR(x) RSTRING(x)->ptr
135
+ #endif
136
+ #ifndef RARRAY_LEN
137
+ # define RARRAY_LEN(x) RARRAY(x)->len
138
+ #endif
139
+ #ifndef RARRAY_PTR
140
+ # define RARRAY_PTR(x) RARRAY(x)->ptr
141
+ #endif
142
+
143
+ namespace GosusDarkSide
144
+ {
145
+ // TODO: Find a way for this to fit into Gosu's design.
146
+ // This can point to a function that wants to be called every
147
+ // frame, e.g. rb_thread_schedule.
148
+ typedef void (*HookOfHorror)();
149
+ extern HookOfHorror oncePerTick;
150
+
151
+ void yieldToOtherRubyThreads()
152
+ {
153
+ rb_thread_schedule();
154
+ }
155
+ }
156
+
157
+ // Allow filenames and RMagick Images to be passed where Bitmaps are needed.
158
+ namespace Gosu
159
+ {
160
+ Gosu::Bitmap loadBitmap(VALUE val)
161
+ {
162
+ // Try to treat as filename first.
163
+ if (rb_respond_to(val, rb_intern("to_str")))
164
+ {
165
+ const char* filename = STR2CSTR(rb_funcall(val, rb_intern("to_str"), 0));
166
+ return quickLoadBitmap(Gosu::utf8ToWstring(filename));
167
+ }
168
+
169
+ // Otherwise, try to call .to_blob on it.
170
+ // (Works with RMagick).
171
+ VALUE conversion = rb_str_new2("to_blob { self.format = 'RGBA'; self.depth = 8 }");
172
+ VALUE blob = rb_obj_instance_eval(1, &conversion, val);
173
+ Check_SafeStr(blob);
174
+ unsigned width = NUM2UINT(rb_funcall(val, rb_intern("columns"), 0));
175
+ unsigned height = NUM2UINT(rb_funcall(val, rb_intern("rows"), 0));
176
+
177
+ if (width * height * 4 != RSTRING_LEN(blob))
178
+ throw std::logic_error("Blob length mismatch!");
179
+ Bitmap result;
180
+ result.resize(width, height);
181
+ const unsigned* rgbaIter = reinterpret_cast<const unsigned*>(RSTRING_PTR(blob));
182
+ for (unsigned y = 0; y < height; ++y)
183
+ for (unsigned x = 0; x < width; ++x)
184
+ {
185
+ unsigned rgba = *rgbaIter;
186
+ result.setPixel(x, y, Gosu::Color(rgba).abgr()); // swap R and B
187
+ ++rgbaIter;
188
+ }
189
+ return result;
190
+ }
191
+ }
192
+ %}
193
+
194
+ // Exception wrapping
195
+ %exception {
196
+ try {
197
+ $action
198
+ } catch(const std::runtime_error& e) {
199
+ SWIG_exception(SWIG_RuntimeError, e.what());
200
+ }
201
+ }
202
+
203
+ // Miscellaneous functions (timing, math)
204
+ %ignore Gosu::sleep;
205
+ %include "../Gosu/Timing.hpp"
206
+ %ignore Gosu::pi;
207
+ %include "../Gosu/Math.hpp"
208
+ %ignore Gosu::textWidth;
209
+ %ignore Gosu::createText;
210
+ %ignore Gosu::textHeight;
211
+ %ignore Gosu::drawText;
212
+ %include "../Gosu/Text.hpp"
213
+
214
+
215
+ // Graphics:
216
+
217
+ // ZPos, AlphaMode, FontFlags, TextAlign
218
+ %include "../Gosu/GraphicsBase.hpp"
219
+
220
+ // Color
221
+ %rename("alpha=") setAlpha;
222
+ %rename("red=") setRed;
223
+ %rename("green=") setGreen;
224
+ %rename("blue=") setBlue;
225
+ %rename("hue=") setHue;
226
+ %rename("saturation=") setSaturation;
227
+ %rename("value=") setValue;
228
+ %include "std_string.i"
229
+ %include "../Gosu/Color.hpp"
230
+ %extend Gosu::Color {
231
+ std::string toS() const {
232
+ std::ostringstream stream;
233
+ stream << "(" << static_cast<int>($self->alpha())
234
+ << "," << static_cast<int>($self->red())
235
+ << "," << static_cast<int>($self->green())
236
+ << "," << static_cast<int>($self->blue()) << ")";
237
+ return stream.str();
238
+ }
239
+ }
240
+
241
+ // Font
242
+ // Hackishly allow the user to pass Window& instead of Graphics&.
243
+ %ignore Gosu::Font::Font(Graphics& graphics, const std::wstring& fontName, unsigned height);
244
+ %include "../Gosu/Font.hpp"
245
+ %extend Gosu::Font {
246
+ Font(Gosu::Window& window, const std::wstring& fontName, unsigned height) {
247
+ return new Gosu::Font(window.graphics(), fontName, height);
248
+ }
249
+ }
250
+
251
+ // AsyncResult
252
+
253
+ //#ifndef WIN32
254
+ //%ignore Gosu::asyncNewImage;
255
+ //%ignore Gosu::asyncNewImage_Impl;
256
+ //%ignore Gosu::AsyncResult::takeValue;
257
+ //%include "../Gosu/Async.hpp"
258
+ //%extend Gosu::AsyncResult {
259
+ // %newobject value;
260
+ // Gosu::Image* value() {
261
+ // return $self->takeValue().release();
262
+ // }
263
+ //}
264
+ //%template(AsyncImageResult) Gosu::AsyncResult<Gosu::Image>;
265
+ //#endif
266
+
267
+ %ignore Gosu::ImageData;
268
+ %rename("tex_name") texName;
269
+ %include "../Gosu/ImageData.hpp"
270
+
271
+ // Image
272
+ // Hackishly allow the user to pass Window& instead of Graphics&.
273
+ // Also, provide convenience functions.
274
+
275
+ // Typemap to return an array of images (for loadTiles)
276
+ %typemap(out) std::vector<Gosu::Image*> {
277
+ $result = rb_ary_new2($1.size());
278
+ for (unsigned i = 0; i < $1.size(); i++) {
279
+ VALUE curImg = SWIG_NewPointerObj(SWIG_as_voidptr((*&$1)[i]), SWIGTYPE_p_Gosu__Image, SWIG_POINTER_OWN);
280
+ rb_ary_store($result, i, curImg);
281
+ }
282
+ }
283
+
284
+ %ignore Gosu::Image::Image(Graphics& graphics, const std::wstring& filename, bool hardBorders = false);
285
+ %ignore Gosu::Image::Image(Graphics& graphics, const std::wstring& filename, unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight, bool hardBorders = false);
286
+ %ignore Gosu::Image::Image(Graphics& graphics, const Bitmap& source, bool hardBorders = false);
287
+ %ignore Gosu::Image::Image(Graphics& graphics, const Bitmap& source, unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight, bool hardBorders = false);
288
+ %include "../Gosu/Image.hpp"
289
+ %extend Gosu::Image {
290
+ Image(Gosu::Window& window, VALUE source, bool hardBorders = false) {
291
+ return new Gosu::Image(window.graphics(), Gosu::loadBitmap(source), hardBorders);
292
+ }
293
+ Image(Gosu::Window& window, VALUE source, bool hardBorders,
294
+ unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight) {
295
+ return new Gosu::Image(window.graphics(), Gosu::loadBitmap(source),
296
+ srcX, srcY, srcWidth, srcHeight, hardBorders);
297
+ }
298
+ #ifndef WIN32
299
+ // %newobject asyncNew;
300
+ // static Gosu::AsyncResult<Gosu::Image>* asyncNew(Gosu::Window& window, const std::wstring& filename) {
301
+ // return new Gosu::AsyncResult<Gosu::Image>(Gosu::asyncNewImage(window, filename));
302
+ // }
303
+ #endif
304
+ void drawAsQuad(double x1, double y1, Color c1,
305
+ double x2, double y2, Color c2,
306
+ double x3, double y3, Color c3,
307
+ double x4, double y4, Color c4,
308
+ ZPos z, AlphaMode mode = Gosu::amDefault) {
309
+ $self->getData().draw(x1, y1, c1, x2, y2, c2, x3, y3, c3, x4, y4, c4, z, mode);
310
+ }
311
+ %newobject glTexInfo;
312
+ Gosu::GLTexInfo* glTexInfo() const {
313
+ boost::optional<Gosu::GLTexInfo> info = $self->getData().glTexInfo();
314
+ if (info)
315
+ return new Gosu::GLTexInfo(*info);
316
+ else
317
+ return 0;
318
+ }
319
+ %newobject fromText;
320
+ static Gosu::Image* fromText(Gosu::Window& window, const std::wstring& text,
321
+ const std::wstring& fontName, unsigned fontHeight,
322
+ unsigned lineSpacing, unsigned maxWidth, TextAlign align) {
323
+ Gosu::Bitmap bmp = Gosu::createText(text, fontName, fontHeight, lineSpacing, maxWidth, align);
324
+ return new Gosu::Image(window.graphics(), bmp);
325
+ }
326
+ static std::vector<Gosu::Image*> loadTiles(Gosu::Window& window, VALUE source,
327
+ int tileWidth, int tileHeight, bool hardBorders) {
328
+ std::vector<Gosu::Image*> vec;
329
+ // TODO: const correctness (<- did I mean exception safety?)
330
+ Gosu::imagesFromTiledBitmap(window.graphics(), Gosu::loadBitmap(source),
331
+ tileWidth, tileHeight, hardBorders, vec);
332
+ return vec;
333
+ }
334
+ }
335
+
336
+ // Audio:
337
+
338
+ %ignore Gosu::Audio;
339
+ %ignore Gosu::Sample::Sample(Audio& audio, const std::wstring& filename);
340
+ %ignore Gosu::Sample::Sample(Audio& audio, Reader reader);
341
+ %ignore Gosu::Song::Song(Audio& audio, const std::wstring& filename);
342
+ %ignore Gosu::Song::Song(Audio& audio, Type type, Reader reader);
343
+ %rename("playing?") playing;
344
+ %rename("volume=") changeVolume;
345
+ %rename("pan=") changePan;
346
+ %rename("speed=") changeSpeed;
347
+ %include "../Gosu/Audio.hpp"
348
+ %extend Gosu::Sample {
349
+ Sample(Gosu::Window& window, const std::string& filename) {
350
+ return new Gosu::Sample(window.audio(), Gosu::utf8ToWstring(filename));
351
+ }
352
+ }
353
+ %extend Gosu::Song {
354
+ Song(Gosu::Window& window, const std::string& filename) {
355
+ return new Gosu::Song(window.audio(), Gosu::utf8ToWstring(filename));
356
+ }
357
+ }
358
+
359
+
360
+ // Input and Window:
361
+
362
+ // Button ID constants
363
+ %include "../Gosu/ButtonsMac.hpp"
364
+ %init %{
365
+ // Backwards compatibility: import the constants into Gosu::Button.
366
+ rb_eval_string("module Gosu::Button; Gosu.constants.each { |c| const_set(c, Gosu.const_get(c)) }; end");
367
+
368
+ // Extend Numeric with simple angle conversion methods.
369
+ // IMPR: Maybe faster in C?
370
+ rb_eval_string("class Numeric;"
371
+ " def gosu_to_radians; (self - 90) * Math::PI / 180.0; end;"
372
+ " def radians_to_gosu; self * 180.0 / Math::PI + 90; end;"
373
+ "end");
374
+
375
+ GosusDarkSide::oncePerTick = GosusDarkSide::yieldToOtherRubyThreads;
376
+ %}
377
+
378
+ // TextInput
379
+ %ignore Gosu::TextInput::feedNSEvent(void*);
380
+ %ignore Gosu::TextInput::feedMessage(unsigned long, unsigned long, unsigned long);
381
+ %ignore Gosu::TextInput::feedButtonId(unsigned);
382
+ %ignore Gosu::TextInput::caretPos() const;
383
+ %ignore Gosu::TextInput::selectionStart() const;
384
+ %rename("text=") setText;
385
+ %include "../Gosu/TextInput.hpp"
386
+ %extend Gosu::TextInput {
387
+ // Fix indices into UTF-8 string
388
+ unsigned caret_pos() const {
389
+ return Gosu::wstringToUTF8($self->text().substr(0, $self->caretPos())).size();
390
+ }
391
+ unsigned selection_start() const {
392
+ return Gosu::wstringToUTF8($self->text().substr(0, $self->selectionStart())).size();
393
+ }
394
+ };
395
+
396
+ // Window
397
+ %rename("caption=") setCaption;
398
+ %rename("button_down?") isButtonDown;
399
+ %rename("text_input=") setTextInput;
400
+ %markfunc Gosu::Window "markWindow";
401
+ %include "../Gosu/Window.hpp"
402
+
403
+ %header %{
404
+ static void markWindow(void* window) {
405
+ Gosu::TextInput* ti = static_cast<Gosu::Window*>(window)->input().textInput();
406
+ if (VALUE ti_value = SWIG_RubyInstanceFor(ti))
407
+ rb_gc_mark(ti_value);
408
+ }
409
+ %}
410
+
411
+ %extend Gosu::Window {
412
+ void drawLine(double x1, double y1, Gosu::Color c1,
413
+ double x2, double y2, Gosu::Color c2,
414
+ Gosu::ZPos z = 0, Gosu::AlphaMode mode = Gosu::amDefault) {
415
+ $self->graphics().drawLine(x1, y1, c1, x2, y2, c2,
416
+ z, mode);
417
+ }
418
+ void drawTriangle(double x1, double y1, Gosu::Color c1,
419
+ double x2, double y2, Gosu::Color c2,
420
+ double x3, double y3, Gosu::Color c3,
421
+ Gosu::ZPos z = 0, Gosu::AlphaMode mode = Gosu::amDefault) {
422
+ $self->graphics().drawTriangle(x1, y1, c1, x2, y2, c2, x3, y3, c3,
423
+ z, mode);
424
+ }
425
+ void drawQuad(double x1, double y1, Gosu::Color c1,
426
+ double x2, double y2, Gosu::Color c2,
427
+ double x3, double y3, Gosu::Color c3,
428
+ double x4, double y4, Gosu::Color c4,
429
+ Gosu::ZPos z = 0, Gosu::AlphaMode mode = Gosu::amDefault) {
430
+ $self->graphics().drawQuad(x1, y1, c1, x2, y2, c2,
431
+ x3, y3, c3, x4, y4, c4,
432
+ z, mode);
433
+ }
434
+ bool isButtonDown(Gosu::Button btn) const {
435
+ return $self->input().down(btn);
436
+ }
437
+ Gosu::Button charToButtonId(wchar_t ch) {
438
+ return $self->input().charToId(ch);
439
+ }
440
+ wchar_t buttonIdToChar(Gosu::Button btn) {
441
+ return $self->input().idToChar(btn);
442
+ }
443
+
444
+ TextInput* textInput() const {
445
+ return $self->input().textInput();
446
+ }
447
+
448
+ void setTextInput(TextInput* ti) {
449
+ $self->input().setTextInput(ti);
450
+ }
451
+
452
+ double mouseX() const {
453
+ return $self->input().mouseX();
454
+ }
455
+ double mouseY() const {
456
+ return $self->input().mouseY();
457
+ }
458
+ int width() const {
459
+ return $self->graphics().width();
460
+ }
461
+ int height() const {
462
+ return $self->graphics().height();
463
+ }
464
+ void gl() {
465
+ $self->graphics().beginGL();
466
+ rb_yield(Qnil);
467
+ $self->graphics().endGL();
468
+ }
469
+ void clipTo(int x, int y, unsigned width, unsigned height) {
470
+ $self->graphics().beginClipping(x, y, width, height);
471
+ rb_yield(Qnil);
472
+ $self->graphics().endClipping();
473
+ }
474
+ };