diff options
Diffstat (limited to 'examples/imageviewer/viewer.go')
| -rw-r--r-- | examples/imageviewer/viewer.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/examples/imageviewer/viewer.go b/examples/imageviewer/viewer.go new file mode 100644 index 0000000..e783d78 --- /dev/null +++ b/examples/imageviewer/viewer.go @@ -0,0 +1,65 @@ +package main + +import ( + "image" + "image/draw" + "os" + + "github.com/faiface/gui" + + _ "image/gif" + _ "image/jpeg" + _ "image/png" + + _ "golang.org/x/image/bmp" +) + +func Viewer(env gui.Env, theme *Theme, view <-chan string) { + redraw := func(r image.Rectangle, img image.Image) func(draw.Image) image.Rectangle { + return func(drw draw.Image) image.Rectangle { + draw.Draw(drw, r, &image.Uniform{theme.Empty}, image.ZP, draw.Src) + DrawCentered(drw, r, img, draw.Over) + return r + } + } + + invalid := DrawText("Invalid image", theme.Face, theme.Text) + + var ( + r image.Rectangle + img image.Image + ) + + for { + select { + case path := <-view: + func() { + f, err := os.Open(path) + if err != nil { + img = invalid + return + } + defer f.Close() + img, _, err = image.Decode(f) + if err != nil { + img = invalid + return + } + }() + env.Draw() <- redraw(r, img) + + case e, ok := <-env.Events(): + if !ok { + close(env.Draw()) + return + } + + var minX, minY, maxX, maxY int + switch { + case e.Matches("resize/%d/%d/%d/%d", &minX, &minY, &maxX, &maxY): + r = image.Rect(minX, minY, maxX, maxY) + env.Draw() <- redraw(r, img) + } + } + } +} |