gosu 0.11.4.pre3 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gosu/Graphics.hpp +22 -30
- data/Gosu/Version.hpp +2 -2
- data/rdoc/gosu.rb +1 -8
- data/src/Audio.cpp +11 -3
- data/src/AudioFile.hpp +2 -2
- data/src/BitmapIO.cpp +1 -1
- data/src/Font.cpp +3 -3
- data/src/GosuViewController.cpp +2 -4
- data/src/Graphics.cpp +58 -86
- data/src/GraphicsImpl.hpp +1 -0
- data/src/LargeImageData.cpp +146 -90
- data/src/LargeImageData.hpp +24 -30
- data/src/Macro.cpp +1 -1
- data/src/RubyGosu.cxx +19 -31
- data/src/TexChunk.cpp +18 -17
- data/src/TexChunk.hpp +13 -22
- data/src/Version.cpp +6 -4
- data/src/Window.cpp +2 -3
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d1640e560328b803317616abde6c301648daffb
|
4
|
+
data.tar.gz: 419425be00ae9f09d1cc74702170f55f87ff563b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ba0ce007bc4fdddd98887d1594f2b106e150fb50282dc859e517f1122a4853c6d8f3ca69cb8d34cde51914e2310c53eba1ba9873dde736fbac58e6dc0bcef32
|
7
|
+
data.tar.gz: 2eb57895d03d4bfcbcc31c28ef79ef35fa5f78684dde4d1f7106b0914470bf2d70b27aa87b3df23e4432f367aa1bdbbd4883bb39e2915405b9b6aba79ed83775
|
data/Gosu/Graphics.hpp
CHANGED
@@ -37,46 +37,38 @@ namespace Gosu
|
|
37
37
|
unsigned width() const;
|
38
38
|
unsigned height() const;
|
39
39
|
|
40
|
-
//! Prepares the graphics object for drawing
|
41
|
-
//!
|
42
|
-
|
43
|
-
//! Every call to begin must have a matching call to end.
|
44
|
-
void end();
|
40
|
+
//! Prepares the graphics object for drawing and then runs the rendering code in f.
|
41
|
+
//! Nothing must be drawn outside of frame() and record().
|
42
|
+
void frame(const std::function<void()>& f);
|
45
43
|
|
46
44
|
//! Flushes the Z queue to the screen and starts a new one.
|
47
|
-
//!
|
45
|
+
//! This can be useful to separate the Z queues of two parts of the game, e.g. the two
|
46
|
+
//! halves of a game that runs in split-screen mode.
|
48
47
|
static void flush();
|
49
48
|
|
50
|
-
//! Finishes all pending Gosu drawing operations and executes
|
51
|
-
//!
|
52
|
-
static void
|
53
|
-
|
54
|
-
static void end_gl();
|
49
|
+
//! Finishes all pending Gosu drawing operations and executes the code in f in a clean
|
50
|
+
//! OpenGL environment.
|
51
|
+
static void gl(const std::function<void()>& f);
|
52
|
+
|
55
53
|
//! Schedules a custom GL functor to be executed at a certain Z level.
|
56
|
-
//! The functor is
|
57
|
-
//! Gosu's rendering up to the Z level may not yet have been glFlush()ed.
|
54
|
+
//! The functor f is run in a clean GL context.
|
58
55
|
//! Note: You may not call any Gosu rendering functions from within the
|
59
|
-
//! functor
|
60
|
-
static void gl(const std::function<void
|
56
|
+
//! functor.
|
57
|
+
static void gl(ZPos z, const std::function<void()>& f);
|
61
58
|
|
62
|
-
//!
|
63
|
-
static void
|
64
|
-
|
65
|
-
static void end_clipping();
|
59
|
+
//! Renders everything drawn in f clipped to a rectangle on the screen.
|
60
|
+
static void clip_to(double x, double y, double width, double height,
|
61
|
+
const std::function<void()>& f);
|
66
62
|
|
67
|
-
//!
|
68
|
-
|
69
|
-
//!
|
70
|
-
|
71
|
-
|
72
|
-
//! it.
|
73
|
-
//! Most usually, the return value is passed to Image::Image().
|
74
|
-
static std::unique_ptr<Gosu::ImageData> end_recording(int width, int height);
|
63
|
+
//! Records a macro and returns it as an ImageData instance.
|
64
|
+
//! Usually, the return value is passed to Image::Image().
|
65
|
+
//! Cannot be nested.
|
66
|
+
static std::unique_ptr<Gosu::ImageData> record(int width, int height,
|
67
|
+
const std::function<void()>& f);
|
75
68
|
|
76
69
|
//! Pushes one transformation onto the transformation stack.
|
77
|
-
static void
|
78
|
-
|
79
|
-
static void pop_transform();
|
70
|
+
static void transform(const Transform& transform,
|
71
|
+
const std::function<void()>& f);
|
80
72
|
|
81
73
|
//! Draws a line from one point to another (last pixel exclusive).
|
82
74
|
//! Note: OpenGL lines are not reliable at all and may have a missing pixel at the start
|
data/Gosu/Version.hpp
CHANGED
data/rdoc/gosu.rb
CHANGED
@@ -381,17 +381,10 @@ module Gosu
|
|
381
381
|
##
|
382
382
|
# Returns an image that is a smaller, rectangular view of this {Image}.
|
383
383
|
#
|
384
|
-
# This is a very fast operation, and no new textures
|
384
|
+
# This is a very fast operation, and no new textures will be allocated.
|
385
385
|
# If you update this {Image} or the {#subimage} using {#insert}, the other {Image} will be affected as well.
|
386
386
|
#
|
387
|
-
# This method can be used to load texture atlases created with third-party tools.
|
388
|
-
# The texture atlas must be a power of two (512x512 or 1024x1024) and loaded with :tileable => true.
|
389
|
-
# The individual {Image}s can then be loaded efficiently with {#subimage}.
|
390
|
-
# {#gl_tex_info} will work on a {#subimage}.
|
391
|
-
#
|
392
387
|
# Caveats:
|
393
|
-
# * {#subimage} only works if the image lives on a single texture.
|
394
|
-
# If the image was too large and had to be split up into several OpenGL textures, subimage will return nil (same as {#gl_tex_info}).
|
395
388
|
# * If you stretch or rotate a {#subimage}, the pixels adjacent to it might bleed into it, as Gosu does not manage the 'tileability' of subimages.
|
396
389
|
#
|
397
390
|
# @return [Image?] an image that represents a portion of the containing image
|
data/src/Audio.cpp
CHANGED
@@ -202,13 +202,13 @@ Gosu::Sample::Sample(Reader reader)
|
|
202
202
|
data.reset(new SampleData(audio_file));
|
203
203
|
}
|
204
204
|
catch (const std::runtime_error& ex) {
|
205
|
+
#ifndef GOSU_IS_MAC
|
205
206
|
if (std::string(ex.what()).find("unknown format") != std::string::npos) {
|
206
207
|
MPEGFile mpeg_file(reader);
|
207
208
|
data.reset(new SampleData(mpeg_file));
|
208
|
-
}
|
209
|
-
|
209
|
+
} else
|
210
|
+
#endif
|
210
211
|
throw ex;
|
211
|
-
}
|
212
212
|
}
|
213
213
|
}
|
214
214
|
|
@@ -374,10 +374,14 @@ public:
|
|
374
374
|
file.reset(new WAVE_FILE(filename));
|
375
375
|
}
|
376
376
|
catch (const std::runtime_error& ex) {
|
377
|
+
#ifndef GOSU_IS_MAC
|
377
378
|
if (std::string(ex.what()).find("unknown format") != std::string::npos) {
|
378
379
|
Gosu::File source_file(filename);
|
379
380
|
file.reset(new MPEGFile(source_file.front_reader()));
|
380
381
|
}
|
382
|
+
else
|
383
|
+
#endif
|
384
|
+
throw ex;
|
381
385
|
}
|
382
386
|
}
|
383
387
|
alGenBuffers(2, buffers);
|
@@ -393,9 +397,13 @@ public:
|
|
393
397
|
file.reset(new WAVE_FILE(reader));
|
394
398
|
}
|
395
399
|
catch (const std::runtime_error& ex) {
|
400
|
+
#ifndef GOSU_IS_MAC
|
396
401
|
if (std::string(ex.what()).find("unknown format") != std::string::npos) {
|
397
402
|
file.reset(new MPEGFile(reader));
|
398
403
|
}
|
404
|
+
else
|
405
|
+
#endif
|
406
|
+
throw ex;
|
399
407
|
}
|
400
408
|
}
|
401
409
|
alGenBuffers(2, buffers);
|
data/src/AudioFile.hpp
CHANGED
@@ -34,7 +34,7 @@ namespace Gosu
|
|
34
34
|
|
35
35
|
const std::vector<char>& decoded_data()
|
36
36
|
{
|
37
|
-
static const
|
37
|
+
static const std::size_t INCREMENT = 512 * 1024;
|
38
38
|
|
39
39
|
if (!data_.empty()) {
|
40
40
|
return data_;
|
@@ -43,7 +43,7 @@ namespace Gosu
|
|
43
43
|
for (;;) {
|
44
44
|
data_.resize(data_.size() + INCREMENT);
|
45
45
|
|
46
|
-
|
46
|
+
auto read_bytes = read_data(&data_[data_.size() - INCREMENT], INCREMENT);
|
47
47
|
|
48
48
|
if (read_bytes < INCREMENT) {
|
49
49
|
data_.resize(data_.size() - INCREMENT + read_bytes);
|
data/src/BitmapIO.cpp
CHANGED
@@ -25,7 +25,7 @@ namespace
|
|
25
25
|
std::size_t remaining = reader->resource().size() - reader->position();
|
26
26
|
std::size_t actual_size = (size < remaining ? size : remaining);
|
27
27
|
reader->read(data, actual_size);
|
28
|
-
return actual_size;
|
28
|
+
return static_cast<int>(actual_size);
|
29
29
|
}
|
30
30
|
|
31
31
|
void skip_callback(void* user, int n)
|
data/src/Font.cpp
CHANGED
@@ -159,7 +159,7 @@ void Gosu::Font::set_image(wchar_t wc, unsigned font_flags, const Image& image)
|
|
159
159
|
void Gosu::Font::draw_rot(const string& text, double x, double y, ZPos z, double angle,
|
160
160
|
double scale_x, double scale_y, Color c, AlphaMode mode) const
|
161
161
|
{
|
162
|
-
Gosu::Graphics::
|
163
|
-
|
164
|
-
|
162
|
+
Gosu::Graphics::transform(rotate(angle, x, y), [&] {
|
163
|
+
draw(text, x, y, z, scale_x, scale_y, c, mode);
|
164
|
+
});
|
165
165
|
}
|
data/src/GosuViewController.cpp
CHANGED
@@ -192,12 +192,10 @@ static void handle_audio_interruption(void* unused, UInt32 inInterruptionState)
|
|
192
192
|
|
193
193
|
if (window.needs_redraw()) {
|
194
194
|
[self.GLView redrawGL:^{
|
195
|
-
|
195
|
+
window.graphics().frame([&window] {
|
196
196
|
window.draw();
|
197
|
-
window.graphics().end();
|
198
|
-
|
199
197
|
Gosu::FPS::register_frame();
|
200
|
-
}
|
198
|
+
});
|
201
199
|
}];
|
202
200
|
}
|
203
201
|
|
data/src/Graphics.cpp
CHANGED
@@ -62,6 +62,35 @@ struct Gosu::Graphics::Impl
|
|
62
62
|
Transform translate_transform = translate(black_width, black_height);
|
63
63
|
base_transform = concat(translate_transform, scale_transform);
|
64
64
|
}
|
65
|
+
|
66
|
+
#ifndef GOSU_IS_OPENGLES
|
67
|
+
void begin_gl()
|
68
|
+
{
|
69
|
+
glPushAttrib(GL_ALL_ATTRIB_BITS);
|
70
|
+
glDisable(GL_BLEND);
|
71
|
+
// Reset the colour to white to avoid surprises.
|
72
|
+
// https://www.libgosu.org/cgi-bin/mwf/topic_show.pl?pid=9115#pid9115
|
73
|
+
glColor4ubv(reinterpret_cast<const GLubyte*>(&Color::WHITE));
|
74
|
+
while (glGetError() != GL_NO_ERROR);
|
75
|
+
}
|
76
|
+
|
77
|
+
void end_gl()
|
78
|
+
{
|
79
|
+
glPopAttrib();
|
80
|
+
|
81
|
+
// Restore matrices.
|
82
|
+
// TODO: Should be merged into RenderState and removed from Graphics.
|
83
|
+
|
84
|
+
glMatrixMode(GL_PROJECTION);
|
85
|
+
glLoadIdentity();
|
86
|
+
glViewport(0, 0, phys_width, phys_height);
|
87
|
+
glOrtho(0, phys_width, phys_height, 0, -1, 1);
|
88
|
+
|
89
|
+
glMatrixMode(GL_MODELVIEW);
|
90
|
+
glLoadIdentity();
|
91
|
+
glEnable(GL_BLEND);
|
92
|
+
}
|
93
|
+
#endif
|
65
94
|
};
|
66
95
|
|
67
96
|
Gosu::Graphics::Graphics(unsigned phys_width, unsigned phys_height)
|
@@ -112,7 +141,7 @@ void Gosu::Graphics::set_resolution(unsigned virtual_width, unsigned virtual_hei
|
|
112
141
|
pimpl->update_base_transform();
|
113
142
|
}
|
114
143
|
|
115
|
-
|
144
|
+
void Gosu::Graphics::frame(const std::function<void()>& f)
|
116
145
|
{
|
117
146
|
if (current_graphics_pointer != nullptr) {
|
118
147
|
throw std::logic_error("Cannot nest calls to Gosu::Graphics::begin()");
|
@@ -135,17 +164,13 @@ bool Gosu::Graphics::begin(Gosu::Color clear_with_color)
|
|
135
164
|
|
136
165
|
queues.back().set_base_transform(pimpl->base_transform);
|
137
166
|
|
138
|
-
glClearColor(
|
139
|
-
clear_with_color.blue() / 255.f, clear_with_color.alpha() / 255.f);
|
167
|
+
glClearColor(0, 0, 0, 1);
|
140
168
|
glClear(GL_COLOR_BUFFER_BIT);
|
141
169
|
|
142
170
|
current_graphics_pointer = this;
|
143
171
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
void Gosu::Graphics::end()
|
148
|
-
{
|
172
|
+
f();
|
173
|
+
|
149
174
|
// If recording is in process, cancel it.
|
150
175
|
while (current_queue().recording()) {
|
151
176
|
queues.pop_back();
|
@@ -164,7 +189,7 @@ void Gosu::Graphics::end()
|
|
164
189
|
0, height() + pimpl->black_height, Color::BLACK,
|
165
190
|
width(), height() + pimpl->black_height, Color::BLACK, 0);
|
166
191
|
}
|
167
|
-
|
192
|
+
if (pimpl->black_width) {
|
168
193
|
draw_quad(-pimpl->black_width, 0, Color::BLACK,
|
169
194
|
0, 0, Color::BLACK,
|
170
195
|
-pimpl->black_width, height(), Color::BLACK,
|
@@ -197,121 +222,68 @@ void Gosu::Graphics::flush()
|
|
197
222
|
current_queue().clear_queue();
|
198
223
|
}
|
199
224
|
|
200
|
-
void Gosu::Graphics::
|
225
|
+
void Gosu::Graphics::gl(const std::function<void()>& f)
|
201
226
|
{
|
202
227
|
if (current_queue().recording()) {
|
203
228
|
throw std::logic_error("Custom OpenGL is not allowed while creating a macro");
|
204
229
|
}
|
205
230
|
|
206
|
-
#ifdef GOSU_IS_OPENGLES
|
207
|
-
throw std::logic_error("Custom OpenGL ES is not supported yet");
|
208
|
-
#else
|
209
|
-
flush();
|
210
|
-
glPushAttrib(GL_ALL_ATTRIB_BITS);
|
211
|
-
glDisable(GL_BLEND);
|
212
|
-
while (glGetError() != GL_NO_ERROR);
|
213
|
-
#endif
|
214
|
-
}
|
215
|
-
|
216
|
-
void Gosu::Graphics::end_gl()
|
217
|
-
{
|
218
231
|
#ifdef GOSU_IS_OPENGLES
|
219
232
|
throw std::logic_error("Custom OpenGL ES is not supported yet");
|
220
233
|
#else
|
221
234
|
Graphics& cg = current_graphics();
|
222
|
-
|
223
|
-
glPopAttrib();
|
224
235
|
|
225
|
-
|
226
|
-
|
236
|
+
flush();
|
237
|
+
|
238
|
+
cg.pimpl->begin_gl();
|
227
239
|
|
228
|
-
|
229
|
-
glLoadIdentity();
|
230
|
-
glViewport(0, 0, cg.pimpl->phys_width, cg.pimpl->phys_height);
|
231
|
-
glOrtho(0, cg.pimpl->phys_width, cg.pimpl->phys_height, 0, -1, 1);
|
240
|
+
f();
|
232
241
|
|
233
|
-
|
234
|
-
glLoadIdentity();
|
235
|
-
glEnable(GL_BLEND);
|
242
|
+
cg.pimpl->end_gl();
|
236
243
|
#endif
|
237
244
|
}
|
238
245
|
|
239
|
-
|
240
|
-
void Gosu::Graphics::gl(const std::function<void ()>& functor, Gosu::ZPos z)
|
246
|
+
void Gosu::Graphics::gl(Gosu::ZPos z, const std::function<void ()>& f)
|
241
247
|
{
|
248
|
+
#ifdef GOSU_IS_OPENGLES
|
242
249
|
throw std::logic_error("Custom OpenGL ES is not supported yet");
|
243
|
-
}
|
244
250
|
#else
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
RunGLFunctor(Graphics& graphics, const std::function<void ()>& functor)
|
253
|
-
: graphics(graphics), functor(functor)
|
254
|
-
{
|
255
|
-
}
|
256
|
-
|
257
|
-
void operator()() const
|
258
|
-
{
|
259
|
-
// Duplicated from begin_gl() (which we don't call, to avoid flushing).
|
260
|
-
glPushAttrib(GL_ALL_ATTRIB_BITS);
|
261
|
-
glDisable(GL_BLEND);
|
262
|
-
// Reset the colour to white to avoid surprises.
|
263
|
-
// https://www.libgosu.org/cgi-bin/mwf/topic_show.pl?pid=9115#pid9115
|
264
|
-
glColor4ubv(reinterpret_cast<const GLubyte*>(&Color::WHITE));
|
265
|
-
while (glGetError() != GL_NO_ERROR);
|
266
|
-
|
267
|
-
functor();
|
268
|
-
|
269
|
-
graphics.end_gl();
|
270
|
-
}
|
271
|
-
};
|
272
|
-
}
|
273
|
-
|
274
|
-
void Gosu::Graphics::gl(const std::function<void ()>& functor, Gosu::ZPos z)
|
275
|
-
{
|
276
|
-
current_queue().gl(RunGLFunctor(current_graphics(), functor), z);
|
277
|
-
}
|
251
|
+
current_queue().gl([f] {
|
252
|
+
Graphics& cg = current_graphics();
|
253
|
+
cg.pimpl->begin_gl();
|
254
|
+
f();
|
255
|
+
cg.pimpl->end_gl();
|
256
|
+
}, z);
|
278
257
|
#endif
|
258
|
+
}
|
279
259
|
|
280
|
-
void Gosu::Graphics::
|
260
|
+
void Gosu::Graphics::clip_to(double x, double y, double width, double height,
|
261
|
+
const std::function<void()>& f)
|
281
262
|
{
|
282
263
|
double screen_height = current_graphics().pimpl->phys_height;
|
283
264
|
current_queue().begin_clipping(x, y, width, height, screen_height);
|
284
|
-
|
285
|
-
|
286
|
-
void Gosu::Graphics::end_clipping()
|
287
|
-
{
|
265
|
+
f();
|
288
266
|
current_queue().end_clipping();
|
289
267
|
}
|
290
268
|
|
291
|
-
|
269
|
+
std::unique_ptr<Gosu::ImageData> Gosu::Graphics::record(int width, int height,
|
270
|
+
const std::function<void()>& f)
|
292
271
|
{
|
293
272
|
queues.resize(queues.size() + 1);
|
294
273
|
current_queue().set_recording();
|
295
|
-
}
|
296
274
|
|
297
|
-
|
298
|
-
{
|
299
|
-
if (!current_queue().recording()) {
|
300
|
-
throw std::logic_error("No macro recording in progress that can be captured");
|
301
|
-
}
|
275
|
+
f();
|
302
276
|
|
303
277
|
std::unique_ptr<ImageData> result(new Macro(current_queue(), width, height));
|
304
278
|
queues.pop_back();
|
305
279
|
return result;
|
306
280
|
}
|
307
281
|
|
308
|
-
void Gosu::Graphics::
|
282
|
+
void Gosu::Graphics::transform(const Gosu::Transform& transform,
|
283
|
+
const std::function<void()>& f)
|
309
284
|
{
|
310
285
|
current_queue().push_transform(transform);
|
311
|
-
|
312
|
-
|
313
|
-
void Gosu::Graphics::pop_transform()
|
314
|
-
{
|
286
|
+
f();
|
315
287
|
current_queue().pop_transform();
|
316
288
|
}
|
317
289
|
|
data/src/GraphicsImpl.hpp
CHANGED
data/src/LargeImageData.cpp
CHANGED
@@ -1,35 +1,37 @@
|
|
1
1
|
#include "LargeImageData.hpp"
|
2
|
-
#include "GraphicsImpl.hpp"
|
3
2
|
#include <Gosu/Bitmap.hpp>
|
4
3
|
#include <Gosu/Graphics.hpp>
|
5
4
|
#include <Gosu/Math.hpp>
|
6
5
|
#include <cmath>
|
7
6
|
using namespace std;
|
8
7
|
|
9
|
-
Gosu::LargeImageData::LargeImageData(const Bitmap& source,
|
10
|
-
|
8
|
+
Gosu::LargeImageData::LargeImageData(const Bitmap& source, int tile_width, int tile_height,
|
9
|
+
unsigned image_flags)
|
11
10
|
{
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
this
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
11
|
+
w = source.width();
|
12
|
+
h = source.height();
|
13
|
+
tiles_x = static_cast<int>(ceil(1.0 * w / tile_width));
|
14
|
+
tiles_y = static_cast<int>(ceil(1.0 * h / tile_height));
|
15
|
+
|
16
|
+
// When there are no tiles, set both fields to 0 to avoid entering any for() loop in this class.
|
17
|
+
if (tiles_x == 0 || tiles_y == 0) {
|
18
|
+
tiles_x = tiles_y = 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
tiles.reserve(tiles_x * tiles_y);
|
22
|
+
|
23
|
+
for (int y = 0; y < tiles_y; ++y) {
|
24
|
+
for (int x = 0; x < tiles_x; ++x) {
|
25
|
+
int src_width = tile_width;
|
26
|
+
if (x == tiles_x - 1 && w % tile_width != 0) {
|
27
|
+
// The right-most parts don't necessarily have the full width.
|
28
|
+
src_width = w % tile_width;
|
27
29
|
}
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
src_height =
|
31
|
+
int src_height = tile_height;
|
32
|
+
if (y == tiles_y - 1 && h % tile_height != 0) {
|
33
|
+
// Same for the parts on the bottom.
|
34
|
+
src_height = h % tile_height;
|
33
35
|
}
|
34
36
|
|
35
37
|
unsigned local_flags = IF_TILEABLE | image_flags;
|
@@ -40,7 +42,7 @@ Gosu::LargeImageData::LargeImageData(const Bitmap& source,
|
|
40
42
|
local_flags |= (image_flags & IF_TILEABLE_LEFT);
|
41
43
|
}
|
42
44
|
// Right edge, only tileable if requested in image_flags.
|
43
|
-
if (x ==
|
45
|
+
if (x == tiles_x - 1) {
|
44
46
|
local_flags &= ~IF_TILEABLE_RIGHT;
|
45
47
|
local_flags |= (image_flags & IF_TILEABLE_RIGHT);
|
46
48
|
}
|
@@ -50,102 +52,156 @@ Gosu::LargeImageData::LargeImageData(const Bitmap& source,
|
|
50
52
|
local_flags |= (image_flags & IF_TILEABLE_TOP);
|
51
53
|
}
|
52
54
|
// Bottom edge, only tileable if requested in image_flags.
|
53
|
-
if (y ==
|
55
|
+
if (y == tiles_y - 1) {
|
54
56
|
local_flags &= ~IF_TILEABLE_BOTTOM;
|
55
57
|
local_flags |= (image_flags & IF_TILEABLE_BOTTOM);
|
56
58
|
}
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
local_flags).release());
|
60
|
+
tiles.emplace_back(Graphics::create_image(source,
|
61
|
+
x * tile_width, y * tile_height,
|
62
|
+
src_width, src_height, local_flags));
|
62
63
|
}
|
63
64
|
}
|
64
65
|
}
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
int Gosu::LargeImageData::height() const
|
67
|
+
void Gosu::LargeImageData::draw(double x1, double y1, Color c1,
|
68
|
+
double x2, double y2, Color c2,
|
69
|
+
double x3, double y3, Color c3,
|
70
|
+
double x4, double y4, Color c4,
|
71
|
+
ZPos z, AlphaMode mode) const
|
72
72
|
{
|
73
|
-
|
73
|
+
normalize_coordinates(x1, y1, x2, y2, x3, y3, c3, x4, y4, c4);
|
74
|
+
|
75
|
+
double y = 0;
|
76
|
+
for (int ty = 0; ty < tiles_y; ++ty) {
|
77
|
+
double x = 0;
|
78
|
+
for (int tx = 0; tx < tiles_x; ++tx) {
|
79
|
+
ImageData& tile = *tiles[ty * tiles_x + tx];
|
80
|
+
|
81
|
+
double rel_x_l = x / w;
|
82
|
+
double rel_x_r = (x + tile.width()) / w;
|
83
|
+
double rel_y_t = y / h;
|
84
|
+
double rel_y_b = (y + tile.height()) / h;
|
85
|
+
|
86
|
+
#define INTERPOLATE(what, x_weight, y_weight) \
|
87
|
+
interpolate(interpolate(what##1, what##3, y_weight), \
|
88
|
+
interpolate(what##2, what##4, y_weight), \
|
89
|
+
x_weight);
|
90
|
+
|
91
|
+
double x_t_l = INTERPOLATE(x, rel_x_l, rel_y_t);
|
92
|
+
double x_t_r = INTERPOLATE(x, rel_x_r, rel_y_t);
|
93
|
+
double x_b_l = INTERPOLATE(x, rel_x_l, rel_y_b);
|
94
|
+
double x_b_r = INTERPOLATE(x, rel_x_r, rel_y_b);
|
95
|
+
|
96
|
+
double y_t_l = INTERPOLATE(y, rel_x_l, rel_y_t);
|
97
|
+
double y_t_r = INTERPOLATE(y, rel_x_r, rel_y_t);
|
98
|
+
double y_b_l = INTERPOLATE(y, rel_x_l, rel_y_b);
|
99
|
+
double y_b_r = INTERPOLATE(y, rel_x_r, rel_y_b);
|
100
|
+
|
101
|
+
Color c_t_l = INTERPOLATE(c, rel_x_l, rel_y_t);
|
102
|
+
Color c_t_r = INTERPOLATE(c, rel_x_r, rel_y_t);
|
103
|
+
Color c_b_l = INTERPOLATE(c, rel_x_l, rel_y_b);
|
104
|
+
Color c_b_r = INTERPOLATE(c, rel_x_r, rel_y_b);
|
105
|
+
|
106
|
+
tile.draw(x_t_l, y_t_l, c_t_l,
|
107
|
+
x_t_r, y_t_r, c_t_r,
|
108
|
+
x_b_l, y_b_l, c_b_l,
|
109
|
+
x_b_r, y_b_r, c_b_r,
|
110
|
+
z, mode);
|
111
|
+
|
112
|
+
x += tile.width();
|
113
|
+
}
|
114
|
+
y += tiles[ty * tiles_x]->height();
|
115
|
+
}
|
74
116
|
}
|
75
117
|
|
76
|
-
|
118
|
+
unique_ptr<Gosu::ImageData>
|
119
|
+
Gosu::LargeImageData::subimage(int left, int top, int width, int height) const
|
77
120
|
{
|
78
|
-
|
79
|
-
|
80
|
-
double ipl(double a, double b, double ratio)
|
81
|
-
{
|
82
|
-
return a + (b - a) * ratio;
|
121
|
+
if (left < 0 || top < 0 || left + width > w || top + height > h) {
|
122
|
+
throw invalid_argument("subimage bounds exceed those of its parent");
|
83
123
|
}
|
84
|
-
|
85
|
-
|
86
|
-
{
|
87
|
-
Gosu::Color result;
|
88
|
-
result.set_alpha(Gosu::round(ipl(a.alpha(), b.alpha(), ratio)));
|
89
|
-
result.set_red (Gosu::round(ipl(a.red(), b.red(), ratio)));
|
90
|
-
result.set_green(Gosu::round(ipl(a.green(), b.green(), ratio)));
|
91
|
-
result.set_blue (Gosu::round(ipl(a.blue(), b.blue(), ratio)));
|
92
|
-
return result;
|
124
|
+
if (width <= 0 || height <= 0) {
|
125
|
+
throw invalid_argument("cannot create empty image");
|
93
126
|
}
|
94
|
-
}
|
95
|
-
|
96
|
-
void Gosu::LargeImageData::draw(double x1, double y1, Color c1, double x2, double y2, Color c2,
|
97
|
-
double x3, double y3, Color c3, double x4, double y4, Color c4, ZPos z, AlphaMode mode) const
|
98
|
-
{
|
99
|
-
if (parts.empty()) return;
|
100
|
-
|
101
|
-
normalize_coordinates(x1, y1, x2, y2, x3, y3, c3, x4, y4, c4);
|
102
127
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
double abs_x_t_r = ipl(ipl(x1, x3, rel_y_t), ipl(x2, x4, rel_y_t), rel_x_r);
|
114
|
-
double abs_x_b_l = ipl(ipl(x1, x3, rel_y_b), ipl(x2, x4, rel_y_b), rel_x_l);
|
115
|
-
double abs_x_b_r = ipl(ipl(x1, x3, rel_y_b), ipl(x2, x4, rel_y_b), rel_x_r);
|
116
|
-
|
117
|
-
double abs_y_t_l = ipl(ipl(y1, y3, rel_y_t), ipl(y2, y4, rel_y_t), rel_x_l);
|
118
|
-
double abs_y_t_r = ipl(ipl(y1, y3, rel_y_t), ipl(y2, y4, rel_y_t), rel_x_r);
|
119
|
-
double abs_y_b_l = ipl(ipl(y1, y3, rel_y_b), ipl(y2, y4, rel_y_b), rel_x_l);
|
120
|
-
double abs_y_b_r = ipl(ipl(y1, y3, rel_y_b), ipl(y2, y4, rel_y_b), rel_x_r);
|
121
|
-
|
122
|
-
Color abs_c_t_l = ipl(ipl(c1, c3, rel_y_t), ipl(c2, c4, rel_y_t), rel_x_l);
|
123
|
-
Color abs_c_t_r = ipl(ipl(c1, c3, rel_y_t), ipl(c2, c4, rel_y_t), rel_x_r);
|
124
|
-
Color abs_c_b_l = ipl(ipl(c1, c3, rel_y_b), ipl(c2, c4, rel_y_b), rel_x_l);
|
125
|
-
Color abs_c_b_r = ipl(ipl(c1, c3, rel_y_b), ipl(c2, c4, rel_y_b), rel_x_r);
|
126
|
-
|
127
|
-
part.draw(abs_x_t_l, abs_y_t_l, abs_c_t_l, abs_x_t_r, abs_y_t_r, abs_c_t_r,
|
128
|
-
abs_x_b_l, abs_y_b_l, abs_c_b_l, abs_x_b_r, abs_y_b_r, abs_c_b_r, z, mode);
|
128
|
+
int sub_tiles_y = 0;
|
129
|
+
vector<unique_ptr<ImageData>> sub_tiles;
|
130
|
+
|
131
|
+
int y = 0;
|
132
|
+
for (int ty = 0; ty < tiles_y; ++ty) {
|
133
|
+
int row_height = tiles[ty * tiles_x]->height();
|
134
|
+
|
135
|
+
if (y + row_height <= top) {
|
136
|
+
y += tiles[ty * tiles_x]->height();
|
137
|
+
continue;
|
129
138
|
}
|
139
|
+
if (y >= top + height) break;
|
140
|
+
|
141
|
+
sub_tiles_y += 1;
|
142
|
+
|
143
|
+
int x = 0;
|
144
|
+
for (int tx = 0; tx < tiles_x; ++tx) {
|
145
|
+
ImageData& tile = *tiles[ty * tiles_x + tx];
|
146
|
+
|
147
|
+
if (x + tile.width() <= left) {
|
148
|
+
x += tile.width();
|
149
|
+
continue;
|
150
|
+
}
|
151
|
+
if (x >= left + width) break;
|
152
|
+
|
153
|
+
int sub_left = max(0, left - x);
|
154
|
+
int sub_top = max(0, top - y);
|
155
|
+
int sub_right = min(tile.width(), left + width - x);
|
156
|
+
int sub_bottom = min(tile.height(), top + height - y);
|
157
|
+
|
158
|
+
sub_tiles.emplace_back(tile.subimage(sub_left, sub_top, sub_right - sub_left, sub_bottom - sub_top));
|
159
|
+
|
160
|
+
x += tile.width();
|
161
|
+
}
|
162
|
+
y += tiles[ty * tiles_x]->height();
|
163
|
+
}
|
164
|
+
|
165
|
+
if (sub_tiles.size() == 1) {
|
166
|
+
return move(sub_tiles[0]);
|
167
|
+
}
|
168
|
+
else {
|
169
|
+
unique_ptr<LargeImageData> result(new LargeImageData());
|
170
|
+
result->w = width;
|
171
|
+
result->h = height;
|
172
|
+
result->tiles_x = static_cast<int>(sub_tiles.size()) / sub_tiles_y;
|
173
|
+
result->tiles_y = sub_tiles_y;
|
174
|
+
result->tiles.swap(sub_tiles);
|
175
|
+
return move(result);
|
130
176
|
}
|
131
177
|
}
|
132
178
|
|
133
179
|
Gosu::Bitmap Gosu::LargeImageData::to_bitmap() const
|
134
180
|
{
|
135
181
|
Bitmap bitmap(width(), height());
|
136
|
-
|
137
|
-
|
138
|
-
|
182
|
+
int y = 0;
|
183
|
+
for (int ty = 0; ty < tiles_y; ++ty) {
|
184
|
+
int x = 0;
|
185
|
+
for (int tx = 0; tx < tiles_x; ++tx) {
|
186
|
+
ImageData& tile = *tiles[ty * tiles_x + tx];
|
187
|
+
bitmap.insert(tile.to_bitmap(), x, y);
|
188
|
+
x += tile.width();
|
139
189
|
}
|
190
|
+
y += tiles[ty * tiles_x]->height();
|
140
191
|
}
|
141
192
|
return bitmap;
|
142
193
|
}
|
143
194
|
|
144
195
|
void Gosu::LargeImageData::insert(const Bitmap& bitmap, int at_x, int at_y)
|
145
196
|
{
|
146
|
-
|
147
|
-
|
148
|
-
|
197
|
+
int y = 0;
|
198
|
+
for (int ty = 0; ty < tiles_y; ++ty) {
|
199
|
+
int x = 0;
|
200
|
+
for (int tx = 0; tx < tiles_x; ++tx) {
|
201
|
+
ImageData& tile = *tiles[ty * tiles_x + tx];
|
202
|
+
tile.insert(bitmap, at_x - x, at_y - y);
|
203
|
+
x += tile.width();
|
149
204
|
}
|
205
|
+
y += tiles[ty * tiles_x]->height();
|
150
206
|
}
|
151
207
|
}
|
data/src/LargeImageData.hpp
CHANGED
@@ -1,43 +1,37 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
+
#include "GraphicsImpl.hpp"
|
3
4
|
#include <Gosu/Fwd.hpp>
|
4
5
|
#include <Gosu/ImageData.hpp>
|
5
6
|
#include <Gosu/Platform.hpp>
|
6
7
|
#include <memory>
|
7
8
|
#include <vector>
|
8
9
|
|
9
|
-
|
10
|
+
class Gosu::LargeImageData : public Gosu::ImageData
|
10
11
|
{
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
std::vector<std::shared_ptr<ImageData>> parts;
|
12
|
+
int w, h;
|
13
|
+
int tiles_x, tiles_y;
|
14
|
+
std::vector<std::unique_ptr<ImageData>> tiles;
|
15
|
+
|
16
|
+
LargeImageData() {}
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
unsigned image_flags);
|
18
|
+
public:
|
19
|
+
LargeImageData(const Bitmap& source, int tile_width, int tile_height, unsigned image_flags);
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
int width() const override { return w; }
|
22
|
+
int height() const override { return h; }
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
void draw(double x1, double y1, Color c1,
|
25
|
+
double x2, double y2, Color c2,
|
26
|
+
double x3, double y3, Color c3,
|
27
|
+
double x4, double y4, Color c4,
|
28
|
+
ZPos z, AlphaMode mode) const override;
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
}
|
38
|
-
|
39
|
-
Bitmap to_bitmap() const override;
|
40
|
-
|
41
|
-
void insert(const Bitmap& bitmap, int x, int y) override;
|
42
|
-
};
|
43
|
-
}
|
30
|
+
const GLTexInfo* gl_tex_info() const override { return nullptr; }
|
31
|
+
|
32
|
+
std::unique_ptr<ImageData> subimage(int x, int y, int width, int height) const override;
|
33
|
+
|
34
|
+
Bitmap to_bitmap() const override;
|
35
|
+
|
36
|
+
void insert(const Bitmap& bitmap, int x, int y) override;
|
37
|
+
};
|
data/src/Macro.cpp
CHANGED
@@ -211,7 +211,7 @@ void Gosu::Macro::draw(double x1, double y1, Color c1, double x2, double y2, Col
|
|
211
211
|
normalize_coordinates(x1, y1, x2, y2, x3, y3, c3, x4, y4, c4);
|
212
212
|
|
213
213
|
std::function<void ()> f = [=] { pimpl->draw_vertex_arrays(x1, y1, x2, y2, x3, y3, x4, y4); };
|
214
|
-
Gosu::Graphics::gl(
|
214
|
+
Gosu::Graphics::gl(z, f);
|
215
215
|
}
|
216
216
|
|
217
217
|
const Gosu::GLTexInfo* Gosu::Macro::gl_tex_info() const
|
data/src/RubyGosu.cxx
CHANGED
@@ -2400,30 +2400,24 @@ namespace Gosu
|
|
2400
2400
|
|
2401
2401
|
void unsafe_gl()
|
2402
2402
|
{
|
2403
|
-
Gosu::Graphics::
|
2404
|
-
rb_yield(Qnil);
|
2405
|
-
Gosu::Graphics::end_gl();
|
2403
|
+
Gosu::Graphics::gl([] { rb_yield(Qnil); });
|
2406
2404
|
}
|
2407
2405
|
|
2408
2406
|
void unsafe_gl(Gosu::ZPos z)
|
2409
2407
|
{
|
2410
2408
|
VALUE block = rb_block_proc();
|
2411
|
-
Gosu::Graphics::gl([block] {
|
2409
|
+
Gosu::Graphics::gl(z, [block] {
|
2412
2410
|
Gosu::call_ruby_block(block);
|
2413
|
-
}
|
2411
|
+
});
|
2414
2412
|
}
|
2415
2413
|
|
2416
2414
|
void clip_to(double x, double y, double width, double height)
|
2417
2415
|
{
|
2418
|
-
Gosu::Graphics::
|
2419
|
-
rb_yield(Qnil);
|
2420
|
-
Gosu::Graphics::end_clipping();
|
2416
|
+
Gosu::Graphics::clip_to(x, y, width, height, [] { rb_yield(Qnil); });
|
2421
2417
|
}
|
2422
2418
|
|
2423
2419
|
Gosu::Image* record(int width, int height) {
|
2424
|
-
Gosu::Graphics::
|
2425
|
-
rb_yield(Qnil);
|
2426
|
-
return new Gosu::Image(Gosu::Graphics::end_recording(width, height));
|
2420
|
+
return new Gosu::Image(Gosu::Graphics::record(width, height, [] { rb_yield(Qnil); }));
|
2427
2421
|
}
|
2428
2422
|
|
2429
2423
|
// This method cannot be called "transform" because then it would be an ambiguous overload of
|
@@ -2437,44 +2431,38 @@ namespace Gosu
|
|
2437
2431
|
Gosu::Transform transform = {
|
2438
2432
|
m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15
|
2439
2433
|
};
|
2440
|
-
Gosu::Graphics::
|
2441
|
-
|
2442
|
-
Gosu::Graphics::pop_transform();
|
2434
|
+
Gosu::Graphics::transform(transform,
|
2435
|
+
[] { rb_yield(Qnil); });
|
2443
2436
|
}
|
2444
2437
|
|
2445
2438
|
void rotate_for_ruby(double angle, double around_x = 0, double around_y = 0)
|
2446
2439
|
{
|
2447
|
-
Gosu::Graphics::
|
2448
|
-
|
2449
|
-
Gosu::Graphics::pop_transform();
|
2440
|
+
Gosu::Graphics::transform(Gosu::rotate(angle, around_x, around_y),
|
2441
|
+
[] { rb_yield(Qnil); });
|
2450
2442
|
}
|
2451
2443
|
|
2452
2444
|
void scale_for_ruby(double factor)
|
2453
2445
|
{
|
2454
|
-
Gosu::Graphics::
|
2455
|
-
|
2456
|
-
Gosu::Graphics::pop_transform();
|
2446
|
+
Gosu::Graphics::transform(Gosu::scale(factor),
|
2447
|
+
[] { rb_yield(Qnil); });
|
2457
2448
|
}
|
2458
2449
|
|
2459
2450
|
void scale_for_ruby(double scale_x, double scale_y)
|
2460
2451
|
{
|
2461
|
-
Gosu::Graphics::
|
2462
|
-
|
2463
|
-
Gosu::Graphics::pop_transform();
|
2452
|
+
Gosu::Graphics::transform(Gosu::scale(scale_x, scale_y),
|
2453
|
+
[] { rb_yield(Qnil); });
|
2464
2454
|
}
|
2465
2455
|
|
2466
2456
|
void scale_for_ruby(double scale_x, double scale_y, double around_x, double around_y)
|
2467
2457
|
{
|
2468
|
-
Gosu::Graphics::
|
2469
|
-
|
2470
|
-
Gosu::Graphics::pop_transform();
|
2458
|
+
Gosu::Graphics::transform(Gosu::scale(scale_x, scale_y, around_x, around_y),
|
2459
|
+
[] { rb_yield(Qnil); });
|
2471
2460
|
}
|
2472
2461
|
|
2473
2462
|
void translate_for_ruby(double x, double y)
|
2474
2463
|
{
|
2475
|
-
Gosu::Graphics::
|
2476
|
-
|
2477
|
-
Gosu::Graphics::pop_transform();
|
2464
|
+
Gosu::Graphics::transform(Gosu::translate(x, y),
|
2465
|
+
[] { rb_yield(Qnil); });
|
2478
2466
|
}
|
2479
2467
|
}
|
2480
2468
|
|
@@ -11638,8 +11626,8 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11638
11626
|
rb_define_const(mGosu, "VERSION", SWIG_From_std_string(static_cast< std::string >(Gosu::VERSION)));
|
11639
11627
|
rb_define_const(mGosu, "LICENSES", SWIG_From_std_string(static_cast< std::string >(Gosu::LICENSES)));
|
11640
11628
|
rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11641
|
-
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(
|
11642
|
-
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(
|
11629
|
+
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(12)));
|
11630
|
+
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11643
11631
|
rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
|
11644
11632
|
rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
|
11645
11633
|
rb_define_module_function(mGosu, "degrees_to_radians", VALUEFUNC(_wrap_degrees_to_radians), -1);
|
data/src/TexChunk.cpp
CHANGED
@@ -3,27 +3,35 @@
|
|
3
3
|
#include "Texture.hpp"
|
4
4
|
#include <Gosu/Bitmap.hpp>
|
5
5
|
#include <Gosu/Graphics.hpp>
|
6
|
+
using namespace std;
|
6
7
|
|
7
8
|
void Gosu::TexChunk::set_tex_info()
|
8
9
|
{
|
10
|
+
double texture_size = texture->size();
|
11
|
+
|
9
12
|
info.tex_name = texture->tex_name();
|
10
|
-
|
11
|
-
info.
|
12
|
-
info.
|
13
|
-
info.right = (x + w) / texture_size;
|
13
|
+
info.left = x / texture_size;
|
14
|
+
info.top = y / texture_size;
|
15
|
+
info.right = (x + w) / texture_size;
|
14
16
|
info.bottom = (y + h) / texture_size;
|
15
17
|
}
|
16
18
|
|
17
|
-
Gosu::TexChunk::TexChunk(
|
19
|
+
Gosu::TexChunk::TexChunk(shared_ptr<Texture> texture, int x, int y, int w, int h, int padding)
|
18
20
|
: texture(texture), x(x), y(y), w(w), h(h), padding(padding)
|
19
21
|
{
|
20
22
|
set_tex_info();
|
21
23
|
}
|
22
24
|
|
23
|
-
Gosu::TexChunk::TexChunk(const TexChunk&
|
24
|
-
: texture(
|
25
|
-
padding(0)
|
25
|
+
Gosu::TexChunk::TexChunk(const TexChunk& parent, int x, int y, int w, int h)
|
26
|
+
: texture(parent.texture), x(parent.x + x), y(parent.y + y), w(w), h(h), padding(0)
|
26
27
|
{
|
28
|
+
if (x < 0 || y < 0 || x + w > parent.w || y + h > parent.h) {
|
29
|
+
throw invalid_argument("subimage bounds exceed those of its parent");
|
30
|
+
}
|
31
|
+
if (w <= 0 || h <= 0) {
|
32
|
+
throw invalid_argument("cannot create empty image");
|
33
|
+
}
|
34
|
+
|
27
35
|
set_tex_info();
|
28
36
|
texture->block(this->x, this->y, this->w, this->h);
|
29
37
|
}
|
@@ -62,9 +70,9 @@ void Gosu::TexChunk::draw(double x1, double y1, Color c1, double x2, double y2,
|
|
62
70
|
Graphics::schedule_draw_op(op);
|
63
71
|
}
|
64
72
|
|
65
|
-
|
73
|
+
unique_ptr<Gosu::ImageData> Gosu::TexChunk::subimage(int x, int y, int width, int height) const
|
66
74
|
{
|
67
|
-
return
|
75
|
+
return unique_ptr<Gosu::ImageData>(new TexChunk(*this, x, y, width, height));
|
68
76
|
}
|
69
77
|
|
70
78
|
Gosu::Bitmap Gosu::TexChunk::to_bitmap() const
|
@@ -72,15 +80,8 @@ Gosu::Bitmap Gosu::TexChunk::to_bitmap() const
|
|
72
80
|
return texture->to_bitmap(x, y, w, h);
|
73
81
|
}
|
74
82
|
|
75
|
-
std::unique_ptr<Gosu::ImageData> Gosu::TexChunk::subimage(int x, int y, int width, int height) const
|
76
|
-
{
|
77
|
-
return std::unique_ptr<Gosu::ImageData>(new TexChunk(*this, x, y, width, height));
|
78
|
-
}
|
79
|
-
|
80
83
|
void Gosu::TexChunk::insert(const Bitmap& original, int x, int y)
|
81
84
|
{
|
82
|
-
// TODO: Should respect border_flags.
|
83
|
-
|
84
85
|
Bitmap alternate;
|
85
86
|
const Bitmap* bitmap = &original;
|
86
87
|
|
data/src/TexChunk.hpp
CHANGED
@@ -5,46 +5,37 @@
|
|
5
5
|
#include <Gosu/ImageData.hpp>
|
6
6
|
#include <memory>
|
7
7
|
#include <stdexcept>
|
8
|
-
#include <vector>
|
9
8
|
|
10
9
|
class Gosu::TexChunk : public Gosu::ImageData
|
11
10
|
{
|
12
11
|
std::shared_ptr<Texture> texture;
|
13
12
|
int x, y, w, h, padding;
|
14
13
|
|
15
|
-
// Cached for faster access.
|
16
14
|
GLTexInfo info;
|
17
15
|
|
18
16
|
void set_tex_info();
|
19
17
|
|
20
18
|
public:
|
21
19
|
TexChunk(std::shared_ptr<Texture> texture, int x, int y, int w, int h, int padding);
|
22
|
-
TexChunk(const TexChunk&
|
23
|
-
~TexChunk();
|
20
|
+
TexChunk(const TexChunk& parent, int x, int y, int w, int h);
|
21
|
+
~TexChunk() override;
|
24
22
|
|
25
|
-
int width() const
|
26
|
-
{
|
27
|
-
return w;
|
28
|
-
}
|
23
|
+
int width() const override { return w; }
|
24
|
+
int height() const override { return h; }
|
29
25
|
|
30
|
-
|
31
|
-
{
|
32
|
-
return h;
|
33
|
-
}
|
34
|
-
|
35
|
-
GLuint tex_name() const
|
36
|
-
{
|
37
|
-
return info.tex_name;
|
38
|
-
}
|
26
|
+
GLuint tex_name() const { return info.tex_name; }
|
39
27
|
|
40
28
|
void draw(double x1, double y1, Color c1,
|
41
29
|
double x2, double y2, Color c2,
|
42
30
|
double x3, double y3, Color c3,
|
43
31
|
double x4, double y4, Color c4,
|
44
|
-
ZPos z, AlphaMode mode) const;
|
32
|
+
ZPos z, AlphaMode mode) const override;
|
45
33
|
|
46
|
-
const GLTexInfo* gl_tex_info() const;
|
47
|
-
|
48
|
-
std::unique_ptr<ImageData> subimage(int x, int y, int width, int height) const;
|
49
|
-
|
34
|
+
const GLTexInfo* gl_tex_info() const override { return &info; }
|
35
|
+
|
36
|
+
std::unique_ptr<ImageData> subimage(int x, int y, int width, int height) const override;
|
37
|
+
|
38
|
+
Gosu::Bitmap to_bitmap() const override;
|
39
|
+
|
40
|
+
void insert(const Bitmap& bitmap, int x, int y) override;
|
50
41
|
};
|
data/src/Version.cpp
CHANGED
@@ -9,14 +9,16 @@ const std::string Gosu::VERSION = std::to_string(GOSU_MAJOR_VERSION) + '.' +
|
|
9
9
|
const std::string Gosu::LICENSES =
|
10
10
|
"This software may utilize code from the following third-party libraries:\n"
|
11
11
|
"\n"
|
12
|
-
"Gosu, https://www.libgosu.org, MIT License,
|
13
|
-
"SDL 2,
|
12
|
+
"Gosu, https://www.libgosu.org, MIT License, https://opensource.org/licenses/MIT\n"
|
13
|
+
"SDL 2, https://www.libsdl.org, MIT License, https://opensource.org/licenses/MIT\n"
|
14
14
|
#if defined(GOSU_IS_WIN) || defined(GOSU_IS_X)
|
15
15
|
"libsndfile, http://www.mega-nerd.com/libsndfile, GNU LGPL 3, "
|
16
|
-
"
|
16
|
+
"https://www.gnu.org/copyleft/lesser.html\n"
|
17
|
+
"mpg123, https://mpg123.de, GNU LGPL 3, "
|
18
|
+
"https://www.gnu.org/copyleft/lesser.html\n"
|
17
19
|
#endif
|
18
20
|
#if defined(GOSU_IS_WIN)
|
19
21
|
"OpenAL Soft, http://kcat.strangesoft.net/openal.html, GNU LGPL 2, "
|
20
|
-
"
|
22
|
+
"https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html\n"
|
21
23
|
#endif
|
22
24
|
;
|
data/src/Window.cpp
CHANGED
@@ -283,11 +283,10 @@ bool Gosu::Window::tick()
|
|
283
283
|
|
284
284
|
if (needs_redraw()) {
|
285
285
|
ensure_current_context();
|
286
|
-
|
286
|
+
graphics().frame([&] {
|
287
287
|
draw();
|
288
|
-
graphics().end();
|
289
288
|
FPS::register_frame();
|
290
|
-
}
|
289
|
+
});
|
291
290
|
|
292
291
|
SDL_GL_SwapWindow(shared_window());
|
293
292
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gosu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Raschke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
2D game development library.
|
@@ -152,12 +152,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
152
|
version: 1.8.2
|
153
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
154
|
requirements:
|
155
|
-
- - "
|
155
|
+
- - ">="
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version:
|
157
|
+
version: '0'
|
158
158
|
requirements: []
|
159
159
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.6.
|
160
|
+
rubygems_version: 2.6.11
|
161
161
|
signing_key:
|
162
162
|
specification_version: 4
|
163
163
|
summary: 2D game development library.
|