| // Copyright The Monogon Project Authors. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| "image/color" |
| "image/png" |
| "log" |
| "os" |
| ) |
| |
| func main() { |
| input := flag.String("input", "", "") |
| output := flag.String("output", "", "") |
| flag.Parse() |
| |
| if *input == "" || *output == "" { |
| log.Fatal("missing input or output flag") |
| } |
| |
| inputFile, err := os.Open(*input) |
| if err != nil { |
| log.Fatal("Error opening image file:", err) |
| return |
| } |
| defer inputFile.Close() |
| |
| img, err := png.Decode(inputFile) |
| if err != nil { |
| log.Fatal("Error decoding image:", err) |
| } |
| |
| if img.Bounds().Dx() != 80 || img.Bounds().Dy() != 20 { |
| log.Fatal("Image dimensions must be 80x20") |
| } |
| |
| var linear []uint8 |
| for y := 0; y < img.Bounds().Dy(); y++ { |
| for x := 0; x < img.Bounds().Dx(); x++ { |
| gray := color.GrayModel.Convert(img.At(x, y)).(color.Gray).Y |
| linear = append(linear, gray) |
| } |
| } |
| |
| // Perform RLE compression |
| var rle []uint8 |
| for len(linear) > 0 { |
| val := linear[0] |
| l := uint8(1) |
| for i := 1; i < len(linear); i++ { |
| if linear[i] != val { |
| break |
| } |
| l++ |
| } |
| |
| L := l |
| for l > 0 { |
| block := l |
| if block > 127 { |
| block = 127 |
| } |
| rle = append(rle, (val<<7)|block) |
| l -= block |
| } |
| linear = linear[L:] |
| } |
| |
| rle = append(rle, 0) |
| |
| outputFile, err := os.Create(*output) |
| if err != nil { |
| log.Fatalf("failed creating output file: %v", err) |
| } |
| defer outputFile.Close() |
| |
| outputFile.WriteString("logo: db ") |
| for i, r := range rle { |
| if i > 0 { |
| outputFile.WriteString(", ") |
| } |
| fmt.Fprintf(outputFile, "0x%02x", r) |
| } |
| outputFile.WriteString("\n") |
| } |