draw: implement Copy; add an example_test.
Change-Id: Ia9cceac17c0326702530eac3a205308b02b85986
Reviewed-on: https://go-review.googlesource.com/7262
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/draw/example_test.go b/draw/example_test.go
new file mode 100644
index 0000000..57f4695
--- /dev/null
+++ b/draw/example_test.go
@@ -0,0 +1,66 @@
+// Copyright 2015 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.
+
+package draw
+
+import (
+ "fmt"
+ "image"
+ "image/png"
+ "log"
+ "math"
+ "os"
+
+ "golang.org/x/image/math/f64"
+)
+
+func ExampleDraw() {
+ fSrc, err := os.Open("../testdata/blue-purple-pink.png")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fSrc.Close()
+ src, err := png.Decode(fSrc)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ sr := src.Bounds()
+ dst := image.NewRGBA(image.Rect(0, 0, 400, 300))
+ qs := []Interpolator{
+ NearestNeighbor,
+ ApproxBiLinear,
+ CatmullRom,
+ }
+ c, s := math.Cos(math.Pi/3), math.Sin(math.Pi/3)
+ t := &f64.Aff3{
+ +2 * c, -2 * s, 100,
+ +2 * s, +2 * c, 100,
+ }
+
+ Copy(dst, image.Point{20, 30}, src, sr, nil)
+ for i, q := range qs {
+ q.Scale(dst, image.Rect(200+10*i, 100*i, 600+10*i, 150+100*i), src, sr, nil)
+ }
+ // TODO: delete the "_ = t" and uncomment this when Transform is implemented.
+ // NearestNeighbor.Transform(dst, t, src, sr, nil)
+ _ = t
+
+ // Change false to true to write the resultant image to disk.
+ if false {
+ fDst, err := os.Create("out.png")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fDst.Close()
+ err = png.Encode(fDst, dst)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+
+ fmt.Printf("dst has bounds %v.\n", dst.Bounds())
+ // Output:
+ // dst has bounds (0,0)-(400,300).
+}
diff --git a/draw/scale.go b/draw/scale.go
index 10a3442..8fc1644 100644
--- a/draw/scale.go
+++ b/draw/scale.go
@@ -13,6 +13,18 @@
"golang.org/x/image/math/f64"
)
+// Copy copies the part of the source image defined by src and sr and writes to
+// the part of the destination image defined by dst and the translation of sr
+// so that sr.Min translates to dp.
+func Copy(dst Image, dp image.Point, src image.Image, sr image.Rectangle, opts *Options) {
+ mask, mp, op := image.Image(nil), image.Point{}, Over
+ if opts != nil {
+ // TODO: set mask, mp and op.
+ }
+ dr := sr.Add(dp.Sub(sr.Min))
+ DrawMask(dst, dr, src, sr.Min, mask, mp, op)
+}
+
// Scaler scales the part of the source image defined by src and sr and writes
// to the part of the destination image defined by dst and dr.
//
@@ -38,7 +50,7 @@
Transform(dst Image, m *f64.Aff3, src image.Image, sr image.Rectangle, opts *Options)
}
-// Options are optional parameters to Scale and Transform.
+// Options are optional parameters to Copy, Scale and Transform.
//
// A nil *Options means to use the default (zero) values of each field.
type Options struct {