gosu 0.10.2.pre1 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecfdbb08ed4f62285efa92a4e6531cd11adae83f
4
- data.tar.gz: 8c7633022fb1c04feacd970b3aa347c3e2130eb5
3
+ metadata.gz: 6a7232fe12b9c8879a9cfa88e30f9ce0cf61916c
4
+ data.tar.gz: 02b5c36e500dcd641fc70ee65d6d316dc16f3dba
5
5
  SHA512:
6
- metadata.gz: 2c13a96ad5c4e0b58ff964208c7a7cd12ee92bb93a4cdb214641ab93877bbfec080c0923364ef115cab7335eb718655d00c5c4210d59b65d6762926bd161bba8
7
- data.tar.gz: c24c6d0429534be9927d1a1bbbd39031bb18b0d23914dd3af8e702571b20746ff57ba416dd2fd644a22d117e8efb481ce4f8d9a8cc45db24c059fa7c93e6074c
6
+ metadata.gz: ac51f4a214b0077dd7817ef0e5e741a1618019b3c7e552a0dc80cd3ae1897ea626d3be2e180b4a76b0603dc7fe5f057a57203d50550bde76e61a8f820bd50fe3
7
+ data.tar.gz: 09520284f76e8efad4dec94ffa584768f0c3c11882c845db9139dc6a7baa02ba4687efd463d43a86f253d44b92a81de61b8e2068b22b9c3f170bc673d63eed6e
@@ -4,7 +4,7 @@
4
4
  #define GOSU_MAJOR_VERSION 0
5
5
  #define GOSU_MINOR_VERSION 10
6
6
  #define GOSU_POINT_VERSION 2
7
- #define GOSU_VERSION "0.10.2.pre1"
7
+ #define GOSU_VERSION "0.10.2"
8
8
 
9
9
  #define GOSU_COPYRIGHT_NOTICE \
10
10
  "This software uses the following third-party libraries:\n" \
@@ -49,7 +49,6 @@ MAC_FILES = %w(
49
49
  Audio/Audio.mm
50
50
  Graphics/ResolutionApple.mm
51
51
  Text/TextApple.mm
52
- Text/TextMac.cpp
53
52
  TimingApple.cpp
54
53
  UtilityApple.mm
55
54
  )
@@ -8,6 +8,10 @@
8
8
  * interface file instead.
9
9
  * ----------------------------------------------------------------------------- */
10
10
 
11
+ // This file was afterwards patched using the following instructions:
12
+ // http://sourceforge.net/tracker/index.php?func=detail&aid=2034216&group_id=1645&atid=101645
13
+ // (Many thanks to Kevin Burge for that.)
14
+
11
15
  #define SWIGRUBY
12
16
  #define SWIG_DIRECTORS
13
17
 
@@ -870,6 +874,7 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
870
874
 
871
875
 
872
876
  #include <ruby.h>
877
+ #include <map>
873
878
 
874
879
  /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which
875
880
  * breaks using rb_intern as an lvalue, as SWIG does. We work around this
@@ -1210,7 +1215,7 @@ extern "C" {
1210
1215
  /* Global Ruby hash table to store Trackings from C/C++
1211
1216
  structs to Ruby Objects.
1212
1217
  */
1213
- static VALUE swig_ruby_trackings = Qnil;
1218
+ static std::map<void*, VALUE> swig_ruby_trackings;
1214
1219
 
1215
1220
  /* Global variable that stores a reference to the ruby
1216
1221
  hash table delete function. */
@@ -1227,34 +1232,18 @@ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) {
1227
1232
  This is done to allow multiple DSOs to share the same
1228
1233
  tracking table.
1229
1234
  */
1230
- ID trackings_id = rb_intern( "@__trackings__" );
1231
1235
  VALUE verbose = rb_gv_get("VERBOSE");
1232
1236
  rb_gv_set("VERBOSE", Qfalse);
1233
- swig_ruby_trackings = rb_ivar_get( _mSWIG, trackings_id );
1234
1237
  rb_gv_set("VERBOSE", verbose);
1235
1238
 
1236
1239
  /* No, it hasn't. Create one ourselves */
1237
- if ( swig_ruby_trackings == Qnil )
1238
- {
1239
- swig_ruby_trackings = rb_hash_new();
1240
- rb_ivar_set( _mSWIG, trackings_id, swig_ruby_trackings );
1241
- }
1240
+ swig_ruby_trackings.clear();
1242
1241
 
1243
1242
  /* Now store a reference to the hash table delete function
1244
1243
  so that we only have to look it up once.*/
1245
1244
  swig_ruby_hash_delete = rb_intern("delete");
1246
1245
  }
1247
1246
 
