44 lines
1007 B
Go
44 lines
1007 B
Go
|
package artist
|
||
|
|
||
|
import "image/color"
|
||
|
|
||
|
// Orientation specifies an eight-way pattern orientation.
|
||
|
type Orientation int
|
||
|
|
||
|
const (
|
||
|
OrientationVertical Orientation = iota
|
||
|
OrientationDiagonalRight
|
||
|
OrientationHorizontal
|
||
|
OrientationDiagonalLeft
|
||
|
)
|
||
|
|
||
|
// Split is a pattern that is divided in half between two sub-patterns.
|
||
|
type Split struct {
|
||
|
First Pattern
|
||
|
Second Pattern
|
||
|
Orientation
|
||
|
}
|
||
|
|
||
|
// AtWhen satisfies the Pattern interface.
|
||
|
func (pattern Split) AtWhen (x, y, width, height int) (c color.RGBA) {
|
||
|
var first bool
|
||
|
switch pattern.Orientation {
|
||
|
case OrientationVertical:
|
||
|
first = x < width / 2
|
||
|
case OrientationDiagonalRight:
|
||
|
first = float64(x) / float64(width) +
|
||
|
float64(y) / float64(height) < 1
|
||
|
case OrientationHorizontal:
|
||
|
first = y < height / 2
|
||
|
case OrientationDiagonalLeft:
|
||
|
first = float64(width - x) / float64(width) +
|
||
|
float64(y) / float64(height) < 1
|
||
|
}
|
||
|
|
||
|
if first {
|
||
|
return pattern.First.AtWhen(x, y, width, height)
|
||
|
} else {
|
||
|
return pattern.Second.AtWhen(x, y, width, height)
|
||
|
}
|
||
|
}
|