anchor.diff:      return info.images[frame].decode(ptr);
     }
   
  +  /**
  +   * Decode all of the frames from an animation.  If the file is not an
  +   * animation, a single frame animation is returned.  If there was a problem
  +   * decoding the file, null is returned.
  +   */
     Animation decodeAnimation(List<int> data) {
  -    Image image = decodeImage(data);
  -    if (image == null) {
  +    if (startDecode(data) == null) {
         return null;
       }
   
       Animation anim = new Animation();
  -    anim.addFrame(image);
  +    for (int i = 0, len = numFrames(); i < len; ++i) {
  +      Image image = decodeFrame(i);
  +      if (i == null) {
  +        continue;
  +      }
  +      anim.addFrame(image);
  +    }
   
       return anim;
     }
  
positive.code:    * If the file is not a valid Gif image, null is returned.
     */
    TiffInfo startDecode(List<int> bytes) {
      Buffer ptr = new Buffer(new Uint8List.fromList(bytes));
      info = _readHeader(ptr);
      return info;
    }
  
    Image decodeImage(List<int> data, {int frame: 0}) {
      Buffer ptr = new Buffer(new Uint8List.fromList(data));
  
  
negative.code:     return info.images.length > 0 ? info : null;
    }
  
    Buffer _input;
  
    static const int TIFF_SIGNATURE = 42;
    static const int TIFF_LITTLE_ENDIAN = 0x4949;
    static const int TIFF_BIG_ENDIAN = 0x4d4d;
  