@@ -31,6 +31,7 @@ import (
3131 "image/jpeg"
3232 "image/png"
3333 "io"
34+ "io/fs"
3435 "os"
3536
3637 "github.com/disintegration/imaging"
@@ -58,11 +59,17 @@ type Renderer struct {
5859 Result * image.NRGBA // The image result after rendering using the Render functions.
5960 tileCache map [uint32 ]image.Image
6061 engine RendererEngine
62+ fs fs.FS
6163}
6264
6365// NewRenderer creates new rendering engine instance.
6466func NewRenderer (m * tiled.Map ) (* Renderer , error ) {
65- r := & Renderer {m : m , tileCache : make (map [uint32 ]image.Image )}
67+ return NewRendererWithFileSystem (m , nil )
68+ }
69+
70+ // NewRendererWithFileSystem creates new rendering engine instance with a custom file system.
71+ func NewRendererWithFileSystem (m * tiled.Map , fs fs.FS ) (* Renderer , error ) {
72+ r := & Renderer {m : m , tileCache : make (map [uint32 ]image.Image ), fs : fs }
6673 if r .m .Orientation == "orthogonal" {
6774 r .engine = & OrthogonalRendererEngine {}
6875 } else {
@@ -75,6 +82,13 @@ func NewRenderer(m *tiled.Map) (*Renderer, error) {
7582 return r , nil
7683}
7784
85+ func (r * Renderer ) open (f string ) (io.ReadCloser , error ) {
86+ if r .fs != nil {
87+ return r .fs .Open (f )
88+ }
89+ return os .Open (f )
90+ }
91+
7892func (r * Renderer ) getTileImage (tile * tiled.LayerTile ) (image.Image , error ) {
7993 timg , ok := r .tileCache [tile .Tileset .FirstGID + tile .ID ]
8094 if ok {
@@ -84,7 +98,7 @@ func (r *Renderer) getTileImage(tile *tiled.LayerTile) (image.Image, error) {
8498 if tile .Tileset .Image == nil {
8599 for i := 0 ; i < len (tile .Tileset .Tiles ); i ++ {
86100 if tile .Tileset .Tiles [i ].ID == tile .ID {
87- sf , err := os . Open (tile .Tileset .GetFileFullPath (tile .Tileset .Tiles [i ].Image .Source ))
101+ sf , err := r . open (tile .Tileset .GetFileFullPath (tile .Tileset .Tiles [i ].Image .Source ))
88102 if err != nil {
89103 return nil , err
90104 }
@@ -97,7 +111,7 @@ func (r *Renderer) getTileImage(tile *tiled.LayerTile) (image.Image, error) {
97111 }
98112 }
99113 } else {
100- sf , err := os . Open (tile .Tileset .GetFileFullPath (tile .Tileset .Image .Source ))
114+ sf , err := r . open (tile .Tileset .GetFileFullPath (tile .Tileset .Image .Source ))
101115 if err != nil {
102116 return nil , err
103117 }
0 commit comments