1248
- /* Get a Ruby number to reference a pointer */
1249
- SWIGRUNTIME VALUE SWIG_RubyPtrToReference(void* ptr) {
1250
- /* We cast the pointer to an unsigned long
1251
- and then store a reference to it using
1252
- a Ruby number object. */
1253
-
1254
- /* Convert the pointer to a Ruby number */
1255
- return SWIG2NUM(ptr);
1256
- }
1257
-
1258
1247
  /* Get a Ruby number to reference an object */
1259
1248
  SWIGRUNTIME VALUE SWIG_RubyObjectToReference(VALUE object) {
1260
1249
  /* We cast the object to an unsigned long
@@ -1276,39 +1265,16 @@ SWIGRUNTIME VALUE SWIG_RubyReferenceToObject(VALUE reference) {
1276
1265
 
1277
1266
  /* Add a Tracking from a C/C++ struct to a Ruby object */
1278
1267
  SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) {
1279
- /* In a Ruby hash table we store the pointer and
1280
- the associated Ruby object. The trick here is
1281
- that we cannot store the Ruby object directly - if
1282
- we do then it cannot be garbage collected. So
1283
- instead we typecast it as a unsigned long and
1284
- convert it to a Ruby number object.*/
1285
-
1286
- /* Get a reference to the pointer as a Ruby number */
1287
- VALUE key = SWIG_RubyPtrToReference(ptr);
1288
-
1289
- /* Get a reference to the Ruby object as a Ruby number */
1290
- VALUE value = SWIG_RubyObjectToReference(object);
1291
-
1292
1268
  /* Store the mapping to the global hash table. */
1293
- rb_hash_aset(swig_ruby_trackings, key, value);
1269
+ swig_ruby_trackings[ptr] = object;
1294
1270
  }
1295
1271
 
1296
1272
  /* Get the Ruby object that owns the specified C/C++ struct */
1297
1273
  SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) {
1298
- /* Get a reference to the pointer as a Ruby number */
1299
- VALUE key = SWIG_RubyPtrToReference(ptr);
1300
-
1301
- /* Now lookup the value stored in the global hash table */
1302
- VALUE value = rb_hash_aref(swig_ruby_trackings, key);
1303
-
1304
- if (value == Qnil) {
1305
- /* No object exists - return nil. */
1274
+ if (swig_ruby_trackings.count(ptr) == 0)
1306
1275
  return Qnil;
1307
- }
1308
- else {
1309
- /* Convert this value to Ruby object */
1310
- return SWIG_RubyReferenceToObject(value);
1311
- }
1276
+ else
1277
+ return swig_ruby_trackings[ptr];
1312
1278
  }
1313
1279
 
1314
1280
  /* Remove a Tracking from a C/C++ struct to a Ruby object. It
@@ -1316,12 +1282,7 @@ SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) {
1316
1282
  since the same memory address may be reused later to create
1317
1283
  a new object. */
1318
1284
  SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) {
1319
- /* Get a reference to the pointer as a Ruby number */
1320
- VALUE key = SWIG_RubyPtrToReference(ptr);
1321
-
1322
- /* Delete the object from the hash table by calling Ruby's
1323
- do this we need to call the Hash.delete method.*/
1324
- rb_funcall(swig_ruby_trackings, swig_ruby_hash_delete, 1, key);
1285
+ swig_ruby_trackings.erase(ptr);
1325
1286
  }
1326
1287
 
