Fixed the Texture pattern
This commit is contained in:
parent
6c3230c0f8
commit
46a4858597
@ -10,42 +10,58 @@ type Texture struct {
|
||||
}
|
||||
|
||||
// Draw tiles the pattern's canvas within the given bounds. The minimum
|
||||
// points of the pattern's canvas and the destination canvas will be lined up.
|
||||
// point of the pattern's canvas will be lined up with the minimum point of the
|
||||
// bounding rectangle.
|
||||
func (pattern Texture) Draw (destination canvas.Canvas, bounds image.Rectangle) {
|
||||
drawBounds := bounds.Canon().Intersect(destination.Bounds())
|
||||
if drawBounds.Empty() { return }
|
||||
|
||||
dstBounds := bounds.Canon().Intersect(destination.Bounds())
|
||||
if dstBounds.Empty() { return }
|
||||
|
||||
dstData, dstStride := destination.Buffer()
|
||||
srcData, srcStride := pattern.Buffer()
|
||||
srcBounds := pattern.Bounds()
|
||||
|
||||
dstPoint := image.Point { }
|
||||
srcPoint := drawBounds.Min.Sub(bounds.Min).Add(srcBounds.Min)
|
||||
// offset is a vector that is added to points in destination space to
|
||||
// convert them to points in source space
|
||||
offset := srcBounds.Min.Sub(bounds.Min)
|
||||
|
||||
// calculate the starting position in source space
|
||||
srcPoint := dstBounds.Min.Add(offset)
|
||||
srcPoint.X = wrap(srcPoint.X, srcBounds.Min.X, srcBounds.Max.X)
|
||||
srcPoint.Y = wrap(srcPoint.Y, srcBounds.Min.Y, srcBounds.Max.Y)
|
||||
|
||||
for dstPoint.Y = drawBounds.Min.Y; dstPoint.Y < drawBounds.Max.Y; dstPoint.Y ++ {
|
||||
srcPoint.X = srcBounds.Min.X
|
||||
dstPoint.X = drawBounds.Min.X
|
||||
srcStartPoint := srcPoint
|
||||
|
||||
// for each row
|
||||
dstPoint := image.Point { }
|
||||
for dstPoint.Y = dstBounds.Min.Y; dstPoint.Y < dstBounds.Max.Y; dstPoint.Y ++ {
|
||||
srcPoint.X = srcStartPoint.X
|
||||
dstPoint.X = dstBounds.Min.X
|
||||
dstYComponent := dstPoint.Y * dstStride
|
||||
srcYComponent := srcPoint.Y * srcStride
|
||||
|
||||
|
||||
// for each pixel in the row
|
||||
for {
|
||||
// draw pixel
|
||||
dstIndex := dstYComponent + dstPoint.X
|
||||
srcIndex := srcYComponent + srcPoint.X
|
||||
dstData[dstIndex] = srcData[srcIndex]
|
||||
|
||||
// increment X in source space. wrap to start if out of
|
||||
// bounds.
|
||||
srcPoint.X ++
|
||||
if srcPoint.X >= srcBounds.Max.X {
|
||||
srcPoint.X = srcBounds.Min.X
|
||||
}
|
||||
|
||||
// increment X in destination space. stop drawing this
|
||||
// row if out of bounds.
|
||||
dstPoint.X ++
|
||||
if dstPoint.X >= drawBounds.Max.X {
|
||||
if dstPoint.X >= dstBounds.Max.X {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// increment row in source space. wrap to start if out of
|
||||
// bounds.
|
||||
srcPoint.Y ++
|
||||
if srcPoint.Y >= srcBounds.Max.Y {
|
||||
srcPoint.Y = srcBounds.Min.Y
|
||||
|
Reference in New Issue
Block a user