| // Copyright 2012 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // This file contains the code snippets included in "The Go image/draw package." | |
| package main | |
| import ( | |
| "image" | |
| "image/color" | |
| "image/draw" | |
| ) | |
| func main() { | |
| Color() | |
| Rect() | |
| RectAndScroll() | |
| ConvAndCircle() | |
| Glyph() | |
| } | |
| func Color() { | |
| c := color.RGBA{255, 0, 255, 255} | |
| r := image.Rect(0, 0, 640, 480) | |
| dst := image.NewRGBA(r) | |
| // ZERO OMIT | |
| // image.ZP is the zero point -- the origin. | |
| draw.Draw(dst, r, &image.Uniform{c}, image.ZP, draw.Src) | |
| // STOP OMIT | |
| // BLUE OMIT | |
| m := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| blue := color.RGBA{0, 0, 255, 255} | |
| draw.Draw(m, m.Bounds(), &image.Uniform{blue}, image.ZP, draw.Src) | |
| // STOP OMIT | |
| // RESET OMIT | |
| draw.Draw(m, m.Bounds(), image.Transparent, image.ZP, draw.Src) | |
| // STOP OMIT | |
| } | |
| func Rect() { | |
| dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| sr := image.Rect(0, 0, 200, 200) | |
| src := image.Black | |
| dp := image.Point{100, 100} | |
| // RECT OMIT | |
| r := image.Rectangle{dp, dp.Add(sr.Size())} | |
| draw.Draw(dst, r, src, sr.Min, draw.Src) | |
| // STOP OMIT | |
| } | |
| func RectAndScroll() { | |
| dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| sr := image.Rect(0, 0, 200, 200) | |
| src := image.Black | |
| dp := image.Point{100, 100} | |
| // RECT2 OMIT | |
| r := sr.Sub(sr.Min).Add(dp) | |
| draw.Draw(dst, r, src, sr.Min, draw.Src) | |
| // STOP OMIT | |
| m := dst | |
| // SCROLL OMIT | |
| b := m.Bounds() | |
| p := image.Pt(0, 20) | |
| // Note that even though the second argument is b, | |
| // the effective rectangle is smaller due to clipping. | |
| draw.Draw(m, b, m, b.Min.Add(p), draw.Src) | |
| dirtyRect := b.Intersect(image.Rect(b.Min.X, b.Max.Y-20, b.Max.X, b.Max.Y)) | |
| // STOP OMIT | |
| _ = dirtyRect // noop | |
| } | |
| func ConvAndCircle() { | |
| src := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| // CONV OMIT | |
| b := src.Bounds() | |
| m := image.NewRGBA(b) | |
| draw.Draw(m, b, src, b.Min, draw.Src) | |
| // STOP OMIT | |
| p := image.Point{100, 100} | |
| r := 50 | |
| // CIRCLE2 OMIT | |
| draw.DrawMask(dst, dst.Bounds(), src, image.ZP, &circle{p, r}, image.ZP, draw.Over) | |
| // STOP OMIT | |
| } | |
| func theGlyphImageForAFont() image.Image { | |
| return image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| } | |
| func theBoundsFor(index int) image.Rectangle { | |
| return image.Rect(0, 0, 32, 32) | |
| } | |
| func Glyph() { | |
| p := image.Point{100, 100} | |
| dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) | |
| glyphIndex := 42 | |
| // GLYPH OMIT | |
| src := &image.Uniform{color.RGBA{0, 0, 255, 255}} | |
| mask := theGlyphImageForAFont() | |
| mr := theBoundsFor(glyphIndex) | |
| draw.DrawMask(dst, mr.Sub(mr.Min).Add(p), src, image.ZP, mask, mr.Min, draw.Over) | |
| // STOP OMIT | |
| } | |
| //CIRCLESTRUCT OMIT | |
| type circle struct { | |
| p image.Point | |
| r int | |
| } | |
| func (c *circle) ColorModel() color.Model { | |
| return color.AlphaModel | |
| } | |
| func (c *circle) Bounds() image.Rectangle { | |
| return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r) | |
| } | |
| func (c *circle) At(x, y int) color.Color { | |
| xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r) | |
| if xx*xx+yy*yy < rr*rr { | |
| return color.Alpha{255} | |
| } | |
| return color.Alpha{0} | |
| } | |
| //STOP OMIT |