gosu 0.7.20 → 0.7.21

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.
@@ -5,6 +5,7 @@
5
5
  #define GOSU_AUDIO_HPP
6
6
 
7
7
  #ifdef WIN32
8
+ #define NOMINMAX
8
9
  #include <windows.h>
9
10
  #endif
10
11
  #include <Gosu/Fwd.hpp>
@@ -146,6 +146,11 @@ namespace Gosu
146
146
  // require 'gosu'; include Gosu
147
147
  // works from within Ruby, the #ifndef guard can be removed.
148
148
  #ifndef SWIG
149
+ inline bool operator<(Color a, Color b)
150
+ {
151
+ return a.argb() < b.argb();
152
+ }
153
+
149
154
  inline bool operator==(Color a, Color b)
150
155
  {
151
156
  return a.argb() == b.argb();
@@ -7,6 +7,7 @@
7
7
  #include <Gosu/Fwd.hpp>
8
8
  #include <Gosu/Color.hpp>
9
9
  #include <Gosu/GraphicsBase.hpp>
10
+ #include <Gosu/Platform.hpp>
10
11
  #include <boost/scoped_ptr.hpp>
11
12
  #include <string>
12
13
 
@@ -45,6 +46,7 @@ namespace Gosu
45
46
  double textWidth(const std::wstring& text, double factorX = 1) const;
46
47
 
47
48
  //! Draws text so the top left corner of the text is at (x; y).
49
+ //! \param text Formatted text without line-breaks.
48
50
  void draw(const std::wstring& text, double x, double y, ZPos z,
49
51
  double factorX = 1, double factorY = 1,
50
52
  Color c = Color::WHITE, AlphaMode mode = amDefault) const;
@@ -59,6 +61,9 @@ namespace Gosu
59
61
  double relX, double relY, double factorX = 1, double factorY = 1,
60
62
  Color c = Color::WHITE, AlphaMode mode = amDefault) const;
61
63
 
64
+ #ifndef SWIG
65
+ GOSU_DEPRECATED
66
+ #endif
62
67
  //! Analogous to draw, but rotates the text by a given angle.
63
68
  void drawRot(const std::wstring& text, double x, double y, ZPos z, double angle,
64
69
  double factorX = 1, double factorY = 1,
@@ -7,6 +7,7 @@
7
7
  #include <Gosu/Fwd.hpp>
8
8
  #include <Gosu/Color.hpp>
9
9
  #include <Gosu/GraphicsBase.hpp>
10
+ #include <boost/array.hpp>
10
11
  #include <boost/scoped_ptr.hpp>
11
12
  #include <memory>
12
13
 
@@ -24,6 +25,12 @@ namespace Gosu
24
25
  // (Held back until it will not cause a stock Ubuntu to crash. Don't ask me!)
25
26
  //extern unsigned const MAX_TEXTURE_SIZE;
26
27
 
28
+ typedef boost::array<double, 16> Transform;
29
+ Transform rotate(double angle, double aroundX = 0, double aroundY = 0);
30
+ Transform translate(double x, double y);
31
+ Transform scale(double factor);
32
+ Transform scale(double factorX, double factorY);
33
+
27
34
  //! Serves as the target of all drawing and provides basic drawing
28
35
  //! functionality.
29
36
  //! Usually created by Gosu::Window.
@@ -66,6 +73,11 @@ namespace Gosu
66
73
  //! Finishes building the macro and returns it as a drawable object.
67
74
  //! Most usually, the return value is passed to Image::Image().
68
75
  std::auto_ptr<Gosu::ImageData> endRecording();
76
+
77
+ //! Pushes one transformation onto the transformation stack.
78
+ void pushTransform(const Transform& transform);
79
+ //! Pops one transformation from the transformation stack.
80
+ void popTransform();
69
81
 
70
82
  //! Draws a line from one point to another (last pixel exclusive).
71
83
  void drawLine(double x1, double y1, Color c1,
@@ -35,9 +35,10 @@ namespace Gosu
35
35
 
36
36
  enum FontFlags
37
37
  {
38
- ffBold = 1,
39
- ffItalic = 2,
40
- ffUnderline = 4
38
+ ffBold = 1,
39
+ ffItalic = 2,
40
+ ffUnderline = 4,
41
+ ffCombinations = 8
41
42
  };
42
43
 
43
44
  enum TextAlign
@@ -42,6 +42,7 @@ namespace Gosu
42
42
  ZPos z, AlphaMode mode) const = 0;
43
43
 
44
44
  virtual boost::optional<GLTexInfo> glTexInfo() const = 0;
45
+ virtual Bitmap toBitmap() const = 0;
45
46
  };
