1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Support for `TileSet`, `TileSetFont` and drawing text with `TextSprites`
20 # Efficiently retrieve tiles in a big texture
22 # Texture containing the tileset
31 # Number of columns of tiles in the texture
32 var nb_cols
: Int = (texture
.width
/ width
.to_f
).to_i
is lazy
34 # Number of rows of tiles in the texture
35 var nb_rows
: Int = (texture
.height
/ height
.to_f
).to_i
is lazy
37 # Cache of the subtextures of tiles
38 var subtextures
: Array[Texture] is lazy
do
39 var subtextures
= new Array[Texture]
40 for j
in [0..nb_rows
[ do
41 for i
in [0..nb_cols
[ do
42 subtextures
.add texture
.subtexture
(
43 i
.to_f
*width
.to_f
, j
.to_f
*height
.to_f
, width
.to_f
, height
.to_f
)
49 # Subtexture for the tile at `x, y`
51 # Require: `x < nb_cols and y < nb_rows`
52 fun [](x
,y
: Int): Texture
54 assert x
>= 0 and x
< nb_cols
and y
>= 0 and y
<= nb_rows
else print
"{x}x{y}<?{nb_cols}x{nb_rows}"
55 var idx
= x
+ y
* nb_cols
56 return subtextures
[idx
]
60 # A monospace bitmap font where glyphs are stored in a tileset
62 # This `Font` does not implement all settings of `TextSprites`.
67 # Set the characters present in `texture`
69 # Last all characters from left to right, then top to bottom.
70 # Line skip `\n`, are ignored and space ' ' skips holes in the tileset.
71 fun chars
=(chars
: Text)
73 chars_cleaned
= chars
.replace
("\n", "")
76 # Character present in the texture, set by `chars=`
77 private var chars_cleaned
: Text is noautoinit
79 # Additional space to insert horizontally between characters
81 # A negative value may display overlapped tiles.
82 var hspace
: Numeric = 0.0 is writable
84 # Additional space to insert vertically between characters
86 # A negative value may display overlapped tiles.
87 var vspace
: Numeric = 0.0 is writable
89 # The glyph/tile/texture associated to `char`
91 # Returns null if `char` is not in `chars`.
92 fun char
(char
: Char): nullable Texture
94 var i
= chars_cleaned
.index_of
(char
)
95 if i
== -1 then return null
99 # Distance between the beginning of a letter tile and the beginning of the next letter tile
100 fun advance
: Float do return width
.to_f
+ hspace
.to_f
102 # Distance between the beginning and the end of the longest line of `text`
103 fun text_width
(text
: Text): Numeric
105 var lines
= text
.split
('\n')
106 if lines
.is_empty
then return 0
109 for line
in lines
do longest
= longest
.max
(line
.length
)
111 return longest
.mul
(advance
)
114 # Distance between the top of the first line to the bottom of the last line in `text`
115 fun text_height
(text
: Text): Numeric
117 if text
.is_empty
then return 0
119 var n_lines
= text
.chars
.count
('\n')
120 return (n_lines
+1).mul
(height
.add
(vspace
)).sub
(vspace
)
123 redef fun write_into
(text_sprites
, text
)
127 var dy
= hspace
.to_f
/2.0
130 dy
-= height
.to_f
+ vspace
.to_f
133 else if c
== pld
then
134 dy
-= (height
.to_f
+ vspace
.to_f
) * partial_line_mod
.to_f
136 else if c
== plu
then
137 dy
+= (height
.to_f
+ vspace
.to_f
) * partial_line_mod
.to_f
139 else if c
.is_whitespace
then
146 # Try to fallback to '?'
148 if tex
== null then continue
151 text_sprites
.sprites
.add
new Sprite(tex
, text_sprites
.anchor
.offset
(dx
, dy
, 0))