Skip to content

Commit dbe29cb

Browse files
committed
Implemented async GIF writer
1 parent e414899 commit dbe29cb

File tree

2 files changed

+448
-24
lines changed

2 files changed

+448
-24
lines changed

pkg/razchess/gif.go

+27-24
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,55 @@ import (
44
"image"
55
"image/color"
66
"image/draw"
7-
"image/gif"
87
"io"
98

109
"github.com/notnil/chess"
1110
"github.com/razzie/chessimage"
11+
"github.com/razzie/razchess/pkg/razchess/internal"
1212
)
1313

14+
const boardSize = 512
15+
1416
var palette = getPalette()
1517

1618
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))
1920
initialPos := positions[0]
2021
positions = positions[1:]
2122

22-
img, err := moveToImage(initialPos, nil)
23+
img, err := prepareMoveRenderer(initialPos, nil)
2324
if err != nil {
2425
return err
2526
}
26-
images = append(images, img)
27+
renderers = append(renderers, img)
2728

2829
for i, move := range moves {
29-
img, err := moveToImage(positions[i], move)
30+
img, err := prepareMoveRenderer(positions[i], move)
3031
if err != nil {
3132
return err
3233
}
33-
images = append(images, img)
34+
renderers = append(renderers, img)
3435
}
3536

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+
3652
return convertImagesToGif(w, images, 100)
3753
}
3854

39-
func moveToImage(pos *chess.Position, move *chess.Move) (image.Image, error) {
55+
func prepareMoveRenderer(pos *chess.Position, move *chess.Move) (*chessimage.Renderer, error) {
4056
r, err := chessimage.NewRendererFromFEN(pos.String())
4157
if err != nil {
4258
return nil, err
@@ -55,24 +71,11 @@ func moveToImage(pos *chess.Position, move *chess.Move) (image.Image, error) {
5571
}
5672
}
5773

58-
return r.Render(chessimage.Options{
59-
PieceRatio: 1,
60-
BoardSize: 512,
61-
})
74+
return r, nil
6275
}
6376

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)
7679
}
7780

7881
func rgb(r, g, b uint8) color.Color {

0 commit comments

Comments
 (0)