1327
1288
  /* This is a helper method that unlinks a Ruby object from its
@@ -3119,14 +3080,14 @@ bool SwigDirector_Window::tick() {
3119
3080
  void SwigDirector_Window::update() {
3120
3081
  VALUE result;
3121
3082
 
3122
- result = rb_funcall(swig_get_self(), rb_intern("update"), 0, NULL);
3083
+ result = rb_funcall(swig_get_self(), rb_intern("protected_update"), 0, NULL);
3123
3084
  }
3124
3085
 
3125
3086
 
3126
3087
  void SwigDirector_Window::draw() {
3127
3088
  VALUE result;
3128
3089
 
3129
- result = rb_funcall(swig_get_self(), rb_intern("draw"), 0, NULL);
3090
+ result = rb_funcall(swig_get_self(), rb_intern("protected_draw_2"), 0, NULL);
3130
3091
  }
3131
3092
 
3132
3093
 
@@ -3134,7 +3095,7 @@ bool SwigDirector_Window::needsRedraw() const {
3134
3095
  bool c_result ;
3135
3096
  VALUE result;
3136
3097
 
3137
- result = rb_funcall(swig_get_self(), rb_intern("needs_redraw?"), 0, NULL);
3098
+ result = rb_funcall(swig_get_self(), rb_intern("protected_needs_redraw?"), 0, NULL);
3138
3099
  bool swig_val;
3139
3100
  int swig_res = SWIG_AsVal_bool(result, &swig_val);
3140
3101
  if (!SWIG_IsOK(swig_res)) {
@@ -3149,7 +3110,7 @@ bool SwigDirector_Window::needsCursor() const {
3149
3110
  bool c_result ;
3150
3111
  VALUE result;
3151
3112
 
3152
- result = rb_funcall(swig_get_self(), rb_intern("needs_cursor?"), 0, NULL);
3113
+ result = rb_funcall(swig_get_self(), rb_intern("protected_needs_cursor?"), 0, NULL);
3153
3114
  bool swig_val;
3154
3115
  int swig_res = SWIG_AsVal_bool(result, &swig_val);
3155
3116
  if (!SWIG_IsOK(swig_res)) {
@@ -3163,7 +3124,7 @@ bool SwigDirector_Window::needsCursor() const {
3163
3124
  void SwigDirector_Window::loseFocus() {
3164
3125
  VALUE result;
3165
3126
 
3166
- result = rb_funcall(swig_get_self(), rb_intern("lose_focus"), 0, NULL);
3127
+ result = rb_funcall(swig_get_self(), rb_intern("protected_lose_focus"), 0, NULL);
3167
3128
  }
3168
3129
 
3169
3130
 
@@ -3184,7 +3145,7 @@ void SwigDirector_Window::buttonDown(Gosu::Button arg0) {
3184
3145
  else
3185
3146
  obj0 = LONG2NUM((&arg0)->id());
3186
3147
  }
3187
- result = rb_funcall(swig_get_self(), rb_intern("button_down"), 1,obj0);
3148
+ result = rb_funcall(swig_get_self(), rb_intern("protected_button_down"), 1,obj0);
3188
3149
  }
3189
3150
 
3190
3151
 
@@ -3198,7 +3159,7 @@ void SwigDirector_Window::buttonUp(Gosu::Button arg0) {
3198
3159
  else
3199
3160
  obj0 = LONG2NUM((&arg0)->id());
3200
3161
  }
3201
- result = rb_funcall(swig_get_self(), rb_intern("button_up"), 1,obj0);
3162
+ result = rb_funcall(swig_get_self(), rb_intern("protected_button_up"), 1,obj0);
3202
3163
  }
3203
3164
 
3204
3165
 
@@ -11209,7 +11170,7 @@ SWIGEXPORT void Init_gosu(void) {
11209
11170
  rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
11210
11171
  rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(10)));
11211
11172
  rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(2)));
11212
- rb_define_const(mGosu, "VERSION", SWIG_FromCharPtr("0.10.2.pre1"));
11173
+ rb_define_const(mGosu, "VERSION", SWIG_FromCharPtr("0.10.2"));
11213
11174
  rb_define_const(mGosu, "GOSU_COPYRIGHT_NOTICE", SWIG_FromCharPtr("This software uses the following third-party libraries:\n\nGosu, http://www.libgosu.org, MIT License, http://opensource.org/licenses/MIT\nSDL 2, http://www.libsdl.org, MIT License, http://opensource.org/licenses/MIT\nlibsndfile, http://www.mega-nerd.com/libsndfile, GNU LGPL 3, http://www.gnu.org/copyleft/lesser.html\nOpenAL Soft, http://kcat.strangesoft.net/openal.html, GNU LGPL 2, http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html\n"));
11214
11175
  rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
11215
11176
  rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
@@ -742,6 +742,18 @@ module Gosu
742
742
  #
743
743
  # @return [void]
744
744
  def show; end
745
+
746
+ ##
747
+ # EXPERIMENTAL - MAY DISAPPEAR WITHOUT WARNING:
748
+ # Performs a single step in the main loop. This can be useful for integrating Gosu with other
749
+ # libraries that have their own main loop, e.g. Ruby/Tk.
750
+ #
751
+ # See: https://www.libgosu.org/cgi-bin/mwf/topic_show.pl?tid=1218
752
+ #
753
+ # If you find a good way to use this, please post it on the forum. Thank you!
754
+ #
755
+ # @return [true, false] whether the Window should still be shown after this tick
756
+ def tick; end
745
757
 
746
758
  ##
747
759
  # Tells the window to end the current run loop as soon as possible. Calling this method will not prevent execution of lines after it.
@@ -67,7 +67,7 @@ namespace Gosu
67
67
  allocatedLines += 10;
68
68
  bmp.resize(bmp.width(),
69
69
  fontHeight * allocatedLines + lineSpacing * (allocatedLines - 1),
70
- Color::NONE);
70
+ 0x00ffffff);
71
71
  }
72
72
  }
73
73
 
@@ -183,7 +183,7 @@ namespace Gosu
183
183
  {
184
184
  Bitmap result = bmp;
185
185
  result.resize(result.width(),
186
- fontHeight * usedLines + lineSpacing * (usedLines - 1));
186
+ fontHeight * usedLines + lineSpacing * (usedLines - 1), 0x00ffffff);
187
187
  return result;
188
188
  }
189
189
 
@@ -347,7 +347,7 @@ Gosu::Bitmap Gosu::createText(const wstring& text,
347
347
  {
348
348
  Gosu::Bitmap entity = entityBitmap(part.entityAt(0));
349
349
  multiplyBitmapAlpha(entity, part.colorAt(0).alpha());
350
- bmp.resize(max(bmp.width(), x + entity.width()), bmp.height());
350
+ bmp.resize(max(bmp.width(), x + entity.width()), bmp.height(), 0x00ffffff);
351
351
  bmp.insert(entity, x, i * fontHeight);
352
352
  x += entity.width();
353
353
  continue;
@@ -357,7 +357,7 @@ Gosu::Bitmap Gosu::createText(const wstring& text,
357
357
  wstring unformattedText = part.unformat();
358
358
  unsigned partWidth =
359
359
  textWidth(unformattedText, fontName, fontHeight, part.flagsAt(0));
360
- bmp.resize(max(bmp.width(), x + partWidth), bmp.height());
360
+ bmp.resize(max(bmp.width(), x + partWidth), bmp.height(), 0x00ffffff);
361
361
  drawText(bmp, unformattedText, x, i * fontHeight, part.colorAt(0),
362
362
  fontName, fontHeight, part.flagsAt(0));
363
363
  x += partWidth;
@@ -1,7 +1,5 @@
1
1
  #import <Gosu/Platform.hpp>
2
2
 
3
- #if defined(GOSU_IS_IPHONE) || defined(__LP64__)
4
-
5
3
  #include <Gosu/Text.hpp>
6
4
  #include <Gosu/Bitmap.hpp>
7
5
  #include <Gosu/Utility.hpp>
@@ -29,6 +27,8 @@ namespace
29
27
  // like any system font. Otherwise, just returns the family name.
30
28
  std::wstring normalizeFont(const std::wstring& fontName)
31
29
  {
30
+ // On iOS, we have no support for loading font files yet. However if you register your fonts
31
+ // via your app's Info.plist, you should be able to reference them by their name.
32
32
  #ifdef GOSU_IS_IPHONE
33
33
  return fontName;
34
34
  #else
@@ -48,8 +48,7 @@ namespace
48
48
  fontName.length() * sizeof(wchar_t),
49
49
  kCFStringEncodingUTF32LE, NO));
50
50
  CFRef<CFURLRef> url(
51
- CFURLCreateWithFileSystemPath(NULL, urlString.obj(),
52
- kCFURLPOSIXPathStyle, YES));
51
+ CFURLCreateWithFileSystemPath(NULL, urlString.obj(), kCFURLPOSIXPathStyle, YES));
53
52
  if (!url.get())
54
53
  return familyOfFiles[fontName] = Gosu::defaultFontName();
55
54
 
@@ -57,17 +56,15 @@ namespace
57
56
  CTFontManagerCreateFontDescriptorsFromURL(url.obj()));
58
57
 
59
58
  if (array.get() == NULL || CFArrayGetCount(array.obj()) < 1 ||
60
- !CTFontManagerRegisterFontsForURL(url.obj(),
61
- kCTFontManagerScopeProcess, NULL))
59
+ !CTFontManagerRegisterFontsForURL(url.obj(), kCTFontManagerScopeProcess, NULL))
62
60
  return familyOfFiles[fontName] = Gosu::defaultFontName();
63
61
 
64
62
  CTFontDescriptorRef ref =
65
63
  (CTFontDescriptorRef)CFArrayGetValueAtIndex(array.get(), 0);
66
64
  CFRef<CFStringRef> fontNameStr(
67
65
  (CFStringRef)CTFontDescriptorCopyAttribute(ref, kCTFontFamilyNameAttribute));
68
-
69
- const char* utf8FontName =
70
- [(NSString*)fontNameStr.obj() cStringUsingEncoding: NSUTF8StringEncoding];
66
+
67
+ const char* utf8FontName = [(NSString*)fontNameStr.obj() UTF8String];
71
68
  return familyOfFiles[fontName] = Gosu::utf8ToWstring(utf8FontName);
72
69
  #endif
73
70
  }
@@ -81,9 +78,9 @@ namespace
81
78
  OSXFont* result = usedFonts[make_pair(fontName, make_pair(fontFlags, height))];
82
79
  if (!result)
83
80
  {
84
- ObjCRef<NSString> name([[NSString alloc] initWithUTF8String: Gosu::wstringToUTF8(fontName).c_str()]);
81
+ ObjCRef<NSString> name([[NSString alloc] initWithUTF8String:Gosu::wstringToUTF8(fontName).c_str()]);
85
82
  #ifdef GOSU_IS_IPHONE
86
- result = [OSXFont fontWithName: name.obj() size: height];
83
+ result = [OSXFont fontWithName:name.obj() size:height];
87
84
  #else
88
85
  NSFontDescriptor* desc = [[NSFontDescriptor fontDescriptorWithFontAttributes:nil] fontDescriptorWithFamily:name.obj()];
89
86
  result = [[NSFont fontWithDescriptor:desc size:height] retain];
@@ -103,8 +100,6 @@ namespace
103
100
 
104
101
  wstring Gosu::defaultFontName()
105
102
  {
106
- // OF COURSE Helvetica is better - but the dots above my capital umlauts get
107
- // eaten when I use it with Gosu. Until this is fixed, keep Arial. (TODO)
108
103
  return L"Arial";
109
104
  }
110
105
 
@@ -121,7 +116,7 @@ namespace
121
116
  if (fontFlags & Gosu::ffUnderline)
122
117
  {
123
118
  Gosu::ObjCRef<NSNumber> underline([[NSNumber alloc] initWithInt:NSUnderlineStyleSingle]);
124
- [dict setValue: underline.obj() forKey:NSUnderlineStyleAttributeName];
119
+ [dict setValue:underline.obj() forKey:NSUnderlineStyleAttributeName];
125
120
  }
126
121
  return dict;
127
122
  }
@@ -138,12 +133,12 @@ unsigned Gosu::textWidth(const wstring& text,
138
133
 
139
134
  // This will, of course, compute a too large size; fontHeight is in pixels,
140
135
  // the method expects point.
141
- ObjCRef<NSString> string([[NSString alloc] initWithUTF8String: wstringToUTF8(text).c_str()]);
136
+ ObjCRef<NSString> string([[NSString alloc] initWithUTF8String:wstringToUTF8(text).c_str()]);
142
137
  #ifndef GOSU_IS_IPHONE
143
138
  ObjCRef<NSDictionary> attributes(attributeDictionary(font, fontFlags));
144
- NSSize size = [string.obj() sizeWithAttributes: attributes.get()];
139
+ NSSize size = [string.obj() sizeWithAttributes:attributes.get()];
145
140
  #else
146
- CGSize size = [string.obj() sizeWithFont: font];
141
+ CGSize size = [string.obj() sizeWithFont:font];
147
142
  #endif
148
143
 
149
144
  // Now adjust the scaling...
@@ -158,20 +153,20 @@ void Gosu::drawText(Bitmap& bitmap, const wstring& text, int x, int y,
158
153
  throw std::invalid_argument("the argument to drawText cannot contain line breaks");
159
154
 
160
155
  OSXFont* font = getFont(fontName, fontFlags, fontHeight);
161
- ObjCRef<NSString> string([[NSString alloc] initWithUTF8String: wstringToUTF8(text).c_str()]);
156
+ ObjCRef<NSString> string([[NSString alloc] initWithUTF8String:wstringToUTF8(text).c_str()]);
162
157
 
163
- // This will, of course, compute a too large size; fontHeight is in pixels, the method expects point.
158
+ // Note that fontHeight is in pixels, the method expects points, so we have to scale this down.
164
159
  #ifndef GOSU_IS_IPHONE
165
160
  ObjCRef<NSDictionary> attributes(attributeDictionary(font, fontFlags));
166
- NSSize size = [string.obj() sizeWithAttributes: attributes.get()];
161
+ NSSize size = [string.obj() sizeWithAttributes:attributes.get()];
167
162
  #else
168
- CGSize size = [string.obj() sizeWithFont: font];
163
+ CGSize size = [string.obj() sizeWithFont:font];
169
164
  #endif
170
165
 
171
166
  unsigned width = static_cast<unsigned>(round(size.width / size.height * fontHeight));
172
167
 
173
168
  // Get the width and height of the image
174
- Bitmap bmp(width, fontHeight);
169
+ Bitmap bmp(width, fontHeight, 0x00ffffff);
175
170
 
176
171
  // Use a temporary context to draw the CGImage to the buffer.
177
172
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
@@ -194,7 +189,7 @@ void Gosu::drawText(Bitmap& bitmap, const wstring& text, int x, int y,
194
189
  CGContextTranslateCTM(context, 0, fontHeight);
195
190
  CGContextScaleCTM(context, 1, -1);
196
191
  UIGraphicsPushContext(context);
197
- [string.obj() drawAtPoint: CGPointZero withFont: font];
192
+ [string.obj() drawAtPoint:CGPointZero withFont:font];
198
193
  UIGraphicsPopContext();
199
194
  #else
200
195
  NSPoint NSPointZero = { 0, 0 };
@@ -203,7 +198,7 @@ void Gosu::drawText(Bitmap& bitmap, const wstring& text, int x, int y,
203
198
  [NSGraphicsContext saveGraphicsState];
204
199
  [NSGraphicsContext setCurrentContext:
205
200
  [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)context flipped:false]];
206
- [string.obj() drawAtPoint: NSPointZero withAttributes: attributes.get()];
201
+ [string.obj() drawAtPoint:NSPointZero withAttributes:attributes.get()];
207
202
  [NSGraphicsContext restoreGraphicsState];
208
203
  #endif
209
204
  CGContextRelease(context);
@@ -220,5 +215,3 @@ void Gosu::drawText(Bitmap& bitmap, const wstring& text, int x, int y,
220
215
  bitmap.setPixel(x + relX, y + relY, c);
221
216
  }
222
217
  }
223
-
224
- #endif
@@ -79,11 +79,6 @@ namespace Gosu
79
79
  return bitmap;
80
80
  }
81
81
 
82
- /*char* data() const
83
- {
84
- return pixels;
85
- }*/
86
-
87
82
  void selectFont(std::wstring fontName, unsigned fontHeight,
88
83
  unsigned fontFlags) const
