92 lines
2.0 KiB
Go
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))
|
|
}
|
|
}
|