123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- package main
- import (
- "encoding/binary"
- "fmt"
- "os"
- "red-green/door"
- "regexp"
- "strings"
- )
- func FontFixup(offsets []uint16, data *[]byte) bool {
- fixed := false
- for _, offset := range offsets {
- if offset == 65535 {
- continue
- }
- if offset == 0 {
- continue
- }
- if (*data)[offset-1] != 0 {
- (*data)[offset-1] = 0
- fixed = true
- }
- }
- return fixed
- }
- func Show(parts []string) {
- reset := "\x1b[0m"
- if len(parts) > 0 {
- for _, line := range parts {
- fmt.Printf("%s%s\n", door.CP437_to_Unicode(string(line)), reset)
-
- }
- fmt.Println("")
- }
- }
- func FontInfo(characters []int) (lower bool, lowerUnique bool, available string) {
-
-
-
-
- lower = characters[int(rune('a')-33)] != -1
- lowerUnique = characters[int(rune('A')-33)] != characters[int(rune('a')-33)]
- for idx, offset := range characters {
- char := idx + 33
- if offset != -1 {
- available += string(char)
- }
- }
- return
- }
- func ShowBlockFont(name string, bf *door.BlockFont) {
- low, uniq, avail := FontInfo(bf.Characters)
- fmt.Printf("Font: %s (LowerCase %t, Unique Lower %t, [%s]\n", name, low, uniq, avail)
- output, _ := bf.Output("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- Show(output)
- if low && uniq {
- output, _ := bf.Output("abcdefghijklmnopqrstuvwxyz")
- Show(output)
- }
- leftovers := avail
- reg, _ := regexp.Compile("[a-zA-Z]+")
- left := reg.ReplaceAllString(leftovers, "")
-
-
- if len(left) > 0 {
- output, _ = bf.Output(left)
- Show(output)
- }
- }
- func ShowColorFont(name string, cf *door.ColorFont) {
- low, uniq, avail := FontInfo(cf.Characters)
- fmt.Printf("Font: %s (LowerCase %t, Unique Lower %t, [%s]\n", name, low, uniq, avail)
-
- output, _ := cf.Output("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- Show(output)
- if low && uniq {
- output, _ := cf.Output("abcdefghijklmnopqrstuvwxyz")
- Show(output)
- }
- leftovers := avail
- reg, _ := regexp.Compile("[a-zA-Z]+")
- left := reg.ReplaceAllString(leftovers, "")
-
-
- if len(left) > 0 {
- output, _ = cf.Output(left)
- Show(output)
- }
- }
- func DisplayFonts(filename string, fonts []string) {
- f, err := os.Open(filename)
- if err != nil {
- fmt.Printf("Open(%s): %s\n", filename, err)
- panic(err)
- }
- defer f.Close()
- tdfonts := make([]byte, 20)
- f.Read(tdfonts)
- for true {
- fontdef := make([]byte, 4)
- read, _ := f.Read(fontdef)
- if read != 4 {
- break
- }
- fontname := make([]byte, 13)
- f.Read(fontname)
- Name := strings.Trim(string(fontname[1:]), "\x00")
-
- f.Read(fontdef)
- single := make([]byte, 1)
- var FontType int8
- binary.Read(f, binary.LittleEndian, &FontType)
-
- f.Read(single)
- var BlockSize int16
- binary.Read(f, binary.LittleEndian, &BlockSize)
- letterOffsets := make([]uint16, 94)
- binary.Read(f, binary.LittleEndian, &letterOffsets)
- if false {
- for idx, i := range letterOffsets {
- fmt.Printf(" %04X", i)
- if (idx+1)%10 == 0 {
- fmt.Println("")
- }
- }
- fmt.Println("")
- }
- data := make([]byte, BlockSize)
- binary.Read(f, binary.LittleEndian, &data)
-
-
- broken := false
- for idx, i := range letterOffsets {
- if i != 65535 {
- if i >= uint16(BlockSize) {
- broken = true
-
- letterOffsets[idx] = 65535
-
- }
- }
- }
- if broken {
- fmt.Println("FONT is corrupted/truncated. FIX attempted.")
- }
- if FontFixup(letterOffsets, &data) {
- fmt.Printf("Attempting to *FIX* Font %s\n", Name)
- }
-
- if len(fonts) == 1 && fonts[0] == "*" {
- switch FontType {
- case 1:
- bf := ExtractBlock(Name, letterOffsets, data)
- if len(bf.Characters) == 0 {
- fmt.Printf("%s : BLOCK FONT FAIL\n", Name)
- } else {
-
- ShowBlockFont(Name, &bf)
- }
- case 2:
- cf := ExtractColor(Name, letterOffsets, data)
- if len(cf.Characters) == 0 {
- fmt.Printf("%s : COLOR FONT FAIL\n", Name)
- } else {
-
- ShowColorFont(Name, &cf)
- }
- default:
- fmt.Printf("Sorry, I can't handle Font: %s Type %d!\n", Name, FontType)
- }
- } else {
- for _, f := range fonts {
- if Name == f {
- switch FontType {
- case 1:
- bf := ExtractBlock(Name, letterOffsets, data)
- if len(bf.Characters) == 0 {
- fmt.Printf("%s : BLOCK FONT FAIL\n", Name)
- } else {
- ShowBlockFont(Name, &bf)
- }
- case 2:
- cf := ExtractColor(Name, letterOffsets, data)
- if len(cf.Characters) == 0 {
- fmt.Printf("%s : COLOR FONT FAIL\n", Name)
- } else {
- ShowColorFont(Name, &cf)
- }
- default:
- fmt.Printf("Sorry, I can't handle Font: %s Type %d!\n", Name, FontType)
- }
- break
- }
- }
- }
- }
- }
|