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 { t.fill() return t.save() } defer file.Close() img, _, err := image.Decode(file) if err != nil { t.fill() return t.save() } 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() }