1    type Rectangle = struct
2        left : u32
3        right : u32
4        up : u32
5        down : u32
6    
7        def width = right - left
8        def height = up - down
9    
10   type FontFile =
11       let id : u64
12       val margin_up : f32
13       val margin_down : f32
14       val space_width : u32
15       val rectangles : Map<Char, Rectangle>
16       val offsets : Map<(Char, Char), i32>
17       val memory : ImageMemory
18       val memory_rgba : ImageMemory
19   
20       def (==) rhs = id == rhs.id
21   
22       def discard =
23           memory.discard
24           memory_rgba.discard
25   
26       is Discard
27   
28   object FontFile =
29       def load (path : String) =
30           let bitmap_path = "$path/grayscale.png"
31           let memory = ImageMemory.load bitmap_path
32           let bitmap_path_rgba = "$path/rgba.png"
33           let memory_rgba = ImageMemory.load bitmap_path_rgba
34   
35           let txt_path = "$path/font.txt"
36           let string = fs/read_text txt_path
37           let lines = string.lines
38           let text = lines[0]
39           let (margin_up, margin_down) =
40               let items = lines[1].split ' '
41               let up = f32.parse items[0]
42               let down = f32.parse items[1]
43               (up, down)
44   
45           let rectangles = Map.new
46           for i, c in text.with_index do
47               let values = lines[i + 2].split ' '
48               let rectangle = Rectangle
49                   left = u32.parse values[0]
50                   right = u32.parse values[1]
51                   up = u32.parse values[2]
52                   down = u32.parse values[3]
53   
54               rectangles.add c rectangle
55   
56           let space_width = u32.parse lines[text.length + 2]
57   
58           let offsets = Map.new
59           let offset_lines = lines.as_slice.drop (text.length + 3)
60           for i = 0 until offset_lines.size / 2 do
61               let offset = i32.parse offset_lines[i * 2]
62               let s = offset_lines[i * 2 + 1]
63               let mut j = 0
64               while j < s.length do
65                   let left_c = s[j]
66                   let right_c = s[j + 1]
67                   offsets.add (left_c, right_c) offset
68                   j += 3
69   
70           FontFile id = Rand.next_u64
71                    =margin_up
72                    =margin_down
73                    =space_width
74                    =rectangles
75                    =offsets
76                    =memory
77                    =memory_rgba
78