Files
imageutils/cmd/repalette/repalette.go
T

92 lines
2.0 KiB
Go

package main
func parseMap(fields []string) (map[string]string, error) {
m := map[string]string{}
var k, v string
for i, v := range fields {
if v == "=" {
return nil, errors.New("bad field")
}
if len(v) > 1 {
// check if "=" is the last or first character
if "=" == v[0] {
return nil, errors.New("no key")
}
if "=" == v[len(v)-1] {
return nil, errors.New("no value")
}
}
if strings.Contains(v, "=") {
splitted := strings.Split(v, "=")
k, v = splitted[0], splitted[1]
m[k] = v
if i == len(fields)-1 {
return m, nil
}
continue
}
return nil, errors.New("no equality sign in field")
}
return nil, errors.New("everything is wrong!")
}
type Map map[color.Color]color.Color
type repalette struct {
image.Image
Map
}
func (r repalette) ColorModel() color.Model {
return r.Image.ColorModel()
}
func (r repalette) Bounds() image.Rectangle {
return r.Image.Bounds()
}
func (r repalette) At(x, y int) color.Color {
v := r.Image.At(x, y)
newColor, ok := r.Map[v]
if !ok {
return v
}
return newColor
}
func main() {
fields := os.Args[1:]
m, err := parseMap(fields)
if err != nil {
panic("parseMap:", err)
}
errParseHexColor := errors.New("parse hex color:")
newPalette, err :=
func(m map[string]string) (newMap map[color.Color]color.Color, err error) {
for k, v := range m {
newKey, err := util.ParseHexColor(k)
if err != nil {
return nil, errors.Join(
errors.New("bad key hex value."),
errors.Join(errParseHexColor, err),
)
}
newValue, err := util.ParseHexColor(v)
if err != nil {
return nil, errors.Join(
errors.New("bad value hex value."),
errors.Join(errParseHexColor, err),
)
}
newMap[newKey] = newValue
}
return
}(fields)
if err != nil {
panic(errors.Join(errors.New("palette parsing:"), err))
}
err = util.ProcessStdio(func(img image.Image) image.Image { return repalette{img, newPalette} })
if err != nil {
panic(errors.Join(errors.New("process stdio:"), err))
}
}