gosu 0.8.7.2 → 0.9.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +29 -0
  3. data/Gosu/Audio.hpp +1 -0
  4. data/Gosu/Font.hpp +8 -4
  5. data/Gosu/Graphics.hpp +28 -18
  6. data/Gosu/GraphicsBase.hpp +17 -13
  7. data/Gosu/Image.hpp +54 -45
  8. data/Gosu/Input.hpp +5 -5
  9. data/Gosu/Version.hpp +3 -3
  10. data/Gosu/Window.hpp +1 -8
  11. data/README.txt +25 -0
  12. data/ext/gosu/gosu_wrap.cxx +1495 -1275
  13. data/ext/gosu/gosu_wrap.h +2 -2
  14. data/lib/gosu/patches.rb +71 -35
  15. data/lib/gosu/preview.rb +9 -142
  16. data/lib/gosu/swig_patches.rb +20 -10
  17. data/rdoc/gosu.rb +1185 -0
  18. data/src/Bitmap/BitmapUtils.cpp +9 -9
  19. data/src/Graphics/Common.hpp +3 -1
  20. data/src/Graphics/Graphics.cpp +100 -38
  21. data/src/Graphics/Image.cpp +57 -15
  22. data/src/Graphics/LargeImageData.cpp +9 -10
  23. data/src/Graphics/LargeImageData.hpp +1 -1
  24. data/src/Graphics/TexChunk.cpp +5 -6
  25. data/src/Graphics/TexChunk.hpp +1 -4
  26. data/src/Graphics/Texture.cpp +10 -3
  27. data/src/Graphics/Texture.hpp +1 -2
  28. data/src/Iconv.hpp +2 -2
  29. data/src/Input/Input.cpp +25 -9
  30. data/src/Input/InputTouch.mm +5 -3
  31. data/src/Text/Font.cpp +13 -8
  32. data/src/Window.cpp +66 -37
  33. data/src/WindowTouch.mm +3 -3
  34. metadata +79 -92
  35. data/examples/ChipmunkIntegration.rb +0 -275
  36. data/examples/CptnRuby.rb +0 -223
  37. data/examples/GosuZen.rb +0 -68
  38. data/examples/MoreChipmunkAndRMagick.rb +0 -155
  39. data/examples/OpenGLIntegration.rb +0 -226
  40. data/examples/RMagickIntegration.rb +0 -417
  41. data/examples/TextInput.rb +0 -154
  42. data/examples/Tutorial.rb +0 -131
  43. data/examples/media/Beep.wav +0 -0
  44. data/examples/media/CptnRuby Gem.png +0 -0
  45. data/examples/media/CptnRuby Map.txt +0 -25
  46. data/examples/media/CptnRuby Tileset.png +0 -0
  47. data/examples/media/CptnRuby.png +0 -0
  48. data/examples/media/Cursor.png +0 -0
  49. data/examples/media/Earth.png +0 -0
  50. data/examples/media/Explosion.wav +0 -0
  51. data/examples/media/Landscape.svg +0 -10
  52. data/examples/media/LargeStar.png +0 -0
  53. data/examples/media/Smoke.png +0 -0
  54. data/examples/media/Soldier.png +0 -0
  55. data/examples/media/Space.png +0 -0
  56. data/examples/media/Star.png +0 -0
  57. data/examples/media/Starfighter.bmp +0 -0
@@ -32,7 +32,7 @@ Gosu::Writer Gosu::saveToBMP(const Bitmap& bitmap, Writer writer)
32
32
 
