anchor.diff:     * (The input format is the same used by the ImageData class, which can be created
      * from a canvas element.)
      */
  -  IndexedAnimation(this.width, this.height, Iterable<List<int>> rgbaFrames) {
  +  _IndexedAnimation(this.width, this.height, Iterable<List<int>> rgbaFrames) {
       for (var frame in rgbaFrames) {
         frames.add(colors.indexImage(width, height, frame));      
       }
  
positive.code:   
    /// Returns the bytes of an animated GIF.
    Uint8List build(int framesPerSecond) {
      return new IndexedAnimation(width, height, _frames).encodeGif(framesPerSecond); 
    }
  }
  
  /**
   * Creates an animated GIF from a list of frames. Each frame contains rgba data for the
   * pixels, but the alpha channel is ignored. Throws an exception if the the image has too
   * many colors.
   */
  Uint8List makeAnimatedGif(int width, int height, int framesPerSecond, Iterable<List<int>> rgbaFrames) {
    return new IndexedAnimation(width, height, rgbaFrames).encodeGif(framesPerSecond);
  }
  
  const maxColorBits = 7;
  const maxColors = 1<<maxColorBits;
  
  class IndexedImage {
    final int width;
    final int height;
    final colors = new _ColorTable();
    List<int> pixels;
  
    IndexedImage(this.width, this.height, List<int> rgba) {   
      pixels = colors.indexImage(width, height, rgba);    
      colors.finish();
    }
  
negative.code: }
  
  /// An animation with a restricted palette.
  class _IndexedAnimation {
    final int width;
    final int height;
    final colors = new _ColorTable();
  