diff --git a/xor/README.md b/xor/README.md new file mode 100644 index 0000000..a71e139 --- /dev/null +++ b/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/xor/main.go b/xor/main.go new file mode 100644 index 0000000..6cefb07 --- /dev/null +++ b/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/xor/screenshot.png b/xor/screenshot.png new file mode 100644 index 0000000..3b96dd9 Binary files /dev/null and b/xor/screenshot.png differ