gosu 0.14.3 → 0.14.4.pre2
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 +4 -4
- data/Gosu/Version.hpp +1 -1
- data/src/Log.hpp +19 -0
- data/src/RubyGosu.cxx +1 -1
- data/src/Texture.cpp +3 -0
- data/src/TrueTypeFont.cpp +2 -2
- data/src/TrueTypeFontUnix.cpp +64 -17
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad14d18a7ade0c42aab29811719f40e6f6c8ada5f1aa2b8048b3f0306baaf138
|
4
|
+
data.tar.gz: 3937bfbc9006015e908c3ce0420ad0c3a2264d6181720bc3a924c0fbca624861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a568075f265f527e288991b9da74b81fd1e52c308609d5aea42fdb5c4b5af1fac0f3a399d8ba7d35089f3fa070b52309997be923f94f5a991440683852837003
|
7
|
+
data.tar.gz: c075d9b23de4e3135953cedb3c27079f94e5c128697581418b8ab553e32172024961a36e75a2338a1c37c9f567923be774c0f709f8dc9babb0260cb82987b549
|
data/Gosu/Version.hpp
CHANGED
data/src/Log.hpp
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <cstdlib>
|
4
|
+
#include <utility>
|
5
|
+
|
6
|
+
namespace Gosu
|
7
|
+
{
|
8
|
+
template<class... Args>
|
9
|
+
void log(const char* format, Args&&... args)
|
10
|
+
{
|
11
|
+
using namespace std;
|
12
|
+
|
13
|
+
if (getenv("GOSU_DEBUG")) {
|
14
|
+
fprintf(stderr, format, std::forward<Args>(args)...);
|
15
|
+
fprintf(stderr, "\n");
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
data/src/RubyGosu.cxx
CHANGED
@@ -11701,7 +11701,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11701
11701
|
rb_define_const(mGosu, "LICENSES", SWIG_From_std_string(static_cast< std::string >(Gosu::LICENSES)));
|
11702
11702
|
rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11703
11703
|
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(14)));
|
11704
|
-
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(
|
11704
|
+
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(4)));
|
11705
11705
|
rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
|
11706
11706
|
rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
|
11707
11707
|
rb_define_module_function(mGosu, "degrees_to_radians", VALUEFUNC(_wrap_degrees_to_radians), -1);
|
data/src/Texture.cpp
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#include "Texture.hpp"
|
2
2
|
#include "TexChunk.hpp"
|
3
|
+
#include "Log.hpp"
|
3
4
|
#include <Gosu/Bitmap.hpp>
|
4
5
|
#include <Gosu/Graphics.hpp>
|
5
6
|
#include <Gosu/Platform.hpp>
|
@@ -14,6 +15,8 @@ namespace Gosu
|
|
14
15
|
Gosu::Texture::Texture(unsigned width, unsigned height, bool retro)
|
15
16
|
: allocator_(width, height), retro_(retro)
|
16
17
|
{
|
18
|
+
log("Allocating a new texture of size %dx%d (retro=%d)", width, height, (int) retro);
|
19
|
+
|
17
20
|
ensure_current_context();
|
18
21
|
|
19
22
|
// Create texture name.
|
data/src/TrueTypeFont.cpp
CHANGED
@@ -244,7 +244,7 @@ Gosu::TrueTypeFont& Gosu::font_by_name(const string& font_name, unsigned font_fl
|
|
244
244
|
vector<const unsigned char*> ttf_stack;
|
245
245
|
ttf_stack.push_back(ttf_fallback_data());
|
246
246
|
ttf_stack.push_back(ttf_data_by_name(default_font_name(), 0));
|
247
|
-
ttf_stack.push_back(ttf_data_by_name(default_font_name(), font_flags));
|
247
|
+
if (font_flags != 0) ttf_stack.push_back(ttf_data_by_name(default_font_name(), font_flags));
|
248
248
|
|
249
249
|
if (font_name.find_first_of("./\\") != string::npos) {
|
250
250
|
// A filename? Load it and add it to the stack.
|
@@ -253,7 +253,7 @@ Gosu::TrueTypeFont& Gosu::font_by_name(const string& font_name, unsigned font_fl
|
|
253
253
|
else if (font_name != default_font_name()) {
|
254
254
|
// A font name? Add it to the stack, both with font_flags and without.
|
255
255
|
ttf_stack.push_back(ttf_data_by_name(font_name, 0));
|
256
|
-
ttf_stack.push_back(ttf_data_by_name(font_name, font_flags));
|
256
|
+
if (font_flags != 0) ttf_stack.push_back(ttf_data_by_name(font_name, font_flags));
|
257
257
|
}
|
258
258
|
|
259
259
|
font_ptr = &font_with_stack(move(ttf_stack));
|
data/src/TrueTypeFontUnix.cpp
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
#if defined(GOSU_IS_X)
|
3
3
|
|
4
4
|
#include "TrueTypeFont.hpp"
|
5
|
+
#include "Log.hpp"
|
5
6
|
|
6
7
|
#include <Gosu/IO.hpp>
|
7
8
|
#include <Gosu/Text.hpp>
|
9
|
+
#include <Gosu/Utility.hpp>
|
8
10
|
|
9
11
|
#include <fontconfig/fontconfig.h>
|
10
12
|
|
@@ -19,18 +21,22 @@ const unsigned char* Gosu::ttf_data_by_name(const string& font_name, unsigned fo
|
|
19
21
|
auto& ttf_ptr = ttf_file_cache[make_pair(font_name, font_flags)];
|
20
22
|
if (ttf_ptr) return ttf_ptr;
|
21
23
|
|
24
|
+
log("Trying to find a font named '%s', flags=%x", font_name.c_str(), font_flags);
|
25
|
+
|
22
26
|
static FcConfig* config = FcInitLoadConfigAndFonts();
|
23
27
|
if (config) {
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
FcPattern* pattern;
|
29
|
+
// Our search pattern does not include weight or slant so that we can compromise on these.
|
30
|
+
pattern = FcPatternBuild(nullptr,
|
31
|
+
FC_FAMILY, FcTypeString, font_name.empty() ? "sans-serif" : font_name.c_str(),
|
32
|
+
FC_OUTLINE, FcTypeBool, FcTrue, // exclude bitmap fonts
|
33
|
+
nullptr);
|
34
|
+
|
31
35
|
FcObjectSet* props = FcObjectSetBuild(FC_FILE, FC_WEIGHT, FC_SLANT, nullptr);
|
32
36
|
|
33
37
|
if (FcFontSet* fonts = FcFontList(config, pattern, props)) {
|
38
|
+
log("Looking for the best candidate among %d matching fonts", (int) fonts->nfont);
|
39
|
+
|
34
40
|
// Among all matching fonts, find the variant that is the best fit for our font_flags.
|
35
41
|
string best_filename;
|
36
42
|
int best_diff;
|
@@ -45,26 +51,32 @@ const unsigned char* Gosu::ttf_data_by_name(const string& font_name, unsigned fo
|
|
45
51
|
// Lower is better, so find the font with the lowest diff.
|
46
52
|
int diff = 0;
|
47
53
|
if (font_flags & Gosu::FF_BOLD) {
|
48
|
-
diff += abs(weight -
|
54
|
+
diff += abs(weight - FC_WEIGHT_BOLD);
|
49
55
|
}
|
50
56
|
else {
|
51
|
-
diff += abs(weight -
|
57
|
+
diff += abs(weight - FC_WEIGHT_REGULAR);
|
52
58
|
}
|
53
59
|
if (font_flags & Gosu::FF_ITALIC) {
|
54
|
-
diff += abs(slant -
|
60
|
+
diff += abs(slant - FC_SLANT_ITALIC);
|
55
61
|
}
|
56
62
|
else {
|
57
|
-
diff += abs(slant -
|
63
|
+
diff += abs(slant - FC_SLANT_ROMAN);
|
64
|
+
}
|
65
|
+
|
66
|
+
// Penalize OTF fonts since we are not really good at handling these.
|
67
|
+
FcChar8 *file;
|
68
|
+
FcPatternGetString(fonts->fonts[i], FC_FILE, 0, &file);
|
69
|
+
if (has_extension(reinterpret_cast<char*>(file), ".otf")) {
|
70
|
+
diff += 10000;
|
58
71
|
}
|
59
72
|
|
60
73
|
if (best_filename.empty() || diff < best_diff) {
|
61
|
-
FcChar8 *file;
|
62
|
-
FcPatternGetString(fonts->fonts[i], FC_FILE, 0, &file);
|
63
74
|
best_filename = reinterpret_cast<char*>(file);
|
64
75
|
best_diff = diff;
|
65
76
|
}
|
66
77
|
}
|
67
78
|
if (!best_filename.empty()) {
|
79
|
+
log("Loading best candidate '%s'", best_filename.c_str());
|
68
80
|
ttf_ptr = ttf_data_from_file(best_filename.c_str());
|
69
81
|
}
|
70
82
|
|
@@ -78,22 +90,57 @@ const unsigned char* Gosu::ttf_data_by_name(const string& font_name, unsigned fo
|
|
78
90
|
return ttf_ptr;
|
79
91
|
}
|
80
92
|
|
93
|
+
static const unsigned char* ttf_data_of_default_sans_serif_font()
|
94
|
+
{
|
95
|
+
const unsigned char* ttf_ptr = nullptr;
|
96
|
+
|
97
|
+
// At this point, we already have an open FcConfig, and can pass nullptr to these functions.
|
98
|
+
FcPattern* pattern = FcNameParse(reinterpret_cast<const FcChar8*>("sans-serif"));
|
99
|
+
FcConfigSubstitute(nullptr, pattern, FcMatchPattern);
|
100
|
+
FcDefaultSubstitute(pattern);
|
101
|
+
FcResult match_result;
|
102
|
+
pattern = FcFontMatch(nullptr, pattern, &match_result);
|
103
|
+
if (match_result == FcResultMatch) {
|
104
|
+
FcChar8* filename;
|
105
|
+
if (FcPatternGetString(pattern, FC_FILE, 0, &filename) == FcResultMatch) {
|
106
|
+
Gosu::log("Found the default sans-serif font: '%s'", filename);
|
107
|
+
ttf_ptr = Gosu::ttf_data_from_file(reinterpret_cast<char*>(filename));
|
108
|
+
}
|
109
|
+
}
|
110
|
+
FcPatternDestroy(pattern);
|
111
|
+
|
112
|
+
return ttf_ptr;
|
113
|
+
}
|
114
|
+
|
81
115
|
const unsigned char* Gosu::ttf_fallback_data()
|
82
116
|
{
|
83
|
-
// Prefer
|
117
|
+
// Prefer Arial Unicode MS as a fallback because it covers a lot of Unicode in a single file.
|
118
|
+
// This is also the fallback font on Windows and macOS.
|
119
|
+
static const unsigned char* arial_unicode = ttf_data_by_name("Arial Unicode MS", 0);
|
120
|
+
if (arial_unicode) return arial_unicode;
|
121
|
+
|
122
|
+
// DejaVu has at least some Unicode coverage (though no CJK).
|
123
|
+
static const unsigned char* deja_vu = ttf_data_by_name("DejaVu", 0);
|
124
|
+
if (deja_vu) return deja_vu;
|
125
|
+
|
126
|
+
// Unifont has pretty good Unicode coverage, but looks extremely ugly.
|
84
127
|
static const unsigned char* unifont = ttf_data_by_name("Unifont", 0);
|
85
128
|
if (unifont) return unifont;
|
86
129
|
|
87
|
-
//
|
88
|
-
static const unsigned char*
|
89
|
-
if (
|
130
|
+
// If none of the fonts above work, try to use the default sans-serif font.
|
131
|
+
static const unsigned char* default_font = ttf_data_of_default_sans_serif_font();
|
132
|
+
if (default_font) return default_font;
|
90
133
|
|
134
|
+
// If nothing else works, try to load a file from this hardcoded path.
|
91
135
|
return ttf_data_from_file("/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf");
|
92
136
|
}
|
93
137
|
|
94
138
|
string Gosu::default_font_name()
|
95
139
|
{
|
140
|
+
// Liberation Sans was designed to have the same metrics as Arial, which is the default
|
141
|
+
// font on macOS and Windows.
|
96
142
|
return "Liberation Sans";
|
97
143
|
}
|
98
144
|
|
99
145
|
#endif
|
146
|
+
|
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.14.
|
4
|
+
version: 0.14.4.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Raschke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
2D game development library.
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- src/Inspection.cpp
|
96
96
|
- src/LargeImageData.cpp
|
97
97
|
- src/LargeImageData.hpp
|
98
|
+
- src/Log.hpp
|
98
99
|
- src/MPEGFile.hpp
|
99
100
|
- src/Macro.cpp
|
100
101
|
- src/Macro.hpp
|
@@ -162,9 +163,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
163
|
version: 1.9.3
|
163
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
165
|
requirements:
|
165
|
-
- - "
|
166
|
+
- - ">"
|
166
167
|
- !ruby/object:Gem::Version
|
167
|
-
version:
|
168
|
+
version: 1.3.1
|
168
169
|
requirements: []
|
169
170
|
rubyforge_project:
|
170
171
|
rubygems_version: 2.7.6
|