gosu 0.7.33 → 0.7.35
Sign up to get free protection for your applications and to get access to all the features.
- 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,
|