diff options
Diffstat (limited to 'Godeps/_workspace/src/code.google.com/p/graphics-go/graphics/detect/projector.go')
-rw-r--r-- | Godeps/_workspace/src/code.google.com/p/graphics-go/graphics/detect/projector.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/Godeps/_workspace/src/code.google.com/p/graphics-go/graphics/detect/projector.go b/Godeps/_workspace/src/code.google.com/p/graphics-go/graphics/detect/projector.go new file mode 100644 index 000000000..1ebd6db59 --- /dev/null +++ b/Godeps/_workspace/src/code.google.com/p/graphics-go/graphics/detect/projector.go @@ -0,0 +1,55 @@ +// Copyright 2011 The Graphics-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 detect + +import ( + "image" +) + +// projector allows projecting from a source Rectangle onto a target Rectangle. +type projector struct { + // rx, ry is the scaling factor. + rx, ry float64 + // dx, dy is the translation factor. + dx, dy float64 + // r is the clipping region of the target. + r image.Rectangle +} + +// newProjector creates a Projector with source src and target dst. +func newProjector(dst image.Rectangle, src image.Rectangle) *projector { + return &projector{ + rx: float64(dst.Dx()) / float64(src.Dx()), + ry: float64(dst.Dy()) / float64(src.Dy()), + dx: float64(dst.Min.X - src.Min.X), + dy: float64(dst.Min.Y - src.Min.Y), + r: dst, + } +} + +// pt projects p from the source rectangle onto the target rectangle. +func (s *projector) pt(p image.Point) image.Point { + return image.Point{ + clamp(s.rx*float64(p.X)+s.dx, s.r.Min.X, s.r.Max.X), + clamp(s.ry*float64(p.Y)+s.dy, s.r.Min.Y, s.r.Max.Y), + } +} + +// rect projects r from the source rectangle onto the target rectangle. +func (s *projector) rect(r image.Rectangle) image.Rectangle { + return image.Rectangle{s.pt(r.Min), s.pt(r.Max)} +} + +// clamp rounds and clamps o to the integer range [x0, x1]. +func clamp(o float64, x0, x1 int) int { + x := int(o + 0.5) + if x < x0 { + return x0 + } + if x > x1 { + return x1 + } + return x +} |