-
Notifications
You must be signed in to change notification settings - Fork 0
/
koala2png.go
98 lines (81 loc) · 1.79 KB
/
koala2png.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
"github.com/lhz/breadbox/gfx"
"flag"
"fmt"
"image"
"image/png"
"log"
"os"
)
var palette = gfx.Pepto
var mask1 = []byte{128, 32, 8, 2}
var mask2 = []byte{64, 16, 4, 1}
var c byte
func usage() {
fmt.Fprintf(os.Stderr, "Usage: %v [flags] <source> <target>\n", os.Args[0])
flag.PrintDefaults()
os.Exit(1)
}
func main() {
paletteName := flag.String("p", "pepto", "Name of palette to use [pepto|colodore|vice|levy]")
flag.Parse()
if len(flag.Args()) != 2 {
usage()
}
switch *paletteName {
case "pepto":
palette = gfx.Pepto
case "colodore":
palette = gfx.Colodore
case "vice":
palette = gfx.Vice
case "vicenew":
palette = gfx.ViceNew
case "levy":
palette = gfx.Levy
default:
usage()
}
sourceFile := flag.Arg(0)
targetFile := flag.Arg(1)
koala := make([]byte, 10003)
f, err := os.Open(sourceFile)
if err != nil {
log.Fatalf("Can't open file %s for reading: %v", sourceFile, err)
return
}
_, err = f.Read(koala)
if err != nil {
log.Fatalf("Can't read from file %s: %v", sourceFile, err)
return
}
img := image.NewPaletted(image.Rect(0, 0, 320, 200), palette)
bkg := koala[10002] & 0x0F
for row := 0; row < 25; row++ {
for col := 0; col < 40; col++ {
scr := koala[8002+row*40+col]
cmp := koala[9002+row*40+col]
for y := 0; y < 8; y++ {
byte := koala[2+row*320+col*8+y]
for x := 0; x < 4; x++ {
b1, b2 := byte&mask1[x], byte&mask2[x]
if b1 > 0 && b2 > 0 {
c = cmp & 0x0F
} else if b1 > 0 {
c = scr & 0x0F
} else if b2 > 0 {
c = (scr & 0xF0) >> 4
} else {
c = bkg
}
img.Set(col*8+x*2, row*8+y, palette[c])
img.Set(col*8+x*2+1, row*8+y, palette[c])
}
}
}
}
f, _ = os.OpenFile(targetFile, os.O_WRONLY|os.O_CREATE, 0600)
defer f.Close()
png.Encode(f, img)
}