package main

import (
	"image"
	"image/color"
	"image/png"
	"math/rand"
	"os"
)

type MixedNegation struct {
	src     image.Image
	counter int
}

func toRGBA(c color.Color) color.RGBA {
	r, g, b, a := c.RGBA()
	return color.RGBA{
		R: uint8(r >> 8),
		G: uint8(g >> 8),
		B: uint8(b >> 8),
		A: uint8(a >> 8),
	}
}

func negateRGBA(c color.RGBA) color.RGBA {
	c.R = 255 - c.R
	c.G = 255 - c.G
	c.B = 255 - c.B
	return c
}

func Negate(c color.Color) color.Color {
	return negateRGBA(toRGBA(c))
}

func randomBool() bool {
	return rand.Intn(3) == 0
}

func (mn MixedNegation) ColorModel() color.Model { return mn.src.ColorModel() }
func (mn MixedNegation) Bounds() image.Rectangle { return mn.src.Bounds() }
func (mn *MixedNegation) At(x, y int) color.Color {
	if (x%1 != 0) && (y%8 != 0) {
		if randomBool() {
			return Negate(mn.src.At(x, y))
		}

	}
	return mn.src.At(x, y)
}

func pixelCount(img image.Image) int {
	return img.Bounds().Dx() * img.Bounds().Dy()
}

func main() {
	img, err := png.Decode(os.Stdin)
	if err != nil {
		panic(err)
	}

	n := pixelCount(img)
	println(n)

	err = png.Encode(os.Stdout, &MixedNegation{src: img, counter: n})
	if err != nil {
		panic(err)
	}
}