46
47
  }
47
48
 
@@ -9,6 +9,7 @@
9
9
 
10
10
  #ifdef GOSU_IS_WIN
11
11
  #include <Gosu/ButtonsWin.hpp>
12
+ #define NOMINMAX
12
13
  #include <windows.h>
13
14
  #endif
14
15
 
@@ -62,4 +62,12 @@ namespace Gosu
62
62
  # endif
63
63
  #endif
64
64
 
65
+ #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
66
+ # define GOSU_DEPRECATED __attribute__((__deprecated__))
67
+ #elif defined(GOSU_IS_WIN)
68
+ # define GOSU_DEPRECATED __declspec(deprecated)
69
+ #else
70
+ # define GOSU_DEPRECATED
71
+ #endif
72
+
65
73
  #endif
@@ -15,14 +15,18 @@ namespace Gosu
15
15
  //! platform.
16
16
  std::wstring defaultFontName();
17
17
 
18
- //! Returns the width a text would span on a bitmap if it were drawn
19
- //! using drawText with the same arguments.
18
+ //! Returns the width an unformatted line of text would span on a bitmap if it were drawn using
19
+ //! drawText with the same arguments. This is a very low-level function that does not understand
20
+ //! any of Gosu's HTML-like markup.
21
+ //! \param text Unformatted text.
20
22
  //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/', does not work on Linux).
21
23
  unsigned textWidth(const std::wstring& text,
22
24
  const std::wstring& fontName, unsigned fontHeight,
23
25
  unsigned fontFlags = 0);
24
26
 
25
- //! Draws a line of text on a bitmap.
27
+ //! Draws a line of unformatted text on a bitmap. This is a very low-level function that does not understand
28
+ //! any of Gosu's HTML-like markup.
29
+ //! \param text Unformatted text.
26
30
  //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/', does not work on Linux).
27
31
  //! \param fontHeight Height, in pixels, of the text.
28
32
  //! \param fontFlags Binary combination of members of the FontFlags
@@ -31,8 +35,9 @@ namespace Gosu
31
35
  Color c, const std::wstring& fontName, unsigned fontHeight,
32
36
  unsigned fontFlags = 0);
33
37
 
34
- //! Creates a bitmap that is filled with a line of text given to the function.
35
- //! The line cannot contain line breaks.
38
+ //! Creates a bitmap that is filled with a line of formatted text given to the function.
39
+ //! The line can contain line breaks and HTML-like markup.
40
+ //! \param text Formatted text.
36
41
  //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/', does not work on Linux).
37
42
  //! \param fontHeight Height of the font in pixels.
38
43
  //! \param fontFlags Binary combination of members of the FontFlags
@@ -41,8 +46,9 @@ namespace Gosu
41
46
  const std::wstring& fontName, unsigned fontHeight,
42
47
  unsigned fontFlags = 0);
43
48
 
44
- //! Creates a bitmap that is filled with the text given to the function.
45
- //! The text may contain line breaks.
49
+ //! Creates a bitmap that is filled with the formatted text given to the function.
50
+ //! The line can contain line breaks and HTML-like markup.
51
+ //! \param text Formatted text.
46
52
  //! \param fontName Name of a system font, or a filename to a TTF file (must contain '/', does not work on Linux).
47
53
  //! \param fontHeight Height of the font in pixels.
48
54
  //! \param lineSpacing Spacing between two lines of text in pixels.
@@ -55,6 +61,10 @@ namespace Gosu
55
61
  const std::wstring& fontName, unsigned fontHeight,
56
62
  unsigned lineSpacing, unsigned maxWidth, TextAlign align,
57
63
  unsigned fontFlags = 0);
64
+
65
+ //! Registers a new HTML-style entity that can subsequently be used
66
+ //! with Gosu::Font and Gosu::createText. The name is given without & and ;.
67
+ void registerEntity(const std::wstring& name, const Bitmap& replacement);
58
68
  }
59
69
 
60
70
  #endif
@@ -3,7 +3,7 @@
3
3
 
4
4
  #define GOSU_MAJOR_VERSION 0
5
5
  #define GOSU_MINOR_VERSION 7
