diff --git a/examples/xor/README.md b/examples/xor/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..a71e139dc8675a843d2ed332e7c8a9323d3c783f
--- /dev/null
+++ b/examples/xor/README.md
@@ -0,0 +1,6 @@
+# Xor
+
+This example demonstrates an unusual Porter-Duff composition method: Xor. (And the capability of
+drawing circles.)
+
+![Screenshot](screenshot.png)
\ No newline at end of file
diff --git a/examples/xor/main.go b/examples/xor/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..6cefb074c9711d7fb019884009df1c521576c976
--- /dev/null
+++ b/examples/xor/main.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+	"math"
+	"time"
+
+	"github.com/faiface/pixel"
+	"github.com/faiface/pixel/imdraw"
+	"github.com/faiface/pixel/pixelgl"
+	"golang.org/x/image/colornames"
+)
+
+func run() {
+	cfg := pixelgl.WindowConfig{
+		Title:     "Xor",
+		Bounds:    pixel.R(0, 0, 1024, 768),
+		Resizable: true,
+		VSync:     true,
+	}
+	win, err := pixelgl.NewWindow(cfg)
+	if err != nil {
+		panic(err)
+	}
+
+	imd := imdraw.New(nil)
+
+	canvas := pixelgl.NewCanvas(win.Bounds())
+
+	start := time.Now()
+	for !win.Closed() {
+		// in case window got resized, we also need to resize out canvas
+		canvas.SetBounds(win.Bounds())
+
+		offset := math.Sin(time.Since(start).Seconds()) * 300
+
+		// clear the canvas to be totally transparent and set the xor compose method
+		canvas.Clear(pixel.Alpha(0))
+		canvas.SetComposeMethod(pixel.ComposeXor)
+
+		// red circle
+		imd.Clear()
+		imd.Color(pixel.RGB(1, 0, 0))
+		imd.Push(pixel.X(-offset) + win.Bounds().Center())
+		imd.Circle(200, 0)
+		imd.Draw(canvas)
+
+		// blue circle
+		imd.Clear()
+		imd.Color(pixel.RGB(0, 0, 1))
+		imd.Push(pixel.X(offset) + win.Bounds().Center())
+		imd.Circle(150, 0)
+		imd.Draw(canvas)
+
+		// yellow circle
+		imd.Clear()
+		imd.Color(pixel.RGB(1, 1, 0))
+		imd.Push(pixel.Y(-offset) + win.Bounds().Center())
+		imd.Circle(100, 0)
+		imd.Draw(canvas)
+
+		// magenta circle
+		imd.Clear()
+		imd.Color(pixel.RGB(1, 0, 1))
+		imd.Push(pixel.Y(offset) + win.Bounds().Center())
+		imd.Circle(50, 0)
+		imd.Draw(canvas)
+
+		win.Clear(colornames.Green)
+		canvas.Draw(win)
+		win.Update()
+	}
+}
+
+func main() {
+	pixelgl.Run(run)
+}
diff --git a/examples/xor/screenshot.png b/examples/xor/screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b96dd9d7d842094e9c0c680c0a401d7c5d46338
Binary files /dev/null and b/examples/xor/screenshot.png differ