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 }