6
- #define GOSU_POINT_VERSION 20
7
- #define GOSU_VERSION "0.7.20"
6
+ #define GOSU_POINT_VERSION 21
7
+ #define GOSU_VERSION "0.7.21"
8
8
 
9
9
  #endif
@@ -13,6 +13,7 @@
13
13
  #include <string>
14
14
 
15
15
  #ifdef GOSU_IS_WIN
16
+ #define NOMINMAX
16
17
  #include <windows.h>
17
18
  #endif
18
19
 
@@ -100,11 +101,10 @@ namespace Gosu
100
101
  const Touches& currentTouches() const;
101
102
  #endif
102
103
 
104
+ GOSU_DEPRECATED const Audio& audio() const;
105
+ GOSU_DEPRECATED Audio& audio();
106
+
103
107
  #endif
104
-
105
- // Deprecated.
106
- const Audio& audio() const;
107
- Audio& audio();
108
108
  };
109
109
  }
110
110
 
@@ -293,6 +293,10 @@ void Gosu::Song::changeVolume(double volume) {
293
293
  Mix_VolumeMusic(trunc(data->volume * MIX_MAX_VOLUME));
294
294
  }
295
295
 
296
+ void Gosu::Song::update()
297
+ {
298
+ }
299
+
296
300
  // Deprecated constructors.
297
301
 
298
302
  Gosu::Sample::Sample(Audio& audio, const std::wstring& filename)
@@ -241,7 +241,7 @@ Gosu::Writer Gosu::saveToPNG(const Bitmap& bmp, Writer writer)
241
241
  tmpWriteStream = &writer; // No more experimental.
242
242
  png_set_write_fn(pngPtr, png_get_io_ptr(pngPtr), writePNGdata, flushPNGdata);
243
243
 
244
- png_set_IHDR(pngPtr, infoPtr, bmp.width(), bmp.height(), 8, PNG_COLOR_TYPE_RGB,
244
+ png_set_IHDR(pngPtr, infoPtr, bmp.width(), bmp.height(), 8, PNG_COLOR_TYPE_RGBA,
245
245
  PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
246
246
 
247
247
  png_write_info(pngPtr, infoPtr);
@@ -250,12 +250,13 @@ Gosu::Writer Gosu::saveToPNG(const Bitmap& bmp, Writer writer)
250
250
  rows = new png_bytep[bmp.height()];
251
251
  for(unsigned int y = 0; y < bmp.height(); y++)
252
252
  {
253
- rows[y] = new png_byte[bmp.width() * 3];
254
- for(unsigned int x = 0; x < bmp.width()*3; x += 3)
253
+ rows[y] = new png_byte[bmp.width() * 4];
254
+ for(unsigned int x = 0; x < bmp.width()*4; x += 4)
255
255
  {
256
- rows[y][x] = bmp.getPixel(x/3, y).red();
257
- rows[y][x+1] = bmp.getPixel(x/3, y).green();
258
- rows[y][x+2] = bmp.getPixel(x/3, y).blue();
256
+ rows[y][x] = bmp.getPixel(x/4, y).red();
257
+ rows[y][x+1] = bmp.getPixel(x/4, y).green();
258
+ rows[y][x+2] = bmp.getPixel(x/4, y).blue();
259
+ rows[y][x+3] = bmp.getPixel(x/4, y).alpha();
259
260
  }
260
261
  }
261
262
 
@@ -1,9 +1,12 @@
1
1
  #ifndef GOSUIMPL_GRAPHICS_COMMON_HPP
2
2
  #define GOSUIMPL_GRAPHICS_COMMON_HPP
3
3
 
4
+ #include <Gosu/Bitmap.hpp>
5
+ #include <Gosu/Graphics.hpp>
4
6
  #include <Gosu/Platform.hpp>
5
7
 
6
8
  #if defined(GOSU_IS_WIN)
9
+ #define NOMINMAX
7
10
  #include <windows.h>
8
11
  #include <GL/gl.h>
9
12
  #elif defined(GOSU_IS_IPHONE)
@@ -16,6 +19,7 @@
16
19
  #endif
17
20
 
18
21
  #include <algorithm>
22
+ #include <list>
19
23
  #include <vector>
20
24
 
21
25
  namespace Gosu
@@ -24,6 +28,7 @@ namespace Gosu
24
28
  class TexChunk;
25
29
  struct DrawOp;
26
30
  class DrawOpQueue;
31
+ typedef std::list<Transform> Transforms;
27
32
  typedef std::vector<DrawOpQueue> DrawOpQueueStack;
28
33
  class Macro;
29
34
 
@@ -46,6 +51,29 @@ namespace Gosu
46
51
  std::swap(c3, c4);
47
52
  }
48
53
  }
