@@ -4,39 +4,55 @@ import (
4
4
"image"
5
5
"image/color"
6
6
"image/draw"
7
- "image/gif"
8
7
"io"
9
8
10
9
"github.com/notnil/chess"
11
10
"github.com/razzie/chessimage"
11
+ "github.com/razzie/razchess/pkg/razchess/internal"
12
12
)
13
13
14
+ const boardSize = 512
15
+
14
16
var palette = getPalette ()
15
17
16
18
func MoveHistoryToGIF (w io.Writer , moves []* chess.Move , positions []* chess.Position ) error {
17
- var images []image.Image
18
-
19
+ renderers := make ([]* chessimage.Renderer , 0 , len (positions ))
19
20
initialPos := positions [0 ]
20
21
positions = positions [1 :]
21
22
22
- img , err := moveToImage (initialPos , nil )
23
+ img , err := prepareMoveRenderer (initialPos , nil )
23
24
if err != nil {
24
25
return err
25
26
}
26
- images = append (images , img )
27
+ renderers = append (renderers , img )
27
28
28
29
for i , move := range moves {
29
- img , err := moveToImage (positions [i ], move )
30
+ img , err := prepareMoveRenderer (positions [i ], move )
30
31
if err != nil {
31
32
return err
32
33
}
33
- images = append (images , img )
34
+ renderers = append (renderers , img )
34
35
}
35
36
37
+ images := make (chan * image.Paletted )
38
+ go func () {
39
+ for _ , r := range renderers {
40
+ img , _ := r .Render (chessimage.Options {
41
+ PieceRatio : 1 ,
42
+ BoardSize : boardSize ,
43
+ })
44
+ bounds := img .Bounds ()
45
+ palettedImage := image .NewPaletted (bounds , palette )
46
+ draw .Draw (palettedImage , bounds , img , image.Point {}, draw .Over )
47
+ images <- palettedImage
48
+ }
49
+ close (images )
50
+ }()
51
+
36
52
return convertImagesToGif (w , images , 100 )
37
53
}
38
54
39
- func moveToImage (pos * chess.Position , move * chess.Move ) (image. Image , error ) {
55
+ func prepareMoveRenderer (pos * chess.Position , move * chess.Move ) (* chessimage. Renderer , error ) {
40
56
r , err := chessimage .NewRendererFromFEN (pos .String ())
41
57
if err != nil {
42
58
return nil , err
@@ -55,24 +71,11 @@ func moveToImage(pos *chess.Position, move *chess.Move) (image.Image, error) {
55
71
}
56
72
}
57
73
58
- return r .Render (chessimage.Options {
59
- PieceRatio : 1 ,
60
- BoardSize : 512 ,
61
- })
74
+ return r , nil
62
75
}
63
76
64
- func convertImagesToGif (w io.Writer , images []image.Image , delay int ) error {
65
- outGif := & gif.GIF {
66
- LoopCount : - 1 ,
67
- }
68
- for _ , img := range images {
69
- bounds := img .Bounds ()
70
- palettedImage := image .NewPaletted (bounds , palette )
71
- draw .Draw (palettedImage , bounds , img , image.Point {}, draw .Over )
72
- outGif .Image = append (outGif .Image , palettedImage )
73
- outGif .Delay = append (outGif .Delay , delay )
74
- }
75
- return gif .EncodeAll (w , outGif )
77
+ func convertImagesToGif (w io.Writer , images <- chan * image.Paletted , delay int ) error {
78
+ return internal .Encode (w , image.Point {X : boardSize , Y : boardSize }, images , delay , - 1 )
76
79
}
77
80
78
81
func rgb (r , g , b uint8 ) color.Color {
0 commit comments