Sasha Koshka
34bf3038ac
This is the first step in transitioning the API over to the new design. The new tomo.Canvas interface gives drawing functions direct access to data buffers and eliminates overhead associated with calling functions for every pixel. The entire artist package will be remade around this.
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
package artist
|
|
|
|
import "image"
|
|
import "image/color"
|
|
|
|
// Pattern is capable of generating a pattern pixel by pixel.
|
|
type Pattern interface {
|
|
// AtWhen returns the color of the pixel located at (x, y) relative to
|
|
// the origin point of the pattern (0, 0), when the pattern has the
|
|
// specified width and height. Patterns may ignore the width and height
|
|
// parameters, but it may be useful for some patterns such as gradients.
|
|
AtWhen (x, y, width, height int) (color.RGBA)
|
|
}
|
|
|
|
// Texture is a struct that allows an image to be converted into a tiling
|
|
// texture pattern.
|
|
type Texture struct {
|
|
data []color.RGBA
|
|
width, height int
|
|
}
|
|
|
|
// NewTexture converts an image into a texture.
|
|
func NewTexture (source image.Image) (texture Texture) {
|
|
bounds := source.Bounds()
|
|
texture.width = bounds.Dx()
|
|
texture.height = bounds.Dy()
|
|
texture.data = make([]color.RGBA, texture.width * texture.height)
|
|
|
|
index := 0
|
|
for y := bounds.Min.Y; y < bounds.Max.Y; y ++ {
|
|
for x := bounds.Min.X; x < bounds.Max.X; x ++ {
|
|
r, g, b, a := source.At(x, y).RGBA()
|
|
texture.data[index] = color.RGBA {
|
|
uint8(r >> 8),
|
|
uint8(g >> 8),
|
|
uint8(b >> 8),
|
|
uint8(a >> 8),
|
|
}
|
|
index ++
|
|
}}
|
|
return
|
|
}
|
|
|
|
// AtWhen returns the color at the specified x and y coordinates, wrapped to the
|
|
// image's width. the width and height are ignored.
|
|
func (texture Texture) AtWhen (x, y, width, height int) (pixel color.RGBA) {
|
|
x %= texture.width
|
|
y %= texture.height
|
|
if x < 0 { x += texture.width }
|
|
if y < 0 { y += texture.height }
|
|
return texture.data[x + y * texture.width]
|
|
}
|