54
+
55
+ inline Transform multiply(const Transform& left, const Transform& right)
56
+ {
57
+ Gosu::Transform result;
58
+ result.assign(0);
59
+ for (int i = 0; i < 16; ++i)
60
+ for (int j = 0; j < 4; ++j)
61
+ result[i] += left[i / 4 * 4 + j] * right[i % 4 + j * 4];
62
+ return result;
63
+ }
64
+
65
+ inline void multiplyBitmapAlpha(Bitmap& bmp, Color::Channel alpha)
66
+ {
67
+ for (int y = 0; y < bmp.height(); ++y)
68
+ for (int x = 0; x < bmp.width(); ++x)
69
+ {
70
+ Color c = bmp.getPixel(x, y);
71
+ c.setAlpha(c.alpha() * alpha / 255);
72
+ bmp.setPixel(x, y, c);
73
+ }
74
+ }
75
+
76
+ const Bitmap& entityBitmap(const std::wstring& name);
49
77
  }
50
78
 
51
79
  #endif
@@ -24,6 +24,7 @@ namespace Gosu
24
24
 
25
25
  struct DrawOp
26
26
  {
27
+ Gosu::Transform* transform;
27
28
  int clipX, clipY;
28
29
  unsigned clipWidth, clipHeight;
29
30
 
@@ -41,17 +42,24 @@ namespace Gosu
41
42
  const TexChunk* chunk;
42
43
  AlphaMode mode;
43
44
 
44
- DrawOp() { clipWidth = 0xffffffff; usedVertices = 0; chunk = 0; }
45
+ DrawOp(Gosu::Transform& transform) : transform(&transform) { clipWidth = 0xffffffff; usedVertices = 0; chunk = 0; }
45
46
 
46
47
  #ifndef GOSU_IS_IPHONE
47
- void perform(GLuint& currentTexName, const void*) const
48
+ void perform(GLuint& currentTexName, Transform*& currentTransform, const void*) const
48
49
  {
49
50
  if (clipWidth != 0xffffffff)
50
51
  {
51
52
  glEnable(GL_SCISSOR_TEST);
52
53
  glScissor(clipX, clipY, clipWidth, clipHeight);
53
54
  }
54
-
55
+
56
+ if (transform != currentTransform) {
57
+ glPopMatrix();
58
+ glPushMatrix();
59
+ glMultMatrixd(transform->data());
60
+ currentTransform = transform;
61
+ }
62
+
55
63
  if (mode == amAdditive)
56
64
  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
57
65
  else if (mode == amMultiply)
@@ -113,7 +121,7 @@ namespace Gosu
113
121
  glDisable(GL_SCISSOR_TEST);
114
122
  }
115
123
  #else
116
- void perform(unsigned& currentTexName, const DrawOp* next) const
124
+ void perform(unsigned& currentTexName, Transform*& currentTransform, const DrawOp* next) const
117
125
  {
118
126
  if (usedVertices != 4)
119
127
  return; // No triangles, no lines on iPhone
@@ -140,6 +148,13 @@ namespace Gosu
140
148
  isSetup = true;
141
149
  }
142
150
 
151
+ if (transform != currentTransform) {
152
+ glPopMatrix();
153
+ glPushMatrix();
154
+ glMultMatrixd(transform->data());
155
+ currentTransform = transform;
156
+ }
157
+
143
158
  if (clipWidth != 0xffffffff)
144
159
  {
145
160
  glEnable(GL_SCISSOR_TEST);
@@ -283,7 +298,11 @@ namespace Gosu
283
298
  if (z == zImmediate)
284
299
  {
285
300
  GLuint currentTexName = NO_TEXTURE;
286
- op.perform(currentTexName, 0);
301
+ Transform* currentTransform = 0;
302
+ glMatrixMode(GL_MODELVIEW);
303
+ glPushMatrix();
304
+ op.perform(currentTexName, currentTransform, 0);
305
+ glPopMatrix();
287
306
  if (currentTexName != NO_TEXTURE)
288
307
  glDisable(GL_TEXTURE_2D);
289
308
  }
@@ -308,15 +327,21 @@ namespace Gosu
308
327
  void performDrawOps() const
309
328
  {
310
329
  GLuint currentTexName = NO_TEXTURE;
330
+ Transform* currentTransform = 0;
331
+
332
+ glMatrixMode(GL_MODELVIEW);
333
+ glPushMatrix();
311
334
 
312
335
  std::multiset<DrawOp>::const_iterator last, cur = set.begin(), end = set.end();
313
336
  while (cur != end)
314
337
  {
315
338
  last = cur;
316
339
  ++cur;
317
- last->perform(currentTexName, cur == end ? 0 : &*cur);
340
+ last->perform(currentTexName, currentTransform, cur == end ? 0 : &*cur);
318
341
  }
319
342
 
343
+ glPopMatrix();
344
+
320
345
  if (currentTexName != NO_TEXTURE)
321
346
  glDisable(GL_TEXTURE_2D);
322
347
  }
@@ -3,7 +3,11 @@
3
3
  #include <Gosu/Image.hpp>
4
4
  #include <Gosu/Math.hpp>
5
5
  #include <Gosu/Text.hpp>
6
+ #include <GosuImpl/Graphics/Common.hpp>
7
+ #include <GosuImpl/Graphics/FormattedString.hpp>
6
8
  #include <boost/array.hpp>
9
+ #include <boost/shared_ptr.hpp>
10
+ #include <map>
7
11
  using namespace std;
8
12
 
9
13
  namespace
@@ -28,25 +32,39 @@ struct Gosu::Font::Impl
28
32
  {
29
33
  Graphics* graphics;
30
34
  wstring name;
31
- unsigned height;
32
- unsigned flags;
35
+ unsigned height, flags;
33
36
 
34
37
  // Chunk of 2^16 characters (on Windows, there'll only be one of them).
35
38
  // IMPR: I couldn't find a way to determine the size of wchar_t at compile
36
39
  // time, so I can't get rid of the magic numbers or even do some #ifdef
37
40
  // magic.
38
41
  typedef boost::array<boost::scoped_ptr<Image>, 65536> CharChunk;
39
- boost::scoped_ptr<CharChunk> chunks[65536];
42
+ boost::scoped_ptr<CharChunk> chunks[65536][ffCombinations];
43
+
44
+ std::map<std::wstring, boost::shared_ptr<Image> > entityCache;
40
45
 
41
- Image& getChar(wchar_t wc)
46
+ const Image& imageAt(const FormattedString& fs, unsigned i)
42
47
  {
48
+ if (fs.entityAt(i))
49
+ {
50
+ boost::shared_ptr<Image>& ptr = entityCache[fs.entityAt(i)];
51
+ if (!ptr)
52
+ ptr.reset(new Image(*graphics, entityBitmap(fs.entityAt(i)), false));
53
+ return *ptr;
54
+ }
55
+
56
+ wchar_t wc = fs.charAt(i);
57
+ unsigned flags = fs.flagsAt(i);
58
+
59
+ assert(flags < ffCombinations);
60
+
43
61
  size_t chunkIndex = wc / 65536;
44
62
  size_t charIndex = wc % 65536;
45
63
 
46
- if (!chunks[chunkIndex])
47
- chunks[chunkIndex].reset(new CharChunk);
64
+ if (!chunks[chunkIndex][flags])
65
+ chunks[chunkIndex][flags].reset(new CharChunk);
48
66
 
49
- boost::scoped_ptr<Image>& imgPtr = (*chunks[chunkIndex])[charIndex];
67
+ boost::scoped_ptr<Image>& imgPtr = (*chunks[chunkIndex][flags])[charIndex];
50
68
 
51
69
  if (imgPtr)
52
70
  return *imgPtr;
@@ -62,6 +80,14 @@ struct Gosu::Font::Impl
62
80
  imgPtr.reset(new Image(*graphics, bmp));
63
81
  return *imgPtr;
64
82
  }
83
+
84
+ double factorAt(const FormattedString& fs, unsigned index) const
85
+ {
86
+ if (fs.entityAt(index))
87
+ return 1;
88
+ else
89
+ return 0.5;
90
+ }
65
91
  };
66
92
 
67
93
  Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned fontHeight,
@@ -70,7 +96,7 @@ Gosu::Font::Font(Graphics& graphics, const wstring& fontName, unsigned fontHeigh
70
96
  {
71
97
  pimpl->graphics = &graphics;
72
98
  pimpl->name = fontName;
73
- pimpl->height = fontHeight * 2; // Auto-AA!
99
+ pimpl->height = fontHeight * 2;
74
100
  pimpl->flags = fontFlags;
75
101
  }
76
102
 
@@ -95,24 +121,29 @@ unsigned Gosu::Font::flags() const
95
121
 
96
122
  double Gosu::Font::textWidth(const std::wstring& text, double factorX) const
97
123
  {
124
+ FormattedString fs(text, flags());
98
125
  double result = 0;
99
- for (unsigned i = 0; i < text.length(); ++i)
100
- result += pimpl->getChar(text[i]).width();
101
- return result * factorX / 2;
126
+ for (unsigned i = 0; i < fs.length(); ++i)
127
+ result += pimpl->imageAt(fs, i).width() * pimpl->factorAt(fs, i);
128
+ return result * factorX;
102
129
  }
103
130
 
104
131
  void Gosu::Font::draw(const wstring& text, double x, double y, ZPos z,
105
132
  double factorX, double factorY, Color c, AlphaMode mode) const
106
133
  {
107
- factorX /= 2;
108
- factorY /= 2;
134
+ FormattedString fs(text, flags());
135
+
109
136
  enum {
110
137
  LTR = 1,
111
138
  RTL = -1
112
139
  } dir = LTR;
113
140
 
114
- for (unsigned i = 0; i < text.length(); ++i)
141
+ for (unsigned i = 0; i < fs.length(); ++i)
115
142
  {
143
+ /*
144
+
145
+ Sorry, LTR/RTL support taken out until somebody uses it
146
+
116
147
  if (isLtrChar(text[i]))
117
148
  {
118
149
  if (dir == RTL)
@@ -124,18 +155,25 @@ void Gosu::Font::draw(const wstring& text, double x, double y, ZPos z,
124
155
  if (dir == LTR)
125
156
  x += 2 * textWidth(text.substr(i + 1, wstring::npos)) * factorX, dir = RTL;
126
157
  continue;
127
- }
128
-
129
- Image& curChar = pimpl->getChar(text[i]);
130
- if (dir == LTR)
131
- curChar.draw(x, y, z, factorX, factorY, c, mode);
158
+ }*/
159
+
160
+ const Image& curChar = pimpl->imageAt(fs, i);
161
+ double curFactor;
162
+ Gosu::Color color;
163
+ if (fs.entityAt(i))
164
+ curFactor = 1.0, color = Gosu::Color(fs.colorAt(i).alpha() * c.alpha() / 255, 255, 255, 255);
132
165
  else
133
- curChar.draw(x - curChar.width() * factorX, y, z, factorX, factorY, c, mode);
166
+ curFactor = 0.5, color = Gosu::multiply(fs.colorAt(i), c);
167
+
168
+ //if (dir == LTR)
169
+ curChar.draw(x, y, z, factorX * curFactor, factorY * curFactor, color, mode);
170
+ //else
171
+ // curChar.draw(x - curChar.width() * factorX, y, z, factorX, factorY, c, mode);
134
172
 
135
- x += curChar.width() * factorX * dir;
173
+ x += curChar.width() * factorX * curFactor * dir;
136
174
  }
137
175
  }
138
-
176
+
139
177
  void Gosu::Font::drawRel(const wstring& text, double x, double y, ZPos z,
140
178
  double relX, double relY, double factorX, double factorY, Color c,
141
179
  AlphaMode mode) const
@@ -149,16 +187,7 @@ void Gosu::Font::drawRel(const wstring& text, double x, double y, ZPos z,
149
187
  void Gosu::Font::drawRot(const wstring& text, double x, double y, ZPos z, double angle,
150
188
  double factorX, double factorY, Color c, AlphaMode mode) const
151
189
  {
152
- factorX /= 2;
153
- factorY /= 2;
154
-
155
- double stepX = offsetX(angle + 90, 1.0), stepY = offsetY(angle + 90, 1.0);
156
-
157
- for (unsigned i = 0; i < text.length(); ++i)
158
- {
159
- Image& curChar = pimpl->getChar(text[i]);
160
- curChar.drawRot(x, y, z, angle, 0.0, 0.0, factorX, factorY, c, mode);
161
- x += curChar.width() * factorX * stepX;
162
- y += curChar.width() * factorX * stepY;
163
- }
190
+ pimpl->graphics->pushTransform(rotate(angle, x, y));
191
+ draw(text, x, y, z, factorX, factorY, c, mode);
192
+ pimpl->graphics->popTransform();
164
193
  }