v2 / vlib / x / ttf / ttf_test.v
238 lines · 225 sloc · 7.38 KB · 2332ecff4811b8c97dfda8e825170e9397962519
Raw
1// vtest build: !docker-ubuntu-musl
2import x.ttf
3import os
4import strings
5
6/**********************************************************************
7*
8* BMP render module utility functions
9*
10* Copyright (c) 2021 Dario Deledda. All rights reserved.
11* Use of this source code is governed by an MIT license
12* that can be found in the LICENSE file.
13*
14* Note:
15* use `v -d create_data vlib/x/ttf/ttf_test.v` to generate binary data for this test file
16*
17* TODO:
18* - manage text directions R to L
19**********************************************************************/
20const font_path = 'Qarmic_sans_Abridged.ttf'
21
22const font_bytes = $embed_file('ttf_test_data.bin')
23
24const test_data = '
250000 0000 0000 0000 0000 0000 0000 0000
260000 0000 0000 0000 0000 0000 0000 0000
270000 0000 0000 0000 0000 0000 0000 0000
280000 0000 0000 0000 0000 0000 0000 0000
290000 0000 0000 0000 0000 0000 0000 0000
300000 0000 0000 0000 0000 0000 0000 0000
310000 0000 0000 0000 0000 0000 0000 0000
320000 0000 0000 0000 0000 0000 0000 0000
330000 0000 0000 0000 0000 0000 0000 0000
340000 0000 0000 0000 0000 0000 0000 0000
350000 0000 0000 0000 0000 0000 0000 0000
360000 0000 0000 0000 0000 0000 0000 0000
370000 0000 0000 0000 0000 0000 0000 0000
380000 0000 0000 0000 0000 0000 0000 0000
390000 0000 0000 0000 0000 0000 0000 0000
400000 0000 0000 0000 0000 0000 0000 0000
410000 0000 0000 0000 0000 0000 0000 0000
420000 0000 0000 0000 0000 0000 0000 0000
430000 0000 0000 0000 0000 0000 0000 0000
440000 0000 0000 0000 0000 0000 0000 0000
450000 0000 0000 0000 0000 0000 0000 0000
460000 0000 0000 0000 0000 0000 0000 0000
470000 0000 0000 0000 0000 0000 0000 0000
480000 0000 0000 0000 0000 0000 0000 0000
490000 0000 0000 0000 0000 0000 0000 0000
500000 0000 0000 0000 0000 0000 0000 0000
510000 0000 0000 0000 0000 0000 0000 0000
520000 0000 0000 0000 0000 0000 0000 0000
5300bf bfbf bfbf bfbf bfbf bfbf bf00 0000
540000 0000 0000 0000 0000 0000 0000 0000
550000 0000 0000 0000 0000 0000 0000 0000
5600bf bfbf bfbf bfbf bfbf bfbf bf00 0000
57bfff ffff ffff ffff ffff ffff ffbf 0000
580000 0000 0000 0000 0000 0000 0000 0000
590000 0000 0000 0000 0000 0000 0000 0000
60bfff ffff ffff ffff ffff ffff ffbf 0000
6100bf ffff ffbf ffff bfff ffff bf00 0000
620000 0000 0000 0000 0000 0000 0000 0000
630000 0000 0000 0000 0000 0000 0000 0000
6400bf ffff ffbf ffff bfff ffff bf00 0000
650000 0000 00bf ffff bf00 0000 0000 0000
660000 0000 0000 0000 0000 0000 0000 0000
67bf00 0000 0000 0000 0000 0000 0000 0000
680000 0000 00bf ffff bf00 0000 0000 0000
690000 0000 00bf ffff bf00 0000 0000 0000
700000 0000 0000 0000 0000 0000 0000 00bf
71ffbf 0000 0000 0000 0000 0000 0000 0000
720000 0000 00bf ffff bf00 0000 0000 0000
730000 0000 00bf ffff bf00 0000 0000 0000
740000 0000 0000 0000 0000 0000 0000 00bf
75ffbf 0000 0000 0000 0000 0000 0000 0000
760000 0000 00bf ffff bf00 0000 0000 0000
770000 0000 00bf ffff bf00 0000 0000 0000
780000 0000 0000 0000 0000 0000 0000 bfbf
79ffbf bfbf bf00 0000 0000 0000 0000 0000
800000 0000 00bf ffff bf00 0000 0000 0000
810000 0000 00bf ffff bf00 0000 0032 72bf
82bfbf 0000 0000 bfbf bfbf 5400 00bf ffff
83ffff ffff ffbf 0000 0000 0000 0000 0000
840000 0000 00bf ffff bf00 0000 0032 72bf
850000 0000 00bf ffff bf00 0065 9999 ffff
86ffff bf00 00bf ffff ffff ff7f 0000 bfff
87bfff bfff bf00 0000 0000 0000 0000 0000
880000 0000 00bf ffff bf00 0065 9999 6500
890000 0000 00bf ffff bf00 bfff ffff ffbf
90ffff ffbf bfff bfff bfbf ffff bf00 bfff
91bf00 0000 0000 0000 0000 0000 0000 0000
920000 0000 00bf ffff bf00 bf72 3300 7fbf
930000 0000 00bf ffff bf7f 5fff ffbf 3f7f
948fbf ffbf ffbf 5500 0000 5fbf 0000 bfff
95bf00 0000 0000 0000 0000 0000 0000 0000
960000 0000 00bf ffff bf7f 5fff ffbf 3f7f
970000 0000 00bf ffff bfbf ffbf bfbf ffff
98ffff ffbf ffff ff7f 0000 0000 0000 bfff
99bf00 0000 0000 0000 0000 0000 0000 0000
1000000 0000 00bf ffff bfbf 00bf bfbf 8f5f
1010000 0000 00bf ffff 7f5f ffff ffff ffff
102ffff ffbf 5fbf ffff bfbf bfbf 0000 bfff
103bf00 0000 0000 0000 0000 0000 0000 0000
1040000 0000 00bf ffff 7f5f 0000 0000 0000
1050000 0000 00bf ffff bfff bfff ffbf ffff
106ffff ffbf 0000 5fbf ffff ffff bf00 bfff
107bf00 0000 0000 0000 0000 0000 0000 0000
1080000 0000 00bf ffff bfff bfff ffbf ffff
1090000 0000 00bf ffff bfff bf00 0000 0000
1100000 0000 0000 0000 7f7f ffff bf00 bfff
111bf00 0000 bf00 0000 0000 0000 0000 0000
1120000 0000 00bf ffff bfff bf00 0000 0000
1130000 0000 00bf ffff bfff bf00 0000 0000
1140000 bf00 bf00 0000 0055 bfff ffbf bfff
115ff7f 00bf ff5f 0000 0000 0000 0000 0000
1160000 0000 00bf ffff bfff bf00 0000 0000
1170000 0000 00bf ffff bfbf ffbf 0000 0055
1187fbf ffbf ffbf 7f55 00bf ffff bf00 7f5f
119ff7f 7f5f ffbf 0000 0000 0000 0000 0000
1200000 0000 00bf ffff bfbf ffbf 0000 0055
1210000 0000 00bf ffff bfbf ffff bfbf bfff
122ffff bfbf ffff ffff ffff ffff bf00 00bf
123ffff ffff ffbf 0000 0000 0000 0000 0000
1240000 0000 00bf ffff bfbf 0000 bfbf bf7f
1250000 0000 00bf ffff bf00 bfff ffff ffff
126ffbf 0000 bfbf ffff ffff bfbf 0000 00bf
127ffbf ffff bf00 0000 0000 0000 0000 0000
1280000 0000 00bf ffff bf00 bf00 0000 3f7f
1290000 0000 0000 5fbf 0000 00bf ffbf 8f5f
1303f00 0000 0000 5fbf bf5f 0000 0000 0000
1310000 bf5f 0000 0000 0000 0000 0000 0000
1320000 0000 0000 5fbf 0000 00bf ffbf 8f5f
1330000 0000 0000 0000 0000 0000 0000 0000
1340000 0000 0000 0000 0000 0000 0000 0000
1350000 0000 0000 0000 0000 0000 0000 0000
1360000 0000 0000 0000 0000 0000 0000 0000
1370000 0000 0000 0000 0000 0000 0000 0000
1380000 0000 0000 0000 0000 0000 0000 0000
1390000 0000 0000 0000 0000 0000 0000 0000
1400000 0000 0000 0000 0000 0000 0000 0000
1410000 0000 0000 0000 0000 0000 0000 0000
1420000 0000 0000 0000 0000 0000 0000 0000
1430000 0000 0000 0000 0000 0000 0000 0000
1440000 0000 0000 0000 0000 0000 0000 0000
1450000 0000 0000 0000 0000 0000 0000 0000
1460000 0000 0000 0000 0000 0000 0000 0000
1470000 0000 0000 0000 0000 0000 0000 0000
1480000 0000 0000 0000 0000 0000 0000 0000
1490000 0000 0000 0000 0000 0000 0000 0000
1500000 0000 0000 0000 0000 0000 0000 0000
1510000 0000 0000 0000 0000 0000 0000 0000
1520000 0000 0000 0000 0000 0000 0000 0000
153'
154
155fn save_raw_data_as_array(buf_bin []u8, file_name string) {
156 mut buf := strings.new_builder(buf_bin.len * 5)
157 for x in buf_bin {
158 buf.write_string('0x${x:02x},')
159 }
160 os.write_file_array(file_name, buf) or { panic(err) }
161}
162
163fn test_main() {
164 mut tf := ttf.TTF_File{}
165 $if create_data ? {
166 tf.buf = os.read_bytes(font_path) or { panic(err) }
167 println('TrueTypeFont file [${font_path}] len: ${tf.buf.len}')
168 save_raw_data_as_array(tf.buf, 'test_ttf_Font_arr.bin')
169 } $else {
170 mut mut_font_bytes := font_bytes
171 tf.buf = unsafe { mut_font_bytes.data().vbytes(font_bytes.len) }
172 }
173 tf.init()
174 // println("Unit per EM: ${tf.units_per_em}")
175
176 w := 64
177 h := 32
178 bp := 4
179 sz := w * h * bp
180
181 font_size := 20
182 device_dpi := 72
183 scale := f32(font_size * device_dpi) / f32(72 * int(tf.units_per_em))
184
185 mut bmp := ttf.BitMap{
186 tf: &tf
187 buf: unsafe { malloc(sz) }
188 buf_size: sz
189 scale: scale
190 width: w
191 height: h
192 }
193
194 y_base := int((tf.y_max - tf.y_min) * bmp.scale)
195 bmp.clear()
196 bmp.set_pos(0, y_base)
197 bmp.init_filler()
198 bmp.draw_text('Test Text')
199
200 mut test_buf := get_raw_data(test_data)
201 $if create_data ? {
202 bmp.save_as_ppm('test_ttf.ppm')
203 bmp.save_raw_data('test_ttf.bin')
204 test_buf = os.read_bytes('test_ttf.bin') or { panic(err) }
205 }
206
207 ram_buf := bmp.get_raw_bytes()
208 assert ram_buf.len == test_buf.len
209 for i in 0 .. ram_buf.len {
210 if test_buf[i] != ram_buf[i] {
211 assert false
212 }
213 }
214}
215
216fn get_raw_data(data string) []u8 {
217 mut buf := []u8{}
218 mut c := 0
219 mut b := u32(0)
220 for ch in data {
221 if ch >= `0` && ch <= `9` {
222 b = b << 4
223 b += u32(ch - `0`)
224 c++
225 } else if ch >= `a` && ch <= `f` {
226 b = b << 4
227 b += u32(ch - `a` + 10)
228 c++
229 }
230
231 if c == 2 {
232 buf << u8(b)
233 b = 0
234 c = 0
235 }
236 }
237 return buf
238}
239