Unifont/convert.go
2021-10-10 14:48:01 +08:00

69 lines
1.2 KiB
Go

// unifont.bin: character-packed bitmap (16*16, 8*16 chars with the back half with zero)
// unifont_width.bin: bitfield starting from highest bit, representing width of character (0-narrow, 1-wide)
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
const (
Count = 0xffff + 1
SizeX = 8
SizeY = 16
)
var (
Filename = "unifont-13.0.06.hex"
Data [Count * SizeX * SizeY * 2]byte
WidthData [Count / 8]byte
)
func main() {
if len(os.Args) > 1 {
Filename = os.Args[1]
}
file, err := os.Open(Filename)
if err != nil {
panic(err)
}
sc := bufio.NewScanner(file)
for sc.Scan() {
line := sc.Text()
parts := strings.Split(line, ":")
var code int
fmt.Sscanf(parts[0], "%X", &code)
//fmt.Printf("Codepoint %02d(%02X): ",code,code)
if len(parts[1]) == 64 { // Full-Width (16*16)
WidthData[code/8] |= 1 << (7 - code%8)
}
basis := code * SizeX * SizeY * 2 / 8
for i := 0; i < len(parts[1]); i += 2 {
var num int
fmt.Sscanf(parts[1][i:i+2], "%X", &num)
//fmt.Printf("%02X",byte(num))
Data[basis+i/2] = byte(num)
}
//fmt.Printf("\n")
}
os.WriteFile("unifont.bin", Data[:], 0644)
os.WriteFile("unifont_width.bin", WidthData[:], 0644)
}