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