gosu 0.7.33 → 0.7.35
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.
- data/Gosu/Async.hpp +10 -8
- data/Gosu/Audio.hpp +6 -4
- data/Gosu/AutoLink.hpp +0 -0
- data/Gosu/Bitmap.hpp +4 -5
- data/Gosu/ButtonsX.hpp +1 -1
- data/Gosu/Color.hpp +8 -8
- data/Gosu/Font.hpp +2 -2
- data/Gosu/Graphics.hpp +4 -6
- data/Gosu/IO.hpp +11 -4
- data/Gosu/Image.hpp +9 -7
- data/Gosu/ImageData.hpp +10 -4
- data/Gosu/Input.hpp +4 -5
- data/Gosu/Sockets.hpp +10 -12
- data/Gosu/TR1.hpp +44 -0
- data/Gosu/TextInput.hpp +2 -2
- data/Gosu/Version.hpp +2 -2
- data/Gosu/WinUtility.hpp +5 -6
- data/Gosu/Window.hpp +5 -6
- data/GosuImpl/Async.cpp +4 -3
- data/GosuImpl/Audio/ALChannelManagement.hpp +23 -11
- data/GosuImpl/Audio/AudioFile.hpp +11 -3
- data/GosuImpl/Audio/AudioOpenAL.cpp +613 -0
- data/GosuImpl/Audio/AudioOpenAL.mm +1 -605
- data/GosuImpl/Audio/AudioSDL.cpp +12 -14
- data/GosuImpl/Audio/AudioToolboxFile.hpp +0 -1
- data/GosuImpl/Audio/OggFile.hpp +2 -0
- data/GosuImpl/Audio/SndFile.hpp +158 -0
- data/GosuImpl/DirectoriesWin.cpp +18 -18
- data/GosuImpl/Graphics/BitmapApple.mm +17 -19
- data/GosuImpl/Graphics/BitmapBMP.cpp +7 -2
- data/GosuImpl/Graphics/BitmapFreeImage.cpp +11 -12
- data/GosuImpl/Graphics/BitmapGDIplus.cpp +35 -31
- data/GosuImpl/Graphics/BitmapUtils.cpp +1 -1
- data/GosuImpl/Graphics/BlockAllocator.cpp +7 -8
- data/GosuImpl/Graphics/BlockAllocator.hpp +3 -4
- data/GosuImpl/Graphics/Common.hpp +3 -2
- data/GosuImpl/Graphics/DrawOp.hpp +2 -3
- data/GosuImpl/Graphics/DrawOpQueue.hpp +28 -20
- data/GosuImpl/Graphics/Font.cpp +13 -13
- data/GosuImpl/Graphics/FormattedString.hpp +93 -86
- data/GosuImpl/Graphics/Graphics.cpp +16 -14
- data/GosuImpl/Graphics/Image.cpp +7 -3
- data/GosuImpl/Graphics/LargeImageData.hpp +4 -5
- data/GosuImpl/Graphics/Macro.hpp +11 -11
- data/GosuImpl/Graphics/RenderState.hpp +5 -4
- data/GosuImpl/Graphics/TexChunk.cpp +3 -3
- data/GosuImpl/Graphics/TexChunk.hpp +4 -4
- data/GosuImpl/Graphics/Text.cpp +29 -30
- data/GosuImpl/Graphics/TextMac.cpp +9 -7
- data/GosuImpl/Graphics/TextTTFWin.cpp +3 -1
- data/GosuImpl/Graphics/TextTouch.mm +0 -1
- data/GosuImpl/Graphics/TextUnix.cpp +12 -4
- data/GosuImpl/Graphics/TextWin.cpp +4 -2
- data/GosuImpl/Graphics/Texture.cpp +7 -6
- data/GosuImpl/Graphics/Texture.hpp +3 -4
- data/GosuImpl/InputMac.mm +12 -15
- data/GosuImpl/InputTouch.mm +3 -3
- data/GosuImpl/InputWin.cpp +149 -159
- data/GosuImpl/InputX.cpp +0 -0
- data/GosuImpl/MacUtility.hpp +9 -4
- data/GosuImpl/RubyGosu.swg +38 -43
- data/GosuImpl/RubyGosu_wrap.cxx +89 -96
- data/GosuImpl/Sockets/CommSocket.cpp +5 -5
- data/GosuImpl/Sockets/Sockets.hpp +4 -4
- data/GosuImpl/TimingApple.cpp +2 -3
- data/GosuImpl/Utility.cpp +18 -0
- data/GosuImpl/WinMain.cpp +0 -1
- data/GosuImpl/WinUtility.cpp +2 -2
- data/GosuImpl/WindowMac.mm +20 -17
- data/GosuImpl/WindowTouch.mm +8 -7
- data/GosuImpl/WindowWin.cpp +12 -7
- data/GosuImpl/WindowX.cpp +67 -18
- data/lib/gosu.rb +14 -12
- data/linux/extconf.rb +11 -6
- metadata +8 -7
- data/GosuImpl/Audio/AudioAudiere.cpp +0 -448
- data/GosuImpl/RubyGosu_DllMain.cxx +0 -31
@@ -2,16 +2,21 @@
|
|
2
2
|
#include <Gosu/Bitmap.hpp>
|
3
3
|
#include <Gosu/IO.hpp>
|
4
4
|
#include <Gosu/Platform.hpp>
|
5
|
+
#include <Gosu/TR1.hpp>
|
5
6
|
#include <Gosu/Utility.hpp>
|
6
7
|
#include <Gosu/WinUtility.hpp>
|
7
|
-
#include <
|
8
|
-
#include <boost/algorithm/string.hpp>
|
8
|
+
#include <cwctype>
|
9
9
|
#include <map>
|
10
10
|
|
11
11
|
#include <objidl.h>
|
12
12
|
#include <gdiplus.h>
|
13
13
|
#include <windows.h>
|
14
14
|
|
15
|
+
using namespace std;
|
16
|
+
|
17
|
+
// TODO: Move into proper internal header
|
18
|
+
namespace Gosu { bool isExtension(const wchar_t* str, const wchar_t* ext); }
|
19
|
+
|
15
20
|
namespace
|
16
21
|
{
|
17
22
|
bool initialized = false;
|
@@ -23,7 +28,7 @@ namespace
|
|
23
28
|
{
|
24
29
|
// Since GDI+ only supports ARGB=BGRA formats, we
|
25
30
|
// manually exchange the R and B channels to get to ABGR=RGBA.
|
26
|
-
|
31
|
+
std::tr1::uint32_t* p = reinterpret_cast<std::tr1::uint32_t*>(bitmap.data());
|
27
32
|
for (int i = bitmap.width() * bitmap.height(); i > 0; --i, ++p)
|
28
33
|
*p = (*p & 0xff00ff00) | ((*p << 16) & 0x00ff0000) | ((*p >> 16) & 0x000000ff);
|
29
34
|
}
|
@@ -31,7 +36,7 @@ namespace
|
|
31
36
|
void check(Gdiplus::Status status, const char* action)
|
32
37
|
{
|
33
38
|
if (status != Gdiplus::Ok)
|
34
|
-
throw
|
39
|
+
throw runtime_error(string("A GDI+ error occured while ") + action);
|
35
40
|
}
|
36
41
|
|
37
42
|
void closeGDIplus()
|
@@ -48,9 +53,8 @@ namespace
|
|
48
53
|
atexit(closeGDIplus);
|
49
54
|
}
|
50
55
|
|
51
|
-
Gosu::Bitmap
|
56
|
+
void gdiPlusToGosu(Gosu::Bitmap& result, Gdiplus::Bitmap& bitmap)
|
52
57
|
{
|
53
|
-
Gosu::Bitmap result;
|
54
58
|
result.resize(bitmap.GetWidth(), bitmap.GetHeight());
|
55
59
|
|
56
60
|
GUID guid;
|
@@ -79,11 +83,9 @@ namespace
|
|
79
83
|
|
80
84
|
if (guid == Gdiplus::ImageFormatBMP)
|
81
85
|
applyColorKey(result, Gosu::Color::FUCHSIA);
|
82
|
-
|
83
|
-
return result;
|
84
86
|
}
|
85
87
|
|
86
|
-
|
88
|
+
tr1::shared_ptr<IStream> readToIStream(Gosu::Reader reader)
|
87
89
|
{
|
88
90
|
unsigned remaining = reader.resource().size() - reader.position();
|
89
91
|
HGLOBAL buffer = ::GlobalAlloc(GMEM_MOVEABLE, remaining);
|
@@ -100,14 +102,14 @@ namespace
|
|
100
102
|
if (::CreateStreamOnHGlobal(buffer, TRUE, &stream) != S_OK)
|
101
103
|
{
|
102
104
|
::GlobalFree(buffer);
|
103
|
-
throw
|
105
|
+
throw runtime_error("Could not create IStream");
|
104
106
|
}
|
105
107
|
return Gosu::Win::shareComPtr(stream);
|
106
108
|
}
|
107
109
|
|
108
|
-
CLSID& encoderFromMimeType(const
|
110
|
+
CLSID& encoderFromMimeType(const wstring& mimeType)
|
109
111
|
{
|
110
|
-
static
|
112
|
+
static map<wstring, CLSID> cache;
|
111
113
|
if (cache.count(mimeType))
|
112
114
|
return cache[mimeType];
|
113
115
|
|
@@ -115,25 +117,27 @@ namespace
|
|
115
117
|
check(Gdiplus::GetImageEncodersSize(&num, &size), "counting encoders");
|
116
118
|
// Do the eleet int-based ceil(size / sizeof)
|
117
119
|
unsigned vecSize = (size + sizeof(Gdiplus::ImageCodecInfo) - 1) / sizeof(Gdiplus::ImageCodecInfo);
|
118
|
-
|
120
|
+
vector<Gdiplus::ImageCodecInfo> codecs(vecSize);
|
119
121
|
check(Gdiplus::GetImageEncoders(num, size,
|
120
122
|
&codecs[0]), "enumerating encoders");
|
121
123
|
for (int i = 0; i < num; ++i)
|
122
124
|
if (codecs[i].MimeType == mimeType)
|
123
125
|
return cache[mimeType] = codecs[i].Clsid;
|
124
|
-
throw
|
126
|
+
throw runtime_error("No encoder found for " + Gosu::wstringToUTF8(mimeType));
|
125
127
|
}
|
126
128
|
|
127
|
-
CLSID encoderFromHint(const
|
129
|
+
CLSID encoderFromHint(const wstring& formatHint)
|
128
130
|
{
|
129
|
-
|
130
|
-
|
131
|
-
if (idx ==
|
131
|
+
wstring::size_type idx = formatHint.rfind('.');
|
132
|
+
wstring mimeType = L"image/";
|
133
|
+
if (idx == wstring::npos)
|
132
134
|
mimeType += formatHint;
|
133
135
|
else
|
134
136
|
mimeType += formatHint.substr(idx + 1);
|
135
|
-
|
136
|
-
|
137
|
+
|
138
|
+
for (int i = 0; i < mimeType.size(); ++i)
|
139
|
+
mimeType[i] = towlower((wint_t)mimeType[i]);
|
140
|
+
|
137
141
|
// Fix pitfalls
|
138
142
|
if (mimeType == L"image/jpg")
|
139
143
|
mimeType = L"image/jpeg";
|
@@ -144,31 +148,31 @@ namespace
|
|
144
148
|
}
|
145
149
|
}
|
146
150
|
|
147
|
-
|
151
|
+
void Gosu::loadImageFile(Gosu::Bitmap& result, const wstring& filename)
|
148
152
|
{
|
149
153
|
requireGDIplus();
|
150
154
|
|
151
155
|
Gdiplus::Bitmap bitmap(filename.c_str());
|
152
156
|
check(bitmap.GetLastStatus(), ("loading " + wstringToUTF8(filename)).c_str());
|
153
|
-
|
157
|
+
gdiPlusToGosu(result, bitmap);
|
154
158
|
}
|
155
159
|
|
156
|
-
|
160
|
+
void Gosu::loadImageFile(Gosu::Bitmap& result, Reader reader)
|
157
161
|
{
|
158
162
|
requireGDIplus();
|
159
163
|
|
160
|
-
|
164
|
+
tr1::shared_ptr<IStream> stream = readToIStream(reader);
|
161
165
|
Gdiplus::Bitmap bitmap(stream.get());
|
162
166
|
check(bitmap.GetLastStatus(), "loading a bitmap from memory");
|
163
|
-
|
167
|
+
gdiPlusToGosu(result, bitmap);
|
164
168
|
}
|
165
169
|
|
166
|
-
void Gosu::saveImageFile(const Bitmap& bitmap, const
|
170
|
+
void Gosu::saveImageFile(const Bitmap& bitmap, const wstring& filename)
|
167
171
|
{
|
168
172
|
requireGDIplus();
|
169
173
|
|
170
174
|
Bitmap input = bitmap;
|
171
|
-
if (
|
175
|
+
if (isExtension(filename.c_str(), L".bmp"))
|
172
176
|
unapplyColorKey(input, Color::FUCHSIA);
|
173
177
|
reshuffleBitmap(input);
|
174
178
|
Gdiplus::Bitmap output(input.width(), input.height(), input.width() * 4,
|
@@ -179,12 +183,12 @@ void Gosu::saveImageFile(const Bitmap& bitmap, const std::wstring& filename)
|
|
179
183
|
("writing to " + wstringToUTF8(filename)).c_str());
|
180
184
|
}
|
181
185
|
|
182
|
-
void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const
|
186
|
+
void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const wstring& formatHint)
|
183
187
|
{
|
184
188
|
requireGDIplus();
|
185
189
|
|
186
190
|
Bitmap input = bitmap;
|
187
|
-
if (
|
191
|
+
if (isExtension(formatHint.c_str(), L".bmp"))
|
188
192
|
unapplyColorKey(input, Color::FUCHSIA);
|
189
193
|
reshuffleBitmap(input);
|
190
194
|
Gdiplus::Bitmap output(input.width(), input.height(), input.width() * 4,
|
@@ -193,8 +197,8 @@ void Gosu::saveImageFile(const Bitmap& bitmap, Writer writer, const std::wstring
|
|
193
197
|
|
194
198
|
IStream* stream = NULL;
|
195
199
|
if (CreateStreamOnHGlobal(0, TRUE, &stream) != S_OK)
|
196
|
-
throw
|
197
|
-
|
200
|
+
throw runtime_error("Could not create IStream for writing");
|
201
|
+
tr1::shared_ptr<IStream> streamGuard(Gosu::Win::shareComPtr(stream));
|
198
202
|
check(output.Save(stream, &encoderFromHint(formatHint)),
|
199
203
|
"saving a bitmap to memory");
|
200
204
|
|
@@ -72,24 +72,23 @@ unsigned Gosu::BlockAllocator::height() const
|
|
72
72
|
return pimpl->height;
|
73
73
|
}
|
74
74
|
|
75
|
-
|
76
|
-
Gosu::BlockAllocator::alloc(unsigned aWidth, unsigned aHeight)
|
75
|
+
bool Gosu::BlockAllocator::alloc(unsigned aWidth, unsigned aHeight, Block& b)
|
77
76
|
{
|
78
77
|
// The rect wouldn't even fit onto the texture!
|
79
78
|
if (aWidth > width() || aHeight > height())
|
80
|
-
return
|
79
|
+
return false;
|
81
80
|
|
82
81
|
// We know there's no space left.
|
83
82
|
if (aWidth > pimpl->maxW && aHeight > pimpl->maxH)
|
84
|
-
return
|
83
|
+
return false;
|
85
84
|
|
86
85
|
// Start to look for a place next to the last returned rect. Chances are
|
87
86
|
// good we'll find a place there.
|
88
|
-
|
87
|
+
b = Block(pimpl->firstX, pimpl->firstY, aWidth, aHeight);
|
89
88
|
if (pimpl->isBlockFree(b))
|
90
89
|
{
|
91
90
|
pimpl->markBlockUsed(b, aWidth, aHeight);
|
92
|
-
return
|
91
|
+
return true;
|
93
92
|
}
|
94
93
|
|
95
94
|
// Brute force: Look for a free place on this texture.
|
@@ -110,13 +109,13 @@ boost::optional<Gosu::BlockAllocator::Block>
|
|
110
109
|
--x;
|
111
110
|
|
112
111
|
pimpl->markBlockUsed(b, aWidth, aHeight);
|
113
|
-
return
|
112
|
+
return true;
|
114
113
|
}
|
115
114
|
|
116
115
|
// So there was no space for the bitmap. Remember this for later.
|
117
116
|
pimpl->maxW = aWidth - 1;
|
118
117
|
pimpl->maxH = aHeight - 1;
|
119
|
-
return
|
118
|
+
return false;
|
120
119
|
}
|
121
120
|
|
122
121
|
void Gosu::BlockAllocator::free(unsigned left, unsigned top)
|
@@ -1,15 +1,14 @@
|
|
1
1
|
#ifndef GOSUIMPL_BLOCKALLOCATOR_HPP
|
2
2
|
#define GOSUIMPL_BLOCKALLOCATOR_HPP
|
3
3
|
|
4
|
-
#include <
|
5
|
-
#include <boost/scoped_ptr.hpp>
|
4
|
+
#include <memory>
|
6
5
|
|
7
6
|
namespace Gosu
|
8
7
|
{
|
9
8
|
class BlockAllocator
|
10
9
|
{
|
11
10
|
struct Impl;
|
12
|
-
|
11
|
+
const std::auto_ptr<Impl> pimpl;
|
13
12
|
|
14
13
|
public:
|
15
14
|
struct Block
|
@@ -26,7 +25,7 @@ namespace Gosu
|
|
26
25
|
unsigned width() const;
|
27
26
|
unsigned height() const;
|
28
27
|
|
29
|
-
|
28
|
+
bool alloc(unsigned width, unsigned height, Block& block);
|
30
29
|
void free(unsigned left, unsigned top);
|
31
30
|
};
|
32
31
|
}
|
@@ -61,10 +61,11 @@ namespace Gosu
|
|
61
61
|
inline Transform multiply(const Transform& left, const Transform& right)
|
62
62
|
{
|
63
63
|
Gosu::Transform result;
|
64
|
-
|
65
|
-
|
64
|
+
for (int i = 0; i < 16; ++i) {
|
65
|
+
result[i] = 0;
|
66
66
|
for (int j = 0; j < 4; ++j)
|
67
67
|
result[i] += left[i / 4 * 4 + j] * right[i % 4 + j * 4];
|
68
|
+
}
|
68
69
|
return result;
|
69
70
|
}
|
70
71
|
|
@@ -6,14 +6,13 @@
|
|
6
6
|
#include <GosuImpl/Graphics/Common.hpp>
|
7
7
|
#include <GosuImpl/Graphics/TexChunk.hpp>
|
8
8
|
#include <GosuImpl/Graphics/RenderState.hpp>
|
9
|
-
#include <boost/cstdint.hpp>
|
10
9
|
|
11
10
|
namespace Gosu
|
12
11
|
{
|
13
12
|
struct ArrayVertex
|
14
13
|
{
|
15
14
|
float texCoords[2];
|
16
|
-
|
15
|
+
unsigned color;
|
17
16
|
float vertices[3];
|
18
17
|
};
|
19
18
|
typedef std::vector<ArrayVertex> VertexArray;
|
@@ -52,7 +51,7 @@ namespace Gosu
|
|
52
51
|
static int spriteCounter = 0;
|
53
52
|
static float spriteVertices[12 * MAX_AUTOGROUP];
|
54
53
|
static float spriteTexcoords[12 * MAX_AUTOGROUP];
|
55
|
-
static
|
54
|
+
static unsigned spriteColors[6 * MAX_AUTOGROUP];
|
56
55
|
|
57
56
|
// iPhone specific setup
|
58
57
|
static bool isSetup = false;
|
@@ -1,11 +1,10 @@
|
|
1
1
|
#ifndef GOSUIMPL_GRAPHICS_DRAWOPQUEUE_HPP
|
2
2
|
#define GOSUIMPL_GRAPHICS_DRAWOPQUEUE_HPP
|
3
3
|
|
4
|
+
#include <Gosu/TR1.hpp>
|
4
5
|
#include <GosuImpl/Graphics/Common.hpp>
|
5
6
|
#include <GosuImpl/Graphics/DrawOp.hpp>
|
6
|
-
#include <
|
7
|
-
#include <boost/function.hpp>
|
8
|
-
#include <boost/optional.hpp>
|
7
|
+
#include <cassert>
|
9
8
|
#include <algorithm>
|
10
9
|
#include <map>
|
11
10
|
#include <vector>
|
@@ -14,7 +13,7 @@ class Gosu::DrawOpQueue
|
|
14
13
|
{
|
15
14
|
typedef std::vector<DrawOp> DrawOps;
|
16
15
|
DrawOps ops;
|
17
|
-
typedef std::multimap<ZPos,
|
16
|
+
typedef std::multimap<ZPos, std::tr1::function<void()> > CodeMap;
|
18
17
|
CodeMap code;
|
19
18
|
|
20
19
|
struct ClipRect
|
@@ -23,15 +22,21 @@ class Gosu::DrawOpQueue
|
|
23
22
|
unsigned width, height;
|
24
23
|
};
|
25
24
|
std::vector<ClipRect> clipRectStack;
|
26
|
-
|
25
|
+
ClipRect effectiveRect;
|
26
|
+
bool haveEffectiveRect; // is effectiveRect valid?
|
27
|
+
|
27
28
|
void updateEffectiveRect()
|
28
29
|
{
|
29
30
|
if (clipRectStack.empty())
|
30
|
-
|
31
|
-
|
31
|
+
{
|
32
|
+
haveEffectiveRect = false;
|
33
|
+
return;
|
34
|
+
}
|
35
|
+
|
32
36
|
ClipRect result = { 0, 0, 0x7fffffff, 0x7fffffff };
|
33
|
-
|
37
|
+
for (int i = 0; i < clipRectStack.size(); ++i)
|
34
38
|
{
|
39
|
+
const ClipRect& rect = clipRectStack[i];
|
35
40
|
int right = std::min<int>(result.x + result.width, rect.x + rect.width);
|
36
41
|
int bottom = std::min<int>(result.y + result.height, rect.y + rect.height);
|
37
42
|
result.x = std::max<int>(result.x, rect.x);
|
@@ -39,7 +44,7 @@ class Gosu::DrawOpQueue
|
|
39
44
|
|
40
45
|
if (result.x >= right || result.y >= bottom)
|
41
46
|
{
|
42
|
-
|
47
|
+
haveEffectiveRect = false;
|
43
48
|
return;
|
44
49
|
}
|
45
50
|
|
@@ -51,14 +56,18 @@ class Gosu::DrawOpQueue
|
|
51
56
|
result.x *= fac, result.y *= fac, result.width *= fac, result.height *= fac;
|
52
57
|
|
53
58
|
effectiveRect = result;
|
59
|
+
haveEffectiveRect = true;
|
54
60
|
}
|
55
61
|
|
56
62
|
public:
|
63
|
+
DrawOpQueue() : haveEffectiveRect(false) {}
|
64
|
+
|
57
65
|
// I really wish I would trust ADL. :|
|
58
66
|
void swap(DrawOpQueue& other)
|
59
67
|
{
|
60
68
|
clipRectStack.swap(other.clipRectStack);
|
61
69
|
std::swap(effectiveRect, other.effectiveRect);
|
70
|
+
std::swap(haveEffectiveRect, other.haveEffectiveRect);
|
62
71
|
ops.swap(other.ops);
|
63
72
|
code.swap(other.code);
|
64
73
|
}
|
@@ -70,13 +79,12 @@ public:
|
|
70
79
|
assert (op.usedVertices == 4);
|
71
80
|
#endif
|
72
81
|
|
73
|
-
if (
|
82
|
+
if (haveEffectiveRect)
|
74
83
|
{
|
75
|
-
|
76
|
-
op.
|
77
|
-
op.
|
78
|
-
op.
|
79
|
-
op.clipHeight = rect.height;
|
84
|
+
op.clipX = effectiveRect.x;
|
85
|
+
op.clipY = effectiveRect.y;
|
86
|
+
op.clipWidth = effectiveRect.width;
|
87
|
+
op.clipHeight = effectiveRect.height;
|
80
88
|
}
|
81
89
|
else if (!clipRectStack.empty())
|
82
90
|
// When we have no effect rect but the stack is not empty, we have clipped
|
@@ -87,7 +95,7 @@ public:
|
|
87
95
|
ops.push_back(op);
|
88
96
|
}
|
89
97
|
|
90
|
-
void scheduleGL(
|
98
|
+
void scheduleGL(std::tr1::function<void()> customCode, ZPos z)
|
91
99
|
{
|
92
100
|
code.insert(std::make_pair(z, customCode));
|
93
101
|
}
|
@@ -110,8 +118,8 @@ public:
|
|
110
118
|
// Allows us to make some assumptions.
|
111
119
|
if (ops.empty())
|
112
120
|
{
|
113
|
-
|
114
|
-
|
121
|
+
for (CodeMap::iterator it = code.begin(), end = code.end(); it != end; ++it)
|
122
|
+
it->second();
|
115
123
|
return;
|
116
124
|
}
|
117
125
|
|
@@ -179,8 +187,8 @@ public:
|
|
179
187
|
|
180
188
|
va.reserve(ops.size());
|
181
189
|
std::stable_sort(ops.begin(), ops.end());
|
182
|
-
|
183
|
-
op
|
190
|
+
for (DrawOps::const_iterator op = ops.begin(), end = ops.end(); op != end; ++op)
|
191
|
+
op->compileTo(va);
|
184
192
|
}
|
185
193
|
};
|
186
194
|
|
data/GosuImpl/Graphics/Font.cpp
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
#include <Gosu/Image.hpp>
|
4
4
|
#include <Gosu/Math.hpp>
|
5
5
|
#include <Gosu/Text.hpp>
|
6
|
+
#include <Gosu/TR1.hpp>
|
6
7
|
#include <GosuImpl/Graphics/Common.hpp>
|
7
8
|
#include <GosuImpl/Graphics/FormattedString.hpp>
|
8
|
-
#include <
|
9
|
-
#include <boost/shared_ptr.hpp>
|
9
|
+
#include <cassert>
|
10
10
|
#include <map>
|
11
11
|
using namespace std;
|
12
12
|
|
@@ -38,16 +38,16 @@ struct Gosu::Font::Impl
|
|
38
38
|
// IMPR: I couldn't find a way to determine the size of wchar_t at compile
|
39
39
|
// time, so I can't get rid of the magic numbers or even do some #ifdef
|
40
40
|
// magic.
|
41
|
-
typedef
|
42
|
-
|
41
|
+
typedef tr1::array<auto_ptr<Image>, 65536> CharChunk;
|
42
|
+
auto_ptr<CharChunk> chunks[65536][ffCombinations];
|
43
43
|
|
44
|
-
|
44
|
+
map<wstring, tr1::shared_ptr<Image> > entityCache;
|
45
45
|
|
46
46
|
const Image& imageAt(const FormattedString& fs, unsigned i)
|
47
47
|
{
|
48
48
|
if (fs.entityAt(i))
|
49
49
|
{
|
50
|
-
|
50
|
+
tr1::shared_ptr<Image>& ptr = entityCache[fs.entityAt(i)];
|
51
51
|
if (!ptr)
|
52
52
|
ptr.reset(new Image(*graphics, entityBitmap(fs.entityAt(i)), false));
|
53
53
|
return *ptr;
|
@@ -61,12 +61,12 @@ struct Gosu::Font::Impl
|
|
61
61
|
size_t chunkIndex = wc / 65536;
|
62
62
|
size_t charIndex = wc % 65536;
|
63
63
|
|
64
|
-
if (!chunks[chunkIndex][flags])
|
64
|
+
if (!chunks[chunkIndex][flags].get())
|
65
65
|
chunks[chunkIndex][flags].reset(new CharChunk);
|
66
66
|
|
67
|
-
|
67
|
+
auto_ptr<Image>& imgPtr = (*chunks[chunkIndex][flags])[charIndex];
|
68
68
|
|
69
|
-
if (imgPtr)
|
69
|
+
if (imgPtr.get())
|
70
70
|
return *imgPtr;
|
71
71
|
|
72
72
|
wstring charString(1, wc);
|
@@ -99,7 +99,7 @@ Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned fontHeigh
|
|
99
99
|
pimpl->flags = fontFlags;
|
100
100
|
}
|
101
101
|
|
102
|
-
|
102
|
+
wstring Gosu::Font::name() const
|
103
103
|
{
|
104
104
|
return pimpl->name;
|
105
105
|
}
|
@@ -114,9 +114,9 @@ unsigned Gosu::Font::flags() const
|
|
114
114
|
return pimpl->flags;
|
115
115
|
}
|
116
116
|
|
117
|
-
double Gosu::Font::textWidth(const
|
117
|
+
double Gosu::Font::textWidth(const wstring& text, double factorX) const
|
118
118
|
{
|
119
|
-
FormattedString fs(text, flags());
|
119
|
+
FormattedString fs(text.c_str(), flags());
|
120
120
|
double result = 0;
|
121
121
|
for (unsigned i = 0; i < fs.length(); ++i)
|
122
122
|
result += pimpl->imageAt(fs, i).width() * pimpl->factorAt(fs, i);
|
@@ -126,7 +126,7 @@ double Gosu::Font::textWidth(const std::wstring& text, double factorX) const
|
|
126
126
|
void Gosu::Font::draw(const wstring& text, double x, double y, ZPos z,
|
127
127
|
double factorX, double factorY, Color c, AlphaMode mode) const
|
128
128
|
{
|
129
|
-
FormattedString fs(text, flags());
|
129
|
+
FormattedString fs(text.c_str(), flags());
|
130
130
|
|
131
131
|
enum {
|
132
132
|
LTR = 1,
|