place/storage/tile.go

64 lines
1.1 KiB
Go
Raw Normal View History

2024-06-13 11:25:18 +00:00
package storage
import (
"bytes"
"image"
"image/draw"
"image/png"
"os"
)
type tile struct {
dirty bool
2024-06-13 12:43:09 +00:00
path string
2024-06-13 11:25:18 +00:00
image *image.RGBA
}
2024-06-13 12:43:09 +00:00
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 {
2024-06-13 17:25:45 +00:00
t.fill()
return t.save()
2024-06-13 12:43:09 +00:00
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
2024-06-13 17:25:45 +00:00
t.fill()
return t.save()
2024-06-13 12:43:09 +00:00
}
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)
2024-06-13 11:25:18 +00:00
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()
}