build: embed Windows release resources
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
// Command releaseicon creates the small deterministic PNG used only by the
|
||||
// Windows release resource generator. Keeping the source rather than a binary
|
||||
// asset makes the icon reproducible in the pinned toolchain.
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/png"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
const canvasSize = 256
|
||||
|
||||
func main() {
|
||||
output := flag.String("out", "", "absolute PNG output path")
|
||||
flag.Parse()
|
||||
if *output == "" || !filepath.IsAbs(*output) {
|
||||
panic("--out must be an absolute path")
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Dir(*output), 0o700); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
file, err := os.OpenFile(*output, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
image := image.NewNRGBA(image.Rect(0, 0, canvasSize, canvasSize))
|
||||
fill(image, color.NRGBA{R: 15, G: 28, B: 48, A: 255})
|
||||
fillRoundedRect(image, 18, 18, 238, 238, 42, color.NRGBA{R: 28, G: 56, B: 92, A: 255})
|
||||
// A compact outlined box and terminal prompt remain recognizable at the
|
||||
// 16-pixel size Windows Explorer generates from this source image.
|
||||
strokeRect(image, 57, 62, 199, 194, 12, color.NRGBA{R: 54, G: 211, B: 189, A: 255})
|
||||
fillRect(image, 79, 105, 96, 121, color.NRGBA{R: 240, G: 249, B: 255, A: 255})
|
||||
fillRect(image, 95, 121, 112, 137, color.NRGBA{R: 240, G: 249, B: 255, A: 255})
|
||||
fillRect(image, 79, 137, 96, 153, color.NRGBA{R: 240, G: 249, B: 255, A: 255})
|
||||
fillRect(image, 126, 150, 176, 166, color.NRGBA{R: 240, G: 249, B: 255, A: 255})
|
||||
if err := png.Encode(file, image); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func fill(image *image.NRGBA, value color.NRGBA) {
|
||||
for y := 0; y < canvasSize; y++ {
|
||||
for x := 0; x < canvasSize; x++ {
|
||||
image.SetNRGBA(x, y, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fillRoundedRect(image *image.NRGBA, left, top, right, bottom, radius int, value color.NRGBA) {
|
||||
for y := top; y < bottom; y++ {
|
||||
for x := left; x < right; x++ {
|
||||
dx, dy := 0, 0
|
||||
if x < left+radius {
|
||||
dx = left + radius - x
|
||||
} else if x >= right-radius {
|
||||
dx = x - (right - radius - 1)
|
||||
}
|
||||
if y < top+radius {
|
||||
dy = top + radius - y
|
||||
} else if y >= bottom-radius {
|
||||
dy = y - (bottom - radius - 1)
|
||||
}
|
||||
if dx*dx+dy*dy <= radius*radius {
|
||||
image.SetNRGBA(x, y, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func strokeRect(image *image.NRGBA, left, top, right, bottom, width int, value color.NRGBA) {
|
||||
fillRect(image, left, top, right, top+width, value)
|
||||
fillRect(image, left, bottom-width, right, bottom, value)
|
||||
fillRect(image, left, top, left+width, bottom, value)
|
||||
fillRect(image, right-width, top, right, bottom, value)
|
||||
}
|
||||
|
||||
func fillRect(image *image.NRGBA, left, top, right, bottom int, value color.NRGBA) {
|
||||
for y := top; y < bottom; y++ {
|
||||
for x := left; x < right; x++ {
|
||||
image.SetNRGBA(x, y, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user