minigl 2.2.9 → 2.3.0
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/README.md +3 -2
- data/lib/minigl/text.rb +137 -32
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0362df674b485b64cd44d6b167377b2d46d6c33fd9b2d65428fe75e8de9e027
|
4
|
+
data.tar.gz: d91ae820bfc76cb9895f43227646028b23927cffe2e4b226f3b2b14779fe08a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70af1a521abd0f23110b62b2c88a1de5f1fd94aeb664fc8c9e4ca8cd414a024c0ac93037889b9b8431598c7e63cf11e62b00f657213f5eb68957da70ca4fdfc5
|
7
|
+
data.tar.gz: 685115af1a42dc3662af276580771b0be33eae0348fd54e1f11f679c2de26a10f8d158a9d00cf0e67ae42ae5bab2af4841adbf466aca38b46b6e75665ca3b773
|
data/README.md
CHANGED
@@ -29,9 +29,10 @@ After installing the Gosu dependencies, you can just `gem install minigl`.
|
|
29
29
|
* The [wiki](https://github.com/victords/minigl/wiki) is a work in progress with tutorials and examples.
|
30
30
|
* Test package and examples aren't complete!
|
31
31
|
|
32
|
-
## Version 2.
|
32
|
+
## Version 2.3.0
|
33
33
|
|
34
|
-
*
|
34
|
+
* Added the `ImageFont` class.
|
35
|
+
* Added scale and line spacing options to `TextHelper` methods.
|
35
36
|
|
36
37
|
## Contributing
|
37
38
|
|
data/lib/minigl/text.rb
CHANGED
@@ -1,4 +1,100 @@
|
|
1
1
|
module MiniGL
|
2
|
+
# This class represents a font and exposes most of the methods from +Gosu::Font+,
|
3
|
+
# but allows the font to be created from an image, allowing for better customization
|
4
|
+
# and also using the +retro+ option.
|
5
|
+
#
|
6
|
+
# The image used to load the font must meet these criteria:
|
7
|
+
# * The characters should be laid out in lines of the same height in pixels.
|
8
|
+
# * The full image must have a height that is a multiple of that line height.
|
9
|
+
# * The characters should occupy the maximum available space in each line, i.e.,
|
10
|
+
# if a character fits in the current line it must not be placed in the next
|
11
|
+
# one. In the last line there can be any amount of free space at the end.
|
12
|
+
class ImageFont
|
13
|
+
# The height of this font in pixels.
|
14
|
+
attr_reader :height
|
15
|
+
|
16
|
+
# Creates an +ImageFont+.
|
17
|
+
#
|
18
|
+
# Parameters:
|
19
|
+
# [img_path] Identifier of an image fitting the description in the class documentation,
|
20
|
+
# as used in +Res.img+.
|
21
|
+
# [chars] A string containing all characters that will be present in the image, in the
|
22
|
+
# same order as they appear in the image. Do not include white space.
|
23
|
+
# [widths] An integer representing the width of the chars in pixels, if this is a fixed
|
24
|
+
# width font, or an array containing the width of each char, in the same order
|
25
|
+
# as they appear in the +chars+ string.
|
26
|
+
# [height] The height of the lines in the image (see description above).
|
27
|
+
# [space_width] The width of the white space character in this font.
|
28
|
+
# [global] Parameter that will be passed to +Res.img+ when loading the image.
|
29
|
+
# [ext] Parameter that will be passed to +Res.img+ when loading the image.
|
30
|
+
# [retro] Parameter that will be passed to +Res.img+ when loading the image.
|
31
|
+
def initialize(img_path, chars, widths, height, space_width, global = true, ext = '.png', retro = nil)
|
32
|
+
retro = Res.retro_images if retro.nil?
|
33
|
+
img = Res.img(img_path, global, false, ext, retro)
|
34
|
+
@chars = chars
|
35
|
+
@images = []
|
36
|
+
@height = height
|
37
|
+
@space_width = space_width
|
38
|
+
wa = widths.is_a?(Array)
|
39
|
+
if wa && widths.length != chars.length
|
40
|
+
raise 'Wrong widths array size!'
|
41
|
+
end
|
42
|
+
x = y = 0
|
43
|
+
(0...chars.length).each do |i|
|
44
|
+
@images.push(img.subimage(x, y, wa ? widths[i] : widths, height))
|
45
|
+
new_x = x + (wa ? widths[i] : widths)
|
46
|
+
if i < chars.length - 1 && new_x + (wa ? widths[i+1] : widths) > img.width
|
47
|
+
x = 0
|
48
|
+
y += height
|
49
|
+
else
|
50
|
+
x = new_x
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the width, in pixels, of a given string written by this font.
|
56
|
+
#
|
57
|
+
# Parameters:
|
58
|
+
# [text] The string to be measured
|
59
|
+
def markup_width(text)
|
60
|
+
text.chars.reduce(0) { |w, c| if c == ' '; w += @space_width; else; i = @chars.index(c); w += i ? @images[i].width : 0; end }
|
61
|
+
end
|
62
|
+
|
63
|
+
# See <code>Gosu::Font#draw_markup_rel</code> for details.
|
64
|
+
def draw_markup_rel(text, x, y, z, rel_x, rel_y, scale_x, scale_y, color)
|
65
|
+
text = text.to_s unless text.is_a?(String)
|
66
|
+
if rel_x == 0.5
|
67
|
+
x -= scale_x * markup_width(text) / 2
|
68
|
+
elsif rel_x == 1
|
69
|
+
x -= scale_x * markup_width(text)
|
70
|
+
end
|
71
|
+
if rel_y == 0.5
|
72
|
+
y -= scale_y * @height / 2
|
73
|
+
elsif rel_y == 1
|
74
|
+
y -= scale_x * @height
|
75
|
+
end
|
76
|
+
text.each_char do |c|
|
77
|
+
if c == ' '
|
78
|
+
x += scale_x * @space_width
|
79
|
+
next
|
80
|
+
end
|
81
|
+
i = @chars.index(c)
|
82
|
+
next if i.nil?
|
83
|
+
@images[i].draw(x, y, z, scale_x, scale_y, color)
|
84
|
+
x += scale_x * @images[i].width
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# See <code>Gosu::Font#draw_markup</code> for details.
|
89
|
+
def draw_markup(text, x, y, z, scale_x, scale_y, color)
|
90
|
+
draw_markup_rel(text, x, y, z, 0, 0, scale_x, scale_y, color)
|
91
|
+
end
|
92
|
+
|
93
|
+
alias :draw_text_rel :draw_markup_rel
|
94
|
+
alias :draw_text :draw_markup
|
95
|
+
alias :text_width :markup_width
|
96
|
+
end
|
97
|
+
|
2
98
|
# This class provides methods for easily drawing one or multiple lines of
|
3
99
|
# text, with control over the text alignment and coloring.
|
4
100
|
class TextHelper
|
@@ -8,9 +104,11 @@ module MiniGL
|
|
8
104
|
# [font] A <code>Gosu::Font</code> that will be used to draw the text.
|
9
105
|
# [line_spacing] When drawing multiple lines, the distance, in pixels,
|
10
106
|
# between each line.
|
11
|
-
def initialize(font, line_spacing = 0)
|
107
|
+
def initialize(font, line_spacing = 0, scale_x = 1, scale_y = 1)
|
12
108
|
@font = font
|
13
109
|
@line_spacing = line_spacing
|
110
|
+
@scale_x = scale_x
|
111
|
+
@scale_y = scale_y
|
14
112
|
end
|
15
113
|
|
16
114
|
# Draws a single line of text.
|
@@ -48,7 +146,7 @@ module MiniGL
|
|
48
146
|
# mandatory.
|
49
147
|
def write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff,
|
50
148
|
effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
|
51
|
-
z_index = 0)
|
149
|
+
z_index = 0, scale_x = nil, scale_y = nil)
|
52
150
|
if text.is_a? Hash
|
53
151
|
x = text[:x]
|
54
152
|
y = text[:y]
|
@@ -60,9 +158,13 @@ module MiniGL
|
|
60
158
|
effect_size = text.fetch(:effect_size, 1)
|
61
159
|
effect_alpha = text.fetch(:effect_alpha, 0xff)
|
62
160
|
z_index = text.fetch(:z_index, 0)
|
161
|
+
scale_x = text.fetch(:scale_x, nil)
|
162
|
+
scale_y = text.fetch(:scale_y, nil)
|
63
163
|
text = text[:text]
|
64
164
|
end
|
65
165
|
|
166
|
+
scale_x = @scale_x if scale_x.nil?
|
167
|
+
scale_y = @scale_y if scale_y.nil?
|
66
168
|
color = (alpha << 24) | color
|
67
169
|
rel =
|
68
170
|
case mode
|
@@ -74,19 +176,19 @@ module MiniGL
|
|
74
176
|
if effect
|
75
177
|
effect_color = (effect_alpha << 24) | effect_color
|
76
178
|
if effect == :border
|
77
|
-
@font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0,
|
78
|
-
@font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0,
|
79
|
-
@font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0,
|
80
|
-
@font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0,
|
81
|
-
@font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0,
|
82
|
-
@font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0,
|
83
|
-
@font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0,
|
84
|
-
@font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0,
|
179
|
+
@font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
180
|
+
@font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
181
|
+
@font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
182
|
+
@font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
|
183
|
+
@font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
184
|
+
@font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
185
|
+
@font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
186
|
+
@font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
|
85
187
|
elsif effect == :shadow
|
86
|
-
@font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0,
|
188
|
+
@font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
|
87
189
|
end
|
88
190
|
end
|
89
|
-
@font.draw_markup_rel text, x, y, z_index, rel, 0,
|
191
|
+
@font.draw_markup_rel text, x, y, z_index, rel, 0, scale_x, scale_y, color
|
90
192
|
end
|
91
193
|
|
92
194
|
# Draws text, breaking lines when needed and when explicitly caused by the
|
@@ -94,7 +196,7 @@ module MiniGL
|
|
94
196
|
#
|
95
197
|
# Parameters:
|
96
198
|
# [text] The text to be drawn. Line breaks are allowed. You can use the
|
97
|
-
|
199
|
+
# `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
|
98
200
|
# [x] The horizontal reference for drawing the text. Works like in
|
99
201
|
# +write_line+ for the +:left+, +:right+ and +:center+ modes. For the
|
100
202
|
# +:justified+ mode, works the same as for +:left+.
|
@@ -109,11 +211,14 @@ module MiniGL
|
|
109
211
|
# transparent) to 255 (fully opaque).
|
110
212
|
# [z_index] The z-order to draw the object. Objects with larger z-orders
|
111
213
|
# will be drawn on top of the ones with smaller z-orders.
|
112
|
-
def write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0)
|
214
|
+
def write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0, scale_x = nil, scale_y = nil, line_spacing = nil)
|
215
|
+
line_spacing = @line_spacing if line_spacing.nil?
|
216
|
+
scale_x = @scale_x if scale_x.nil?
|
217
|
+
scale_y = @scale_y if scale_y.nil?
|
113
218
|
color = (alpha << 24) | color
|
114
219
|
text.split("\n").each do |p|
|
115
220
|
if mode == :justified
|
116
|
-
y = write_paragraph_justified p, x, y, width, color, z_index
|
221
|
+
y = write_paragraph_justified p, x, y, width, color, z_index, scale_x, scale_y, line_spacing
|
117
222
|
else
|
118
223
|
rel =
|
119
224
|
case mode
|
@@ -122,40 +227,40 @@ module MiniGL
|
|
122
227
|
when :right then 1
|
123
228
|
else 0
|
124
229
|
end
|
125
|
-
y = write_paragraph p, x, y, width, rel, color, z_index
|
230
|
+
y = write_paragraph p, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing
|
126
231
|
end
|
127
232
|
end
|
128
233
|
end
|
129
234
|
|
130
235
|
private
|
131
236
|
|
132
|
-
def write_paragraph(text, x, y, width, rel, color, z_index)
|
237
|
+
def write_paragraph(text, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing)
|
133
238
|
line = ''
|
134
239
|
line_width = 0
|
135
240
|
text.split(' ').each do |word|
|
136
|
-
w = @font.markup_width
|
137
|
-
if line_width + w > width
|
138
|
-
@font.draw_markup_rel line.chop, x, y, z_index, rel, 0,
|
241
|
+
w = @font.markup_width(word)
|
242
|
+
if line_width + w * scale_x > width
|
243
|
+
@font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color
|
139
244
|
line = ''
|
140
245
|
line_width = 0
|
141
|
-
y += @font.height +
|
246
|
+
y += (@font.height + line_spacing) * scale_y
|
142
247
|
end
|
143
248
|
line += "#{word} "
|
144
|
-
line_width += @font.markup_width
|
249
|
+
line_width += @font.markup_width("#{word} ") * scale_x
|
145
250
|
end
|
146
|
-
@font.draw_markup_rel line.chop, x, y, z_index, rel, 0,
|
147
|
-
y + @font.height +
|
251
|
+
@font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color unless line.empty?
|
252
|
+
y + (@font.height + line_spacing) * scale_y
|
148
253
|
end
|
149
254
|
|
150
|
-
def write_paragraph_justified(text, x, y, width, color, z_index)
|
151
|
-
space_width = @font.text_width '
|
255
|
+
def write_paragraph_justified(text, x, y, width, color, z_index, scale_x, scale_y, line_spacing)
|
256
|
+
space_width = @font.text_width(' ') * scale_x
|
152
257
|
spaces = [[]]
|
153
258
|
line_index = 0
|
154
259
|
new_x = x
|
155
260
|
words = text.split(' ')
|
156
261
|
words.each do |word|
|
157
|
-
w = @font.markup_width
|
158
|
-
if new_x + w > x + width
|
262
|
+
w = @font.markup_width(word)
|
263
|
+
if new_x + w * scale_x > x + width
|
159
264
|
space = x + width - new_x + space_width
|
160
265
|
index = 0
|
161
266
|
while space > 0
|
@@ -170,7 +275,7 @@ module MiniGL
|
|
170
275
|
|
171
276
|
new_x = x
|
172
277
|
end
|
173
|
-
new_x += @font.markup_width(word) + space_width
|
278
|
+
new_x += @font.markup_width(word) * scale_x + space_width
|
174
279
|
spaces[line_index] << space_width
|
175
280
|
end
|
176
281
|
|
@@ -178,11 +283,11 @@ module MiniGL
|
|
178
283
|
spaces.each do |line|
|
179
284
|
new_x = x
|
180
285
|
line.each do |s|
|
181
|
-
@font.draw_markup
|
182
|
-
new_x += @font.markup_width(words[index]) + s
|
286
|
+
@font.draw_markup(words[index], new_x, y, z_index, scale_x, scale_y, color)
|
287
|
+
new_x += @font.markup_width(words[index]) * scale_x + s
|
183
288
|
index += 1
|
184
289
|
end
|
185
|
-
y += @font.height +
|
290
|
+
y += (@font.height + line_spacing) * scale_y
|
186
291
|
end
|
187
292
|
y
|
188
293
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minigl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor David Santos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06
|
11
|
+
date: 2020-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|