-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathbin.go
68 lines (61 loc) · 1.41 KB
/
bin.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
package main
import (
"bytes"
"errors"
"os"
"github.com/fiam/max7456tool/mcm"
cli "github.com/urfave/cli/v2"
)
const (
flipHorizontalPixelsFlagName = "flip-horizontal-pixels"
)
func flipHorizontalBytePixels(c byte) byte {
return (c >> 6) | (c << 6) | ((c >> 2) & (3 << 2)) | ((c << 2) & (3 << 4))
}
func buildBinFromMCM(ctx *cli.Context, output string, input string, flipHorizontalPixels bool) error {
mf, err := os.Open(input)
if err != nil {
return err
}
defer mf.Close()
dec, err := mcm.NewDecoder(mf)
if err != nil {
return err
}
// Write all data to a buffer
var buf bytes.Buffer
for ii := 0; ii < dec.NChars(); ii++ {
chr := dec.CharAt(ii)
data := chr.Data()
if flipHorizontalPixels {
for jj := 0; jj < mcm.MinCharBytes; jj++ {
data[jj] = flipHorizontalBytePixels(data[jj])
}
}
if _, err := buf.Write(data); err != nil {
return err
}
}
// Save to bin
f, err := openOutputFile(output)
if err != nil {
return err
}
defer f.Close()
if _, err := f.Write(buf.Bytes()); err != nil {
return err
}
if err := f.Close(); err != nil {
return err
}
return nil
}
func binAction(ctx *cli.Context) error {
if ctx.NArg() != 2 {
return errors.New("bin requires 2 arguments, see help bin")
}
input := ctx.Args().Get(0)
output := ctx.Args().Get(1)
flipHorizontalPixels := ctx.Bool(flipHorizontalPixelsFlagName)
return buildBinFromMCM(ctx, output, input, flipHorizontalPixels)
}