Files
mysql-tunnel/tools/mkico/main.go
T
2026-09-21 16:46:55 +08:00

70 lines
1.5 KiB
Go

package main
import (
"encoding/binary"
"fmt"
"os"
"path/filepath"
)
// mkico packs internal/gui/logo.png into a single-image ICO at cmd/tunnel/app.ico.
// Prefer replacing app.ico with a proper multi-size .ico from a designer tool;
// this helper is a quick path when you only have a PNG.
func main() {
root, err := findRoot()
if err != nil {
panic(err)
}
pngPath := filepath.Join(root, "internal", "gui", "logo.png")
icoPath := filepath.Join(root, "cmd", "tunnel", "app.ico")
png, err := os.ReadFile(pngPath)
if err != nil {
panic(err)
}
var w, h uint32
if len(png) >= 24 {
w = binary.BigEndian.Uint32(png[16:20])
h = binary.BigEndian.Uint32(png[20:24])
}
wb, hb := byte(w), byte(h)
if w >= 256 {
wb = 0
}
if h >= 256 {
hb = 0
}
out := make([]byte, 22+len(png))
binary.LittleEndian.PutUint16(out[2:], 1)
binary.LittleEndian.PutUint16(out[4:], 1)
out[6] = wb
out[7] = hb
binary.LittleEndian.PutUint16(out[10:], 1)
binary.LittleEndian.PutUint16(out[12:], 32)
binary.LittleEndian.PutUint32(out[14:], uint32(len(png)))
binary.LittleEndian.PutUint32(out[18:], 22)
copy(out[22:], png)
if err := os.WriteFile(icoPath, out, 0o644); err != nil {
panic(err)
}
fmt.Println("wrote", icoPath)
}
func findRoot() (string, error) {
wd, err := os.Getwd()
if err != nil {
return "", err
}
dir := wd
for {
if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
return dir, nil
}
parent := filepath.Dir(dir)
if parent == dir {
return "", fmt.Errorf("go.mod not found from %s", wd)
}
dir = parent
}
}