Skip to content
Autodesk Animator FLIC file encoder and decoder, written in Rust.
Rust C
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Update examples to sdl2-0.30. Jul 22, 2017
src Clean up. Apr 28, 2017
.gitignore Initial commit: libflic. Sep 11, 2016
.travis.yml Update Travis CI. Apr 29, 2017
Cargo.toml Version bump: 0.1.6. Jul 22, 2017
LICENCE-MIT.txt Version bump: 0.1.5. Apr 29, 2017 Clean up. Feb 3, 2017

LibFLIC Version Status


LibFLIC provides routines for encoding and decoding Autodesk Animator FLI and Autodesk Animator Pro FLC files.

The code is based on the documentation and source code of Animator and Animator Pro that has been released by Jim Kent.

LibFLIC is written entirely in Rust. C bindings to the underlying codecs are provided.


A few example programs are provided in the examples/ directory:

  • quickfli - a simple FLIC player.
  • recompress - loads and saves FLIC files.
  • browse - display postage stamps (thumbnails).

To clone this repository, run:

git clone

Then build the library and run the example programs using Cargo.

cargo build --example quickfli

To play a FLIC file, run:

cargo run --example quickfli <example.flc>

Basic Usage

Add LibFLIC as a dependency to your project's Cargo.toml:

flic = "0.1"

Import the library in your project, e.g.:

extern crate flic;

use flic::{FlicFile,RasterMut};

The FlicFile type refers to FLIC files streamed from disk. When opening a FLIC file, it will first read the FLIC metadata such as the animation's dimensions and speed. FlicFile will keep the file open.

let flic = FlicFile::open(Path::new("example.flc"))?;

Allocate the pixel data and palette data buffers to which we will decode the animation.

let flic_w = flic.width() as usize;
let flic_h = flic.height() as usize;
let mut buf = vec![0; flic_w * flic_h];
let mut pal = vec![0; 3 * 256];

It is convenient to group these two buffers, along with their dimensions and strides, together to form a single Raster or RasterMut type.

LibFLIC will ask for a Raster type for operations that require read-only access to the buffers (e.g. encoding), and a RasterMut type when it requires read-write access (e.g. decoding).

For example, to decode a frame, we first create a RasterMut by borrowing buf and pal mutably as shown below. Rasters are cheap to create, so don't worry about creating and dropping them frequently.

let mut raster = RasterMut::new(flic_w, flic_h, &mut buf, &mut pal);
flic.read_next_frame(&mut raster);

Since FLIC files store the differences between consecutive frames, when reading the next frame in the animation, it is up to the library user to ensure that the buffer and palettes contain the previous frame's data.



David Wang

You can’t perform that action at this time.