62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
package storage
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/draw"
|
|
"image/png"
|
|
"os"
|
|
)
|
|
|
|
type tile struct {
|
|
dirty bool
|
|
path string
|
|
image *image.RGBA
|
|
}
|
|
|
|
func (t *tile) load(path string, tileSize int) error {
|
|
t.image = image.NewRGBA(image.Rect(0, 0, tileSize, tileSize))
|
|
t.path = path
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
img, _, err := image.Decode(file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
draw.Draw(t.image, img.Bounds(), img, img.Bounds().Min, draw.Src)
|
|
t.dirty = false
|
|
|
|
return nil
|
|
}
|
|
|
|
func (t *tile) save() error {
|
|
file, err := os.OpenFile(t.path, os.O_WRONLY|os.O_CREATE, 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
err = png.Encode(file, t.image)
|
|
t.dirty = false
|
|
return err
|
|
}
|
|
|
|
func (t *tile) fill() {
|
|
draw.Draw(t.image, t.image.Bounds(), &image.Uniform{C: image.White}, image.Point{}, draw.Src)
|
|
}
|
|
|
|
func (t *tile) toBytesPNG() (*bytes.Buffer, error) {
|
|
buffer := &bytes.Buffer{}
|
|
err := png.Encode(buffer, t.image)
|
|
return buffer, err
|
|
}
|
|
|
|
func (t *tile) size() image.Point {
|
|
return t.image.Bounds().Size()
|
|
}
|