gosu 0.8.7.2 → 0.9.0.pre1
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.
- checksums.yaml +4 -4
- data/COPYING +29 -0
- data/Gosu/Audio.hpp +1 -0
- data/Gosu/Font.hpp +8 -4
- data/Gosu/Graphics.hpp +28 -18
- data/Gosu/GraphicsBase.hpp +17 -13
- data/Gosu/Image.hpp +54 -45
- data/Gosu/Input.hpp +5 -5
- data/Gosu/Version.hpp +3 -3
- data/Gosu/Window.hpp +1 -8
- data/README.txt +25 -0
- data/ext/gosu/gosu_wrap.cxx +1495 -1275
- data/ext/gosu/gosu_wrap.h +2 -2
- data/lib/gosu/patches.rb +71 -35
- data/lib/gosu/preview.rb +9 -142
- data/lib/gosu/swig_patches.rb +20 -10
- data/rdoc/gosu.rb +1185 -0
- data/src/Bitmap/BitmapUtils.cpp +9 -9
- data/src/Graphics/Common.hpp +3 -1
- data/src/Graphics/Graphics.cpp +100 -38
- data/src/Graphics/Image.cpp +57 -15
- data/src/Graphics/LargeImageData.cpp +9 -10
- data/src/Graphics/LargeImageData.hpp +1 -1
- data/src/Graphics/TexChunk.cpp +5 -6
- data/src/Graphics/TexChunk.hpp +1 -4
- data/src/Graphics/Texture.cpp +10 -3
- data/src/Graphics/Texture.hpp +1 -2
- data/src/Iconv.hpp +2 -2
- data/src/Input/Input.cpp +25 -9
- data/src/Input/InputTouch.mm +5 -3
- data/src/Text/Font.cpp +13 -8
- data/src/Window.cpp +66 -37
- data/src/WindowTouch.mm +3 -3
- metadata +79 -92
- data/examples/ChipmunkIntegration.rb +0 -275
- data/examples/CptnRuby.rb +0 -223
- data/examples/GosuZen.rb +0 -68
- data/examples/MoreChipmunkAndRMagick.rb +0 -155
- data/examples/OpenGLIntegration.rb +0 -226
- data/examples/RMagickIntegration.rb +0 -417
- data/examples/TextInput.rb +0 -154
- data/examples/Tutorial.rb +0 -131
- data/examples/media/Beep.wav +0 -0
- data/examples/media/CptnRuby Gem.png +0 -0
- data/examples/media/CptnRuby Map.txt +0 -25
- data/examples/media/CptnRuby Tileset.png +0 -0
- data/examples/media/CptnRuby.png +0 -0
- data/examples/media/Cursor.png +0 -0
- data/examples/media/Earth.png +0 -0
- data/examples/media/Explosion.wav +0 -0
- data/examples/media/Landscape.svg +0 -10
- data/examples/media/LargeStar.png +0 -0
- data/examples/media/Smoke.png +0 -0
- data/examples/media/Soldier.png +0 -0
- data/examples/media/Space.png +0 -0
- data/examples/media/Star.png +0 -0
- data/examples/media/Starfighter.bmp +0 -0
@@ -6,9 +6,8 @@
|
|
6
6
|
#include <cmath>
|
7
7
|
using namespace std;
|
8
8
|
|
9
|
-
Gosu::LargeImageData::LargeImageData(
|
10
|
-
|
11
|
-
unsigned borderFlags)
|
9
|
+
Gosu::LargeImageData::LargeImageData(const Bitmap& source,
|
10
|
+
unsigned partWidth, unsigned partHeight, unsigned flags)
|
12
11
|
{
|
13
12
|
fullWidth = source.width();
|
14
13
|
fullHeight = source.height();
|
@@ -32,19 +31,19 @@ Gosu::LargeImageData::LargeImageData(Graphics& graphics,
|
|
32
31
|
if (y == partsY - 1 && source.height() % partHeight != 0)
|
33
32
|
srcHeight = source.height() % partHeight;
|
34
33
|
|
35
|
-
unsigned
|
34
|
+
unsigned localFlags = ifTileable;
|
36
35
|
if (x == 0)
|
37
|
-
|
36
|
+
localFlags = (localFlags & ~ifTileableLeft) | (flags & ifTileableLeft);
|
38
37
|
if (x == partsX - 1)
|
39
|
-
|
38
|
+
localFlags = (localFlags & ~ifTileableRight) | (flags & ifTileableRight);
|
40
39
|
if (y == 0)
|
41
|
-
|
40
|
+
localFlags = (localFlags & ~ifTileableTop) | (flags & ifTileableTop);
|
42
41
|
if (y == partsY - 1)
|
43
|
-
|
42
|
+
localFlags = (localFlags & ~ifTileableBottom) | (flags & ifTileableBottom);
|
44
43
|
|
45
|
-
parts[y * partsX + x].reset(
|
44
|
+
parts[y * partsX + x].reset(Graphics::createImage(source,
|
46
45
|
x * partWidth, y * partHeight, srcWidth, srcHeight,
|
47
|
-
|
46
|
+
localFlags).release());
|
48
47
|
}
|
49
48
|
}
|
50
49
|
|
@@ -16,7 +16,7 @@ namespace Gosu
|
|
16
16
|
std::vector<std::tr1::shared_ptr<ImageData> > parts;
|
17
17
|
|
18
18
|
public:
|
19
|
-
LargeImageData(
|
19
|
+
LargeImageData(const Bitmap& source,
|
20
20
|
unsigned partWidth, unsigned partHeight, unsigned borderFlags);
|
21
21
|
|
22
22
|
int width() const;
|
data/src/Graphics/TexChunk.cpp
CHANGED
@@ -14,16 +14,15 @@ void Gosu::TexChunk::setTexInfo()
|
|
14
14
|
info.bottom = (y + h) / textureSize;
|
15
15
|
}
|
16
16
|
|
17
|
-
Gosu::TexChunk::TexChunk(
|
18
|
-
|
19
|
-
:
|
17
|
+
Gosu::TexChunk::TexChunk(std::tr1::shared_ptr<Texture> texture,
|
18
|
+
int x, int y, int w, int h, int padding)
|
19
|
+
: texture(texture), x(x), y(y), w(w), h(h), padding(padding)
|
20
20
|
{
|
21
21
|
setTexInfo();
|
22
22
|
}
|
23
23
|
|
24
24
|
Gosu::TexChunk::TexChunk(const TexChunk& parentChunk, int x, int y, int w, int h)
|
25
|
-
:
|
26
|
-
x(parentChunk.x + x), y(parentChunk.y + y), w(w), h(h), padding(0)
|
25
|
+
: texture(parentChunk.texture), x(parentChunk.x + x), y(parentChunk.y + y), w(w), h(h), padding(0)
|
27
26
|
{
|
28
27
|
setTexInfo();
|
29
28
|
texture->block(this->x, this->y, this->w, this->h);
|
@@ -63,7 +62,7 @@ void Gosu::TexChunk::draw(double x1, double y1, Color c1,
|
|
63
62
|
op.bottom = info.bottom;
|
64
63
|
|
65
64
|
op.z = z;
|
66
|
-
|
65
|
+
Graphics::scheduleDrawOp(op);
|
67
66
|
}
|
68
67
|
|
69
68
|
const Gosu::GLTexInfo* Gosu::TexChunk::glTexInfo() const
|
data/src/Graphics/TexChunk.hpp
CHANGED
@@ -11,8 +11,6 @@
|
|
11
11
|
|
12
12
|
class Gosu::TexChunk : public Gosu::ImageData
|
13
13
|
{
|
14
|
-
Graphics& graphics;
|
15
|
-
DrawOpQueueStack& queues;
|
16
14
|
std::tr1::shared_ptr<Texture> texture;
|
17
15
|
int x, y, w, h, padding;
|
18
16
|
|
@@ -22,8 +20,7 @@ class Gosu::TexChunk : public Gosu::ImageData
|
|
22
20
|
void setTexInfo();
|
23
21
|
|
24
22
|
public:
|
25
|
-
TexChunk(
|
26
|
-
std::tr1::shared_ptr<Texture> texture, int x, int y, int w, int h, int padding);
|
23
|
+
TexChunk(std::tr1::shared_ptr<Texture> texture, int x, int y, int w, int h, int padding);
|
27
24
|
TexChunk(const TexChunk& parentChunk, int x, int y, int w, int h);
|
28
25
|
~TexChunk();
|
29
26
|
|
data/src/Graphics/Texture.cpp
CHANGED
@@ -13,6 +13,8 @@ namespace Gosu
|
|
13
13
|
Gosu::Texture::Texture(unsigned size)
|
14
14
|
: allocator(size, size)
|
15
15
|
{
|
16
|
+
ensureCurrentContext();
|
17
|
+
|
16
18
|
// Create texture name.
|
17
19
|
glGenTextures(1, &name);
|
18
20
|
if (name == static_cast<GLuint>(-1))
|
@@ -50,6 +52,8 @@ Gosu::Texture::Texture(unsigned size)
|
|
50
52
|
|
51
53
|
Gosu::Texture::~Texture()
|
52
54
|
{
|
55
|
+
ensureCurrentContext();
|
56
|
+
|
53
57
|
glDeleteTextures(1, &name);
|
54
58
|
}
|
55
59
|
|
@@ -64,8 +68,7 @@ GLuint Gosu::Texture::texName() const
|
|
64
68
|
}
|
65
69
|
|
66
70
|
GOSU_UNIQUE_PTR<Gosu::TexChunk>
|
67
|
-
Gosu::Texture::tryAlloc(
|
68
|
-
std::tr1::shared_ptr<Texture> ptr, const Bitmap& bmp, unsigned padding)
|
71
|
+
Gosu::Texture::tryAlloc(std::tr1::shared_ptr<Texture> ptr, const Bitmap& bmp, unsigned padding)
|
69
72
|
{
|
70
73
|
GOSU_UNIQUE_PTR<Gosu::TexChunk> result;
|
71
74
|
|
@@ -73,9 +76,11 @@ GOSU_UNIQUE_PTR<Gosu::TexChunk>
|
|
73
76
|
if (!allocator.alloc(bmp.width(), bmp.height(), block))
|
74
77
|
return result;
|
75
78
|
|
76
|
-
result.reset(new TexChunk(
|
79
|
+
result.reset(new TexChunk(ptr, block.left + padding, block.top + padding,
|
77
80
|
block.width - 2 * padding, block.height - 2 * padding, padding));
|
78
81
|
|
82
|
+
ensureCurrentContext();
|
83
|
+
|
79
84
|
glBindTexture(GL_TEXTURE_2D, name);
|
80
85
|
glTexSubImage2D(GL_TEXTURE_2D, 0, block.left, block.top, block.width, block.height,
|
81
86
|
Color::GL_FORMAT, GL_UNSIGNED_BYTE, bmp.data());
|
@@ -98,6 +103,8 @@ Gosu::Bitmap Gosu::Texture::toBitmap(unsigned x, unsigned y, unsigned width, uns
|
|
98
103
|
#ifdef GOSU_IS_OPENGLES
|
99
104
|
throw std::logic_error("Texture::toBitmap not supported on iOS");
|
100
105
|
#else
|
106
|
+
ensureCurrentContext();
|
107
|
+
|
101
108
|
Gosu::Bitmap fullTexture(size(), size());
|
102
109
|
glBindTexture(GL_TEXTURE_2D, name);
|
103
110
|
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, fullTexture.data());
|
data/src/Graphics/Texture.hpp
CHANGED
@@ -22,8 +22,7 @@ namespace Gosu
|
|
22
22
|
unsigned size() const;
|
23
23
|
GLuint texName() const;
|
24
24
|
GOSU_UNIQUE_PTR<TexChunk>
|
25
|
-
tryAlloc(
|
26
|
-
std::tr1::shared_ptr<Texture> ptr, const Bitmap& bmp, unsigned padding);
|
25
|
+
tryAlloc(std::tr1::shared_ptr<Texture> ptr, const Bitmap& bmp, unsigned padding);
|
27
26
|
void block(unsigned x, unsigned y, unsigned width, unsigned height);
|
28
27
|
void free(unsigned x, unsigned y, unsigned width, unsigned height);
|
29
28
|
Gosu::Bitmap toBitmap(unsigned x, unsigned y, unsigned width, unsigned height) const;
|
data/src/Iconv.hpp
CHANGED
data/src/Input/Input.cpp
CHANGED
@@ -3,14 +3,30 @@
|
|
3
3
|
#include <Gosu/TR1.hpp>
|
4
4
|
#include <Gosu/Utility.hpp>
|
5
5
|
#include <SDL2/SDL.h>
|
6
|
-
#include <algorithm>
|
7
6
|
#include <cwctype>
|
7
|
+
#include <cstdlib>
|
8
|
+
#include <algorithm>
|
9
|
+
|
10
|
+
namespace
|
11
|
+
{
|
12
|
+
void requireSDLVideo()
|
13
|
+
{
|
14
|
+
static bool initializedSDLVideo = false;
|
15
|
+
if (!initializedSDLVideo)
|
16
|
+
{
|
17
|
+
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER);
|
18
|
+
std::atexit(SDL_Quit);
|
19
|
+
initializedSDLVideo = true;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
std::tr1::array<bool, Gosu::numButtons> buttonStates { { false } };
|
24
|
+
}
|
8
25
|
|
9
26
|
struct Gosu::Input::Impl
|
10
27
|
{
|
11
28
|
Input& input;
|
12
29
|
TextInput* textInput;
|
13
|
-
std::tr1::array<bool, Gosu::numButtons> buttonStates;
|
14
30
|
double mouseX, mouseY;
|
15
31
|
double mouseFactorX, mouseFactorY;
|
16
32
|
double mouseOffsetX, mouseOffsetY;
|
@@ -18,8 +34,6 @@ struct Gosu::Input::Impl
|
|
18
34
|
Impl(Input& input)
|
19
35
|
: input(input), textInput(NULL)
|
20
36
|
{
|
21
|
-
std::fill(buttonStates.begin(), buttonStates.end(), false);
|
22
|
-
|
23
37
|
mouseFactorX = mouseFactorY = 1;
|
24
38
|
mouseOffsetX = mouseOffsetY = 0;
|
25
39
|
}
|
@@ -225,7 +239,7 @@ private:
|
|
225
239
|
Gosu::Input::Input()
|
226
240
|
: pimpl(new Impl(*this))
|
227
241
|
{
|
228
|
-
|
242
|
+
requireSDLVideo();
|
229
243
|
|
230
244
|
pimpl->initializeGamepads();
|
231
245
|
}
|
@@ -233,8 +247,6 @@ Gosu::Input::Input()
|
|
233
247
|
Gosu::Input::~Input()
|
234
248
|
{
|
235
249
|
pimpl->releaseGamepads();
|
236
|
-
|
237
|
-
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
|
238
250
|
}
|
239
251
|
|
240
252
|
bool Gosu::Input::feedSDLEvent(void* event)
|
@@ -281,6 +293,8 @@ bool Gosu::Input::feedSDLEvent(void* event)
|
|
281
293
|
|
282
294
|
wchar_t Gosu::Input::idToChar(Button btn)
|
283
295
|
{
|
296
|
+
requireSDLVideo();
|
297
|
+
|
284
298
|
if (btn.id() > kbRangeEnd)
|
285
299
|
return 0;
|
286
300
|
|
@@ -312,6 +326,8 @@ wchar_t Gosu::Input::idToChar(Button btn)
|
|
312
326
|
|
313
327
|
Gosu::Button Gosu::Input::charToId(wchar_t ch)
|
314
328
|
{
|
329
|
+
requireSDLVideo();
|
330
|
+
|
315
331
|
std::wstring string(1, ch);
|
316
332
|
SDL_Keycode keycode = SDL_GetKeyFromName(wstringToUTF8(string).c_str());
|
317
333
|
|
@@ -323,12 +339,12 @@ Gosu::Button Gosu::Input::charToId(wchar_t ch)
|
|
323
339
|
}
|
324
340
|
}
|
325
341
|
|
326
|
-
bool Gosu::Input::down(Gosu::Button btn)
|
342
|
+
bool Gosu::Input::down(Gosu::Button btn)
|
327
343
|
{
|
328
344
|
if (btn == noButton || btn.id() >= numButtons)
|
329
345
|
return false;
|
330
346
|
|
331
|
-
return
|
347
|
+
return buttonStates[btn.id()];
|
332
348
|
}
|
333
349
|
|
334
350
|
double Gosu::Input::mouseX() const
|
data/src/Input/InputTouch.mm
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#include <Gosu/TextInput.hpp>
|
3
3
|
|
4
4
|
#include "MacUtility.hpp"
|
5
|
-
#include "
|
5
|
+
#include "AccelerometerReader.hpp"
|
6
6
|
#import <UIKit/UIKit.h>
|
7
7
|
|
8
8
|
struct Gosu::TextInput::Impl {};
|
@@ -26,7 +26,7 @@ struct Gosu::Input::Impl
|
|
26
26
|
Touch translateTouch(UITouch* uiTouch)
|
27
27
|
{
|
28
28
|
CGPoint point = [uiTouch locationInView: view];
|
29
|
-
Touch touch = { uiTouch, point.x, point.y };
|
29
|
+
Touch touch = { uiTouch, (float)point.x, (float)point.y };
|
30
30
|
touch.x *= factorX, touch.y *= factorY;
|
31
31
|
return touch;
|
32
32
|
}
|
@@ -100,9 +100,11 @@ void Gosu::Input::setMousePosition(double x, double y) {
|
|
100
100
|
pimpl->mouseY = y;
|
101
101
|
}
|
102
102
|
|
103
|
-
void Gosu::Input::setMouseFactors(double factorX, double factorY) {
|
103
|
+
void Gosu::Input::setMouseFactors(double factorX, double factorY, double offsetX, double offsetY) {
|
104
104
|
pimpl->factorX = factorX;
|
105
105
|
pimpl->factorY = factorY;
|
106
|
+
|
107
|
+
// TODO - use offset
|
106
108
|
}
|
107
109
|
|
108
110
|
const Gosu::Touches& Gosu::Input::currentTouches() const
|
data/src/Text/Font.cpp
CHANGED
@@ -12,7 +12,6 @@ using namespace std;
|
|
12
12
|
|
13
13
|
struct Gosu::Font::Impl
|
14
14
|
{
|
15
|
-
Graphics* graphics;
|
16
15
|
wstring name;
|
17
16
|
unsigned height, flags;
|
18
17
|
|
@@ -49,7 +48,7 @@ struct Gosu::Font::Impl
|
|
49
48
|
{
|
50
49
|
tr1::shared_ptr<Image>& ptr = entityCache[fs.entityAt(i)];
|
51
50
|
if (!ptr)
|
52
|
-
ptr.reset(new Image(
|
51
|
+
ptr.reset(new Image(entityBitmap(fs.entityAt(i)), ifSmooth));
|
53
52
|
return *ptr;
|
54
53
|
}
|
55
54
|
|
@@ -68,7 +67,7 @@ struct Gosu::Font::Impl
|
|
68
67
|
|
69
68
|
Bitmap bitmap(charWidth, height);
|
70
69
|
drawText(bitmap, charString, 0, 0, Color::WHITE, name, height, flags);
|
71
|
-
info.image.reset(new Image(
|
70
|
+
info.image.reset(new Image(bitmap));
|
72
71
|
info.factor = 0.5;
|
73
72
|
return *info.image;
|
74
73
|
}
|
@@ -81,11 +80,9 @@ struct Gosu::Font::Impl
|
|
81
80
|
}
|
82
81
|
};
|
83
82
|
|
84
|
-
Gosu::Font::Font(
|
85
|
-
unsigned fontFlags)
|
83
|
+
Gosu::Font::Font(unsigned fontHeight, const wstring& fontName, unsigned fontFlags)
|
86
84
|
: pimpl(new Impl)
|
87
85
|
{
|
88
|
-
pimpl->graphics = &graphics;
|
89
86
|
pimpl->name = fontName;
|
90
87
|
pimpl->height = fontHeight * 2;
|
91
88
|
pimpl->flags = fontFlags;
|
@@ -164,7 +161,15 @@ void Gosu::Font::setImage(wchar_t wc, unsigned fontFlags, const Image& image)
|
|
164
161
|
void Gosu::Font::drawRot(const wstring& text, double x, double y, ZPos z, double angle,
|
165
162
|
double factorX, double factorY, Color c, AlphaMode mode) const
|
166
163
|
{
|
167
|
-
|
164
|
+
Gosu::Graphics::pushTransform(rotate(angle, x, y));
|
168
165
|
draw(text, x, y, z, factorX, factorY, c, mode);
|
169
|
-
|
166
|
+
Gosu::Graphics::popTransform();
|
167
|
+
}
|
168
|
+
|
169
|
+
// Deprecated constructors
|
170
|
+
|
171
|
+
Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned fontHeight,
|
172
|
+
unsigned fontFlags)
|
173
|
+
{
|
174
|
+
Font(fontHeight, fontName, fontFlags).pimpl.swap(pimpl);
|
170
175
|
}
|
data/src/Window.cpp
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#include <Gosu/Gosu.hpp>
|
2
|
+
#include "Graphics/Common.hpp"
|
2
3
|
#include <SDL2/SDL.h>
|
3
4
|
#include <cstdlib>
|
4
5
|
#include <memory>
|
@@ -18,12 +19,56 @@ namespace Gosu
|
|
18
19
|
const char *error = SDL_GetError();
|
19
20
|
throw std::runtime_error(operation + ": " + (error ? error : "(unknown error)"));
|
20
21
|
}
|
22
|
+
|
23
|
+
SDL_Window* sharedWindow()
|
24
|
+
{
|
25
|
+
static SDL_Window *window = 0;
|
26
|
+
if (window == 0)
|
27
|
+
{
|
28
|
+
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
29
|
+
throwSDLError("Could not initialize SDL Video");
|
30
|
+
|
31
|
+
atexit(SDL_Quit);
|
32
|
+
|
33
|
+
Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN;
|
34
|
+
|
35
|
+
#if SDL_VERSION_ATLEAST(2, 0, 1)
|
36
|
+
flags |= SDL_WINDOW_ALLOW_HIGHDPI;
|
37
|
+
#endif
|
38
|
+
|
39
|
+
window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 64, 64, flags);
|
40
|
+
if (window == 0)
|
41
|
+
throwSDLError("Could not create window");
|
42
|
+
}
|
43
|
+
return window;
|
44
|
+
}
|
45
|
+
|
46
|
+
SDL_GLContext sharedGLContext()
|
47
|
+
{
|
48
|
+
static SDL_GLContext context = 0;
|
49
|
+
if (context == 0)
|
50
|
+
{
|
51
|
+
#ifdef GOSU_IS_OPENGLES
|
52
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
|
53
|
+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
54
|
+
#endif
|
55
|
+
|
56
|
+
context = SDL_GL_CreateContext(sharedWindow());
|
57
|
+
|
58
|
+
if (context == 0)
|
59
|
+
throwSDLError("Could not create OpenGL context");
|
60
|
+
}
|
61
|
+
return context;
|
62
|
+
}
|
63
|
+
|
64
|
+
void ensureCurrentContext()
|
65
|
+
{
|
66
|
+
SDL_GL_MakeCurrent(sharedWindow(), sharedGLContext());
|
67
|
+
}
|
21
68
|
}
|
22
69
|
|
23
70
|
struct Gosu::Window::Impl
|
24
71
|
{
|
25
|
-
SDL_Window *window;
|
26
|
-
SDL_GLContext context;
|
27
72
|
double updateInterval;
|
28
73
|
|
29
74
|
std::auto_ptr<Graphics> graphics;
|
@@ -33,8 +78,6 @@ struct Gosu::Window::Impl
|
|
33
78
|
Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double updateInterval)
|
34
79
|
: pimpl(new Impl)
|
35
80
|
{
|
36
|
-
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
37
|
-
throwSDLError("Could not initialize SDL Video");
|
38
81
|
|
39
82
|
int actualWidth = width;
|
40
83
|
int actualHeight = height;
|
@@ -68,34 +111,22 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
68
111
|
}
|
69
112
|
}
|
70
113
|
|
71
|
-
|
72
|
-
#if SDL_VERSION_ATLEAST(2, 0, 1)
|
73
|
-
flags |= SDL_WINDOW_ALLOW_HIGHDPI;
|
74
|
-
#endif
|
75
|
-
if (fullscreen) {
|
76
|
-
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
77
|
-
}
|
78
|
-
|
79
|
-
pimpl->window = SDL_CreateWindow("",
|
80
|
-
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
81
|
-
actualWidth, actualHeight, flags);
|
82
|
-
if (! pimpl->window)
|
83
|
-
throwSDLError("Could not open window");
|
84
|
-
|
85
|
-
#ifdef GOSU_IS_OPENGLES
|
86
|
-
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
|
87
|
-
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
88
|
-
#endif
|
89
|
-
|
90
|
-
#if SDL_VERSION_ATLEAST(2, 0, 1)
|
91
|
-
SDL_GL_GetDrawableSize(pimpl->window, &actualWidth, &actualHeight);
|
92
|
-
#endif
|
114
|
+
// TODO - it would be better/enough to only do this in show()
|
93
115
|
|
94
|
-
|
95
|
-
|
96
|
-
|
116
|
+
SDL_SetWindowTitle(sharedWindow(), "");
|
117
|
+
SDL_SetWindowSize(sharedWindow(), actualWidth, actualHeight);
|
118
|
+
SDL_SetWindowPosition(sharedWindow(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
119
|
+
if (fullscreen)
|
120
|
+
{
|
121
|
+
SDL_SetWindowFullscreen(sharedWindow(), fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
|
122
|
+
}
|
123
|
+
SDL_ShowWindow(sharedWindow());
|
124
|
+
|
125
|
+
#if SDL_VERSION_ATLEAST(2, 0, 1)
|
126
|
+
SDL_GL_GetDrawableSize(sharedWindow(), &actualWidth, &actualHeight);
|
127
|
+
#endif
|
97
128
|
|
98
|
-
|
129
|
+
ensureCurrentContext();
|
99
130
|
SDL_GL_SetSwapInterval(1);
|
100
131
|
|
101
132
|
pimpl->graphics.reset(new Graphics(actualWidth, actualHeight, fullscreen));
|
@@ -109,21 +140,18 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
109
140
|
|
110
141
|
Gosu::Window::~Window()
|
111
142
|
{
|
112
|
-
|
113
|
-
SDL_DestroyWindow(pimpl->window);
|
114
|
-
|
115
|
-
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
143
|
+
SDL_HideWindow(sharedWindow());
|
116
144
|
}
|
117
145
|
|
118
146
|
std::wstring Gosu::Window::caption() const
|
119
147
|
{
|
120
|
-
return utf8ToWstring(SDL_GetWindowTitle(
|
148
|
+
return utf8ToWstring(SDL_GetWindowTitle(sharedWindow()));
|
121
149
|
}
|
122
150
|
|
123
151
|
void Gosu::Window::setCaption(const std::wstring& caption)
|
124
152
|
{
|
125
153
|
std::string utf8 = wstringToUTF8(caption);
|
126
|
-
SDL_SetWindowTitle(
|
154
|
+
SDL_SetWindowTitle(sharedWindow(), utf8.c_str());
|
127
155
|
}
|
128
156
|
|
129
157
|
double Gosu::Window::updateInterval() const
|
@@ -162,13 +190,14 @@ void Gosu::Window::show()
|
|
162
190
|
SDL_ShowCursor(needsCursor());
|
163
191
|
|
164
192
|
if (needsRedraw()) {
|
193
|
+
ensureCurrentContext();
|
165
194
|
if (graphics().begin()) {
|
166
195
|
draw();
|
167
196
|
graphics().end();
|
168
197
|
FPS::registerFrame();
|
169
198
|
}
|
170
199
|
|
171
|
-
SDL_GL_SwapWindow(
|
200
|
+
SDL_GL_SwapWindow(sharedWindow());
|
172
201
|
|
173
202
|
if (GosusDarkSide::oncePerTick) GosusDarkSide::oncePerTick();
|
174
203
|
}
|