package main

var Opaque, Transparent = color.Alpha{0xff}, color.Alpha{0}

type xor struct{ dst, src image.Image }

func (t xor) ColorModel() color.Model { return t.dst.ColorModel() }
func (t xor) Bounds() image.Rectangle { return t.src.Bounds() }
func (t xor) At(x, y int) color.Color {
	dstColor := t.ColorModel().Convert(t.dst.At(x, y))
	srcColor := t.ColorModel().Convert(t.src.At(x, y))

	// xor operation (a || b) && !(a && b)
	if ((dstColor == color.Opaque) || (srcColor == color.Opaque)) &&
		!((dstColor == color.Opaque) && (srcColor == color.Opaque)) {
		return color.Opaque
	}
	return color.Transparent
}
