gosu 0.7.10.1

Sign up to get free protection for your applications and to get access to all the features.
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,34 @@
1
+ #ifndef GOSUIMPL_BLOCKALLOCATOR_HPP
2
+ #define GOSUIMPL_BLOCKALLOCATOR_HPP
3
+
4
+ #include <boost/optional.hpp>
5
+ #include <boost/scoped_ptr.hpp>
6
+
7
+ namespace Gosu
8
+ {
9
+ class BlockAllocator
10
+ {
11
+ struct Impl;
12
+ boost::scoped_ptr<Impl> pimpl;
13
+
14
+ public:
15
+ struct Block
16
+ {
17
+ unsigned left, top, width, height;
18
+ Block() {}
19
+ Block(unsigned aLeft, unsigned aTop, unsigned aWidth, unsigned aHeight)
20
+ : left(aLeft), top(aTop), width(aWidth), height(aHeight) {}
21
+ };
22
+
23
+ BlockAllocator(unsigned width, unsigned height);
24
+ ~BlockAllocator();
25
+
26
+ unsigned width() const;
27
+ unsigned height() const;
28
+
29
+ boost::optional<Block> alloc(unsigned width, unsigned height);
30
+ void free(unsigned left, unsigned top);
31
+ };
32
+ }
33
+
34
+ #endif
@@ -0,0 +1,126 @@
1
+ #include <Gosu/Color.hpp>
2
+ #include <Gosu/Math.hpp>
3
+ #include <algorithm>
4
+
5
+ namespace
6
+ {
7
+ struct HSV { double h, s, v; };
8
+
9
+ HSV colorToHSV(const Gosu::Color& c)
10
+ {
11
+ double r = c.red() / 255.0;
12
+ double g = c.green() / 255.0;
13
+ double b = c.blue() / 255.0;
14
+
15
+ double min = std::min(std::min(r, g), b);
16
+ double max = std::max(std::max(r, g), b);
17
+
18
+ if (max == 0)
19
+ {
20
+ HSV hsv = { 0, 0, 0 };
21
+ return hsv;
22
+ }
23
+
24
+ // Value.
25
+ HSV hsv = { -1, -1, max };
26
+
27
+ // Saturation.
28
+ double delta = max - min;
29
+ hsv.s = delta / max;
30
+
31
+ // Hue.
32
+ if (r == max)
33
+ hsv.h = (g - b) / delta + (g < b ? 6 : 0);
34
+ else if (g == max)
35
+ hsv.h = (b - r) / delta + 2;
36
+ else
37
+ hsv.h = (r - g) / delta + 4;
38
+ hsv.h *= 60;
39
+
40
+ return hsv;
41
+ }
42
+ }
43
+
44
+ Gosu::Color Gosu::Color::fromHSV(double h, double s, double v)
45
+ {
46
+ return fromAHSV(255, h, s, v);
47
+ }
48
+
49
+ Gosu::Color Gosu::Color::fromAHSV(Channel alpha, double h, double s, double v)
50
+ {
51
+ if (s == 0)
52
+ // Grey.
53
+ return Color(alpha, v * 255, v * 255, v * 255);
54
+
55
+ // Normalize hue
56
+ h = ((static_cast<int>(h) % 360) + 360) % 360;
57
+
58
+ int sector = h / 60;
59
+ double factorial = h / 60 - sector;
60
+
61
+ double p = v * (1 - s);
62
+ double q = v * (1 - s * factorial);
63
+ double t = v * (1 - s * (1 - factorial));
64
+
65
+ switch (sector)
66
+ {
67
+ case 0:
68
+ return Color(alpha, v * 255, t * 255, p * 255);
69
+ case 1:
70
+ return Color(alpha, q * 255, v * 255, p * 255);
71
+ case 2:
72
+ return Color(alpha, p * 255, v * 255, t * 255);
73
+ case 3:
74
+ return Color(alpha, p * 255, q * 255, v * 255);
75
+ case 4:
76
+ return Color(alpha, t * 255, p * 255, v * 255);
77
+ default: // sector 5
78
+ return Color(alpha, v * 255, p * 255, q * 255);
79
+ }
80
+ }
81
+
82
+ double Gosu::Color::hue() const
83
+ {
84
+ return colorToHSV(*this).h;
85
+ }
86
+
87
+ void Gosu::Color::setHue(double h)
88
+ {
89
+ *this = fromAHSV(alpha(), h, saturation(), value());
90
+ }
91
+
92
+ double Gosu::Color::saturation() const
93
+ {
94
+ return colorToHSV(*this).s;
95
+ }
96
+
97
+ void Gosu::Color::setSaturation(double s)
98
+ {
99
+ *this = fromAHSV(alpha(), hue(), s, value());
100
+ }
101
+
102
+ double Gosu::Color::value() const
103
+ {
104
+ return colorToHSV(*this).v;
105
+ }
106
+
107
+ void Gosu::Color::setValue(double v)
108
+ {
109
+ *this = fromAHSV(alpha(), hue(), saturation(), v);
110
+ }
111
+
112
+ Gosu::Color Gosu::interpolate(Color a, Color b, double weight)
113
+ {
114
+ return Color(clamp<int>(round(Gosu::interpolate(a.alpha(), b.alpha(), weight)), 0, 255),
115
+ clamp<int>(round(Gosu::interpolate(a.red(), b.red(), weight)), 0, 255),
116
+ clamp<int>(round(Gosu::interpolate(a.green(), b.green(), weight)), 0, 255),
117
+ clamp<int>(round(Gosu::interpolate(a.blue(), b.blue(), weight)), 0, 255));
118
+ }
119
+
120
+ Gosu::Color Gosu::multiply(Color a, Color b)
121
+ {
122
+ return Color(round(a.alpha() * b.alpha() / 255.0),
123
+ round(a.red() * b.red() / 255.0),
124
+ round(a.green() * b.green() / 255.0),
125
+ round(a.blue() * b.blue() / 255.0));
126
+ }
@@ -0,0 +1,21 @@
1
+ #ifndef GOSUIMPL_GRAPHICS_COMMON_HPP
2
+ #define GOSUIMPL_GRAPHICS_COMMON_HPP
3
+
4
+ #ifdef WIN32
5
+ #include <windows.h>
6
+ #endif
7
+ #ifdef __APPLE__
8
+ #include <OpenGL/gl.h>
9
+ #else
10
+ #include <GL/gl.h>
11
+ #endif
12
+
13
+ namespace Gosu
14
+ {
15
+ class Texture;
16
+ class TexChunk;
17
+ struct DrawOp;
18
+ class DrawOpQueue;
19
+ }
20
+
21
+ #endif
@@ -0,0 +1,154 @@
1
+ #ifndef GOSUIMPL_DRAWOP_HPP
2
+ #define GOSUIMPL_DRAWOP_HPP
3
+
4
+ #include <Gosu/GraphicsBase.hpp>
5
+ #include <Gosu/Color.hpp>
6
+ #include <GosuImpl/Graphics/Common.hpp>
7
+ #include <GosuImpl/Graphics/TexChunk.hpp>
8
+ #include <set>
9
+
10
+ namespace Gosu
11
+ {
12
+ struct DrawOp
13
+ {
14
+ int clipX, clipY;
15
+ unsigned clipWidth, clipHeight;
16
+
17
+ struct Vertex
18
+ {
19
+ double x, y;
20
+ Color c;
21
+ Vertex() {}
22
+ Vertex(double x, double y, Color c) : x(x), y(y), c(c) {}
23
+ };
24
+
25
+ ZPos z;
26
+ Vertex vertices[4];
27
+ unsigned usedVertices;
28
+ const TexChunk* chunk;
29
+ AlphaMode mode;
30
+
31
+ DrawOp() { clipWidth = 0xffffffff; usedVertices = 0; chunk = 0; }
32
+
33
+ void perform() const
34
+ {
35
+ if (clipWidth != 0xffffffff)
36
+ {
37
+ glEnable(GL_SCISSOR_TEST);
38
+ glScissor(clipX, clipY, clipWidth, clipHeight);
39
+ }
40
+
41
+ if (mode == amAdditive)
42
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
43
+ else
44
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
45
+
46
+ if (chunk)
47
+ {
48
+ glEnable(GL_TEXTURE_2D);
49
+ glBindTexture(GL_TEXTURE_2D, chunk->texName());
50
+ }
51
+
52
+ if (usedVertices == 2)
53
+ glBegin(GL_LINES);
54
+ else if (usedVertices == 3)
55
+ glBegin(GL_TRIANGLES);
56
+ else if (usedVertices == 4)
57
+ glBegin(GL_QUADS);
58
+
59
+ double left, top, right, bottom;
60
+ if (chunk)
61
+ chunk->getCoords(left, top, right, bottom);
62
+
63
+ for (unsigned i = 0; i < usedVertices; i++)
64
+ {
65
+ glColor4f(vertices[i].c.red() / 255.0, vertices[i].c.green() / 255.0,
66
+ vertices[i].c.blue() / 255.0, vertices[i].c.alpha() / 255.0);
67
+ if (chunk)
68
+ switch (i)
69
+ {
70
+ case 0:
71
+ glTexCoord2d(left, top);
72
+ break;
73
+ case 1:
74
+ glTexCoord2d(right, top);
75
+ break;
76
+ case 2:
77
+ glTexCoord2d(right, bottom);
78
+ break;
79
+ case 3:
80
+ glTexCoord2d(left, bottom);
81
+ break;
82
+ }
83
+ glVertex2d(vertices[i].x, vertices[i].y);
84
+ }
85
+
86
+ glEnd();
87
+
88
+ if (chunk)
89
+ glDisable(GL_TEXTURE_2D);
90
+
91
+ if (clipWidth != 0xffffffff)
92
+ glDisable(GL_SCISSOR_TEST);
93
+ }
94
+
95
+ bool operator<(const DrawOp& other) const
96
+ {
97
+ return z < other.z; // optimization starts TODAY
98
+ }
99
+ };
100
+
101
+ class DrawOpQueue
102
+ {
103
+ int clipX, clipY;
104
+ unsigned clipWidth, clipHeight;
105
+ std::multiset<DrawOp> set;
106
+
107
+ public:
108
+ DrawOpQueue()
109
+ : clipWidth(0xffffffff)
110
+ {
111
+ }
112
+
113
+ void addDrawOp(DrawOp op, ZPos z)
114
+ {
115
+ op.z = z;
116
+ if (clipWidth != 0xffffffff)
117
+ {
118
+ op.clipX = clipX;
119
+ op.clipY = clipY;
120
+ op.clipWidth = clipWidth;
121
+ op.clipHeight = clipHeight;
122
+ }
123
+ set.insert(op);
124
+ }
125
+
126
+ void beginClipping(int x, int y, unsigned width, unsigned height)
127
+ {
128
+ clipX = x;
129
+ clipY = y;
130
+ clipWidth = width;
131
+ clipHeight = height;
132
+ }
133
+
134
+ void endClipping()
135
+ {
136
+ clipWidth = 0xffffffff;
137
+ }
138
+
139
+ void performDrawOps()
140
+ {
141
+ std::multiset<DrawOp>::iterator cur = set.begin(), end = set.end();
142
+ while (cur != end)
143
+ {
144
+ cur->perform();
145
+ ++cur;
146
+ }
147
+ set.clear();
148
+ }
149
+ };
150
+ }
151
+
152
+ #endif
153
+
154
+
@@ -0,0 +1,110 @@
1
+ #include <Gosu/Font.hpp>
2
+ #include <Gosu/Graphics.hpp>
3
+ #include <Gosu/Image.hpp>
4
+ #include <Gosu/Math.hpp>
5
+ #include <Gosu/Text.hpp>
6
+ #include <boost/array.hpp>
7
+ using namespace std;
8
+
9
+ struct Gosu::Font::Impl
10
+ {
11
+ Graphics* graphics;
12
+ wstring fontName;
13
+ unsigned height;
14
+
15
+ // Chunk of 2^16 characters (on Windows, there'll only be one of them).
16
+ // IMPR: I couldn't find a way to determine the size of wchar_t at compile
17
+ // time, so I can't get rid of the magic numbers or even do some #ifdef
18
+ // magic.
19
+ typedef boost::array<boost::scoped_ptr<Image>, 65536> CharChunk;
20
+ boost::scoped_ptr<CharChunk> chunks[65536];
21
+
22
+ Image& getChar(wchar_t wc)
23
+ {
24
+ size_t chunkIndex = wc / 65536;
25
+ size_t charIndex = wc % 65536;
26
+
27
+ if (!chunks[chunkIndex])
28
+ chunks[chunkIndex].reset(new CharChunk);
29
+
30
+ boost::scoped_ptr<Image>& imgPtr = (*chunks[chunkIndex])[charIndex];
31
+
32
+ if (imgPtr)
33
+ return *imgPtr;
34
+
35
+ wstring charString(1, wc);
36
+ unsigned charWidth = Gosu::textWidth(charString, fontName, height, ffBold);
37
+ Bitmap bmp;
38
+ bmp.resize(charWidth, height);
39
+
40
+ drawText(bmp, charString, 0, 0, Colors::white, fontName, height, ffBold);
41
+ imgPtr.reset(new Image(*graphics, bmp));
42
+ return *imgPtr;
43
+ }
44
+ };
45
+
46
+ Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned height)
47
+ : pimpl(new Impl)
48
+ {
49
+ pimpl->graphics = &graphics;
50
+ pimpl->fontName = fontName;
51
+ pimpl->height = height * 2; // Auto-AA!
52
+ }
53
+
54
+ Gosu::Font::~Font()
55
+ {
56
+ }
57
+
58
+ unsigned Gosu::Font::height() const
59
+ {
60
+ return pimpl->height / 2;
61
+ }
62
+
63
+ double Gosu::Font::textWidth(const std::wstring& text, double factorX) const
64
+ {
65
+ double result = 0;
66
+ for (unsigned i = 0; i < text.length(); ++i)
67
+ result += pimpl->getChar(text[i]).width();
68
+ return result * factorX / 2;
69
+ }
70
+
71
+ void Gosu::Font::draw(const wstring& text, double x, double y, ZPos z,
72
+ double factorX, double factorY, Color c, AlphaMode mode) const
73
+ {
74
+ factorX /= 2;
75
+ factorY /= 2;
76
+
77
+ for (unsigned i = 0; i < text.length(); ++i)
78
+ {
79
+ Image& curChar = pimpl->getChar(text[i]);
80
+ curChar.draw(x, y, z, factorX, factorY, c, mode);
81
+ x += curChar.width() * factorX;
82
+ }
83
+ }
84
+
85
+ void Gosu::Font::drawRel(const wstring& text, double x, double y, ZPos z,
86
+ double relX, double relY, double factorX, double factorY, Color c,
87
+ AlphaMode mode) const
88
+ {
89
+ x -= textWidth(text) * factorX * relX;
90
+ y -= height() * factorY * relY;
91
+
92
+ draw(text, x, y, z, factorX, factorY, c, mode);
93
+ }
94
+
95
+ void Gosu::Font::drawRot(const wstring& text, double x, double y, ZPos z, double angle,
96
+ double factorX, double factorY, Color c, AlphaMode mode) const
97
+ {
98
+ factorX /= 2;
99
+ factorY /= 2;
100
+
101
+ double stepX = offsetX(angle + 90, 1.0), stepY = offsetY(angle + 90, 1.0);
102
+
103
+ for (unsigned i = 0; i < text.length(); ++i)
104
+ {
105
+ Image& curChar = pimpl->getChar(text[i]);
106
+ curChar.drawRot(x, y, z, angle, 0.0, 0.0, factorX, factorY, c, mode);
107
+ x += curChar.width() * factorX * stepX;
108
+ y += curChar.width() * factorX * stepY;
109
+ }
110
+ }