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,47 @@
1
+ //! \file Text.hpp
2
+ //! Functions to output text on bitmaps.
3
+
4
+ #ifndef GOSU_TEXT_HPP
5
+ #define GOSU_TEXT_HPP
6
+
7
+ #include <Gosu/Fwd.hpp>
8
+ #include <Gosu/GraphicsBase.hpp>
9
+ #include <string>
10
+
11
+ namespace Gosu
12
+ {
13
+ //! Returns the name of a neutral font that is available on the current
14
+ //! platform.
15
+ std::wstring defaultFontName();
16
+
17
+ //! Returns the width a text would span on a bitmap if it were drawn
18
+ //! using drawText with the same arguments.
19
+ //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/').
20
+ unsigned textWidth(const std::wstring& text,
21
+ const std::wstring& fontName, unsigned fontHeight,
22
+ unsigned fontFlags = 0);
23
+
24
+ //! Draws a line of text on a bitmap.
25
+ //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/').
26
+ //! \param fontHeight Height, in pixels, of the text.
27
+ //! \param fontFlags Binary combination of members of the FontFlags
28
+ //! enum.
29
+ void drawText(Bitmap& bitmap, const std::wstring& text, int x, int y,
30
+ Color c, const std::wstring& fontName, unsigned fontHeight,
31
+ unsigned fontFlags = 0);
32
+
33
+ //! Creates a bitmap that is filled with the text given to the function.
34
+ //! The text may contain line breaks.
35
+ //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/').
36
+ //! \param fontHeight Height of the font in pixels.
37
+ //! \param lineSpacing Spacing between two lines of text in pixels.
38
+ //! \param maxWidth Maximal width of the bitmap that will be returned. Text
39
+ //! will be split into multiple lines to avoid drawing over the right
40
+ //! border. When a single word is too long, it will be truncated.
41
+ Bitmap createText(const std::wstring& text,
42
+ const std::wstring& fontName, unsigned fontHeight,
43
+ unsigned lineSpacing, unsigned maxWidth, TextAlign align,
44
+ unsigned fontFlags = 0);
45
+ }
46
+
47
+ #endif
@@ -0,0 +1,57 @@
1
+ //! \file TextInput.hpp
2
+ //! Interface of the TextInput class.
3
+
4
+ #ifndef GOSU_TEXTINPUT_HPP
5
+ #define GOSU_TEXTINPUT_HPP
6
+
7
+ #include <Gosu/Fwd.hpp>
8
+ #include <Gosu/Platform.hpp>
9
+ #include <boost/scoped_ptr.hpp>
10
+ #include <string>
11
+
12
+ namespace Gosu
13
+ {
14
+ //! TextInput instances are invisible objects that build a text string from input,
15
+ //! using the current operating system's keyboard layout.
16
+ //! At its most basic form, you only need to create a new TextInput instance and
17
+ //! pass it to your window via setTextInput. Until you call this function again,
18
+ //! passing 0, the TextInput object will build a text that can be accessed via
19
+ //! TextInput::text().
20
+ //! A TextInput object is purely abstract, though; drawing the input field is left
21
+ //! to the user. As with most of Gosu, how this is handled is completely left open.
22
+ //! TextInput only aims to provide enough code for your own GUIs to build upon.
23
+ class TextInput
24
+ {
25
+ struct Impl;
26
+ boost::scoped_ptr<Impl> pimpl;
27
+
28
+ public:
29
+ TextInput();
30
+ ~TextInput();
31
+
32
+ std::wstring text() const;
33
+
34
+ //! Replaces the current text by the given string and positions the cursor
35
+ //! at the end of the text, with an empty selection.
36
+ void setText(const std::wstring& text);
37
+
38
+ //! Position of the caret as the index of the character that it's left to.
39
+ unsigned caretPos() const;
40
+
41
+ //! If there is a selection, the selectionStart() member yields its beginning,
42
+ //! using the same indexing scheme as caretPos. If there is no selection,
43
+ //! selectionStart() is equal to caretPos().
44
+ unsigned selectionStart() const;
45
+
46
+ // Platform-specific communication with Gosu::Input.
47
+ #if defined(GOSU_IS_MAC)
48
+ bool feedNSEvent(void* event);
49
+ #elif defined(GOSU_IS_WIN)
50
+ bool feedMessage(unsigned long message, unsigned long wparam, unsigned long lparam);
51
+ #elif defined(GOSU_IS_X)
52
+ bool feedXEvent(void* display, void* event);
53
+ #endif
54
+ };
55
+ }
56
+
57
+ #endif
@@ -0,0 +1,16 @@
1
+ //! \file Timing.hpp
2
+ //! Functions for timing.
3
+
4
+ #ifndef GOSU_TIMING_HPP
5
+ #define GOSU_TIMING_HPP
6
+
7
+ namespace Gosu
8
+ {
9
+ //! Freezes the current thread for at least the specified time.
10
+ void sleep(unsigned milliseconds);
11
+
12
+ //! Incrementing, possibly wrapping millisecond timer.
13
+ unsigned long milliseconds();
14
+ }
15
+
16
+ #endif
@@ -0,0 +1,24 @@
1
+ //! \file Utility.hpp
2
+ //! General purpose utility functions.
3
+
4
+ // REDESIGN: Rename to StringConversion.hpp?
5
+
6
+ #ifndef GOSU_UTILITY_HPP
7
+ #define GOSU_UTILITY_HPP
8
+
9
+ #include <string>
10
+ #include <vector>
11
+
12
+ namespace Gosu
13
+ {
14
+ //! Converts an std::string into an std::wstring.
15
+ std::wstring widen(const std::string& s);
16
+ //! Converts an std::wstring into an std::string.
17
+ std::string narrow(const std::wstring& ws);
18
+
19
+ // Undocumented, temporary: Please ignore. ;)
20
+ std::wstring utf8ToWstring(const std::string& utf8);
21
+ std::string wstringToUTF8(const std::wstring& ws);
22
+ }
23
+
24
+ #endif
@@ -0,0 +1,76 @@
1
+ //! \file WinUtility.hpp
2
+ //! Contains some functions which are used to implement Gosu on Windows and
3
+ //! might be useful for advanced users who try to integrate Gosu in a Win32
4
+ //! application.
5
+
6
+ #ifndef GOSU_WINUTILITY_HPP
7
+ #define GOSU_WINUTILITY_HPP
8
+
9
+ #include <windows.h>
10
+ #include <Gosu/Platform.hpp>
11
+ #include <boost/function.hpp>
12
+ #include <boost/shared_ptr.hpp>
13
+ #include <string>
14
+
15
+ namespace Gosu
16
+ {
17
+ //! Implementation helpers for the Windows platform.
18
+ namespace Win
19
+ {
20
+ //! Returns the instance handle of the application.
21
+ HINSTANCE instance();
22
+
23
+ //! Blocking function which waits for the next message, processes it,
24
+ //! then returns.
25
+ void handleMessage();
26
+
27
+ //! Non-blocking function which processes all waiting messages but does
28
+ //! not wait for further incoming messages.
29
+ void processMessages();
30
+
31
+ //! Registers a function to be called by handleMessage and
32
+ //! processMessages. Every message is passed to the hooks and not
33
+ //! processed further if any hook function returns true.
34
+ void registerMessageHook(const boost::function<bool (MSG&)>& hook);
35
+
36
+ //! Throws an exception according to the error which GetLastError()
37
+ //! returns, optionally prefixed with "While <action>, the following
38
+ //! error occured: ".
39
+ GOSU_NORETURN void throwLastError(const std::string& action = "");
40
+
41
+ //! Small helper function that throws an exception whenever the value
42
+ //! passed through is false. Note that this doesn't make sense for all
43
+ //! Windows API functions, but for most of them.
44
+ template<typename T>
45
+ inline T check(T valToCheck, const std::string& action = "")
46
+ {
47
+ if (!valToCheck)
48
+ throwLastError(action);
49
+ return valToCheck;
50
+ }
51
+
52
+ // IMPR: Why can't I use mem_fn for releasing objects even though it is
53
+ // shown like that in the shared_ptr documentation?
54
+ template<typename T>
55
+ void releaseComPtr(T* ptr)
56
+ {
57
+ ptr->Release();
58
+ }
59
+
60
+ //! Small helper function that transfers ownership of a COM interface
61
+ //! to a boost::shared_ptr.
62
+ template<typename T>
63
+ inline boost::shared_ptr<T> shareComPtr(T* ptr)
64
+ {
65
+ return boost::shared_ptr<T>(ptr, releaseComPtr<T>);
66
+ }
67
+
68
+ //! Returns the executable's filename.
69
+ std::wstring appFilename();
70
+
71
+ //! Returns the executable's containing directory.
72
+ std::wstring appDirectory();
73
+ }
74
+ }
75
+
76
+ #endif
@@ -0,0 +1,84 @@
1
+ //! \file Window.hpp
2
+ //! Interface of the Window class.
3
+
4
+ #ifndef GOSU_WINDOW_HPP
5
+ #define GOSU_WINDOW_HPP
6
+
7
+ #include <Gosu/Fwd.hpp>
8
+ #include <Gosu/Platform.hpp>
9
+ #include <Gosu/Input.hpp>
10
+ #include <boost/scoped_ptr.hpp>
11
+ #include <boost/shared_ptr.hpp>
12
+ #include <boost/function.hpp>
13
+ #include <string>
14
+
15
+ #ifdef GOSU_IS_WIN
16
+ #include <windows.h>
17
+ #endif
18
+
19
+ namespace Gosu
20
+ {
21
+ //! Convenient all-in-one class that serves as the foundation of a standard
22
+ //! Gosu application. Manages initialization of all of Gosu's core components
23
+ //! and provides timing functionality.
24
+ class Window
25
+ {
26
+ struct Impl;
27
+ boost::scoped_ptr<Impl> pimpl;
28
+
29
+ public:
30
+ //! Constructs a Window.
31
+ //! \param updateInterval Interval in milliseconds between two calls
32
+ //! to the update member function.
33
+ Window(unsigned width, unsigned height, bool fullscreen,
34
+ double updateInterval = 16.666666);
35
+ virtual ~Window();
36
+
37
+ std::wstring caption() const;
38
+ void setCaption(const std::wstring& caption);
39
+
40
+ //! Starts the main event loop.
41
+ void show();
42
+ //! Closes the window if it is currently shown.
43
+ void close();
44
+
45
+ //! Called every updateInterval milliseconds while the window is being
46
+ //! shown. Your application's main game logic goes here.
47
+ virtual void update() {}
48
+ //! Called after every update and when the OS wants the window to
49
+ //! repaint itself. Your application's rendering code goes here.
50
+ virtual void draw() {}
51
+
52
+ //! Called before update when the user pressed a button while the
53
+ //! window had the focus.
54
+ virtual void buttonDown(Gosu::Button) {}
55
+ //! Same as buttonDown. Called then the user released a button.
56
+ virtual void buttonUp(Gosu::Button) {}
57
+
58
+ // Ignore when SWIG is wrapping this class for Ruby/Gosu.
59
+ #ifndef SWIG
60
+ const Graphics& graphics() const;
61
+ Graphics& graphics();
62
+
63
+ const Audio& audio() const;
64
+ Audio& audio();
65
+
66
+ const Input& input() const;
67
+ Input& input();
68
+
69
+ #ifdef GOSU_IS_WIN
70
+ // Only on Windows.
71
+ HWND handle() const;
72
+ virtual LRESULT handleMessage(UINT message, WPARAM wparam,
73
+ LPARAM lparam);
74
+ #else
75
+ // Only on Unices (so far).
76
+ typedef boost::shared_ptr<boost::function<void()> > SharedContext;
77
+ SharedContext createSharedContext();
78
+ #endif
79
+
80
+ #endif
81
+ };
82
+ }
83
+
84
+ #endif
@@ -0,0 +1,37 @@
1
+ #include <Gosu/Async.hpp>
2
+ #include <Gosu/Graphics.hpp>
3
+ #include <Gosu/Image.hpp>
4
+ #include <Gosu/Window.hpp>
5
+ #include <boost/bind.hpp>
6
+
7
+ using namespace boost;
8
+
9
+ namespace Gosu
10
+ {
11
+ namespace
12
+ {
13
+ void asyncNewImage_Impl(Window& window, std::wstring filename,
14
+ Window::SharedContext context,
15
+ shared_ptr<try_mutex> mutex,
16
+ shared_ptr<std::auto_ptr<Image> > result)
17
+ {
18
+ try_mutex::scoped_lock lock(*mutex);
19
+ (*context)();
20
+ result->reset(new Image(window.graphics(), filename));
21
+ }
22
+ }
23
+ }
24
+
25
+ Gosu::AsyncResult<Gosu::Image>
26
+ Gosu::asyncNewImage(Window& window, const std::wstring& filename)
27
+ {
28
+ shared_ptr<try_mutex> mutex(new try_mutex);
29
+ shared_ptr<std::auto_ptr<Image> > image(new std::auto_ptr<Image>);
30
+ thread thread(bind(asyncNewImage_Impl,
31
+ ref(window),
32
+ filename,
33
+ window.createSharedContext(),
34
+ mutex,
35
+ image));
36
+ return AsyncResult<Image>(mutex, image);
37
+ }
@@ -0,0 +1,417 @@
1
+ #include <Gosu/Audio.hpp>
2
+ #include <Gosu/Math.hpp>
3
+ #include <Gosu/IO.hpp>
4
+ #include <Gosu/Utility.hpp>
5
+ #include <boost/algorithm/string.hpp>
6
+ #include <cassert>
7
+ #include <cstdlib>
8
+ #include <algorithm>
9
+ #include <stdexcept>
10
+ #include <vector>
11
+
12
+ #include <fmod.h>
13
+ #include <fmod_errors.h>
14
+
15
+ namespace Gosu
16
+ {
17
+ namespace
18
+ {
19
+ GOSU_NORETURN void throwLastFMODError()
20
+ {
21
+ throw std::runtime_error(FMOD_ErrorString(FSOUND_GetError()));
22
+ }
23
+
24
+ inline unsigned char fmodCheck(unsigned char retVal)
25
+ {
26
+ if (retVal == 0 && FSOUND_GetError() != FMOD_ERR_NONE)
27
+ throwLastFMODError();
28
+
29
+ return retVal;
30
+ }
31
+
32
+ bool fmodInitialized = false;
33
+ Song* curSong = 0;
34
+
35
+ #ifdef GOSU_IS_WIN
36
+ bool setWindow(HWND window)
37
+ {
38
+ // Copied and pasted from MSDN.
39
+ #define FACILITY_VISUALCPP ((LONG)0x6d)
40
+ #define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err)
41
+ #define BAD_MOD VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND)
42
+
43
+ // Try to call the first function from fmod.dll, which is lazily
44
+ // linked. With this guard, we can raise a catchable C++ exception
45
+ // if the library is not found, instead of crashing the game.
46
+ __try
47
+ {
48
+ FSOUND_SetHWND(reinterpret_cast<void*>(window));
49
+ }
50
+ __except ((GetExceptionCode() == BAD_MOD) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
51
+ {
52
+ return false;
53
+ }
54
+ return true;
55
+
56
+ #undef BAD_MOD
57
+ #undef VcppException
58
+ #undef FACILITY_VISUALCPP
59
+ }
60
+ #endif
61
+ }
62
+ }
63
+
64
+ #ifdef GOSU_IS_WIN
65
+ Gosu::Audio::Audio(HWND window)
66
+ {
67
+ if (!setWindow(window))
68
+ throw std::runtime_error("Could not load fmod.dll");
69
+ #else
70
+ Gosu::Audio::Audio()
71
+ {
72
+ #endif
73
+
74
+ if (fmodInitialized)
75
+ throw std::logic_error("Multiple Gosu::Audio instances not supported");
76
+
77
+ fmodCheck(FSOUND_Init(44100, 32, 0));
78
+ fmodInitialized = true;
79
+ }
80
+
81
+ Gosu::Audio::~Audio()
82
+ {
83
+ assert(fmodInitialized);
84
+
85
+ FSOUND_Close();
86
+ fmodInitialized = false;
87
+ }
88
+
89
+ Gosu::SampleInstance::SampleInstance(int handle, int extra)
90
+ : handle(handle), extra(extra)
91
+ {
92
+ }
93
+
94
+ bool Gosu::SampleInstance::playing() const
95
+ {
96
+ return FSOUND_IsPlaying(handle);
97
+ }
98
+
99
+ void Gosu::SampleInstance::stop()
100
+ {
101
+ FSOUND_StopSound(handle);
102
+ }
103
+
104
+ void Gosu::SampleInstance::changeVolume(double volume)
105
+ {
106
+ FSOUND_SetVolume(handle, clamp<int>(volume * 255, 0, 255));
107
+ }
108
+
109
+ void Gosu::SampleInstance::changePan(double pan)
110
+ {
111
+ FSOUND_SetPan(handle, clamp<int>(pan * 127 + 127, 0, 255));
112
+ }
113
+
114
+ void Gosu::SampleInstance::changeSpeed(double speed)
115
+ {
116
+ FSOUND_SetFrequency(handle, clamp<int>(speed * extra, 100, 705600));
117
+ }
118
+
119
+ struct Gosu::Sample::SampleData : boost::noncopyable
120
+ {
121
+ FSOUND_SAMPLE* rep;
122
+
123
+ SampleData()
124
+ : rep(0)
125
+ {
126
+ }
127
+
128
+ ~SampleData()
129
+ {
130
+ // Should be checked for earlier, as play would crash too.
131
+ // This is just because it's hard to free things in the right
132
+ // order in Ruby/Gosu.
133
+
134
+ if (!fmodInitialized)
135
+ return;
136
+
137
+ if (rep != 0)
138
+ FSOUND_Sample_Free(rep);
139
+ }
140
+ };
141
+
142
+ Gosu::Sample::Sample(Audio& audio, const std::wstring& filename)
143
+ {
144
+ Buffer buf;
145
+ loadFile(buf, filename);
146
+
147
+ // Forward.
148
+ Sample(audio, buf.frontReader()).data.swap(data);
149
+ }
150
+
151
+ Gosu::Sample::Sample(Audio& audio, Reader reader)
152
+ {
153
+ std::vector<char> buffer(reader.resource().size() - reader.position());
154
+ reader.read(&buffer.front(), buffer.size());
155
+
156
+ data.reset(new SampleData);
157
+ data->rep = FSOUND_Sample_Load(FSOUND_FREE | FSOUND_UNMANAGED,
158
+ &buffer.front(), FSOUND_NORMAL | FSOUND_LOADMEMORY, 0, buffer.size());
159
+ if (data->rep == 0)
160
+ throwLastFMODError();
161
+ }
162
+
163
+ Gosu::Sample::~Sample()
164
+ {
165
+ }
166
+
167
+ Gosu::SampleInstance Gosu::Sample::play(double volume, double speed) const
168
+ {
169
+ int handle = FSOUND_PlaySound(FSOUND_FREE, data->rep);
170
+ int freq;
171
+ if (handle > 0)
172
+ {
173
+ freq = FSOUND_GetFrequency(handle);
174
+ FSOUND_SetPan(handle, FSOUND_STEREOPAN);
175
+ }
176
+
177
+ SampleInstance result(handle, freq);
178
+ result.changeVolume(volume);
179
+ result.changeSpeed(speed);
180
+ return result;
181
+ }
182
+
183
+ Gosu::SampleInstance Gosu::Sample::playPan(double pan, double volume, double speed) const
184
+ {
185
+ int handle = FSOUND_PlaySound(FSOUND_FREE, data->rep);
186
+ int freq;
187
+ if (handle > 0)
188
+ {
189
+ freq = FSOUND_GetFrequency(handle);
190
+ }
191
+
192
+ SampleInstance result(handle, freq);
193
+ result.changeVolume(volume);
194
+ result.changePan(pan);
195
+ result.changeSpeed(speed);
196
+ return result;
197
+ }
198
+
199
+ class Gosu::Song::BaseData : boost::noncopyable
200
+ {
201
+ double volume_;
202
+
203
+ protected:
204
+ BaseData() : volume_(1) {}
205
+ virtual void applyVolume() = 0;
206
+
207
+ public:
208
+ virtual ~BaseData() {}
209
+
210
+ virtual void play() = 0;
211
+ virtual void stop() = 0;
212
+
213
+ double volume() const
214
+ {
215
+ return volume_;
216
+ }
217
+
218
+ void changeVolume(double volume)
219
+ {
220
+ volume_ = clamp(volume, 0.0, 1.0);
221
+ applyVolume();
222
+ }
223
+ };
224
+
225
+ class Gosu::Song::StreamData : public BaseData
226
+ {
227
+ FSOUND_STREAM* stream;
228
+ int handle;
229
+ std::vector<char> buffer;
230
+
231
+ static signed char F_CALLBACKAPI endSongCallback(FSOUND_STREAM*, void*,
232
+ int, void* self)
233
+ {
234
+ curSong = 0;
235
+ static_cast<StreamData*>(self)->handle = -1;
236
+ return 0;
237
+ }
238
+
239
+ public:
240
+ StreamData(Gosu::Reader reader)
241
+ : stream(0), handle(-1)
242
+ {
243
+ buffer.resize(reader.resource().size() - reader.position());
244
+ reader.read(&buffer[0], buffer.size());
245
+
246
+ // Disabled for licensing reasons.
247
+ // If you have a license to play MP3 files, compile with GOSU_ALLOW_MP3.
248
+ #ifndef GOSU_ALLOW_MP3
249
+ if (buffer.size() > 2 &&
250
+ ((buffer[0] == '\xff' && (buffer[1] & 0xfe) == '\xfa') ||
251
+ (buffer[0] == 'I' && buffer[1] == 'D' && buffer[2] == '3')))
252
+ {
253
+ throw std::runtime_error("MP3 file playback not allowed");
254
+ }
255
+ #endif
256
+
257
+ stream = FSOUND_Stream_Open(&buffer[0], FSOUND_LOADMEMORY, 0,
258
+ buffer.size());
259
+ if (stream == 0)
260
+ throwLastFMODError();
261
+
262
+ FSOUND_Stream_SetEndCallback(stream, endSongCallback, this);
263
+ }
264
+
265
+ ~StreamData()
266
+ {
267
+ // TODO: Should be checked for earlier, as play would crash too.
268
+ // This is just because Ruby's GC will free objects in a weird
269
+ // order.
270
+ if (!fmodInitialized)
271
+ return;
272
+
273
+ if (stream != 0)
274
+ FSOUND_Stream_Close(stream);
275
+ }
276
+
277
+ void play()
278
+ {
279
+ handle = FSOUND_Stream_Play(FSOUND_FREE, stream);
280
+ applyVolume();
281
+ }
282
+
283
+ void stop()
284
+ {
285
+ fmodCheck(FSOUND_Stream_Stop(stream));
286
+ }
287
+
288
+ void applyVolume()
289
+ {
290
+ if (handle != -1)
291
+ FSOUND_SetVolume(handle, static_cast<int>(volume() * 255));
292
+ }
293
+ };
294
+
295
+ class Gosu::Song::ModuleData : public Gosu::Song::BaseData
296
+ {
297
+ FMUSIC_MODULE* module_;
298
+
299
+ public:
300
+ ModuleData(Reader reader)
301
+ : module_(0)
302
+ {
303
+ std::vector<char> buffer(reader.resource().size() - reader.position());
304
+ reader.read(&buffer[0], buffer.size());
305
+
306
+ module_ = FMUSIC_LoadSongEx(&buffer[0], 0, buffer.size(),
307
+ FSOUND_LOADMEMORY | FSOUND_LOOP_OFF, 0, 0);
308
+ if (module_ == 0)
309
+ throwLastFMODError();
310
+ }
311
+
312
+ ~ModuleData()
313
+ {
314
+ // TODO: Should be checked for earlier, as play would crash too.
315
+ // This is just because Ruby's GC will free objects in a weird
316
+ // order.
317
+ if (!fmodInitialized)
318
+ return;
319
+
320
+ if (module_ != 0)
321
+ FMUSIC_FreeSong(module_);
322
+ }
323
+
324
+ void play()
325
+ {
326
+ FMUSIC_PlaySong(module_);
327
+ applyVolume();
328
+ }
329
+
330
+ void stop()
331
+ {
332
+ fmodCheck(FMUSIC_StopSong(module_));
333
+ }
334
+
335
+ void applyVolume()
336
+ {
337
+ // Weird as it may seem, the FMOD doc really says volume can
338
+ // be 0 to 256, *inclusive*, for this function.
339
+ FMUSIC_SetMasterVolume(module_, static_cast<int>(volume() * 256.0));
340
+ }
341
+ };
342
+
343
+ Gosu::Song::Song(Audio& audio, const std::wstring& filename)
344
+ {
345
+ Buffer buf;
346
+ loadFile(buf, filename);
347
+ Type type = stStream;
348
+
349
+ using boost::iends_with;
350
+ if (iends_with(filename, ".mod") || iends_with(filename, ".mid") ||
351
+ iends_with(filename, ".s3m") || iends_with(filename, ".it") ||
352
+ iends_with(filename, ".xm"))
353
+ {
354
+ type = stModule;
355
+ }
356
+
357
+ // Forward.
358
+ Song(audio, type, buf.frontReader()).data.swap(data);
359
+ }
360
+
361
+ Gosu::Song::Song(Audio& audio, Type type, Reader reader)
362
+ {
363
+ switch (type)
364
+ {
365
+ case stStream:
366
+ data.reset(new StreamData(reader));
367
+ break;
368
+
369
+ case stModule:
370
+ data.reset(new ModuleData(reader));
371
+ break;
372
+
373
+ default:
374
+ throw std::logic_error("Invalid song type");
375
+ }
376
+ }
377
+
378
+ Gosu::Song::~Song()
379
+ {
380
+ if (fmodInitialized)
381
+ stop();
382
+ }
383
+
384
+ void Gosu::Song::play()
385
+ {
386
+ if (curSong)
387
+ curSong->stop();
388
+
389
+ assert(curSong == 0);
390
+
391
+ data->play();
392
+ curSong = this;
393
+ }
394
+
395
+ void Gosu::Song::stop()
396
+ {
397
+ if (playing())
398
+ {
399
+ data->stop();
400
+ curSong = 0;
401
+ }
402
+ }
403
+
404
+ bool Gosu::Song::playing() const
405
+ {
406
+ return curSong == this;
407
+ }
408
+
409
+ double Gosu::Song::volume() const
410
+ {
411
+ return data->volume();
412
+ }
413
+
414
+ void Gosu::Song::changeVolume(double volume)
415
+ {
416
+ data->changeVolume(volume);
417
+ }