원문 캡처 · github.com
원문 캡처 · github.com

lila-gif는 체스 포지션과 게임을 GIF로 렌더링하고 프레임 단위로 스트리밍하는 웹 서비스다. 저장소 예시 GIF는 363 KiB이며, 렌더링 시간은 약 60ms, 프레임 수는 93개, 색상 수는 255개, 크기는 720×840픽셀이다.

서비스는 기본적으로 127.0.0.1:6175에서 요청을 받는다. 실행 옵션은 다음과 같다.

text
lila-gif USAGE:     lila-gif [OPTIONS] OPTIONS:         --bind <BIND>    Listen on this address [default: 127.0.0.1:6175]     -h, --help           Print help information

GET /image.gif 요청에는 FEN 포지션을 전달해 정지 이미지를 만들 수 있다.

bash
curl "http://localhost:6175/image.gif?fen=4k3/6KP/8/8/8/8/7p/8" --output image.gif

FEN은 보드 정보만으로 지정할 수 있으며, 기본값은 시작 포지션이다. 흰색·검은색 선수 이름은 각각 100바이트까지 전달할 수 있고, 알려진 체스 타이틀은 강조 표시된다. GIF 메타데이터에 넣을 설명은 255바이트까지 지원한다. 그 밖에 UCI 표기법의 마지막 수, 체크 상태인 왕의 칸, 보드 방향, 테마와 기물 세트를 지정할 수 있다. 방향은 기본값이 white이며 black을 전달하면 보드를 뒤집는다. 테마 기본값은 brown이고 blue, brown, green, ic, pink, purple을 선택할 수 있다. 기물 세트는 목록에서 고른다.

POST /game.gif에는 게임 프레임과 표시 옵션을 전달해 애니메이션 GIF를 만들 수 있다. 기본 프레임 지연 시간은 50센티초이며 프레임마다 별도로 바꿀 수 있다. 각 프레임에는 FEN을 지정하고 마지막 수나 체크 상태인 왕을 강조할 수 있다.

json
{
 "white": "Molinari", // optional
 "black": "Bordais", // optional
 "comment": "https://www.chessgames.com/perl/chessgame?gid=1251038", // optional
 "orientation": "white", // default
 "theme": "brown", // default
 "piece": "cburnett", // default
 "delay": 50, // default frame delay in centiseconds
 "frames": [
 // [...]
 {
 "fen": "r1bqkb1r/pp1ppppp/5n2/2p5/2P1P3/2Nn2P1/PP1PNP1P/R1BQKB1R w KQkq - 1 6",
 "delay": 500, // optionally overwrite default delay
 "lastMove": "b4d3", // optionally highlight last move
 "check": "e1" // optionally highlight king
 }
 ]
}

GET /example.gif은 예시 게임을 렌더링한다. 구현 방식은 실행 시 벡터 그래픽을 그리는 대신, 가능한 배경색마다 기물 이미지를 미리 렌더링하는 것이다. 제작자는 이 방식으로 색상 팔레트를 미리 준비하며, 기물에는 배경별 안티앨리어싱을 위한 색도 필요하다고 설명한다. 실행 중에는 스프라이트를 복사하고 GIF로 인코딩하며, 렌더링 시간의 95% 이상이 LZW 압축에 쓰인다고 밝힌다. 애니메이션 프레임에는 바뀐 칸만 투명한 배경으로 담긴다.

lila-gif는 GNU Affero General Public License 버전 3 또는 이후 버전으로 제공된다. 생성 이미지에는 Apache License 2.0의 Noto Sans 글꼴과 여러 라이선스가 적용되는 기물 세트가 포함된다.