gosu 0.11.3.pre1 → 0.11.3
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/Gosu/Window.hpp +3 -1
- data/lib/gosu/compat.rb +183 -0
- data/lib/gosu/patches.rb +0 -100
- data/lib/gosu/swig_patches.rb +1 -1
- data/lib/gosu.rb +9 -7
- data/rdoc/gosu.rb +11 -17
- data/src/RubyGosu.cxx +59 -7
- data/src/RubyGosu.h +1 -0
- data/src/TextTTFWin.cpp +10 -64
- data/src/TextWin.cpp +3 -4
- data/src/Window.cpp +26 -9
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8b68fbdbd0189edbb8b7cbb01493859fa122a0e
|
4
|
+
data.tar.gz: 382fb6970aaa117293d78a1276bcb1c95dfeb6af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 064b805c31aa7ada4b62afd6f6ad7f15c25fc4e6ccccb0f7aed8b298befe04470b3ce142fb5eefb95c3dd35a2483346fd3f075e050696ebbcc053d26fd8b23a4
|
7
|
+
data.tar.gz: 328be94282b2f6193f64d7957c020b74de6aeada8a82440889ad2d3743debf94ea0a73e4e95c707ae629385d1e21d42028573b50d984e7c4e40de50148f3f219
|
data/Gosu/Version.hpp
CHANGED
data/Gosu/Window.hpp
CHANGED
@@ -77,7 +77,9 @@ namespace Gosu
|
|
77
77
|
virtual bool tick();
|
78
78
|
|
79
79
|
//! Closes the window if it is currently shown.
|
80
|
-
|
80
|
+
//! If you do not want the window to close immediately, you should override this method and
|
81
|
+
//! only call the base implementation (Window::close) when needed.
|
82
|
+
virtual void close();
|
81
83
|
|
82
84
|
//! Called every update_interval milliseconds while the window is being shown.
|
83
85
|
//! Your application's main game logic goes here.
|
data/lib/gosu/compat.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
# This whole file is about backward compatibility.
|
2
|
+
|
3
|
+
# Define some helpers to deprecate code.
|
4
|
+
module Gosu
|
5
|
+
DEPRECATION_STACKTRACE_LINES = 1
|
6
|
+
|
7
|
+
# Adapted from RubyGems, but without the date part.
|
8
|
+
def self.deprecate(klass, name, repl)
|
9
|
+
klass.class_eval {
|
10
|
+
old = "_deprecated_#{name}"
|
11
|
+
alias_method old, name
|
12
|
+
define_method name do |*args, &block|
|
13
|
+
Gosu.deprecation_message(self, name, repl)
|
14
|
+
send old, *args, &block
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.deprecate_const(name, repl)
|
20
|
+
send(:remove_const, name) if const_defined?(name)
|
21
|
+
|
22
|
+
@@_deprecated_constants ||= {}
|
23
|
+
@@_deprecated_constants[name] = repl
|
24
|
+
end
|
25
|
+
|
26
|
+
# Constant deprecation works by undefining the original constant and then re-adding it in
|
27
|
+
# const_missing, so that each deprecation warning is only printed once.
|
28
|
+
def self.const_missing(const_name)
|
29
|
+
if @@_deprecated_constants && repl = @@_deprecated_constants[const_name]
|
30
|
+
Gosu.deprecation_message(self, const_name, repl)
|
31
|
+
const_get(repl)
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.deprecation_message(klass_or_full_message, name=nil, repl=nil)
|
38
|
+
@@_deprecations_shown ||= {}
|
39
|
+
|
40
|
+
msg = if klass_or_full_message.is_a?(String) and name.nil? and repl.nil?
|
41
|
+
[ "DEPRECATION WARNING: #{klass_or_full_message},
|
42
|
+
\n#Called from #{caller[1, DEPRECATION_STACKTRACE_LINES]}"
|
43
|
+
]
|
44
|
+
else
|
45
|
+
# Class method deprecation warnings result in something like this:
|
46
|
+
# #<Class:Gosu::Window>::button_id_to_char is deprecated
|
47
|
+
# Remove the instance-inspect stuff to make it look a bit better:
|
48
|
+
if klass_or_full_message.kind_of?(Module)
|
49
|
+
target = "#{klass_or_full_message.to_s.gsub(/#<Class:(.*)>/, '\1')}::"
|
50
|
+
else
|
51
|
+
"#{klass_or_full_message.class}#"
|
52
|
+
end
|
53
|
+
[ "DEPRECATION WARNING: #{target}#{name} is deprecated",
|
54
|
+
repl == :none ? " with no replacement." : "; use #{repl} instead.",
|
55
|
+
"\n#{target}#{name} called from #{Gosu.deprecation_caller.join("\n")}",
|
56
|
+
]
|
57
|
+
end
|
58
|
+
return if @@_deprecations_shown.has_key?(msg[0])
|
59
|
+
@@_deprecations_shown[msg[0]] = true
|
60
|
+
|
61
|
+
warn "#{msg.join}."
|
62
|
+
end
|
63
|
+
|
64
|
+
# This method removes the deprecation methods themselves from the stacktrace.
|
65
|
+
def self.deprecation_caller
|
66
|
+
caller.delete_if { |trace_line| trace_line =~ /(deprecat|const_missing)/ }
|
67
|
+
.first(DEPRECATION_STACKTRACE_LINES)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# No need to pass a Window to Image.
|
72
|
+
class Gosu::Image
|
73
|
+
alias initialize_without_window initialize
|
74
|
+
|
75
|
+
def initialize(*args)
|
76
|
+
if args[0].is_a? Gosu::Window
|
77
|
+
Gosu.deprecation_message("Passing a Window to Image#initialize has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
78
|
+
if args.size == 7
|
79
|
+
initialize_without_window args[1], :tileable => args[2], :rect => args[3..-1]
|
80
|
+
else
|
81
|
+
initialize_without_window args[1], :tileable => args[2]
|
82
|
+
end
|
83
|
+
else
|
84
|
+
initialize_without_window(*args)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class << self
|
89
|
+
alias from_text_without_window from_text
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.from_text(*args)
|
93
|
+
if args.size == 4
|
94
|
+
Gosu.deprecation_message("Passing a Window to Image.from_text has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
95
|
+
from_text_without_window(args[1], args[3], :font => args[2])
|
96
|
+
elsif args.size == 7
|
97
|
+
Gosu.deprecation_message("Passing a Window to Image.from_text has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
98
|
+
from_text_without_window(args[1], args[3], :font => args[2],
|
99
|
+
:spacing => args[4], :width => args[5], :align => args[6])
|
100
|
+
else
|
101
|
+
from_text_without_window(*args)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# No need to pass a Window to Sample.
|
107
|
+
class Gosu::Sample
|
108
|
+
alias initialize_without_window initialize
|
109
|
+
|
110
|
+
def initialize(*args)
|
111
|
+
if args.first.is_a? Gosu::Window
|
112
|
+
args.shift
|
113
|
+
Gosu.deprecation_message("Passing a Window to Sample#initialize has been deprecated in Gosu 0.7.17.")
|
114
|
+
end
|
115
|
+
initialize_without_window(*args)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# No need to pass a Window to Song.
|
120
|
+
class Gosu::Song
|
121
|
+
alias initialize_without_window initialize
|
122
|
+
|
123
|
+
def initialize(*args)
|
124
|
+
if args.first.is_a? Gosu::Window
|
125
|
+
args.shift
|
126
|
+
Gosu.deprecation_message("Passing a Window to Song#initialize has been deprecated in Gosu 0.7.17.")
|
127
|
+
end
|
128
|
+
initialize_without_window(*args)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Moved some Window-methods to the Gosu::Module
|
133
|
+
class Gosu::Window
|
134
|
+
# Class methods that have been turned into module methods.
|
135
|
+
class << self
|
136
|
+
def button_id_to_char(id)
|
137
|
+
Gosu.button_id_to_char(id)
|
138
|
+
end
|
139
|
+
|
140
|
+
def char_to_button_id(ch)
|
141
|
+
Gosu.char_to_button_id(ch)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Instance methods that have been turned into module methods.
|
146
|
+
%w(draw_line draw_triangle draw_quad
|
147
|
+
flush gl clip_to record
|
148
|
+
transform translate rotate scale
|
149
|
+
button_id_to_char char_to_button_id button_down?).each do |method|
|
150
|
+
define_method method.to_sym do |*args, &block|
|
151
|
+
Gosu.send method, *args, &block
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# Constants
|
157
|
+
module Gosu
|
158
|
+
Gosu.deprecate Window, :set_mouse_position, "Window#mouse_x= and Window#mouse_y="
|
159
|
+
Gosu.deprecate Font, :draw_rot, "Font#draw with Gosu.rotate"
|
160
|
+
|
161
|
+
# This was renamed because it's not actually a "copyright notice".
|
162
|
+
# (https://en.wikipedia.org/wiki/Copyright_notice)
|
163
|
+
deprecate_const :GOSU_COPYRIGHT_NOTICE, :LICENSES
|
164
|
+
|
165
|
+
module Button; end
|
166
|
+
|
167
|
+
# Support for KbLeft instead of KB_LEFT and Gp3Button2 instead of GP_3_BUTTON_2.
|
168
|
+
Gosu.constants.grep(/^KB_|MS_|GP_/).each do |new_name|
|
169
|
+
old_name = case new_name
|
170
|
+
when :KB_ISO then "KbISO"
|
171
|
+
when :KB_NUMPAD_PLUS then "KbNumpadAdd"
|
172
|
+
when :KB_NUMPAD_MINUS then "KbNumpadSubtract"
|
173
|
+
when :KB_EQUALS then "KbEqual"
|
174
|
+
when :KB_LEFT_BRACKET then "KbBracketLeft"
|
175
|
+
when :KB_RIGHT_BRACKET then "KbBracketRight"
|
176
|
+
else new_name.to_s.capitalize.gsub(/_(.)/) { $1.upcase }
|
177
|
+
end
|
178
|
+
Gosu.const_set old_name, new_name
|
179
|
+
|
180
|
+
# Also import old-style constants into Gosu::Button.
|
181
|
+
Gosu::Button.const_set old_name, Gosu.const_get(new_name)
|
182
|
+
end
|
183
|
+
end
|
data/lib/gosu/patches.rb
CHANGED
@@ -18,79 +18,6 @@ class ::Numeric
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
# Backwards compatibility:
|
22
|
-
# Support for KbLeft instead of KB_LEFT and Gp3Button2 instead of GP_3_BUTTON_2.
|
23
|
-
# Also import old-style constants into Gosu::Button.
|
24
|
-
module Gosu::Button; end
|
25
|
-
Gosu.constants.grep(/^KB_|MS_|GP_/).each do |c|
|
26
|
-
old_name = case c
|
27
|
-
when :KB_ISO then "KbISO"
|
28
|
-
when :KB_NUMPAD_PLUS then "KbNumpadAdd"
|
29
|
-
when :KB_NUMPAD_MINUS then "KbNumpadSubtract"
|
30
|
-
when :KB_EQUALS then "KbEqual"
|
31
|
-
when :KB_LEFT_BRACKET then "KbBracketLeft"
|
32
|
-
when :KB_RIGHT_BRACKET then "KbBracketRight"
|
33
|
-
else c.to_s.capitalize.gsub(/_(.)/) { $1.upcase }
|
34
|
-
end
|
35
|
-
Gosu.const_set old_name, Gosu.const_get(c)
|
36
|
-
Gosu::Button.const_set old_name, Gosu.const_get(c)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Backwards compatibility:
|
40
|
-
# Passing a Window to initialize and from_text has been deprecated in Gosu 0.9.
|
41
|
-
class Gosu::Image
|
42
|
-
alias initialize_without_window initialize
|
43
|
-
|
44
|
-
def initialize(*args)
|
45
|
-
if args[0].is_a? Gosu::Window
|
46
|
-
if args.size == 7
|
47
|
-
initialize_without_window args[1], :tileable => args[2], :rect => args[3..-1]
|
48
|
-
else
|
49
|
-
initialize_without_window args[1], :tileable => args[2]
|
50
|
-
end
|
51
|
-
else
|
52
|
-
initialize_without_window(*args)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class << self
|
57
|
-
alias from_text_without_window from_text
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.from_text(*args)
|
61
|
-
if args.size == 4
|
62
|
-
from_text_without_window(args[1], args[3], :font => args[2])
|
63
|
-
elsif args.size == 7
|
64
|
-
from_text_without_window(args[1], args[3], :font => args[2],
|
65
|
-
:spacing => args[4], :width => args[5], :align => args[6])
|
66
|
-
else
|
67
|
-
from_text_without_window(*args)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# Backwards compatibility:
|
73
|
-
# Passing a Window to Sample#initialize has been deprecated in Gosu 0.7.17.
|
74
|
-
class Gosu::Sample
|
75
|
-
alias initialize_without_window initialize
|
76
|
-
|
77
|
-
def initialize(*args)
|
78
|
-
args.shift if args.first.is_a? Gosu::Window
|
79
|
-
initialize_without_window(*args)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# Backwards compatibility:
|
84
|
-
# Passing a Window to Song#initialize has been deprecated in Gosu 0.7.17.
|
85
|
-
class Gosu::Song
|
86
|
-
alias initialize_without_window initialize
|
87
|
-
|
88
|
-
def initialize(*args)
|
89
|
-
args.shift if args.first.is_a? Gosu::Window
|
90
|
-
initialize_without_window(*args)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
21
|
# Color constants.
|
95
22
|
# This is cleaner than having SWIG define them.
|
96
23
|
module Gosu
|
@@ -119,29 +46,6 @@ module Gosu
|
|
119
46
|
end
|
120
47
|
|
121
48
|
class Gosu::Window
|
122
|
-
# Backwards compatibility:
|
123
|
-
# Class methods that have been turned into module methods.
|
124
|
-
|
125
|
-
def self.button_id_to_char(id)
|
126
|
-
Gosu.button_id_to_char(id)
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.char_to_button_id(ch)
|
130
|
-
Gosu.char_to_button_id(ch)
|
131
|
-
end
|
132
|
-
|
133
|
-
# Backwards compatibility:
|
134
|
-
# Instance methods that have been turned into module methods.
|
135
|
-
|
136
|
-
%w(draw_line draw_triangle draw_quad
|
137
|
-
flush gl clip_to record
|
138
|
-
transform translate rotate scale
|
139
|
-
button_id_to_char char_to_button_id button_down?).each do |method|
|
140
|
-
define_method method.to_sym do |*args, &block|
|
141
|
-
Gosu.send method, *args, &block
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
49
|
# Call Thread.pass every tick, which may or may not be necessary for friendly co-existence with
|
146
50
|
# Ruby's Thread class.
|
147
51
|
|
@@ -153,10 +57,6 @@ class Gosu::Window
|
|
153
57
|
end
|
154
58
|
end
|
155
59
|
|
156
|
-
# Backwards compatibility:
|
157
|
-
# This was renamed, because it's not actually a "copyright notice" (Wikipedia: https://en.wikipedia.org/wiki/Copyright_notice).
|
158
|
-
Gosu::GOSU_COPYRIGHT_NOTICE = Gosu::LICENSES
|
159
|
-
|
160
60
|
# Release OpenAL resources during Ruby's shutdown, not Gosu's.
|
161
61
|
at_exit do
|
162
62
|
begin
|
data/lib/gosu/swig_patches.rb
CHANGED
@@ -28,7 +28,7 @@ class Gosu::Window
|
|
28
28
|
# Conveniently turn the return value into a boolean result (for needs_cursor? etc).
|
29
29
|
defined?(@_exception) ? false : !!send(callback, *args)
|
30
30
|
rescue Exception => e
|
31
|
-
# Exit the message loop naturally, then re-throw
|
31
|
+
# Exit the message loop naturally, then re-throw during the next tick.
|
32
32
|
@_exception = e
|
33
33
|
close
|
34
34
|
false
|
data/lib/gosu.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
|
-
require
|
1
|
+
require "rbconfig"
|
2
2
|
|
3
3
|
if RUBY_PLATFORM =~ /mswin$|mingw32|mingw64|win32\-|\-win32/
|
4
4
|
binary_path = File.dirname(__FILE__)
|
5
5
|
# 64-bit builds of Windows use "x64-mingw32" as RUBY_PLATFORM
|
6
|
-
binary_path +=
|
6
|
+
binary_path += "64" if RUBY_PLATFORM =~ /^x64-/
|
7
7
|
|
8
8
|
# Add this gem to the PATH on Windows so that bundled DLLs can be found.
|
9
|
-
|
9
|
+
# When running through Ocra on Windows, we need to be careful to preserve the ENV["PATH"]
|
10
|
+
# encoding (see #385).
|
11
|
+
ENV["PATH"] = "#{binary_path.encode ENV["PATH"].encoding};#{ENV["PATH"]}"
|
10
12
|
|
11
|
-
# Add the correct directory
|
12
|
-
|
13
|
-
$LOAD_PATH.unshift "#{binary_path}/#{$1}"
|
13
|
+
# Add the correct lib directory for the current version of Ruby (major.minor).
|
14
|
+
$LOAD_PATH.unshift File.join(binary_path, RUBY_VERSION[/^\d+.\d+/])
|
14
15
|
end
|
15
16
|
|
16
|
-
require "gosu.#{RbConfig::CONFIG[
|
17
|
+
require "gosu.#{RbConfig::CONFIG["DLEXT"]}"
|
17
18
|
|
18
19
|
require "gosu/swig_patches"
|
19
20
|
require "gosu/patches"
|
21
|
+
require "gosu/compat"
|
data/rdoc/gosu.rb
CHANGED
@@ -17,10 +17,6 @@ module Gosu
|
|
17
17
|
# A version string of the form "0.1.2", "0.1.2.3" or "0.1.2pre4".
|
18
18
|
VERSION = :a_string
|
19
19
|
|
20
|
-
##
|
21
|
-
# @deprecated Use LICENSES instead as it's a more appropriate name
|
22
|
-
GOSU_COPYRIGHT_NOTICE = :a_string
|
23
|
-
|
24
20
|
##
|
25
21
|
# A block of legal copy that your game is obliged to display somewhere.
|
26
22
|
LICENSES = :a_string
|
@@ -291,13 +287,6 @@ module Gosu
|
|
291
287
|
# @see https://github.com/gosu/gosu/wiki/Basic-Concepts#z-ordering Z-ordering explained in the Gosu Wiki
|
292
288
|
def draw_rel(text, x, y, z, rel_x, rel_y, scale_x=1, scale_y=1, color=0xff_ffffff, mode=:default); end
|
293
289
|
|
294
|
-
##
|
295
|
-
# @deprecated Use {#draw} in conjunction with {Gosu.rotate} instead.
|
296
|
-
#
|
297
|
-
# @see #draw
|
298
|
-
# @see Gosu::Window#rotate
|
299
|
-
def draw_rot(text, x, y, z, angle, scale_x=1, scale_y=1, color=0xff_ffffff, mode=:default); end
|
300
|
-
|
301
290
|
# @!endgroup
|
302
291
|
|
303
292
|
##
|
@@ -778,10 +767,10 @@ module Gosu
|
|
778
767
|
def tick; end
|
779
768
|
|
780
769
|
##
|
781
|
-
# Tells the window to end the current run loop as soon as possible.
|
770
|
+
# Tells the window to end the current run loop as soon as possible.
|
782
771
|
#
|
783
772
|
# @return [void]
|
784
|
-
def close
|
773
|
+
def close!; end
|
785
774
|
|
786
775
|
# @!group Callbacks
|
787
776
|
|
@@ -813,6 +802,15 @@ module Gosu
|
|
813
802
|
# @return [true, false] whether the system cursor should be shown.
|
814
803
|
def needs_cursor?; end
|
815
804
|
|
805
|
+
##
|
806
|
+
# This method is called whenever the user tries to close the window, e.g. by clicking the [x]
|
807
|
+
# button in the window's title bar.
|
808
|
+
# If you do not want the window to close immediately, you should override this method and
|
809
|
+
# call the {#close!} when needed.
|
810
|
+
#
|
811
|
+
# @return [bool]
|
812
|
+
def close; end
|
813
|
+
|
816
814
|
##
|
817
815
|
# This method is called before {#update} if a button is pressed while the window has focus.
|
818
816
|
#
|
@@ -839,10 +837,6 @@ module Gosu
|
|
839
837
|
def button_up(id); end
|
840
838
|
|
841
839
|
# @!endgroup
|
842
|
-
|
843
|
-
##
|
844
|
-
# @deprecated Use {#mouse_x=} and {#mouse_y=} instead.
|
845
|
-
def set_mouse_position(x, y); end
|
846
840
|
end
|
847
841
|
|
848
842
|
##
|
data/src/RubyGosu.cxx
CHANGED
@@ -3172,6 +3172,9 @@ SWIGINTERN void Gosu_Window_set_mouse_x(Gosu::Window *self,double x){
|
|
3172
3172
|
SWIGINTERN void Gosu_Window_set_mouse_y(Gosu::Window *self,double y){
|
3173
3173
|
self->input().set_mouse_position(self->input().mouse_x(), y);
|
3174
3174
|
}
|
3175
|
+
SWIGINTERN void Gosu_Window_force_close(Gosu::Window *self){
|
3176
|
+
self->Gosu::Window::close();
|
3177
|
+
}
|
3175
3178
|
|
3176
3179
|
// Also mark the TextInput instance alive when the window is being marked.
|
3177
3180
|
static void mark_window(void* window)
|
@@ -3252,6 +3255,13 @@ bool SwigDirector_Window::tick() {
|
|
3252
3255
|
}
|
3253
3256
|
|
3254
3257
|
|
3258
|
+
void SwigDirector_Window::close() {
|
3259
|
+
VALUE SWIGUNUSED result;
|
3260
|
+
|
3261
|
+
result = rb_funcall(swig_get_self(), rb_intern("close"), 0, NULL);
|
3262
|
+
}
|
3263
|
+
|
3264
|
+
|
3255
3265
|
void SwigDirector_Window::update() {
|
3256
3266
|
VALUE SWIGUNUSED result;
|
3257
3267
|
|
@@ -9183,6 +9193,8 @@ _wrap_Window_close(int argc, VALUE *argv, VALUE self) {
|
|
9183
9193
|
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
9184
9194
|
void *argp1 = 0 ;
|
9185
9195
|
int res1 = 0 ;
|
9196
|
+
Swig::Director *director = 0;
|
9197
|
+
bool upcall = false;
|
9186
9198
|
|
9187
9199
|
if ((argc < 0) || (argc > 0)) {
|
9188
9200
|
rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
|
@@ -9192,13 +9204,24 @@ _wrap_Window_close(int argc, VALUE *argv, VALUE self) {
|
|
9192
9204
|
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Gosu::Window *","close", 1, self ));
|
9193
9205
|
}
|
9194
9206
|
arg1 = reinterpret_cast< Gosu::Window * >(argp1);
|
9195
|
-
|
9196
|
-
|
9197
|
-
|
9198
|
-
|
9199
|
-
|
9200
|
-
|
9207
|
+
director = dynamic_cast<Swig::Director *>(arg1);
|
9208
|
+
upcall = (director && (director->swig_get_self() == self));
|
9209
|
+
try {
|
9210
|
+
{
|
9211
|
+
try {
|
9212
|
+
if (upcall) {
|
9213
|
+
(arg1)->Gosu::Window::close();
|
9214
|
+
} else {
|
9215
|
+
(arg1)->close();
|
9216
|
+
}
|
9217
|
+
}
|
9218
|
+
catch (const std::exception& e) {
|
9219
|
+
SWIG_exception(SWIG_RuntimeError, e.what());
|
9220
|
+
}
|
9201
9221
|
}
|
9222
|
+
} catch (Swig::DirectorException& e) {
|
9223
|
+
rb_exc_raise(e.getError());
|
9224
|
+
SWIG_fail;
|
9202
9225
|
}
|
9203
9226
|
return Qnil;
|
9204
9227
|
fail:
|
@@ -9907,6 +9930,34 @@ fail:
|
|
9907
9930
|
}
|
9908
9931
|
|
9909
9932
|
|
9933
|
+
SWIGINTERN VALUE
|
9934
|
+
_wrap_Window_closeN___(int argc, VALUE *argv, VALUE self) {
|
9935
|
+
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
9936
|
+
void *argp1 = 0 ;
|
9937
|
+
int res1 = 0 ;
|
9938
|
+
|
9939
|
+
if ((argc < 0) || (argc > 0)) {
|
9940
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
|
9941
|
+
}
|
9942
|
+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Gosu__Window, 0 | 0 );
|
9943
|
+
if (!SWIG_IsOK(res1)) {
|
9944
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Gosu::Window *","force_close", 1, self ));
|
9945
|
+
}
|
9946
|
+
arg1 = reinterpret_cast< Gosu::Window * >(argp1);
|
9947
|
+
{
|
9948
|
+
try {
|
9949
|
+
Gosu_Window_force_close(arg1);
|
9950
|
+
}
|
9951
|
+
catch (const std::exception& e) {
|
9952
|
+
SWIG_exception(SWIG_RuntimeError, e.what());
|
9953
|
+
}
|
9954
|
+
}
|
9955
|
+
return Qnil;
|
9956
|
+
fail:
|
9957
|
+
return Qnil;
|
9958
|
+
}
|
9959
|
+
|
9960
|
+
|
9910
9961
|
SWIGINTERN VALUE
|
9911
9962
|
_wrap_disown_Window(int argc, VALUE *argv, VALUE self) {
|
9912
9963
|
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
@@ -11523,7 +11574,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11523
11574
|
rb_define_const(mGosu, "LICENSES", SWIG_From_std_string(static_cast< std::string >(Gosu::LICENSES)));
|
11524
11575
|
rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11525
11576
|
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(11)));
|
11526
|
-
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(
|
11577
|
+
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(3)));
|
11527
11578
|
rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
|
11528
11579
|
rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
|
11529
11580
|
rb_define_module_function(mGosu, "degrees_to_radians", VALUEFUNC(_wrap_degrees_to_radians), -1);
|
@@ -11944,6 +11995,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11944
11995
|
rb_define_method(SwigClassWindow.klass, "set_mouse_position", VALUEFUNC(_wrap_Window_set_mouse_position), -1);
|
11945
11996
|
rb_define_method(SwigClassWindow.klass, "mouse_x=", VALUEFUNC(_wrap_Window_mouse_xe___), -1);
|
11946
11997
|
rb_define_method(SwigClassWindow.klass, "mouse_y=", VALUEFUNC(_wrap_Window_mouse_ye___), -1);
|
11998
|
+
rb_define_method(SwigClassWindow.klass, "close!", VALUEFUNC(_wrap_Window_closeN___), -1);
|
11947
11999
|
SwigClassWindow.mark = (void (*)(void *)) mark_window;
|
11948
12000
|
SwigClassWindow.destroy = (void (*)(void *)) free_Gosu_Window;
|
11949
12001
|
SwigClassWindow.trackObjects = 1;
|
data/src/RubyGosu.h
CHANGED
data/src/TextTTFWin.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include <Gosu/Platform.hpp>
|
2
2
|
#if defined(GOSU_IS_WIN)
|
3
3
|
|
4
|
+
#include <Gosu/IO.hpp>
|
4
5
|
#include <Gosu/Utility.hpp>
|
5
6
|
#include <cassert>
|
6
7
|
#include <cstdio>
|
@@ -56,69 +57,18 @@ struct TT_NAME_RECORD
|
|
56
57
|
|
57
58
|
namespace Gosu
|
58
59
|
{
|
59
|
-
std::string get_name_from_ttf_file(const std::
|
60
|
+
std::string get_name_from_ttf_file(const std::string& filename)
|
60
61
|
{
|
61
62
|
FONT_PROPERTIES_ANSI fp;
|
62
63
|
FONT_PROPERTIES_ANSI * lpFontProps = &fp;
|
63
64
|
memset(lpFontProps, 0, sizeof(FONT_PROPERTIES_ANSI));
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
GENERIC_READ,// | GENERIC_WRITE,
|
68
|
-
FILE_SHARE_READ,
|
69
|
-
NULL,
|
70
|
-
OPEN_EXISTING,
|
71
|
-
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
|
72
|
-
NULL);
|
73
|
-
|
74
|
-
if (hFile == INVALID_HANDLE_VALUE)
|
75
|
-
{
|
76
|
-
TRACE(_T("ERROR: failed to open '%s'\n"), wstring_to_utf8(filename).c_str());
|
77
|
-
TRACE(_T("ERROR: %s failed, GetLastError() = 0x%x\n"), _T("CreateFile"), (int)GetLastError());
|
78
|
-
return wstring_to_utf8(filename);
|
79
|
-
}
|
66
|
+
Buffer buffer;
|
67
|
+
load_file(buffer, filename);
|
80
68
|
|
81
69
|
// get the file size
|
82
|
-
DWORD dwFileSize =
|
83
|
-
|
84
|
-
if (dwFileSize == INVALID_FILE_SIZE)
|
85
|
-
{
|
86
|
-
TRACE(_T("ERROR: %s failed\n"), _T("GetFileSize"));
|
87
|
-
::CloseHandle(hFile);
|
88
|
-
return wstring_to_utf8(filename);
|
89
|
-
}
|
90
|
-
|
91
|
-
//TRACE(_T("dwFileSize = %d\n"), dwFileSize);
|
92
|
-
|
93
|
-
// Create a file mapping object that is the current size of the file
|
94
|
-
HANDLE hMappedFile = NULL;
|
95
|
-
hMappedFile = ::CreateFileMapping(hFile,
|
96
|
-
NULL,
|
97
|
-
PAGE_READONLY, //PAGE_READWRITE,
|
98
|
-
0,
|
99
|
-
dwFileSize,
|
100
|
-
NULL);
|
101
|
-
|
102
|
-
if (hMappedFile == NULL)
|
103
|
-
{
|
104
|
-
TRACE(_T("ERROR: %s failed\n"), _T("CreateFileMapping"));
|
105
|
-
::CloseHandle(hFile);
|
106
|
-
return wstring_to_utf8(filename);
|
107
|
-
}
|
108
|
-
|
109
|
-
LPBYTE lpMapAddress = (LPBYTE) ::MapViewOfFile(hMappedFile, // handle to file-mapping object
|
110
|
-
FILE_MAP_READ,//FILE_MAP_WRITE, // access mode
|
111
|
-
0, // high-order DWORD of offset
|
112
|
-
0, // low-order DWORD of offset
|
113
|
-
0); // number of bytes to map
|
114
|
-
|
115
|
-
if (lpMapAddress == NULL)
|
116
|
-
{
|
117
|
-
TRACE(_T("ERROR: %s failed\n"), _T("MapViewOfFile"));
|
118
|
-
::CloseHandle(hMappedFile);
|
119
|
-
::CloseHandle(hFile);
|
120
|
-
return wstring_to_utf8(filename);
|
121
|
-
}
|
70
|
+
DWORD dwFileSize = buffer.size();
|
71
|
+
LPBYTE lpMapAddress = (LPBYTE) buffer.data();
|
122
72
|
|
123
73
|
BOOL bRetVal = FALSE;
|
124
74
|
int index = 0;
|
@@ -132,8 +82,9 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
132
82
|
ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);
|
133
83
|
|
134
84
|
//check is this is a true type font and the version is 1.0
|
135
|
-
if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
|
136
|
-
|
85
|
+
if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0) {
|
86
|
+
throw std::runtime_error("Only version 1.0 of the TTF file format is supported");
|
87
|
+
}
|
137
88
|
|
138
89
|
TT_TABLE_DIRECTORY tblDir;
|
139
90
|
memset(&tblDir, 0, sizeof(TT_TABLE_DIRECTORY));
|
@@ -143,7 +94,6 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
143
94
|
|
144
95
|
for (int i = 0; i< ttOffsetTable.uNumOfTables; i++)
|
145
96
|
{
|
146
|
-
//f.Read(&tblDir, sizeof(TT_TABLE_DIRECTORY));
|
147
97
|
memcpy(&tblDir, &lpMapAddress[index], sizeof(TT_TABLE_DIRECTORY));
|
148
98
|
index += sizeof(TT_TABLE_DIRECTORY);
|
149
99
|
|
@@ -191,7 +141,7 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
191
141
|
|
192
142
|
if (ttRecord.uNameID == 1 || ttRecord.uNameID == 0 || ttRecord.uNameID == 7)
|
193
143
|
{
|
194
|
-
int nPos = index;
|
144
|
+
int nPos = index;
|
195
145
|
|
196
146
|
index = tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset;
|
197
147
|
|
@@ -240,10 +190,6 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
240
190
|
}
|
241
191
|
}
|
242
192
|
|
243
|
-
::UnmapViewOfFile(lpMapAddress);
|
244
|
-
::CloseHandle(hMappedFile);
|
245
|
-
::CloseHandle(hFile);
|
246
|
-
|
247
193
|
return lpFontProps->csName[0] ? lpFontProps->csName : lpFontProps->csFamily;
|
248
194
|
}
|
249
195
|
}
|
data/src/TextWin.cpp
CHANGED
@@ -22,7 +22,7 @@ std::string Gosu::default_font_name()
|
|
22
22
|
|
23
23
|
namespace Gosu
|
24
24
|
{
|
25
|
-
std::string get_name_from_ttf_file(const std::
|
25
|
+
std::string get_name_from_ttf_file(const std::string& filename);
|
26
26
|
|
27
27
|
namespace
|
28
28
|
{
|
@@ -93,9 +93,8 @@ namespace Gosu
|
|
93
93
|
|
94
94
|
if (font_name.find("/") != font_name.npos) {
|
95
95
|
if (custom_fonts.count(font_name) == 0) {
|
96
|
-
|
97
|
-
|
98
|
-
font_name = custom_fonts[font_name] = get_name_from_ttf_file(wfont_name);
|
96
|
+
AddFontResourceExW(utf8_to_wstring(font_name).c_str(), FR_PRIVATE, 0);
|
97
|
+
font_name = custom_fonts[font_name] = get_name_from_ttf_file(font_name);
|
99
98
|
}
|
100
99
|
else {
|
101
100
|
font_name = custom_fonts[font_name];
|
data/src/Window.cpp
CHANGED
@@ -83,6 +83,12 @@ struct Gosu::Window::Impl
|
|
83
83
|
bool fullscreen;
|
84
84
|
double update_interval;
|
85
85
|
|
86
|
+
// A single `bool open` is not good enough to support the tick() method: When close() is called
|
87
|
+
// from outside the window's call graph, the next call to tick() must return false (transition
|
88
|
+
// from CLOSING to CLOSED), but the call after that must return show the window again
|
89
|
+
// (transition from CLOSED to OPEN).
|
90
|
+
enum { CLOSED, OPEN, CLOSING } state = CLOSED;
|
91
|
+
|
86
92
|
std::unique_ptr<Graphics> graphics;
|
87
93
|
std::unique_ptr<Input> input;
|
88
94
|
};
|
@@ -93,10 +99,11 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
93
99
|
// Even in fullscreen mode, temporarily show the window in windowed mode to centre it.
|
94
100
|
// This ensures that the window will be centred correctly when exiting fullscreen mode.
|
95
101
|
// Fixes https://github.com/gosu/gosu/issues/369
|
102
|
+
// (This will implicitly create graphics() and input(), and make the OpenGL context current.)
|
96
103
|
resize(width, height, false);
|
97
104
|
SDL_SetWindowPosition(shared_window(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
98
105
|
|
99
|
-
//
|
106
|
+
// Really enable fullscreen if desired.
|
100
107
|
resize(width, height, fullscreen);
|
101
108
|
|
102
109
|
SDL_GL_SetSwapInterval(1);
|
@@ -104,7 +111,7 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
104
111
|
pimpl->update_interval = update_interval;
|
105
112
|
|
106
113
|
input().on_button_down = [this](Button button) { button_down(button); };
|
107
|
-
input().on_button_up
|
114
|
+
input().on_button_up = [this](Button button) { button_up(button); };
|
108
115
|
}
|
109
116
|
|
110
117
|
Gosu::Window::~Window()
|
@@ -221,12 +228,20 @@ void Gosu::Window::show()
|
|
221
228
|
|
222
229
|
time_before_tick = milliseconds();
|
223
230
|
}
|
231
|
+
|
232
|
+
pimpl->state = Impl::CLOSED;
|
224
233
|
}
|
225
234
|
|
226
235
|
bool Gosu::Window::tick()
|
227
236
|
{
|
228
|
-
if (
|
237
|
+
if (pimpl->state == Impl::CLOSING) {
|
238
|
+
pimpl->state = Impl::CLOSED;
|
239
|
+
return false;
|
240
|
+
}
|
241
|
+
|
242
|
+
if (pimpl->state == Impl::CLOSED) {
|
229
243
|
SDL_ShowWindow(shared_window());
|
244
|
+
pimpl->state = Impl::OPEN;
|
230
245
|
|
231
246
|
// SDL_GL_GetDrawableSize returns different values before and after showing the window.
|
232
247
|
// -> When first showing the window, update the physical size of Graphics (=glViewport).
|
@@ -239,8 +254,7 @@ bool Gosu::Window::tick()
|
|
239
254
|
SDL_Event e;
|
240
255
|
while (SDL_PollEvent(&e)) {
|
241
256
|
if (e.type == SDL_QUIT) {
|
242
|
-
|
243
|
-
return false;
|
257
|
+
close();
|
244
258
|
}
|
245
259
|
else {
|
246
260
|
input().feed_sdl_event(&e);
|
@@ -266,14 +280,17 @@ bool Gosu::Window::tick()
|
|
266
280
|
SDL_GL_SwapWindow(shared_window());
|
267
281
|
}
|
268
282
|
|
269
|
-
|
283
|
+
if (pimpl->state == Impl::CLOSING) {
|
284
|
+
pimpl->state = Impl::CLOSED;
|
285
|
+
}
|
286
|
+
|
287
|
+
return pimpl->state == Impl::OPEN;
|
270
288
|
}
|
271
289
|
|
272
290
|
void Gosu::Window::close()
|
273
291
|
{
|
274
|
-
|
275
|
-
|
276
|
-
SDL_PushEvent(&e);
|
292
|
+
pimpl->state = Impl::CLOSING;
|
293
|
+
SDL_HideWindow(shared_window());
|
277
294
|
}
|
278
295
|
|
279
296
|
void Gosu::Window::button_down(Button button)
|
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.11.3
|
4
|
+
version: 0.11.3
|
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-03-
|
11
|
+
date: 2017-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
2D game development library.
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- README.md
|
54
54
|
- ext/gosu/extconf.rb
|
55
55
|
- lib/gosu.rb
|
56
|
+
- lib/gosu/compat.rb
|
56
57
|
- lib/gosu/patches.rb
|
57
58
|
- lib/gosu/preview.rb
|
58
59
|
- lib/gosu/run.rb
|
@@ -150,9 +151,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
151
|
version: 1.8.2
|
151
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
153
|
requirements:
|
153
|
-
- - "
|
154
|
+
- - ">="
|
154
155
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
156
|
+
version: '0'
|
156
157
|
requirements: []
|
157
158
|
rubyforge_project:
|
158
159
|
rubygems_version: 2.6.8
|