From 93e9ab79b16a466a4b168f0d9b0419c899fc1f56 Mon Sep 17 00:00:00 2001 From: faiface <faiface@ksp.sk> Date: Sat, 15 Apr 2017 17:10:35 +0200 Subject: [PATCH] add xor example --- examples/xor/README.md | 6 +++ examples/xor/main.go | 76 ++++++++++++++++++++++++++++++++++++ examples/xor/screenshot.png | Bin 0 -> 10628 bytes 3 files changed, 82 insertions(+) create mode 100644 examples/xor/README.md create mode 100644 examples/xor/main.go create mode 100644 examples/xor/screenshot.png diff --git a/examples/xor/README.md b/examples/xor/README.md new file mode 100644 index 0000000..a71e139 --- /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.) + + \ No newline at end of file diff --git a/examples/xor/main.go b/examples/xor/main.go new file mode 100644 index 0000000..6cefb07 --- /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 GIT binary patch literal 10628 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 Bi(UW# literal 0 HcmV?d00001 -- GitLab