minigl 2.2.3 → 2.2.4

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.
data/lib/minigl/text.rb CHANGED
@@ -1,190 +1,190 @@
1
- module MiniGL
2
- # This class provides methods for easily drawing one or multiple lines of
3
- # text, with control over the text alignment and coloring.
4
- class TextHelper
5
- # Creates a TextHelper.
6
- #
7
- # Parameters:
8
- # [font] A <code>Gosu::Font</code> that will be used to draw the text.
9
- # [line_spacing] When drawing multiple lines, the distance, in pixels,
10
- # between each line.
11
- def initialize(font, line_spacing = 0)
12
- @font = font
13
- @line_spacing = line_spacing
14
- end
15
-
16
- # Draws a single line of text.
17
- #
18
- # Parameters:
19
- # [text] The text to be drawn. No line breaks are allowed. You can use the
20
- # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
21
- # [x] The horizontal reference for drawing the text. If +mode+ is +:left+,
22
- # all text will be drawn from this point to the right; if +mode+ is
23
- # +:right+, all text will be drawn from this point to the left; and if
24
- # +mode+ is +:center+, the text will be equally distributed to the
25
- # left and to the right of this point.
26
- # [y] The vertical reference for drawing the text. All text will be drawn
27
- # from this point down.
28
- # [mode] The alignment of the text. Valid values are +:left+, +:right+ and
29
- # +:center+.
30
- # [color] The color of the text, in hexadecimal RRGGBB format.
31
- # [alpha] The opacity of the text. Valid values vary from 0 (fully
32
- # transparent) to 255 (fully opaque).
33
- # [effect] Effect to add to the text. It can be either +nil+, for no effect,
34
- # +:border+ for bordered text, or +:shadow+ for shadowed text (the
35
- # shadow is always placed below and to the right of the text).
36
- # [effect_color] Color of the effect, if any.
37
- # [effect_size] Size of the effect, if any. In the case of +:border+, this
38
- # will be the width of the border (the border will only look
39
- # good when +effect_size+ is relatively small, compared to the
40
- # size of the font); in the case of +:shadow+, it will be the
41
- # distance between the text and the shadow.
42
- # [effect_alpha] Opacity of the effect, if any. For shadows, it is usual to
43
- # provide less than 255.
44
- # [z_index] The z-order to draw the object. Objects with larger z-orders
45
- # will be drawn on top of the ones with smaller z-orders.
46
- #
47
- # *Obs.:* This method accepts named parameters, but +text+, +x+ and +y+ are
48
- # mandatory.
49
- def write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff,
50
- effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
51
- z_index = 0)
52
- if text.is_a? Hash
53
- x = text[:x]
54
- y = text[:y]
55
- mode = text.fetch(:mode, :left)
56
- color = text.fetch(:color, 0)
57
- alpha = text.fetch(:alpha, 0xff)
58
- effect = text.fetch(:effect, nil)
59
- effect_color = text.fetch(:effect_color, 0)
60
- effect_size = text.fetch(:effect_size, 1)
61
- effect_alpha = text.fetch(:effect_alpha, 0xff)
62
- z_index = text.fetch(:z_index, 0)
63
- text = text[:text]
64
- end
65
-
66
- color = (alpha << 24) | color
67
- rel =
68
- case mode
69
- when :left then 0
70
- when :center then 0.5
71
- when :right then 1
72
- else 0
73
- end
74
- if effect
75
- effect_color = (effect_alpha << 24) | effect_color
76
- if effect == :border
77
- @font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
78
- @font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, 1, 1, effect_color
79
- @font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
80
- @font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, 1, 1, effect_color
81
- @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
82
- @font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, 1, 1, effect_color
83
- @font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
84
- @font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, 1, 1, effect_color
85
- elsif effect == :shadow
86
- @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
87
- end
88
- end
89
- @font.draw_markup_rel text, x, y, z_index, rel, 0, 1, 1, color
90
- end
91
-
92
- # Draws text, breaking lines when needed and when explicitly caused by the
93
- # "\n" character.
94
- #
95
- # Parameters:
96
- # [text] The text to be drawn. Line breaks are allowed. You can use the
97
- # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
98
- # [x] The horizontal reference for drawing the text. Works like in
99
- # +write_line+ for the +:left+, +:right+ and +:center+ modes. For the
100
- # +:justified+ mode, works the same as for +:left+.
101
- # [y] The vertical reference for drawing the text. All text will be drawn
102
- # from this point down.
103
- # [width] The maximum width for the lines of text. Line is broken when
104
- # this width is exceeded.
105
- # [mode] The alignment of the text. Valid values are +:left+, +:right+,
106
- # +:center+ and +:justified+.
107
- # [color] The color of the text, in hexadecimal RRGGBB format.
108
- # [alpha] The opacity of the text. Valid values vary from 0 (fully
109
- # transparent) to 255 (fully opaque).
110
- # [z_index] The z-order to draw the object. Objects with larger z-orders
111
- # 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)
113
- color = (alpha << 24) | color
114
- text.split("\n").each do |p|
115
- if mode == :justified
116
- y = write_paragraph_justified p, x, y, width, color, z_index
117
- else
118
- rel =
119
- case mode
120
- when :left then 0
121
- when :center then 0.5
122
- when :right then 1
123
- else 0
124
- end
125
- y = write_paragraph p, x, y, width, rel, color, z_index
126
- end
127
- end
128
- end
129
-
130
- private
131
-
132
- def write_paragraph(text, x, y, width, rel, color, z_index)
133
- line = ''
134
- line_width = 0
135
- text.split(' ').each do |word|
136
- w = @font.markup_width word
137
- if line_width + w > width
138
- @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color
139
- line = ''
140
- line_width = 0
141
- y += @font.height + @line_spacing
142
- end
143
- line += "#{word} "
144
- line_width += @font.markup_width "#{word} "
145
- end
146
- @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color unless line.empty?
147
- y + @font.height + @line_spacing
148
- end
149
-
150
- def write_paragraph_justified(text, x, y, width, color, z_index)
151
- space_width = @font.text_width ' '
152
- spaces = [[]]
153
- line_index = 0
154
- new_x = x
155
- words = text.split(' ')
156
- words.each do |word|
157
- w = @font.markup_width word
158
- if new_x + w > x + width
159
- space = x + width - new_x + space_width
160
- index = 0
161
- while space > 0
162
- spaces[line_index][index] += 1
163
- space -= 1
164
- index += 1
165
- index = 0 if index == spaces[line_index].size - 1
166
- end
167
-
168
- spaces << []
169
- line_index += 1
170
-
171
- new_x = x
172
- end
173
- new_x += @font.markup_width(word) + space_width
174
- spaces[line_index] << space_width
175
- end
176
-
177
- index = 0
178
- spaces.each do |line|
179
- new_x = x
180
- line.each do |s|
181
- @font.draw_markup words[index], new_x, y, z_index, 1, 1, color
182
- new_x += @font.markup_width(words[index]) + s
183
- index += 1
184
- end
185
- y += @font.height + @line_spacing
186
- end
187
- y
188
- end
189
- end
190
- end
1
+ module MiniGL
2
+ # This class provides methods for easily drawing one or multiple lines of
3
+ # text, with control over the text alignment and coloring.
4
+ class TextHelper
5
+ # Creates a TextHelper.
6
+ #
7
+ # Parameters:
8
+ # [font] A <code>Gosu::Font</code> that will be used to draw the text.
9
+ # [line_spacing] When drawing multiple lines, the distance, in pixels,
10
+ # between each line.
11
+ def initialize(font, line_spacing = 0)
12
+ @font = font
13
+ @line_spacing = line_spacing
14
+ end
15
+
16
+ # Draws a single line of text.
17
+ #
18
+ # Parameters:
19
+ # [text] The text to be drawn. No line breaks are allowed. You can use the
20
+ # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
21
+ # [x] The horizontal reference for drawing the text. If +mode+ is +:left+,
22
+ # all text will be drawn from this point to the right; if +mode+ is
23
+ # +:right+, all text will be drawn from this point to the left; and if
24
+ # +mode+ is +:center+, the text will be equally distributed to the
25
+ # left and to the right of this point.
26
+ # [y] The vertical reference for drawing the text. All text will be drawn
27
+ # from this point down.
28
+ # [mode] The alignment of the text. Valid values are +:left+, +:right+ and
29
+ # +:center+.
30
+ # [color] The color of the text, in hexadecimal RRGGBB format.
31
+ # [alpha] The opacity of the text. Valid values vary from 0 (fully
32
+ # transparent) to 255 (fully opaque).
33
+ # [effect] Effect to add to the text. It can be either +nil+, for no effect,
34
+ # +:border+ for bordered text, or +:shadow+ for shadowed text (the
35
+ # shadow is always placed below and to the right of the text).
36
+ # [effect_color] Color of the effect, if any.
37
+ # [effect_size] Size of the effect, if any. In the case of +:border+, this
38
+ # will be the width of the border (the border will only look
39
+ # good when +effect_size+ is relatively small, compared to the
40
+ # size of the font); in the case of +:shadow+, it will be the
41
+ # distance between the text and the shadow.
42
+ # [effect_alpha] Opacity of the effect, if any. For shadows, it is usual to
43
+ # provide less than 255.
44
+ # [z_index] The z-order to draw the object. Objects with larger z-orders
45
+ # will be drawn on top of the ones with smaller z-orders.
46
+ #
47
+ # *Obs.:* This method accepts named parameters, but +text+, +x+ and +y+ are
48
+ # mandatory.
49
+ def write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff,
50
+ effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
51
+ z_index = 0)
52
+ if text.is_a? Hash
53
+ x = text[:x]
54
+ y = text[:y]
55
+ mode = text.fetch(:mode, :left)
56
+ color = text.fetch(:color, 0)
57
+ alpha = text.fetch(:alpha, 0xff)
58
+ effect = text.fetch(:effect, nil)
59
+ effect_color = text.fetch(:effect_color, 0)
60
+ effect_size = text.fetch(:effect_size, 1)
61
+ effect_alpha = text.fetch(:effect_alpha, 0xff)
62
+ z_index = text.fetch(:z_index, 0)
63
+ text = text[:text]
64
+ end
65
+
66
+ color = (alpha << 24) | color
67
+ rel =
68
+ case mode
69
+ when :left then 0
70
+ when :center then 0.5
71
+ when :right then 1
72
+ else 0
73
+ end
74
+ if effect
75
+ effect_color = (effect_alpha << 24) | effect_color
76
+ if effect == :border
77
+ @font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
78
+ @font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, 1, 1, effect_color
79
+ @font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
80
+ @font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, 1, 1, effect_color
81
+ @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
82
+ @font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, 1, 1, effect_color
83
+ @font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
84
+ @font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, 1, 1, effect_color
85
+ elsif effect == :shadow
86
+ @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
87
+ end
88
+ end
89
+ @font.draw_markup_rel text, x, y, z_index, rel, 0, 1, 1, color
90
+ end
91
+
92
+ # Draws text, breaking lines when needed and when explicitly caused by the
93
+ # "\n" character.
94
+ #
95
+ # Parameters:
96
+ # [text] The text to be drawn. Line breaks are allowed. You can use the
97
+ # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
98
+ # [x] The horizontal reference for drawing the text. Works like in
99
+ # +write_line+ for the +:left+, +:right+ and +:center+ modes. For the
100
+ # +:justified+ mode, works the same as for +:left+.
101
+ # [y] The vertical reference for drawing the text. All text will be drawn
102
+ # from this point down.
103
+ # [width] The maximum width for the lines of text. Line is broken when
104
+ # this width is exceeded.
105
+ # [mode] The alignment of the text. Valid values are +:left+, +:right+,
106
+ # +:center+ and +:justified+.
107
+ # [color] The color of the text, in hexadecimal RRGGBB format.
108
+ # [alpha] The opacity of the text. Valid values vary from 0 (fully
109
+ # transparent) to 255 (fully opaque).
110
+ # [z_index] The z-order to draw the object. Objects with larger z-orders
111
+ # 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)
113
+ color = (alpha << 24) | color
114
+ text.split("\n").each do |p|
115
+ if mode == :justified
116
+ y = write_paragraph_justified p, x, y, width, color, z_index
117
+ else
118
+ rel =
119
+ case mode
120
+ when :left then 0
121
+ when :center then 0.5
122
+ when :right then 1
123
+ else 0
124
+ end
125
+ y = write_paragraph p, x, y, width, rel, color, z_index
126
+ end
127
+ end
128
+ end
129
+
130
+ private
131
+
132
+ def write_paragraph(text, x, y, width, rel, color, z_index)
133
+ line = ''
134
+ line_width = 0
135
+ text.split(' ').each do |word|
136
+ w = @font.markup_width word
137
+ if line_width + w > width
138
+ @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color
139
+ line = ''
140
+ line_width = 0
141
+ y += @font.height + @line_spacing
142
+ end
143
+ line += "#{word} "
144
+ line_width += @font.markup_width "#{word} "
145
+ end
146
+ @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color unless line.empty?
147
+ y + @font.height + @line_spacing
148
+ end
149
+
150
+ def write_paragraph_justified(text, x, y, width, color, z_index)
151
+ space_width = @font.text_width ' '
152
+ spaces = [[]]
153
+ line_index = 0
154
+ new_x = x
155
+ words = text.split(' ')
156
+ words.each do |word|
157
+ w = @font.markup_width word
158
+ if new_x + w > x + width
159
+ space = x + width - new_x + space_width
160
+ index = 0
161
+ while space > 0
162
+ spaces[line_index][index] += 1
163
+ space -= 1
164
+ index += 1
165
+ index = 0 if index == spaces[line_index].size - 1
166
+ end
167
+
168
+ spaces << []
169
+ line_index += 1
170
+
171
+ new_x = x
172
+ end
173
+ new_x += @font.markup_width(word) + space_width
174
+ spaces[line_index] << space_width
175
+ end
176
+
177
+ index = 0
178
+ spaces.each do |line|
179
+ new_x = x
180
+ line.each do |s|
181
+ @font.draw_markup words[index], new_x, y, z_index, 1, 1, color
182
+ new_x += @font.markup_width(words[index]) + s
183
+ index += 1
184
+ end
185
+ y += @font.height + @line_spacing
186
+ end
187
+ y
188
+ end
189
+ end
190
+ end
@@ -1,73 +1,73 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
- width="204"
13
- height="24"
14
- id="svg2"
15
- version="1.1"
16
- inkscape:version="0.48.4 r9939"
17
- sodipodi:docname="barbg.svg"
18
- inkscape:export-filename="/home/victor/Projects/TCC/minigl/test/data/img/barbg.png"
19
- inkscape:export-xdpi="90"
20
- inkscape:export-ydpi="90">
21
- <defs
22
- id="defs4" />
23
- <sodipodi:namedview
24
- id="base"
25
- pagecolor="#ffffff"
26
- bordercolor="#666666"
27
- borderopacity="1.0"
28
- inkscape:pageopacity="0.0"
29
- inkscape:pageshadow="2"
30
- inkscape:zoom="4"
31
- inkscape:cx="127.40358"
32
- inkscape:cy="-8.2431265"
33
- inkscape:document-units="px"
34
- inkscape:current-layer="layer1"
35
- showgrid="false"
36
- inkscape:window-width="1364"
37
- inkscape:window-height="718"
38
- inkscape:window-x="0"
39
- inkscape:window-y="0"
40
- inkscape:window-maximized="1" />
41
- <metadata
42
- id="metadata7">
43
- <rdf:RDF>
44
- <cc:Work
45
- rdf:about="">
46
- <dc:format>image/svg+xml</dc:format>
47
- <dc:type
48
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
49
- <dc:title></dc:title>
50
- </cc:Work>
51
- </rdf:RDF>
52
- </metadata>
53
- <g
54
- inkscape:label="Layer 1"
55
- inkscape:groupmode="layer"
56
- id="layer1"
57
- transform="translate(0,-1028.3622)">
58
- <rect
59
- style="fill:#ffffff;fill-opacity:1;stroke:none"
60
- id="rect3753"
61
- width="204"
62
- height="24"
63
- x="0"
64
- y="1028.3622" />
65
- <rect
66
- style="fill:#ff0000;fill-opacity:1;stroke:none"
67
- id="rect3755"
68
- width="200"
69
- height="20"
70
- x="2"
71
- y="1030.3622" />
72
- </g>
73
- </svg>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ width="204"
13
+ height="24"
14
+ id="svg2"
15
+ version="1.1"
16
+ inkscape:version="0.48.4 r9939"
17
+ sodipodi:docname="barbg.svg"
18
+ inkscape:export-filename="/home/victor/Projects/TCC/minigl/test/data/img/barbg.png"
19
+ inkscape:export-xdpi="90"
20
+ inkscape:export-ydpi="90">
21
+ <defs
22
+ id="defs4" />
23
+ <sodipodi:namedview
24
+ id="base"
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1.0"
28
+ inkscape:pageopacity="0.0"
29
+ inkscape:pageshadow="2"
30
+ inkscape:zoom="4"
31
+ inkscape:cx="127.40358"
32
+ inkscape:cy="-8.2431265"
33
+ inkscape:document-units="px"
34
+ inkscape:current-layer="layer1"
35
+ showgrid="false"
36
+ inkscape:window-width="1364"
37
+ inkscape:window-height="718"
38
+ inkscape:window-x="0"
39
+ inkscape:window-y="0"
40
+ inkscape:window-maximized="1" />
41
+ <metadata
42
+ id="metadata7">
43
+ <rdf:RDF>
44
+ <cc:Work
45
+ rdf:about="">
46
+ <dc:format>image/svg+xml</dc:format>
47
+ <dc:type
48
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
49
+ <dc:title></dc:title>
50
+ </cc:Work>
51
+ </rdf:RDF>
52
+ </metadata>
53
+ <g
54
+ inkscape:label="Layer 1"
55
+ inkscape:groupmode="layer"
56
+ id="layer1"
57
+ transform="translate(0,-1028.3622)">
58
+ <rect
59
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
60
+ id="rect3753"
61
+ width="204"
62
+ height="24"
63
+ x="0"
64
+ y="1028.3622" />
65
+ <rect
66
+ style="fill:#ff0000;fill-opacity:1;stroke:none"
67
+ id="rect3755"
68
+ width="200"
69
+ height="20"
70
+ x="2"
71
+ y="1030.3622" />
72
+ </g>
73
+ </svg>