Files
imageutils/cmd/showpalette/show.go
2025-12-14 06:04:57 +03:00

75 lines
1.2 KiB
Go

package main
import (
"encoding/csv"
"image"
"image/color"
"image/png"
"math"
"os"
imgutil "git.niplace.ru/XoxJlopeZi4BB/imageutils/pkg"
)
func nearestHighSqrt(n int) int {
if math.Mod(math.Sqrt(float64(n)), 1) == 0 {
return n
}
return nearestHighSqrt(n + 1)
}
type showColors struct {
color.Palette
}
func (s showColors) ColorModel() color.Model {
return color.RGBAModel
}
func (s showColors) Bounds() image.Rectangle {
n := nearestHighSqrt(len(s.Palette))
return image.Rect(0, 0, n, n)
}
func (s showColors) At(x, y int) color.Color {
n := nearestHighSqrt(len(s.Palette))
return s.Palette[y*n+x]
}
func check(err error) {
if err != nil {
panic(err)
}
}
func Must[T any](v T, err error) T {
check(err)
return v
}
func Map[S1 ~[]T1, S2 ~[]T2, T1, T2 any](s S1, f func(T1) T2) S2 {
result := make(S2, len(s))
for i := range s {
result[i] = f(s[i])
}
return result
}
func main() {
r := csv.NewReader(os.Stdin)
r.TrailingComma = true
colors, err := r.Read()
check(err)
palette := color.Palette(
Map[[]string, color.Palette](colors,
func(v string) color.Color {
println(v + "cat-v")
return Must(imgutil.ParseHexColor(v))
},
),
)
err = png.Encode(os.Stdout, showColors{palette})
check(err)
}