89
84
  {
@@ -123,8 +118,9 @@ namespace Gosu
123
118
  CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
124
119
  DEFAULT_PITCH | FF_DONTCARE };
125
120
 
126
- // Note: This will truncate the font value, but that's the way stuff works.
127
- /*std::*/wcsncpy(logfont.lfFaceName, fontName.c_str(), LF_FACESIZE);
121
+ // Don't rely on wcsncpy being in std::...
122
+ using namepace std;
123
+ wcsncpy(logfont.lfFaceName, fontName.c_str(), LF_FACESIZE);
128
124
  logfont.lfFaceName[LF_FACESIZE - 1] = 0;
129
125
 
130
126
  font = loadedFonts[key] = Win::check(::CreateFontIndirect(&logfont),
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.10.2.pre1
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Raschke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-31 00:00:00.000000000 Z
11
+ date: 2015-09-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  2D game development library.
@@ -85,7 +85,6 @@ files:
85
85
  - src/Math.cpp
86
86
  - src/Text/Font.cpp
87
87
  - src/Text/Text.cpp
88
- - src/Text/TextMac.cpp
89
88
  - src/Text/TextTTFWin.cpp
90
89
  - src/Text/TextUnix.cpp
91
90
  - src/Text/TextWin.cpp
@@ -155,9 +154,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
154
  version: 1.8.2
156
155
  required_rubygems_version: !ruby/object:Gem::Requirement
157
156
  requirements:
158
- - - '>'
157
+ - - '>='
159
158
  - !ruby/object:Gem::Version
160
- version: 1.3.1
159
+ version: '0'
161
160
  requirements: []
162
161
  rubyforge_project:
163
162
  rubygems_version: 2.0.14
@@ -1,253 +0,0 @@
1
- #include <Gosu/Platform.hpp>
2
-
3
- #if !defined(GOSU_IS_IPHONE) && !defined(__LP64__)
4
-
5
- #include <Gosu/Bitmap.hpp>
6
- #include <Gosu/Text.hpp>
7
- #include <Gosu/TR1.hpp>
8
- #include <Gosu/Math.hpp>
9
- #include <Gosu/Utility.hpp>
10
- #include <Gosu/IO.hpp>
11
- #include "../AppleUtility.hpp"
12
- #include <cmath>
13
- #include <stdexcept>
14
- #include <map>
15
- #include <vector>
16
- #include <ApplicationServices/ApplicationServices.h>
17
-
18
- std::wstring Gosu::defaultFontName()
19
- {
20
- // OF COURSE Helvetica is better - but the dots above my capital umlauts get
21
- // eaten when I use it with Gosu. Until this is fixed, keep Arial. (TODO)
22
- return L"Arial";
23
- }
24
-
25
- namespace Gosu
26
- {
27
- std::vector<unsigned short> wstringToUniChars(const std::wstring& ws);
28
- }
29
-
30
- namespace
31
- {
32
- class MacBitmap
33
- {
34
- std::tr1::uint32_t* buf;
35
- unsigned width, height;
36
- CGContextRef ctx;
37
-
38
- MacBitmap(const MacBitmap&);
39
- MacBitmap& operator=(const MacBitmap&);
40
-
41
- public:
42
- MacBitmap(std::tr1::uint32_t* buf, unsigned width, unsigned height)
43
- : buf(buf), width(width), height(height)
44
- {
45
- CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
46
- ctx = CGBitmapContextCreate (buf, width, height, 8, width * 4, colorSpace,
47
- kCGImageAlphaPremultipliedLast);
48
-
49
- CGColorSpaceRelease( colorSpace );
50
- }
51
-
52
- ~MacBitmap()
53
- {
54
- CGContextRelease(ctx);
55
- }
56
-
57
- CGContextRef context() const
58
- {
59
- return ctx;
60
- }
61
- };
62
-
63
- struct CachedFontInfo
64
- {
65
- ATSUFontID fontId;
66
- double heightAt1Pt;
67
- double descentAt1Pt;
68
- };
69
- CachedFontInfo& getFont(const std::wstring& fontName)
70
- {
71
- static std::map<std::wstring, CachedFontInfo> fonts;
72
-
73
- if (fonts.count(fontName))
74
- return fonts[fontName];
75
-
76
- // Get reference to font, loaded from the system or a file.
77
- ATSFontRef atsRef;
78
- if (fontName.find(L"/") == std::wstring::npos)
79
- {
80
- // System font
81
- CFStringRef cfName = CFStringCreateWithCString(NULL, Gosu::narrow(fontName).c_str(), kCFStringEncodingASCII);
82
- atsRef = ATSFontFindFromName(cfName, kATSOptionFlagsDefault);
83
- if (!atsRef)
84
- throw std::runtime_error("Cannot find font " + Gosu::narrow(fontName));
85
- CFRelease(cfName);
86
- }
87
- else
88
- {
89
- // Filename to font
90
- Gosu::Buffer buf;
91
- Gosu::loadFile(buf, fontName);
92
-
93
- ATSFontContainerRef container;
94
- CHECK_OS( ATSFontActivateFromMemory(buf.data(), buf.size(),
95
- kATSFontContextLocal, kATSFontFormatUnspecified,
96
- NULL, kATSOptionFlagsDefault, &container) );
97
-
98
- ATSFontRef fontRefs[1024];
99
- ItemCount fontCount;
100
- CHECK_OS( ATSFontFindFromContainer(container, kATSOptionFlagsDefault,
101
- 1024, fontRefs, &fontCount) );
102
- if (fontCount == 0)
103
- throw std::runtime_error("No font found in " + Gosu::narrow(fontName));
104
-
105
- atsRef = fontRefs[0];
106
- }
107
-
108
- // Calculate metrics (for space allocations) and create CachedFontInfo entry.
109
- CachedFontInfo newFont;
110
- newFont.fontId = (ATSUFontID)atsRef;
111
-
112
- ATSFontMetrics metrics;
113
- CHECK_OS(ATSFontGetHorizontalMetrics(newFont.fontId, kATSOptionFlagsDefault, &metrics));
114
- newFont.heightAt1Pt = metrics.ascent - metrics.descent;
115
- newFont.descentAt1Pt = -metrics.descent;
116
- fonts[fontName] = newFont;
117
- return fonts[fontName];
118
- }
119
-
120
- class ATSULayoutAndStyle
121
- {
122
- ATSUStyle style;
123
- ATSUTextLayout layout;
124
- std::vector<UniChar> utf16; // More like UCS-2-INTERNAL.
125
-
126
- template<typename T>
127
- void setAttribute(ATSUAttributeTag tag, T value)
128
- {
129
- ByteCount size = sizeof value;
130
- ATSUAttributeValuePtr ptr = &value;
131
- CHECK_OS( ATSUSetAttributes(style, 1, &tag, &size, &ptr) );
132
- }
133
-
134
- template<typename T>
135
- void setLayoutControl(ATSUAttributeTag tag, T value)
136
- {
137
- ByteCount size = sizeof value;
138
- ATSUAttributeValuePtr ptr = &value;
139
- CHECK_OS( ATSUSetLayoutControls(layout, 1, &tag, &size, &ptr) );
140
- }
141
-
142
- public:
143
- ATSULayoutAndStyle(const std::wstring& text, const std::wstring& fontName, unsigned fontHeightPx, unsigned fontFlags)
144
- {
145
- utf16 = Gosu::wstringToUniChars(text);
146
-
147
- CHECK_OS( ATSUCreateStyle(&style) );
148
-
149
- CachedFontInfo& font = getFont(fontName);
150
-
151
- setAttribute<ATSUFontID>(kATSUFontTag, font.fontId);
152
-
153
- setAttribute<Fixed>(kATSUSizeTag, X2Fix(fontHeightPx / font.heightAt1Pt));
154
- if (fontFlags & Gosu::ffBold)
155
- setAttribute<Boolean>(kATSUQDBoldfaceTag, TRUE);
156
- if (fontFlags & Gosu::ffItalic)
157
- setAttribute<Boolean>(kATSUQDItalicTag, TRUE);
158
- if (fontFlags & Gosu::ffUnderline)
159
- setAttribute<Boolean>(kATSUQDUnderlineTag, TRUE);
160
-
161
- UniCharCount runLength = utf16.size();
162
- CHECK_OS( ATSUCreateTextLayoutWithTextPtr(&utf16[0], kATSUFromTextBeginning,
163
- kATSUToTextEnd, utf16.size(), 1, &runLength, &style, &layout) );
164
- }
165
-
166
- ~ATSULayoutAndStyle()
167
- {
168
- CHECK_OS( ATSUDisposeStyle(style) );
169
- CHECK_OS( ATSUDisposeTextLayout(layout) );
170
- }
171
-
172
- Rect textExtents() const
173
- {
174
- Rect rect;
175
- CHECK_OS( ATSUSetTransientFontMatching(layout, TRUE) );
176
- CHECK_OS( ATSUMeasureTextImage(layout, kATSUFromTextBeginning,
177
- kATSUToTextEnd, X2Fix(0), X2Fix(0), &rect) );
178
- return rect;
179
- }
180
-
181
- void drawToContext(Fixed x, Fixed y, CGContextRef context)
182
- {
183
- // Always draw in black - recoloring to white happens in drawText itself.
184
- // Reason: Text drawn using fallback fonts seems to always be black anyway :(
185
-
186
- RGBColor color = { 0, 0, 0 };
187
- setAttribute<RGBColor>(kATSUColorTag, color);
188
- setLayoutControl<CGContextRef>(kATSUCGContextTag, context);
189
- CHECK_OS( ATSUSetTransientFontMatching(layout, TRUE) );
190
- CHECK_OS( ATSUDrawText(layout, kATSUFromTextBeginning, kATSUToTextEnd, x, y) );
191
- }
192
- };
193
- }
194
-
195
- unsigned Gosu::textWidth(const std::wstring& text,
196
- const std::wstring& fontName, unsigned fontHeight, unsigned fontFlags)
197
- {
198
- if (text.find_first_of(L"\r\n") != std::wstring::npos)
199
- throw std::invalid_argument("the argument to textWidth cannot contain line breaks");
200
-
201
- // TODO: Why 1?
202
- if (text.empty())
203
- return 1;
204
-
205
- // TODO: special case :(
206
- // TODO: Why? I guess it was empty otherwise?
207
- if (text == L" ")
208
- return fontHeight / 3;
209
-
210
- ATSULayoutAndStyle atlas(text, fontName, fontHeight, fontFlags);
211
- Rect rect = atlas.textExtents();
212
- return rect.right + 1 - rect.left + 1; // add one pixel on OS X
213
- }
214
-
215
- void Gosu::drawText(Bitmap& bitmap, const std::wstring& text, int x, int y,
216
- Color c, const std::wstring& fontName, unsigned fontHeight,
217
- unsigned fontFlags)
218
- {
219
- if (text.find_first_of(L"\r\n") != std::wstring::npos)
220
- throw std::invalid_argument("the argument to drawText cannot contain line breaks");
221
-
222
- if (text.empty())
223
- return;
224
-
225
- CachedFontInfo& font = getFont(fontName);
226
-
227
- ATSULayoutAndStyle atlas(text, fontName, fontHeight, fontFlags);
228
- Rect rect = atlas.textExtents();
229
- int width = rect.right + 1 - rect.left + 1; // add one pixel on OS X
230
- std::vector<std::tr1::uint32_t> buf(width * fontHeight);
231
- {
232
- MacBitmap helper(&buf[0], width, fontHeight);
233
- atlas.drawToContext(X2Fix(-rect.left), X2Fix(fontHeight / font.heightAt1Pt * font.descentAt1Pt),
234
- helper.context());
235
- }
236
-
237
- int effectiveWidth = Gosu::clamp<int>(width, 0, bitmap.width() - x);
238
- int effectiveHeight = Gosu::clamp<int>(fontHeight, 0, bitmap.height() - y);
239
-
240
- for (int relY = 0; relY < effectiveHeight; ++relY)
241
- for (int relX = 0; relX < effectiveWidth; ++relX)
242
- {
243
- #ifdef __BIG_ENDIAN__
244
- Color::Channel alpha = buf[relY * width + relX];
245
- #else
246
- Color::Channel alpha = Color(buf[relY * width + relX]).alpha();
247
- #endif
248
- if (alpha != 0)
249
- bitmap.setPixel(x + relX, y + relY, multiply(c, Color(alpha, 0xff, 0xff, 0xff)));
250
- }
251
- }
252
-
253
- #endif