From 566ca3cc75f9c6fbe1a015018d381cdbfbf1a2ad Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 7 May 2022 16:09:51 +0900 Subject: [PATCH] Add tmemo_converter --- README.md | 1 + tmemo_converter/README.md | 16 +++++++++ tmemo_converter/main.go | 71 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 tmemo_converter/README.md create mode 100644 tmemo_converter/main.go diff --git a/README.md b/README.md index 3e27869..a8ef23a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ - [read_keys_SH3.c](read_keys_SH3.c) Scan key matrix and return key name rewritten with C. nice performance - [x1](x1) Executable to analyze `[JHSBA]1` gen - [lcdbench](lcdbench) Benchmark fb0 fill and show results + - [tmemo_converter](tmemo_converter) Converts 手書き暗記メモ into PNGs (2G or older) ### License diff --git a/tmemo_converter/README.md b/tmemo_converter/README.md new file mode 100644 index 0000000..20c9f67 --- /dev/null +++ b/tmemo_converter/README.md @@ -0,0 +1,16 @@ +### Prerequisites + - Go 1.1x + + +### Run + +```shell-session +$ # Example 1 +$ go run main.go tmemo000.tmd + +$ # Example 2 +$ go run main.go tmemo000.tmd tmemo001.tmd + +$ # Example 3 +$ go run main.go *.tmd +``` diff --git a/tmemo_converter/main.go b/tmemo_converter/main.go new file mode 100644 index 0000000..65af373 --- /dev/null +++ b/tmemo_converter/main.go @@ -0,0 +1,71 @@ +package main + +import ( + "fmt" + "image" + "image/color" + "image/png" + "io/ioutil" + "os" +) + +const ( + bytesPerPixel = 2 + width = 480 + height = 320 + toolbarHeight = 16 + actualHeight = height - toolbarHeight + + total = width * actualHeight * bytesPerPixel +) + +func main() { + if len(os.Args) == 1 { + fmt.Printf("Usage: %s INPUT ...\n", os.Args[0]) + fmt.Printf("Example: %s tmemo000.tmd tmemo001.tmd\n", os.Args[0]) + os.Exit(0) + } + + for _, a := range os.Args[1:] { + err := convert(a) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to convert %s: %s\n", a, err) + os.Exit(1) + } + } +} + +func convert(fn string) error { + raw, err := ioutil.ReadFile(fn) + if err != nil { + return fmt.Errorf("failed to read %s: %s", fn, err) + } + + if len(raw) != total { + return fmt.Errorf("unexpected binary length: expect=%d, actual=%d", total, len(raw)) + } + + rgba := image.NewRGBA(image.Rect(0, 0, width, actualHeight)) + + for i := 0; i < width*actualHeight; i++ { + pixel := uint16(raw[i*2+1])<<8 + uint16(raw[i*2]) + r := float64(pixel&0xf800>>11) * 255 / 31 + g := float64(pixel&0x07e0>>5) * 255 / 63 + b := float64(pixel&0x001f) * 255 / 31 + rgba.SetRGBA(i%width, actualHeight-i/width, color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 255}) + } + + newFn := fn + ".png" + out, err := os.Create(newFn) + if err != nil { + return fmt.Errorf("failed to create a file %s: %s", newFn, err) + } + defer out.Close() + + err = png.Encode(out, rgba) + if err != nil { + return fmt.Errorf("failed to compress the image into PNG: %s", err) + } + + return nil +}