gosu 0.7.24 → 0.7.25
Sign up to get free protection for your applications and to get access to all the features.
- data/Gosu/ButtonsMac.hpp +2 -2
- data/Gosu/ButtonsWin.hpp +4 -1
- data/Gosu/ButtonsX.hpp +2 -2
- data/Gosu/Color.hpp +47 -29
- data/Gosu/Graphics.hpp +1 -1
- data/Gosu/Version.hpp +2 -2
- data/GosuImpl/Graphics/BitmapPNG.cpp +1 -1
- data/GosuImpl/Graphics/BitmapTouch.mm +0 -4
- data/GosuImpl/Graphics/Color.cpp +1 -1
- data/GosuImpl/Graphics/Graphics.cpp +1 -1
- data/GosuImpl/Graphics/Texture.cpp +2 -72
- data/GosuImpl/Graphics/Texture.hpp +0 -2
- data/GosuImpl/InputMac.mm +39 -9
- data/GosuImpl/RubyGosu.swg +32 -15
- data/GosuImpl/RubyGosu_wrap.cxx +269 -84
- data/GosuImpl/RubyGosu_wrap.h +1 -1
- data/GosuImpl/WindowMac.mm +10 -8
- data/GosuImpl/WindowWin.cpp +1 -1
- data/examples/CptnRuby.rb +1 -7
- data/examples/OpenGLIntegration.rb +1 -7
- data/examples/RMagickIntegration.rb +1 -7
- data/examples/TextInput.rb +1 -7
- data/examples/Tutorial.rb +1 -7
- data/lib/gosu/patches.rb +22 -11
- data/lib/gosu.rb +0 -0
- metadata +4 -4
data/Gosu/ButtonsMac.hpp
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
|
4
4
|
namespace Gosu
|
5
5
|
{
|
6
|
-
//! List of
|
7
|
-
//! This enumeration contains ids for
|
6
|
+
//! List of button ids that can be used with Gosu::Input.
|
7
|
+
//! This enumeration contains ids for keyboard keys (kb*),
|
8
8
|
//! mouse buttons and mouse wheel (ms*) and gamepad buttons (gp*).
|
9
9
|
enum ButtonName
|
10
10
|
{
|
data/Gosu/ButtonsWin.hpp
CHANGED
@@ -3,7 +3,10 @@
|
|
3
3
|
|
4
4
|
namespace Gosu
|
5
5
|
{
|
6
|
-
|
6
|
+
//! List of button ids that can be used with Gosu::Input.
|
7
|
+
//! This enumeration contains ids for keyboard keys (kb*),
|
8
|
+
//! mouse buttons and mouse wheel (ms*) and gamepad buttons (gp*).
|
9
|
+
enum ButtonName
|
7
10
|
{
|
8
11
|
kbRangeBegin = 1,
|
9
12
|
kbEscape = 0x01,
|
data/Gosu/ButtonsX.hpp
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
|
4
4
|
namespace Gosu
|
5
5
|
{
|
6
|
-
//!
|
7
|
-
//! This enumeration contains ids for
|
6
|
+
//! List of button ids that can be used with Gosu::Input.
|
7
|
+
//! This enumeration contains ids for keyboard keys (kb*),
|
8
8
|
//! mouse buttons and mouse wheel (ms*) and gamepad buttons (gp*).
|
9
9
|
enum ButtonName
|
10
10
|
{
|
data/Gosu/Color.hpp
CHANGED
@@ -5,39 +5,58 @@
|
|
5
5
|
#define GOSU_COLOR_HPP
|
6
6
|
|
7
7
|
#include <boost/cstdint.hpp>
|
8
|
+
#include <Gosu/Platform.hpp>
|
8
9
|
|
9
10
|
namespace Gosu
|
10
11
|
{
|
11
12
|
//! Represents an ARGB color value with 8 bits for each channel. Can be
|
12
13
|
//! implicitly constructed from literals of the form 0xaarrggbb. Has fast
|
13
14
|
//! value semantics.
|
15
|
+
//! The four-byte layout in memory is RGBA. On Big-Endian machines the
|
16
|
+
//! unsigned int interpretation is 0xrrggbbaa, on Little-Endian machines
|
17
|
+
//! it is 0xaabbggrr.
|
14
18
|
class Color
|
15
19
|
{
|
16
20
|
boost::uint32_t rep;
|
17
|
-
|
21
|
+
#ifdef GOSU_IS_LITTLE_ENDIAN
|
22
|
+
enum { RED_OFFSET = 0, GREEN_OFFSET = 8, BLUE_OFFSET = 16, ALPHA_OFFSET = 24 };
|
23
|
+
#else
|
24
|
+
enum { RED_OFFSET = 24, GREEN_OFFSET = 16, BLUE_OFFSET = 8, ALPHA_OFFSET = 0 };
|
25
|
+
#endif
|
26
|
+
|
18
27
|
public:
|
19
28
|
typedef boost::uint8_t Channel;
|
20
|
-
|
29
|
+
static const unsigned GL_FORMAT = 0x1908; // GL_RGBA
|
30
|
+
|
21
31
|
//! The default constructor does not initialize the color to any value.
|
22
32
|
Color()
|
23
33
|
{
|
24
34
|
}
|
25
|
-
|
35
|
+
|
26
36
|
//! Conversion constructor for literals of the form 0xaarrggbb.
|
27
37
|
//! (C++ only.)
|
28
38
|
Color(boost::uint32_t argb)
|
29
|
-
: rep(argb)
|
30
39
|
{
|
40
|
+
*this = Color((argb >> 24) & 0xff, (argb >> 16) & 0xff,
|
41
|
+
(argb >> 8) & 0xff, (argb >> 0) & 0xff);
|
31
42
|
}
|
32
|
-
|
43
|
+
|
33
44
|
Color(Channel red, Channel green, Channel blue)
|
34
45
|
{
|
35
|
-
|
46
|
+
*this = Color(0xff, red, green, blue);
|
36
47
|
}
|
37
|
-
|
48
|
+
|
38
49
|
Color(Channel alpha, Channel red, Channel green, Channel blue)
|
39
50
|
{
|
40
|
-
rep = (alpha <<
|
51
|
+
rep = (alpha << ALPHA_OFFSET) | (red << RED_OFFSET) |
|
52
|
+
(green << GREEN_OFFSET) | (blue << BLUE_OFFSET);
|
53
|
+
}
|
54
|
+
|
55
|
+
static Color fromRGBA(boost::uint32_t rgba)
|
56
|
+
{
|
57
|
+
Color result;
|
58
|
+
result.rep = rgba;
|
59
|
+
return result;
|
41
60
|
}
|
42
61
|
|
43
62
|
//! Constructs a color from the given hue/saturation/value triple.
|
@@ -47,48 +66,48 @@ namespace Gosu
|
|
47
66
|
static Color fromHSV(double h, double s, double v);
|
48
67
|
static Color fromAHSV(Channel alpha, double h, double s, double v);
|
49
68
|
|
50
|
-
Channel alpha() const
|
51
|
-
{
|
52
|
-
return static_cast<Channel>((rep >> 24) & 0xff);
|
53
|
-
}
|
54
|
-
|
55
69
|
Channel red() const
|
56
70
|
{
|
57
|
-
return static_cast<Channel>(
|
71
|
+
return static_cast<Channel>(rep >> RED_OFFSET);
|
58
72
|
}
|
59
73
|
|
60
74
|
Channel green() const
|
61
75
|
{
|
62
|
-
return static_cast<Channel>(
|
76
|
+
return static_cast<Channel>(rep >> GREEN_OFFSET);
|
63
77
|
}
|
64
78
|
|
65
79
|
Channel blue() const
|
66
80
|
{
|
67
|
-
return static_cast<Channel>(rep
|
81
|
+
return static_cast<Channel>(rep >> BLUE_OFFSET);
|
68
82
|
}
|
69
83
|
|
70
|
-
|
84
|
+
Channel alpha() const
|
71
85
|
{
|
72
|
-
rep
|
73
|
-
rep |= value << 24;
|
86
|
+
return static_cast<Channel>(rep >> ALPHA_OFFSET);
|
74
87
|
}
|
75
88
|
|
76
89
|
void setRed(Channel value)
|
77
90
|
{
|
78
|
-
rep &=
|
79
|
-
rep |= value <<
|
91
|
+
rep &= ~(0xff << RED_OFFSET);
|
92
|
+
rep |= value << RED_OFFSET;
|
80
93
|
}
|
81
94
|
|
82
95
|
void setGreen(Channel value)
|
83
96
|
{
|
84
|
-
rep &=
|
85
|
-
rep |= value <<
|
97
|
+
rep &= ~(0xff << GREEN_OFFSET);
|
98
|
+
rep |= value << GREEN_OFFSET;
|
86
99
|
}
|
87
100
|
|
88
101
|
void setBlue(Channel value)
|
89
102
|
{
|
90
|
-
rep &=
|
91
|
-
rep |= value;
|
103
|
+
rep &= ~(0xff << BLUE_OFFSET);
|
104
|
+
rep |= value << BLUE_OFFSET;
|
105
|
+
}
|
106
|
+
|
107
|
+
void setAlpha(Channel value)
|
108
|
+
{
|
109
|
+
rep &= ~(0xff << ALPHA_OFFSET);
|
110
|
+
rep |= value << ALPHA_OFFSET;
|
92
111
|
}
|
93
112
|
|
94
113
|
//! Returns the hue of the color, in the usual range of 0..360.
|
@@ -112,19 +131,19 @@ namespace Gosu
|
|
112
131
|
//! Returns the color in 0xaarrggbb representation.
|
113
132
|
boost::uint32_t argb() const
|
114
133
|
{
|
115
|
-
return
|
134
|
+
return alpha() << 24 | red() << 16 | green() << 8 | blue();
|
116
135
|
}
|
117
136
|
|
118
137
|
//! Returns the color in 0x00bbggrr representation.
|
119
138
|
boost::uint32_t bgr() const
|
120
139
|
{
|
121
|
-
return
|
140
|
+
return blue() << 16 | green() << 8 | red();
|
122
141
|
}
|
123
142
|
|
124
143
|
//! Returns the color in 0xaabbggrr representation.
|
125
144
|
boost::uint32_t abgr() const
|
126
145
|
{
|
127
|
-
return alpha() << 24 |
|
146
|
+
return alpha() << 24 | blue() << 16 | green() << 8 | red();
|
128
147
|
}
|
129
148
|
|
130
149
|
static const Color NONE;
|
@@ -171,7 +190,6 @@ namespace Gosu
|
|
171
190
|
//! and then multiplied with each other.
|
172
191
|
Color multiply(Color a, Color b);
|
173
192
|
|
174
|
-
// Deprecated
|
175
193
|
namespace Colors
|
176
194
|
{
|
177
195
|
const Color none = 0x00000000;
|
data/Gosu/Graphics.hpp
CHANGED
@@ -22,7 +22,7 @@ namespace Gosu
|
|
22
22
|
//! Returns the maximum size of an texture that will be allocated
|
23
23
|
//! internally by Gosu.
|
24
24
|
//! Useful when extending Gosu using OpenGL.
|
25
|
-
|
25
|
+
unsigned const MAX_TEXTURE_SIZE = 1024;
|
26
26
|
|
27
27
|
typedef boost::array<double, 16> Transform;
|
28
28
|
Transform translate(double x, double y);
|
data/Gosu/Version.hpp
CHANGED
@@ -34,10 +34,6 @@ Gosu::Reader Gosu::loadFromBMP(Bitmap& bmp, Reader reader)
|
|
34
34
|
CGContextDrawImage(context, CGRectMake(0.0, 0.0, bmp.width(), bmp.height()), imageRef);
|
35
35
|
CGContextRelease(context);
|
36
36
|
|
37
|
-
for (unsigned y = 0; y < bmp.height(); ++y)
|
38
|
-
for (unsigned x = 0; x < bmp.width(); ++x)
|
39
|
-
bmp.setPixel(x, y, bmp.getPixel(x, y).abgr());
|
40
|
-
|
41
37
|
return reader;
|
42
38
|
}
|
43
39
|
|
data/GosuImpl/Graphics/Color.cpp
CHANGED
@@ -128,7 +128,7 @@ Gosu::Color Gosu::multiply(Color a, Color b)
|
|
128
128
|
const Gosu::Color Gosu::Color::NONE = 0x00000000;
|
129
129
|
const Gosu::Color Gosu::Color::BLACK = 0xff000000;
|
130
130
|
const Gosu::Color Gosu::Color::GRAY = 0xff808080;
|
131
|
-
const Gosu::Color Gosu::Color::WHITE = 0xffffffff;
|
131
|
+
const Gosu::Color Gosu::Color::WHITE = 0xffffffff;
|
132
132
|
const Gosu::Color Gosu::Color::AQUA = 0xff00ffff;
|
133
133
|
const Gosu::Color Gosu::Color::RED = 0xffff0000;
|
134
134
|
const Gosu::Color Gosu::Color::GREEN = 0xff00ff00;
|
@@ -357,7 +357,7 @@ std::auto_ptr<Gosu::ImageData> Gosu::Graphics::createImage(
|
|
357
357
|
const Bitmap& src, unsigned srcX, unsigned srcY,
|
358
358
|
unsigned srcWidth, unsigned srcHeight, unsigned borderFlags)
|
359
359
|
{
|
360
|
-
static const unsigned maxSize =
|
360
|
+
static const unsigned maxSize = MAX_TEXTURE_SIZE;
|
361
361
|
|
362
362
|
// Special case: If the texture is supposed to have hard borders,
|
363
363
|
// is quadratic, has a size that is at least 64 pixels but less than 256
|
@@ -5,43 +5,6 @@
|
|
5
5
|
#include <Gosu/Platform.hpp>
|
6
6
|
#include <stdexcept>
|
7
7
|
|
8
|
-
#ifndef GL_BGRA
|
9
|
-
#define GL_BGRA 0x80E1
|
10
|
-
#endif
|
11
|
-
|
12
|
-
// TODO: Move from Texture:: to local namespace and use MAX_TEXTURE_SIZE instead.
|
13
|
-
unsigned Gosu::Texture::maxTextureSize()
|
14
|
-
{
|
15
|
-
#if defined(GOSU_IS_MAC)
|
16
|
-
// Includes the iPhone
|
17
|
-
return 1024;
|
18
|
-
#elif defined(GOSU_IS_UNIX)
|
19
|
-
// Since we cannot get the max. texture size until after context creation, we have to
|
20
|
-
// just be pessimistic about it until Gosu is restructured to create the context
|
21
|
-
// earlier. Otherwise, libGL will segfault left and right.
|
22
|
-
return 512;
|
23
|
-
#else
|
24
|
-
const static unsigned MIN_SIZE = 256, MAX_SIZE = 1024;
|
25
|
-
|
26
|
-
static unsigned size = 0;
|
27
|
-
if (size == 0)
|
28
|
-
{
|
29
|
-
size = MIN_SIZE / 2;
|
30
|
-
GLint width = 1;
|
31
|
-
do
|
32
|
-
{
|
33
|
-
size *= 2;
|
34
|
-
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, 4, size * 2, size * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
35
|
-
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
|
36
|
-
} while (width != 0 && size < MAX_SIZE);
|
37
|
-
}
|
38
|
-
|
39
|
-
return size;
|
40
|
-
#endif
|
41
|
-
}
|
42
|
-
|
43
|
-
const unsigned Gosu::MAX_TEXTURE_SIZE = Gosu::Texture::maxTextureSize();
|
44
|
-
|
45
8
|
namespace Gosu
|
46
9
|
{
|
47
10
|
bool undocumentedRetrofication = false;
|
@@ -113,32 +76,9 @@ std::auto_ptr<Gosu::TexChunk>
|
|
113
76
|
result.reset(new TexChunk(graphics, transforms, queues, ptr, block->left + padding, block->top + padding,
|
114
77
|
block->width - 2 * padding, block->height - 2 * padding, padding));
|
115
78
|
|
116
|
-
#if defined(__BIG_ENDIAN__)
|
117
|
-
std::vector<unsigned> pixelData(srcWidth * srcHeight);
|
118
|
-
for (unsigned y = 0; y < srcHeight; ++y)
|
119
|
-
for (unsigned x = 0; x < srcWidth; ++x)
|
120
|
-
{
|
121
|
-
boost::uint32_t pixVal = (bmp.getPixel(x, y).argb() & 0x00ffffff) << 8 | bmp.getPixel(x, y).alpha();
|
122
|
-
pixVal = bigToNative(pixVal);
|
123
|
-
pixelData[y * srcWidth + x] = pixVal;
|
124
|
-
}
|
125
|
-
const unsigned* texData = &pixelData[0];
|
126
|
-
unsigned format = GL_RGBA;
|
127
|
-
#elif defined(GOSU_IS_IPHONE)
|
128
|
-
std::vector<unsigned> pixelData(srcWidth * srcHeight);
|
129
|
-
for (unsigned y = 0; y < srcHeight; ++y)
|
130
|
-
for (unsigned x = 0; x < srcWidth; ++x)
|
131
|
-
pixelData[y * srcWidth + x] = bmp.getPixel(x, y).abgr();
|
132
|
-
const unsigned* texData = &pixelData[0];
|
133
|
-
unsigned format = GL_RGBA;
|
134
|
-
#else
|
135
|
-
const unsigned* texData = bmp.data();
|
136
|
-
unsigned format = GL_BGRA;
|
137
|
-
#endif
|
138
|
-
|
139
79
|
glBindTexture(GL_TEXTURE_2D, name);
|
140
80
|
glTexSubImage2D(GL_TEXTURE_2D, 0, block->left, block->top, block->width, block->height,
|
141
|
-
|
81
|
+
Color::GL_FORMAT, GL_UNSIGNED_BYTE, bmp.data());
|
142
82
|
|
143
83
|
num += 1;
|
144
84
|
return result;
|
@@ -158,21 +98,11 @@ Gosu::Bitmap Gosu::Texture::toBitmap(unsigned x, unsigned y, unsigned width, uns
|
|
158
98
|
Gosu::Bitmap fullTexture;
|
159
99
|
fullTexture.resize(size(), size());
|
160
100
|
glBindTexture(GL_TEXTURE_2D, name);
|
161
|
-
glGetTexImage(GL_TEXTURE_2D, 0,
|
101
|
+
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, fullTexture.data());
|
162
102
|
Gosu::Bitmap bitmap;
|
163
103
|
bitmap.resize(width, height);
|
164
104
|
bitmap.insert(fullTexture, -int(x), -int(y));
|
165
105
|
|
166
|
-
#if defined(__BIG_ENDIAN__)
|
167
|
-
for (unsigned y = 0; y < height; ++y)
|
168
|
-
for (unsigned x = 0; x < width; ++x)
|
169
|
-
bitmap.setPixel(x, y, bigToNative(bitmap.getPixel(x, y).argb() & 0xffffff00 >> 8 | bitmap.getPixel(x, y).alpha() << 24));
|
170
|
-
#elif defined(GOSU_IS_IPHONE)
|
171
|
-
for (unsigned y = 0; y < height; ++y)
|
172
|
-
for (unsigned x = 0; x < width; ++x)
|
173
|
-
bitmap.setPixel(x, y, bitmap.getPixel(x, y).abgr());
|
174
|
-
#endif
|
175
|
-
|
176
106
|
return bitmap;
|
177
107
|
#endif
|
178
108
|
}
|
data/GosuImpl/InputMac.mm
CHANGED
@@ -441,11 +441,49 @@ namespace {
|
|
441
441
|
|
442
442
|
idChars.assign(0);
|
443
443
|
|
444
|
-
#
|
444
|
+
#ifdef __LP64__
|
445
|
+
CFRef<TISInputSourceRef> is(TISCopyCurrentKeyboardLayoutInputSource());
|
446
|
+
CFRef<CFDataRef> UCHR(
|
447
|
+
static_cast<CFDataRef>(TISGetInputSourceProperty(is.obj(), kTISPropertyUnicodeKeyLayoutData)));
|
448
|
+
if (!UCHR.get())
|
449
|
+
return;
|
450
|
+
|
451
|
+
// Reverse for() to prefer lower IDs in charToId
|
452
|
+
for (int code = numScancodes - 1; code >= 0; --code)
|
453
|
+
{
|
454
|
+
UInt32 deadKeyState = 0;
|
455
|
+
UniChar value[8];
|
456
|
+
UniCharCount valueLength = 8;
|
457
|
+
|
458
|
+
if (code == kbLeftShift || code == kbRightShift ||
|
459
|
+
code == kbLeftAlt || code == kbRightAlt ||
|
460
|
+
code == kbLeftControl || code == kbRightControl ||
|
461
|
+
code == kbLeftMeta || code == kbRightMeta)
|
462
|
+
continue;
|
463
|
+
|
464
|
+
if (noErr != UCKeyTranslate(
|
465
|
+
reinterpret_cast<const UCKeyboardLayout*>(CFDataGetBytePtr(UCHR.obj())),
|
466
|
+
code, kUCKeyActionDown, 0, LMGetKbdType(),
|
467
|
+
kUCKeyTranslateNoDeadKeysMask, &deadKeyState,
|
468
|
+
valueLength, &valueLength, value))
|
469
|
+
continue;
|
470
|
+
|
471
|
+
// Ignore special characters except newline.
|
472
|
+
if (value[0] == 3)
|
473
|
+
value[0] = 13; // convert Enter to Return
|
474
|
+
if (value[0] < 32 && value[0] != 13)
|
475
|
+
continue;
|
476
|
+
|
477
|
+
idChars[code] = value[0];
|
478
|
+
charIds[value[0]] = code;
|
479
|
+
}
|
480
|
+
#else
|
481
|
+
// The very old-school way.
|
445
482
|
const void* KCHR = reinterpret_cast<const void*>(GetScriptManagerVariable(smKCHRCache));
|
446
483
|
if (!KCHR)
|
447
484
|
return;
|
448
485
|
|
486
|
+
// Reverse for() to prefer lower IDs in charToId
|
449
487
|
for (int code = numScancodes - 1; code >= 0; --code)
|
450
488
|
{
|
451
489
|
UInt32 deadKeyState = 0;
|
@@ -454,20 +492,12 @@ namespace {
|
|
454
492
|
if (deadKeyState != 0)
|
455
493
|
value = KeyTranslate(KCHR, code, &deadKeyState);
|
456
494
|
|
457
|
-
// No character! Pity.
|
458
|
-
if (value == 0)
|
459
|
-
continue;
|
460
|
-
|
461
495
|
// Ignore special characters except newline.
|
462
496
|
if (value == 3)
|
463
497
|
value = 13; // convert Enter to Return
|
464
498
|
if (value < 32 && value != 13)
|
465
499
|
continue;
|
466
500
|
|
467
|
-
// Now we have a character which is *not* limited to the ASCII range. To correctly
|
468
|
-
// translate this into a wchar_t, we need to convert it based on the current locale.
|
469
|
-
// TODO: That locale stuff should be explicit. Locales always cause trouble.
|
470
|
-
|
471
501
|
std::string str(1, char(value));
|
472
502
|
wchar_t ch = Gosu::macRomanToWstring(str).at(0);
|
473
503
|
|
data/GosuImpl/RubyGosu.swg
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
// Mini
|
2
|
-
// - %predicate instead of %rename
|
3
|
-
// - use Python names for op overloading
|
1
|
+
// Mini SWIG file TODO List:
|
2
|
+
// - %predicate instead of %rename where applicable
|
3
|
+
// - use Python names for op overloading for easier porting to other languages
|
4
4
|
|
5
5
|
%trackobjects;
|
6
6
|
%include exception.i
|
@@ -61,14 +61,16 @@
|
|
61
61
|
$1 = Gosu::Button(NUM2LONG($input));
|
62
62
|
}
|
63
63
|
%typemap(out) Gosu::Button {
|
64
|
-
|
65
|
-
if ($result == -1)
|
64
|
+
if ($1 == Gosu::noButton)
|
66
65
|
$result = Qnil;
|
66
|
+
else
|
67
|
+
$result = LONG2NUM($1.id());
|
67
68
|
}
|
68
69
|
%typemap(directorin) Gosu::Button {
|
69
|
-
|
70
|
-
if ($input == -1)
|
70
|
+
if ($1 == Gosu::noButton)
|
71
71
|
$input = Qnil;
|
72
|
+
else
|
73
|
+
$input = LONG2NUM($1.id());
|
72
74
|
}
|
73
75
|
|
74
76
|
// Typemaps for enums that should be given in as symbols.
|
@@ -164,7 +166,9 @@ namespace Gosu {
|
|
164
166
|
void register_entity(const std::wstring& name, Gosu::Image* image) { registerEntity(name, image->getData().toBitmap()); }
|
165
167
|
}
|
166
168
|
|
169
|
+
#include <ctime>
|
167
170
|
#include <sstream>
|
171
|
+
#include <boost/algorithm/string.hpp>
|
168
172
|
|
169
173
|
// New Ruby 1.9 syntax (for compilation with Ruby 1.8)
|
170
174
|
#ifndef RSTRING_LEN
|
@@ -219,14 +223,8 @@ namespace Gosu
|
|
219
223
|
throw std::logic_error("Blob length mismatch!");
|
220
224
|
Bitmap result;
|
221
225
|
result.resize(width, height);
|
222
|
-
|
223
|
-
|
224
|
-
for (unsigned x = 0; x < width; ++x)
|
225
|
-
{
|
226
|
-
unsigned rgba = *rgbaIter;
|
227
|
-
result.setPixel(x, y, Gosu::Color(rgba).abgr()); // swap R and B
|
228
|
-
++rgbaIter;
|
229
|
-
}
|
226
|
+
std::memcpy(result.data(),
|
227
|
+
reinterpret_cast<const boost::uint32_t*>(RSTRING_PTR(blob)), width * height * 4);
|
230
228
|
return result;
|
231
229
|
}
|
232
230
|
}
|
@@ -434,6 +432,7 @@ namespace Gosu {
|
|
434
432
|
}
|
435
433
|
std::string toBlob() const
|
436
434
|
{
|
435
|
+
// TODO: Optimize with direct copy into a Ruby string
|
437
436
|
Gosu::Bitmap bmp = $self->getData().toBitmap();
|
438
437
|
return std::string(reinterpret_cast<const char*>(bmp.data()),
|
439
438
|
reinterpret_cast<const char*>(bmp.data()) + bmp.width() * bmp.height() * 4);
|
@@ -446,6 +445,16 @@ namespace Gosu {
|
|
446
445
|
{
|
447
446
|
return $self->height();
|
448
447
|
}
|
448
|
+
void save(const std::wstring& filename) const
|
449
|
+
{
|
450
|
+
Gosu::Bitmap bmp = $self->getData().toBitmap();
|
451
|
+
Gosu::Buffer buf;
|
452
|
+
if (boost::iends_with(filename, L".bmp"))
|
453
|
+
Gosu::saveToBMP(bmp, buf.backWriter());
|
454
|
+
else
|
455
|
+
Gosu::saveToPNG(bmp, buf.backWriter());
|
456
|
+
Gosu::saveFile(buf, filename);
|
457
|
+
}
|
449
458
|
}
|
450
459
|
|
451
460
|
// Audio:
|
@@ -472,6 +481,9 @@ namespace Gosu {
|
|
472
481
|
%include "../Gosu/ButtonsMac.hpp"
|
473
482
|
%init %{
|
474
483
|
GosusDarkSide::oncePerTick = GosusDarkSide::yieldToOtherRubyThreads;
|
484
|
+
// While we are at it, to some healthy srand() - otherwise unavailable to Ruby people
|
485
|
+
std::srand(static_cast<unsigned int>(std::time(0)));
|
486
|
+
std::rand(); // and flush the first value
|
475
487
|
%}
|
476
488
|
|
477
489
|
// TextInput
|
@@ -624,6 +636,11 @@ namespace Gosu {
|
|
624
636
|
rb_yield(Qnil);
|
625
637
|
$self->graphics().popTransform();
|
626
638
|
}
|
639
|
+
void scale(double factorX, double factorY, double aroundX, double aroundY) {
|
640
|
+
$self->graphics().pushTransform(Gosu::scale(factorX, factorY, aroundX, aroundY));
|
641
|
+
rb_yield(Qnil);
|
642
|
+
$self->graphics().popTransform();
|
643
|
+
}
|
627
644
|
void translate(double x, double y) {
|
628
645
|
$self->graphics().pushTransform(Gosu::translate(x, y));
|
629
646
|
rb_yield(Qnil);
|