33
33
  void Gosu::applyBorderFlags(Bitmap& dest, const Bitmap& source,
34
34
  unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
35
- unsigned borderFlags)
35
+ unsigned imageFlags)
36
36
  {
37
37
  dest.resize(srcWidth + 2, srcHeight + 2);
38
38
 
@@ -40,34 +40,34 @@ void Gosu::applyBorderFlags(Bitmap& dest, const Bitmap& source,
40
40
  // borders.
41
41
 
42
42
  // Top.
43
- if (borderFlags & bfTileableTop)
43
+ if (imageFlags & ifTileableTop)
44
44
  dest.insert(source, 1, 0, srcX, srcY, srcWidth, 1);
45
45
  // Bottom.
46
- if (borderFlags & bfTileableBottom)
46
+ if (imageFlags & ifTileableBottom)
47
47
  dest.insert(source, 1, dest.height() - 1,
48
48
  srcX, srcY + srcHeight - 1, srcWidth, 1);
49
49
  // Left.
50
- if (borderFlags & bfTileableLeft)
50
+ if (imageFlags & ifTileableLeft)
51
51
  dest.insert(source, 0, 1, srcX, srcY, 1, srcHeight);
52
52
  // Right.
53
- if (borderFlags & bfTileableRight)
53
+ if (imageFlags & ifTileableRight)
54
54
  dest.insert(source, dest.width() - 1, 1,
55
55
  srcX + srcWidth - 1, srcY, 1, srcHeight);
56
56
 
57
57
  // Top left.
58
- if ((borderFlags & bfTileableTop) && (borderFlags & bfTileableLeft))
58
+ if ((imageFlags & ifTileableTop) && (imageFlags & ifTileableLeft))
59
59
  dest.setPixel(0, 0,
60
60
  source.getPixel(srcX, srcY));
61
61
  // Top right.
62
- if ((borderFlags & bfTileableTop) && (borderFlags & bfTileableRight))
62
+ if ((imageFlags & ifTileableTop) && (imageFlags & ifTileableRight))
63
63
  dest.setPixel(dest.width() - 1, 0,
64
64
  source.getPixel(srcX + srcWidth - 1, srcY));
65
65
  // Bottom left.
66
- if ((borderFlags & bfTileableBottom) && (borderFlags & bfTileableLeft))
66
+ if ((imageFlags & ifTileableBottom) && (imageFlags & ifTileableLeft))
67
67
  dest.setPixel(0, dest.height() - 1,
68
68
  source.getPixel(srcX, srcY + srcHeight - 1));
69
69
  // Bottom right.
70
- if ((borderFlags & bfTileableBottom) && (borderFlags & bfTileableRight))
70
+ if ((imageFlags & ifTileableBottom) && (imageFlags & ifTileableRight))
71
71
  dest.setPixel(dest.width() - 1, dest.height() - 1,
72
72
  source.getPixel(srcX + srcWidth - 1, srcY + srcHeight - 1));
73
73
 
@@ -34,7 +34,7 @@ namespace Gosu
34
34
  const GLuint NO_TEXTURE = static_cast<GLuint>(-1);
35
35
  const unsigned NO_CLIPPING = 0xffffffff;
36
36
 
37
- // In various places in Gosu, width==NO_CLIPPING conventionally means
37
+ // In various places in Gosu, width==NO_CLIPPING by convention means
38
38
  // that no clipping should happen.
39
39
  struct ClipRect
40
40
  {
@@ -118,6 +118,8 @@ namespace Gosu
118
118
 
119
119
  bool isEntity(const std::wstring& name);
120
120
  const Bitmap& entityBitmap(const std::wstring& name);
121
+
122
+ void ensureCurrentContext();
121
123
  }
122
124
 
123
125
  #endif
@@ -12,6 +12,25 @@
12
12
  #include <algorithm>
13
13
  #include <limits>
14
14
 
15
+ namespace Gosu
16
+ {
17
+ namespace
18
+ {
19
+ Graphics* currentGraphicsPointer = 0;
20
+
21
+ Graphics& currentGraphics()
22
+ {
23
+ if (currentGraphicsPointer == 0)
24
+ throw std::logic_error("Gosu::Graphics can only be drawn to while rendering");
25
+
26
+ return *currentGraphicsPointer;
27
+ }
28
+
29
+ typedef std::vector<std::tr1::shared_ptr<Texture> > Textures;
30
+ Textures textures;
31
+ }
32
+ }
33
+
15
34
  struct Gosu::Graphics::Impl
16
35
  {
17
36
  unsigned virtWidth, virtHeight;
@@ -19,8 +38,6 @@ struct Gosu::Graphics::Impl
19
38
  double blackWidth, blackHeight;
20
39
  bool fullscreen;
21
40
  DrawOpQueueStack queues;
22
- typedef std::vector<std::tr1::shared_ptr<Texture> > Textures;
23
- Textures textures;
24
41
  };
25
42
 
26
43
  Gosu::Graphics::Graphics(unsigned physWidth, unsigned physHeight, bool fullscreen)
@@ -55,6 +72,8 @@ Gosu::Graphics::Graphics(unsigned physWidth, unsigned physHeight, bool fullscree
55
72
 
56
73
  Gosu::Graphics::~Graphics()
57
74
  {
75
+ if (currentGraphicsPointer == this)
76
+ currentGraphicsPointer = 0;
58
77
  }
59
78
 
60
79
  unsigned Gosu::Graphics::width() const
@@ -106,6 +125,11 @@ bool Gosu::Graphics::begin(Gosu::Color clearWithColor)
106
125
  clearWithColor.blue() / 255.f, clearWithColor.alpha() / 255.f);
107
126
  glClear(GL_COLOR_BUFFER_BIT);
108
127
 
128
+ if (currentGraphicsPointer != 0)
129
+ throw std::logic_error("Cannot nest calls to Gosu::Graphics::begin()");
130
+
131
+ currentGraphicsPointer = this;
132
+
109
133
  return true;
110
134
  }
111
135
 
@@ -115,7 +139,7 @@ void Gosu::Graphics::end()
115
139
  pimpl->queues.resize(1);
116
140
 
117
141
  flush();
118
-
142
+
119
143
  if (pimpl->blackHeight || pimpl->blackWidth) {
120
144
  if (pimpl->blackHeight) {
121
145
  drawQuad(0, -pimpl->blackHeight, Color::BLACK,
@@ -141,20 +165,26 @@ void Gosu::Graphics::end()
141
165
  }
142
166
 
143
167
  glFlush();
168
+
169
+ currentGraphicsPointer = 0;
144
170
  }
145
171
 
146
172
  void Gosu::Graphics::flush()
147
173
  {
148
- if (pimpl->queues.size() != 1)
174
+ Graphics& cg = currentGraphics();
175
+
176
+ if (cg.pimpl->queues.size() != 1)
149
177
  throw std::logic_error("Flushing to screen is not allowed while creating a macro");
150
178
 
151
- pimpl->queues.front().performDrawOpsAndCode();
152
- pimpl->queues.front().clearQueue();
179
+ cg.pimpl->queues.front().performDrawOpsAndCode();
180
+ cg.pimpl->queues.front().clearQueue();
153
181
  }
154
182
 
155
183
  void Gosu::Graphics::beginGL()
156
184
  {
157
- if (pimpl->queues.size() > 1)
185
+ Graphics& cg = currentGraphics();
186
+
187
+ if (cg.pimpl->queues.size() > 1)
158
188
  throw std::logic_error("Custom OpenGL is not allowed while creating a macro");
159
189
 
160
190
  #ifdef GOSU_IS_OPENGLES
@@ -172,6 +202,8 @@ void Gosu::Graphics::endGL()
172
202
  #ifdef GOSU_IS_OPENGLES
173
203
  throw std::logic_error("Custom OpenGL ES is not supported yet");
174
204
  #else
205
+ Graphics& cg = currentGraphics();
206
+
175
207
  glPopAttrib();
176
208
 
177
209
  // Restore matrices.
@@ -179,8 +211,8 @@ void Gosu::Graphics::endGL()
179
211
 
180
212
  glMatrixMode(GL_PROJECTION);
181
213
  glLoadIdentity();
182
- glViewport(0, 0, pimpl->physWidth, pimpl->physHeight);
183
- glOrtho(0, pimpl->physWidth, pimpl->physHeight, 0, -1, 1);
214
+ glViewport(0, 0, cg.pimpl->physWidth, cg.pimpl->physHeight);
215
+ glOrtho(0, cg.pimpl->physWidth, cg.pimpl->physHeight, 0, -1, 1);
184
216
 
185
217
  glMatrixMode(GL_MODELVIEW);
186
218
  glLoadIdentity();
@@ -223,64 +255,82 @@ namespace Gosu
223
255
 
224
256
  void Gosu::Graphics::scheduleGL(const std::tr1::function<void()>& functor, Gosu::ZPos z)
225
257
  {
226
- pimpl->queues.back().scheduleGL(RunGLFunctor(*this, functor), z);
258
+ Graphics& cg = currentGraphics();
259
+
260
+ cg.pimpl->queues.back().scheduleGL(RunGLFunctor(cg, functor), z);
227
261
  }
228
262
  #endif
229
263
 
230
264
  void Gosu::Graphics::beginClipping(double x, double y, double width, double height)
231
265
  {
232
- if (pimpl->queues.size() > 1)
266
+ Graphics& cg = currentGraphics();
267
+
268
+ if (cg.pimpl->queues.size() > 1)
233
269
  throw std::logic_error("Clipping is not allowed while creating a macro yet");
234
270
 
235
- pimpl->queues.back().beginClipping(x, y, width, height, pimpl->physHeight);
271
+ cg.pimpl->queues.back().beginClipping(x, y, width, height, cg.pimpl->physHeight);
236
272
  }
237
273
 
238
274
  void Gosu::Graphics::endClipping()
239
275
  {
240
- pimpl->queues.back().endClipping();
276
+ Graphics& cg = currentGraphics();
277
+
278
+ cg.pimpl->queues.back().endClipping();
241
279
  }
242
280
 
243
281
  void Gosu::Graphics::beginRecording()
244
282
  {
245
- pimpl->queues.resize(pimpl->queues.size() + 1);
283
+ Graphics& cg = currentGraphics();
284
+
285
+ cg.pimpl->queues.resize(cg.pimpl->queues.size() + 1);
246
286
  }
247
287
 
248
288
  GOSU_UNIQUE_PTR<Gosu::ImageData> Gosu::Graphics::endRecording(int width, int height)
249
289
  {
250
- if (pimpl->queues.size() == 1)
290
+ Graphics& cg = currentGraphics();
291
+
292
+ if (cg.pimpl->queues.size() == 1)
251
293
  throw std::logic_error("No macro recording in progress that can be captured");
252
294
 
253
- GOSU_UNIQUE_PTR<ImageData> result(new Macro(*this, pimpl->queues.back(), width, height));
254
- pimpl->queues.pop_back();
295
+ GOSU_UNIQUE_PTR<ImageData> result(new Macro(cg, cg.pimpl->queues.back(), width, height));
296
+ cg.pimpl->queues.pop_back();
255
297
  return result;
256
298
  }
257
299
 
258
300
  void Gosu::Graphics::pushTransform(const Gosu::Transform& transform)
259
301
  {
260
- pimpl->queues.back().pushTransform(transform);
302
+ Graphics& cg = currentGraphics();
303
+
304
+ cg.pimpl->queues.back().pushTransform(transform);
261
305
  }
262
306
 
263
307
  void Gosu::Graphics::popTransform()
264
308
  {
265
- pimpl->queues.back().popTransform();
309
+ Graphics& cg = currentGraphics();
310
+
311
+ cg.pimpl->queues.back().popTransform();
266
312
  }
267
313
 
268
314
  void Gosu::Graphics::drawLine(double x1, double y1, Color c1,
269
315
  double x2, double y2, Color c2, ZPos z, AlphaMode mode)
270
316
  {
317
+ Graphics& cg = currentGraphics();
318
+
271
319
  DrawOp op;
272
320
  op.renderState.mode = mode;
273
321
  op.verticesOrBlockIndex = 2;
274
322
  op.vertices[0] = DrawOp::Vertex(x1, y1, c1);
275
323
  op.vertices[1] = DrawOp::Vertex(x2, y2, c2);
276
324
  op.z = z;
277
- pimpl->queues.back().scheduleDrawOp(op);
325
+ cg.pimpl->queues.back().scheduleDrawOp(op);
278
326
  }
279
327
 
280
328
  void Gosu::Graphics::drawTriangle(double x1, double y1, Color c1,
281
329
  double x2, double y2, Color c2, double x3, double y3, Color c3,
282
330
  ZPos z, AlphaMode mode)
283
331
  {
332
+ Graphics& cg = currentGraphics();
333
+
284
334
  DrawOp op;
285
335
  op.renderState.mode = mode;
286
336
  op.verticesOrBlockIndex = 3;
@@ -292,13 +342,15 @@ void Gosu::Graphics::drawTriangle(double x1, double y1, Color c1,
292
342
  op.vertices[3] = op.vertices[2];
293
343
  #endif
294
344
  op.z = z;
295
- pimpl->queues.back().scheduleDrawOp(op);
345
+ cg.pimpl->queues.back().scheduleDrawOp(op);
296
346
  }
297
347
 
298
348
  void Gosu::Graphics::drawQuad(double x1, double y1, Color c1,
299
349
  double x2, double y2, Color c2, double x3, double y3, Color c3,
300
350
  double x4, double y4, Color c4, ZPos z, AlphaMode mode)
301
351
  {
352
+ Graphics& cg = currentGraphics();
353
+
302
354
  reorderCoordinatesIfNecessary(x1, y1, x2, y2, x3, y3, c3, x4, y4, c4);
303
355
 
304
356
  DrawOp op;
@@ -315,22 +367,33 @@ void Gosu::Graphics::drawQuad(double x1, double y1, Color c1,
315
367
  op.vertices[2] = DrawOp::Vertex(x4, y4, c4);
316
368
  #endif
317
369
  op.z = z;
318
- pimpl->queues.back().scheduleDrawOp(op);
370
+ cg.pimpl->queues.back().scheduleDrawOp(op);
371
+ }
372
+
373
+ void Gosu::Graphics::scheduleDrawOp(const Gosu::DrawOp &op)
374
+ {
375
+ Graphics& cg = currentGraphics();
376
+
377
+ cg.pimpl->queues.back().scheduleDrawOp(op);
319
378
  }
320
379
 
321
380
  GOSU_UNIQUE_PTR<Gosu::ImageData> Gosu::Graphics::createImage(
322
381
  const Bitmap& src, unsigned srcX, unsigned srcY,
323
- unsigned srcWidth, unsigned srcHeight, unsigned borderFlags)
382
+ unsigned srcWidth, unsigned srcHeight, unsigned flags)
324
383
  {
325
384
  static const unsigned maxSize = MAX_TEXTURE_SIZE;
385
+
386
+ // Backwards compatibility: This used to be 'bool tileable'.
387
+ if (flags == 1)
388
+ flags = ifTileable;
326
389
 
327
- // Special case: If the texture is supposed to have hard borders,
328
- // is quadratic, has a size that is at least 64 pixels but less than 256
390
+ // Special case: If the texture is supposed to have hard borders, is
391
+ // quadratic, has a size that is at least 64 pixels but no more than maxSize
329
392
  // pixels and a power of two, create a single texture just for this image.
330
- if ((borderFlags & bfTileable) == bfTileable &&
393
+ if ((flags & ifTileable) == ifTileable &&
331
394
  srcWidth == srcHeight &&
332
395
  (srcWidth & (srcWidth - 1)) == 0 &&
333
- srcWidth >= 64)
396
+ srcWidth >= 64 && srcWidth <= maxSize)
334
397
  {
335
398
  std::tr1::shared_ptr<Texture> texture(new Texture(srcWidth));
336
399
  GOSU_UNIQUE_PTR<ImageData> data;
@@ -340,14 +403,13 @@ GOSU_UNIQUE_PTR<Gosu::ImageData> Gosu::Graphics::createImage(
340
403
  if (srcX == 0 && srcWidth == src.width() &&
341
404
  srcY == 0 && srcHeight == src.height())
342
405
  {
343
- data = texture->tryAlloc(*this, pimpl->queues, texture, src, 0);
406
+ data = texture->tryAlloc(texture, src, 0);
344
407
  }
345
408
  else
346
409
  {
347
- Bitmap trimmedSrc;
348
- trimmedSrc.resize(srcWidth, srcHeight);
349
- trimmedSrc.insert(src, 0, 0, srcX, srcY, srcWidth, srcHeight);
350
- data = texture->tryAlloc(*this, pimpl->queues, texture, trimmedSrc, 0);
410
+ Bitmap bmp(srcWidth, srcHeight);
411
+ bmp.insert(src, 0, 0, srcX, srcY, srcWidth, srcHeight);
412
+ data = texture->tryAlloc(texture, bmp, 0);
351
413
  }
352
414
 
353
415
  if (!data.get())
@@ -361,20 +423,20 @@ GOSU_UNIQUE_PTR<Gosu::ImageData> Gosu::Graphics::createImage(
361
423
  Bitmap bmp(srcWidth, srcHeight);
362
424
  bmp.insert(src, 0, 0, srcX, srcY, srcWidth, srcHeight);
363
425
  GOSU_UNIQUE_PTR<ImageData> lidi;
364
- lidi.reset(new LargeImageData(*this, bmp, maxSize - 2, maxSize - 2, borderFlags));
426
+ lidi.reset(new LargeImageData(bmp, maxSize - 2, maxSize - 2, flags));
365
427
  return GOSU_MOVE_UNIQUE_PTR(lidi);
366
428
  }
367
429
 
368
430
  Bitmap bmp;
369
- applyBorderFlags(bmp, src, srcX, srcY, srcWidth, srcHeight, borderFlags);
431
+ applyBorderFlags(bmp, src, srcX, srcY, srcWidth, srcHeight, flags);
370
432
 
371
433
  // Try to put the bitmap into one of the already allocated textures.
372
- for (Impl::Textures::iterator i = pimpl->textures.begin(); i != pimpl->textures.end(); ++i)
434
+ for (Textures::iterator i = textures.begin(); i != textures.end(); ++i)
373
435
  {
374
436
  std::tr1::shared_ptr<Texture> texture(*i);
375
437
 
376
438
  GOSU_UNIQUE_PTR<ImageData> data;
377
- data = texture->tryAlloc(*this, pimpl->queues, texture, bmp, 1);
439
+ data = texture->tryAlloc(texture, bmp, 1);
378
440
  if (data.get())
379
441
  return GOSU_MOVE_UNIQUE_PTR(data);
380
442
  }
@@ -383,10 +445,10 @@ GOSU_UNIQUE_PTR<Gosu::ImageData> Gosu::Graphics::createImage(
383
445
 
384
446
  std::tr1::shared_ptr<Texture> texture;
385
447
  texture.reset(new Texture(maxSize));
386
- pimpl->textures.push_back(texture);
448
+ textures.push_back(texture);
387
449
 
388
450
  GOSU_UNIQUE_PTR<ImageData> data;
389
- data = texture->tryAlloc(*this, pimpl->queues, texture, bmp, 1);
451
+ data = texture->tryAlloc(texture, bmp, 1);
390
452
  if (!data.get())
391
453
  throw std::logic_error("Internal texture block allocation error");
392
454
 
@@ -6,35 +6,34 @@
6
6
  #include <Gosu/IO.hpp>
7
7
  #include <stdexcept>
8
8
 
9
- Gosu::Image::Image(Graphics& graphics, const std::wstring& filename, bool tileable)
9
+ Gosu::Image::Image(const std::wstring& filename, unsigned flags)
10
10
  {
11
11
  // Forward.
12
12
  Bitmap bmp;
13
13
  loadImageFile(bmp, filename);
14
- Image(graphics, bmp, tileable).data.swap(data);
14
+ Image(bmp, flags).data.swap(data);
15
15
  }
16
16
 
17
- Gosu::Image::Image(Graphics& graphics, const std::wstring& filename,
17
+ Gosu::Image::Image(const std::wstring& filename,
18
18
  unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
19
- bool tileable)
19
+ unsigned flags)
20
20
  {
21
21
  // Forward.
22
22
  Bitmap bmp;
23
23
  loadImageFile(bmp, filename);
24
- Image(graphics, bmp, srcX, srcY, srcWidth, srcHeight, tileable).data.swap(data);
24
+ Image(bmp, srcX, srcY, srcWidth, srcHeight, flags).data.swap(data);
25
25
  }
26
26
 
27
- Gosu::Image::Image(Graphics& graphics, const Bitmap& source, bool tileable)
27
+ Gosu::Image::Image(const Bitmap& source, unsigned flags)
28
28
  {
29
29
  // Forward.
30
- Image(graphics, source, 0, 0, source.width(), source.height(), tileable).data.swap(data);
30
+ Image(source, 0, 0, source.width(), source.height(), flags).data.swap(data);
31
31
  }
32
32
 
33
- Gosu::Image::Image(Graphics& graphics, const Bitmap& source,
33
+ Gosu::Image::Image(const Bitmap& source,
34
34
  unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
35
- bool tileable)
36
- : data(graphics.createImage(source, srcX, srcY, srcWidth, srcHeight,
37
- tileable ? Gosu::bfTileable : Gosu::bfSmooth).release())
35
+ unsigned flags)
36
+ : data(Graphics::createImage(source, srcX, srcY, srcWidth, srcHeight, flags).release())
38
37
  {
39
38
  }
40
39
 
@@ -115,7 +114,8 @@ Gosu::ImageData& Gosu::Image::getData() const
115
114
  return *data;
116
115
  }
117
116
 
118
- std::vector<Gosu::Image> Gosu::loadTiles(Graphics& graphics, const Bitmap& bmp, int tileWidth, int tileHeight, bool tileable)
117
+ std::vector<Gosu::Image> Gosu::loadTiles(const Bitmap& bmp,
118
+ int tileWidth, int tileHeight, unsigned flags)
119
119
  {
120
120
  int tilesX, tilesY;
121
121
  std::vector<Image> images;
@@ -138,14 +138,56 @@ std::vector<Gosu::Image> Gosu::loadTiles(Graphics& graphics, const Bitmap& bmp,
138
138
 
139
139
  for (int y = 0; y < tilesY; ++y)
140
140
  for (int x = 0; x < tilesX; ++x)
141
- images.push_back(Image(graphics, bmp, x * tileWidth, y * tileHeight, tileWidth, tileHeight, tileable));
141
+ images.push_back(Image(bmp, x * tileWidth, y * tileHeight, tileWidth, tileHeight, flags));
142
142
 
143
143
  return images;
144
144
  }
145
145
 
146
- std::vector<Gosu::Image> Gosu::loadTiles(Graphics& graphics, const std::wstring& filename, int tileWidth, int tileHeight, bool tileable)
146
+ std::vector<Gosu::Image> Gosu::loadTiles(const std::wstring& filename,
147
+ int tileWidth, int tileHeight, unsigned flags)
147
148
  {
148
149
  Bitmap bmp;
149
150
  loadImageFile(bmp, filename);
150
- return loadTiles(graphics, bmp, tileWidth, tileHeight, tileable);
151
+ return loadTiles(bmp, tileWidth, tileHeight, flags);
151
152
  }
153
+
154
+ // Deprecated constructors.
155
+
156
+ Gosu::Image::Image(Graphics& graphics, const std::wstring& filename, bool tileable)
157
+ {
158
+ Image(filename, tileable).data.swap(data);
159
+ }
160
+
161
+ Gosu::Image::Image(Graphics& graphics, const std::wstring& filename,
162
+ unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
163
+ bool tileable)
164
+ {
165
+ Image(filename, srcX, srcY, srcWidth, srcHeight, tileable).data.swap(data);
166
+ }
167
+
168
+ Gosu::Image::Image(Graphics& graphics, const Bitmap& source, bool tileable)
169
+ {
170
+ Image(source, tileable).data.swap(data);
171
+ }
172
+
173
+ Gosu::Image::Image(Graphics& graphics, const Bitmap& source,
174
+ unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight,
175
+ bool tileable)
176
+ {
177
+ Image(source, srcX, srcY, srcWidth, srcHeight, tileable).data.swap(data);
178
+ }
179
+
180
+ // Deprecated helpers.
181
+
182
+ std::vector<Gosu::Image> Gosu::loadTiles(Gosu::Graphics& graphics, const Bitmap& bmp,
183
+ int tileWidth, int tileHeight, bool tileable)
184
+ {
185
+ return Gosu::loadTiles(bmp, tileWidth, tileHeight, tileable);
186
+ }
187
+
188
+ std::vector<Gosu::Image> Gosu::loadTiles(Gosu::Graphics& graphics, const std::wstring& filename,
189
+ int tileWidth, int tileHeight, bool tileable)
190
+ {
191
+ return Gosu::loadTiles(filename, tileWidth, tileHeight, tileable);
192
+ }
193
+