{"version":3,"file":"pixi-gif.mjs","sources":["../node_modules/js-binary-schema-parser/lib/index.js","../node_modules/js-binary-schema-parser/lib/parsers/uint8.js","../node_modules/js-binary-schema-parser/lib/schemas/gif.js","../node_modules/gifuct-js/lib/deinterlace.js","../node_modules/gifuct-js/lib/lzw.js","../node_modules/gifuct-js/lib/index.js","../src/AnimatedGIF.ts","../src/AnimatedGIFAsset.ts"],"sourcesContent":["\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loop = exports.conditional = exports.parse = void 0;\n\nvar parse = function parse(stream, schema) {\n  var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;\n\n  if (Array.isArray(schema)) {\n    schema.forEach(function (partSchema) {\n      return parse(stream, partSchema, result, parent);\n    });\n  } else if (typeof schema === 'function') {\n    schema(stream, result, parent, parse);\n  } else {\n    var key = Object.keys(schema)[0];\n\n    if (Array.isArray(schema[key])) {\n      parent[key] = {};\n      parse(stream, schema[key], result, parent[key]);\n    } else {\n      parent[key] = schema[key](stream, result, parent, parse);\n    }\n  }\n\n  return result;\n};\n\nexports.parse = parse;\n\nvar conditional = function conditional(schema, conditionFunc) {\n  return function (stream, result, parent, parse) {\n    if (conditionFunc(stream, result, parent)) {\n      parse(stream, schema, result, parent);\n    }\n  };\n};\n\nexports.conditional = conditional;\n\nvar loop = function loop(schema, continueFunc) {\n  return function (stream, result, parent, parse) {\n    var arr = [];\n    var lastStreamPos = stream.pos;\n\n    while (continueFunc(stream, result, parent)) {\n      var newParent = {};\n      parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well\n      // it falls into infinite recursion, null check to avoid the same\n\n      if (stream.pos === lastStreamPos) {\n        break;\n      }\n\n      lastStreamPos = stream.pos;\n      arr.push(newParent);\n    }\n\n    return arr;\n  };\n};\n\nexports.loop = loop;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;\n\n// Default stream and parsers for Uint8TypedArray data type\nvar buildStream = function buildStream(uint8Data) {\n  return {\n    data: uint8Data,\n    pos: 0\n  };\n};\n\nexports.buildStream = buildStream;\n\nvar readByte = function readByte() {\n  return function (stream) {\n    return stream.data[stream.pos++];\n  };\n};\n\nexports.readByte = readByte;\n\nvar peekByte = function peekByte() {\n  var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n  return function (stream) {\n    return stream.data[stream.pos + offset];\n  };\n};\n\nexports.peekByte = peekByte;\n\nvar readBytes = function readBytes(length) {\n  return function (stream) {\n    return stream.data.subarray(stream.pos, stream.pos += length);\n  };\n};\n\nexports.readBytes = readBytes;\n\nvar peekBytes = function peekBytes(length) {\n  return function (stream) {\n    return stream.data.subarray(stream.pos, stream.pos + length);\n  };\n};\n\nexports.peekBytes = peekBytes;\n\nvar readString = function readString(length) {\n  return function (stream) {\n    return Array.from(readBytes(length)(stream)).map(function (value) {\n      return String.fromCharCode(value);\n    }).join('');\n  };\n};\n\nexports.readString = readString;\n\nvar readUnsigned = function readUnsigned(littleEndian) {\n  return function (stream) {\n    var bytes = readBytes(2)(stream);\n    return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];\n  };\n};\n\nexports.readUnsigned = readUnsigned;\n\nvar readArray = function readArray(byteSize, totalOrFunc) {\n  return function (stream, result, parent) {\n    var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;\n    var parser = readBytes(byteSize);\n    var arr = new Array(total);\n\n    for (var i = 0; i < total; i++) {\n      arr[i] = parser(stream);\n    }\n\n    return arr;\n  };\n};\n\nexports.readArray = readArray;\n\nvar subBitsTotal = function subBitsTotal(bits, startIndex, length) {\n  var result = 0;\n\n  for (var i = 0; i < length; i++) {\n    result += bits[startIndex + i] && Math.pow(2, length - i - 1);\n  }\n\n  return result;\n};\n\nvar readBits = function readBits(schema) {\n  return function (stream) {\n    var _byte = readByte()(stream); // convert the byte to bit array\n\n\n    var bits = new Array(8);\n\n    for (var i = 0; i < 8; i++) {\n      bits[7 - i] = !!(_byte & 1 << i);\n    } // convert the bit array to values based on the schema\n\n\n    return Object.keys(schema).reduce(function (res, key) {\n      var def = schema[key];\n\n      if (def.length) {\n        res[key] = subBitsTotal(bits, def.index, def.length);\n      } else {\n        res[key] = bits[def.index];\n      }\n\n      return res;\n    }, {});\n  };\n};\n\nexports.readBits = readBits;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _ = require(\"../\");\n\nvar _uint = require(\"../parsers/uint8\");\n\n// a set of 0x00 terminated subblocks\nvar subBlocksSchema = {\n  blocks: function blocks(stream) {\n    var terminator = 0x00;\n    var chunks = [];\n    var streamSize = stream.data.length;\n    var total = 0;\n\n    for (var size = (0, _uint.readByte)()(stream); size !== terminator; size = (0, _uint.readByte)()(stream)) {\n      // size becomes undefined for some case when file is corrupted and  terminator is not proper \n      // null check to avoid recursion\n      if (!size) break; // catch corrupted files with no terminator\n\n      if (stream.pos + size >= streamSize) {\n        var availableSize = streamSize - stream.pos;\n        chunks.push((0, _uint.readBytes)(availableSize)(stream));\n        total += availableSize;\n        break;\n      }\n\n      chunks.push((0, _uint.readBytes)(size)(stream));\n      total += size;\n    }\n\n    var result = new Uint8Array(total);\n    var offset = 0;\n\n    for (var i = 0; i < chunks.length; i++) {\n      result.set(chunks[i], offset);\n      offset += chunks[i].length;\n    }\n\n    return result;\n  }\n}; // global control extension\n\nvar gceSchema = (0, _.conditional)({\n  gce: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    byteSize: (0, _uint.readByte)()\n  }, {\n    extras: (0, _uint.readBits)({\n      future: {\n        index: 0,\n        length: 3\n      },\n      disposal: {\n        index: 3,\n        length: 3\n      },\n      userInput: {\n        index: 6\n      },\n      transparentColorGiven: {\n        index: 7\n      }\n    })\n  }, {\n    delay: (0, _uint.readUnsigned)(true)\n  }, {\n    transparentColorIndex: (0, _uint.readByte)()\n  }, {\n    terminator: (0, _uint.readByte)()\n  }]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xf9;\n}); // image pipeline block\n\nvar imageSchema = (0, _.conditional)({\n  image: [{\n    code: (0, _uint.readByte)()\n  }, {\n    descriptor: [{\n      left: (0, _uint.readUnsigned)(true)\n    }, {\n      top: (0, _uint.readUnsigned)(true)\n    }, {\n      width: (0, _uint.readUnsigned)(true)\n    }, {\n      height: (0, _uint.readUnsigned)(true)\n    }, {\n      lct: (0, _uint.readBits)({\n        exists: {\n          index: 0\n        },\n        interlaced: {\n          index: 1\n        },\n        sort: {\n          index: 2\n        },\n        future: {\n          index: 3,\n          length: 2\n        },\n        size: {\n          index: 5,\n          length: 3\n        }\n      })\n    }]\n  }, (0, _.conditional)({\n    lct: (0, _uint.readArray)(3, function (stream, result, parent) {\n      return Math.pow(2, parent.descriptor.lct.size + 1);\n    })\n  }, function (stream, result, parent) {\n    return parent.descriptor.lct.exists;\n  }), {\n    data: [{\n      minCodeSize: (0, _uint.readByte)()\n    }, subBlocksSchema]\n  }]\n}, function (stream) {\n  return (0, _uint.peekByte)()(stream) === 0x2c;\n}); // plain text block\n\nvar textSchema = (0, _.conditional)({\n  text: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    blockSize: (0, _uint.readByte)()\n  }, {\n    preData: function preData(stream, result, parent) {\n      return (0, _uint.readBytes)(parent.text.blockSize)(stream);\n    }\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0x01;\n}); // application block\n\nvar applicationSchema = (0, _.conditional)({\n  application: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    blockSize: (0, _uint.readByte)()\n  }, {\n    id: function id(stream, result, parent) {\n      return (0, _uint.readString)(parent.blockSize)(stream);\n    }\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xff;\n}); // comment block\n\nvar commentSchema = (0, _.conditional)({\n  comment: [{\n    codes: (0, _uint.readBytes)(2)\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xfe;\n});\nvar schema = [{\n  header: [{\n    signature: (0, _uint.readString)(3)\n  }, {\n    version: (0, _uint.readString)(3)\n  }]\n}, {\n  lsd: [{\n    width: (0, _uint.readUnsigned)(true)\n  }, {\n    height: (0, _uint.readUnsigned)(true)\n  }, {\n    gct: (0, _uint.readBits)({\n      exists: {\n        index: 0\n      },\n      resolution: {\n        index: 1,\n        length: 3\n      },\n      sort: {\n        index: 4\n      },\n      size: {\n        index: 5,\n        length: 3\n      }\n    })\n  }, {\n    backgroundColorIndex: (0, _uint.readByte)()\n  }, {\n    pixelAspectRatio: (0, _uint.readByte)()\n  }]\n}, (0, _.conditional)({\n  gct: (0, _uint.readArray)(3, function (stream, result) {\n    return Math.pow(2, result.lsd.gct.size + 1);\n  })\n}, function (stream, result) {\n  return result.lsd.gct.exists;\n}), // content frames\n{\n  frames: (0, _.loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {\n    var nextCode = (0, _uint.peekByte)()(stream); // rather than check for a terminator, we should check for the existence\n    // of an ext or image block to avoid infinite loops\n    //var terminator = 0x3B;\n    //return nextCode !== terminator;\n\n    return nextCode === 0x21 || nextCode === 0x2c;\n  })\n}];\nvar _default = schema;\nexports[\"default\"] = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deinterlace = void 0;\n\n/**\r\n * Deinterlace function from https://github.com/shachaf/jsgif\r\n */\nvar deinterlace = function deinterlace(pixels, width) {\n  var newPixels = new Array(pixels.length);\n  var rows = pixels.length / width;\n\n  var cpRow = function cpRow(toRow, fromRow) {\n    var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n    newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n  }; // See appendix E.\n\n\n  var offsets = [0, 4, 2, 1];\n  var steps = [8, 8, 4, 2];\n  var fromRow = 0;\n\n  for (var pass = 0; pass < 4; pass++) {\n    for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n      cpRow(toRow, fromRow);\n      fromRow++;\n    }\n  }\n\n  return newPixels;\n};\n\nexports.deinterlace = deinterlace;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.lzw = void 0;\n\n/**\r\n * javascript port of java LZW decompression\r\n * Original java author url: https://gist.github.com/devunwired/4479231\r\n */\nvar lzw = function lzw(minCodeSize, data, pixelCount) {\n  var MAX_STACK_SIZE = 4096;\n  var nullCode = -1;\n  var npix = pixelCount;\n  var available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, i, datum, data_size, first, top, bi, pi;\n  var dstPixels = new Array(pixelCount);\n  var prefix = new Array(MAX_STACK_SIZE);\n  var suffix = new Array(MAX_STACK_SIZE);\n  var pixelStack = new Array(MAX_STACK_SIZE + 1); // Initialize GIF data stream decoder.\n\n  data_size = minCodeSize;\n  clear = 1 << data_size;\n  end_of_information = clear + 1;\n  available = clear + 2;\n  old_code = nullCode;\n  code_size = data_size + 1;\n  code_mask = (1 << code_size) - 1;\n\n  for (code = 0; code < clear; code++) {\n    prefix[code] = 0;\n    suffix[code] = code;\n  } // Decode GIF pixel stream.\n\n\n  var datum, bits, count, first, top, pi, bi;\n  datum = bits = count = first = top = pi = bi = 0;\n\n  for (i = 0; i < npix;) {\n    if (top === 0) {\n      if (bits < code_size) {\n        // get the next byte\n        datum += data[bi] << bits;\n        bits += 8;\n        bi++;\n        continue;\n      } // Get the next code.\n\n\n      code = datum & code_mask;\n      datum >>= code_size;\n      bits -= code_size; // Interpret the code\n\n      if (code > available || code == end_of_information) {\n        break;\n      }\n\n      if (code == clear) {\n        // Reset decoder.\n        code_size = data_size + 1;\n        code_mask = (1 << code_size) - 1;\n        available = clear + 2;\n        old_code = nullCode;\n        continue;\n      }\n\n      if (old_code == nullCode) {\n        pixelStack[top++] = suffix[code];\n        old_code = code;\n        first = code;\n        continue;\n      }\n\n      in_code = code;\n\n      if (code == available) {\n        pixelStack[top++] = first;\n        code = old_code;\n      }\n\n      while (code > clear) {\n        pixelStack[top++] = suffix[code];\n        code = prefix[code];\n      }\n\n      first = suffix[code] & 0xff;\n      pixelStack[top++] = first; // add a new string to the table, but only if space is available\n      // if not, just continue with current table until a clear code is found\n      // (deferred clear code implementation as per GIF spec)\n\n      if (available < MAX_STACK_SIZE) {\n        prefix[available] = old_code;\n        suffix[available] = first;\n        available++;\n\n        if ((available & code_mask) === 0 && available < MAX_STACK_SIZE) {\n          code_size++;\n          code_mask += available;\n        }\n      }\n\n      old_code = in_code;\n    } // Pop a pixel off the pixel stack.\n\n\n    top--;\n    dstPixels[pi++] = pixelStack[top];\n    i++;\n  }\n\n  for (i = pi; i < npix; i++) {\n    dstPixels[i] = 0; // clear missing pixels\n  }\n\n  return dstPixels;\n};\n\nexports.lzw = lzw;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.decompressFrames = exports.decompressFrame = exports.parseGIF = void 0;\n\nvar _gif = _interopRequireDefault(require(\"js-binary-schema-parser/lib/schemas/gif\"));\n\nvar _jsBinarySchemaParser = require(\"js-binary-schema-parser\");\n\nvar _uint = require(\"js-binary-schema-parser/lib/parsers/uint8\");\n\nvar _deinterlace = require(\"./deinterlace\");\n\nvar _lzw = require(\"./lzw\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parseGIF = function parseGIF(arrayBuffer) {\n  var byteData = new Uint8Array(arrayBuffer);\n  return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif[\"default\"]);\n};\n\nexports.parseGIF = parseGIF;\n\nvar generatePatch = function generatePatch(image) {\n  var totalPixels = image.pixels.length;\n  var patchData = new Uint8ClampedArray(totalPixels * 4);\n\n  for (var i = 0; i < totalPixels; i++) {\n    var pos = i * 4;\n    var colorIndex = image.pixels[i];\n    var color = image.colorTable[colorIndex] || [0, 0, 0];\n    patchData[pos] = color[0];\n    patchData[pos + 1] = color[1];\n    patchData[pos + 2] = color[2];\n    patchData[pos + 3] = colorIndex !== image.transparentIndex ? 255 : 0;\n  }\n\n  return patchData;\n};\n\nvar decompressFrame = function decompressFrame(frame, gct, buildImagePatch) {\n  if (!frame.image) {\n    console.warn('gif frame does not have associated image.');\n    return;\n  }\n\n  var image = frame.image; // get the number of pixels\n\n  var totalPixels = image.descriptor.width * image.descriptor.height; // do lzw decompression\n\n  var pixels = (0, _lzw.lzw)(image.data.minCodeSize, image.data.blocks, totalPixels); // deal with interlacing if necessary\n\n  if (image.descriptor.lct.interlaced) {\n    pixels = (0, _deinterlace.deinterlace)(pixels, image.descriptor.width);\n  }\n\n  var resultImage = {\n    pixels: pixels,\n    dims: {\n      top: frame.image.descriptor.top,\n      left: frame.image.descriptor.left,\n      width: frame.image.descriptor.width,\n      height: frame.image.descriptor.height\n    }\n  }; // color table\n\n  if (image.descriptor.lct && image.descriptor.lct.exists) {\n    resultImage.colorTable = image.lct;\n  } else {\n    resultImage.colorTable = gct;\n  } // add per frame relevant gce information\n\n\n  if (frame.gce) {\n    resultImage.delay = (frame.gce.delay || 10) * 10; // convert to ms\n\n    resultImage.disposalType = frame.gce.extras.disposal; // transparency\n\n    if (frame.gce.extras.transparentColorGiven) {\n      resultImage.transparentIndex = frame.gce.transparentColorIndex;\n    }\n  } // create canvas usable imagedata if desired\n\n\n  if (buildImagePatch) {\n    resultImage.patch = generatePatch(resultImage);\n  }\n\n  return resultImage;\n};\n\nexports.decompressFrame = decompressFrame;\n\nvar decompressFrames = function decompressFrames(parsedGif, buildImagePatches) {\n  return parsedGif.frames.filter(function (f) {\n    return f.image;\n  }).map(function (f) {\n    return decompressFrame(f, parsedGif.gct, buildImagePatches);\n  });\n};\n\nexports.decompressFrames = decompressFrames;","import { decompressFrames, ParsedFrame, parseGIF } from 'gifuct-js';\nimport { DOMAdapter, SCALE_MODE, Sprite, Texture, Ticker, UPDATE_PRIORITY } from 'pixi.js';\n\n/** Represents a single frame of a GIF. Includes image and timing data. */\ninterface FrameObject\n{\n    /** Image data for the current frame */\n    imageData: ImageData;\n    /** The start of the current frame, in milliseconds */\n    start: number;\n    /** The end of the current frame, in milliseconds */\n    end: number;\n}\n\n/** Default options for all AnimatedGIF objects. */\ninterface AnimatedGIFOptions\n{\n    /** Whether to start playing right away */\n    autoPlay: boolean;\n    /**\n     * Scale Mode to use for the texture\n     * @type {PIXI.SCALE_MODE}\n     */\n    scaleMode: SCALE_MODE;\n    /** To enable looping */\n    loop: boolean;\n    /** Speed of the animation */\n    animationSpeed: number;\n    /** Set to `false` to manage updates yourself */\n    autoUpdate: boolean;\n    /** The completed callback, optional */\n    onComplete: null | (() => void);\n    /** The loop callback, optional */\n    onLoop: null | (() => void);\n    /** The frame callback, optional */\n    onFrameChange: null | ((currentFrame: number) => void);\n    /** Fallback FPS if GIF contains no time information */\n    fps?: number;\n}\n\n/** Options for the AnimatedGIF constructor. */\ninterface AnimatedGIFSize\n{\n    /** Width of the GIF image */\n    width: number;\n    /** Height of the GIF image */\n    height: number;\n}\n\n/**\n * Runtime object to play animated GIFs. This object is similar to an AnimatedSprite.\n * It support playback (seek, play, stop) as well as animation speed and looping.\n * @see Thanks to {@link https://github.com/matt-way/gifuct-js/ gifuct-js}\n */\nclass AnimatedGIF extends Sprite\n{\n    /**\n     * Default options for all AnimatedGIF objects.\n     * @property {PIXI.SCALE_MODE} [scaleMode='linear'] - Scale mode to use for the texture.\n     * @property {boolean} [loop=true] - To enable looping.\n     * @property {number} [animationSpeed=1] - Speed of the animation.\n     * @property {boolean} [autoUpdate=true] - Set to `false` to manage updates yourself.\n     * @property {boolean} [autoPlay=true] - To start playing right away.\n     * @property {Function} [onComplete=null] - The completed callback, optional.\n     * @property {Function} [onLoop=null] - The loop callback, optional.\n     * @property {Function} [onFrameChange=null] - The frame callback, optional.\n     * @property {number} [fps=30] - Fallback FPS if GIF contains no time information.\n     */\n    public static defaultOptions: AnimatedGIFOptions = {\n        scaleMode: 'linear',\n        fps: 30,\n        loop: true,\n        animationSpeed: 1,\n        autoPlay: true,\n        autoUpdate: true,\n        onComplete: null,\n        onFrameChange: null,\n        onLoop: null,\n    };\n\n    /**\n     * The speed that the animation will play at. Higher is faster, lower is slower.\n     * @default 1\n     */\n    public animationSpeed = 1;\n\n    /**\n     * Whether or not the animate sprite repeats after playing.\n     * @default true\n     */\n    public loop = true;\n\n    /**\n     * User-assigned function to call when animation finishes playing. This only happens\n     * if loop is set to `false`.\n     *\n     * @example\n     * animation.onComplete = () => {\n     *   // finished!\n     * };\n     */\n    public onComplete?: () => void;\n\n    /**\n     * User-assigned function to call when animation changes which texture is being rendered.\n     *\n     * @example\n     * animation.onFrameChange = () => {\n     *   // updated!\n     * };\n     */\n    public onFrameChange?: (currentFrame: number) => void;\n\n    /**\n     * User-assigned function to call when `loop` is true, and animation is played and\n     * loops around to start again. This only happens if loop is set to `true`.\n     *\n     * @example\n     * animation.onLoop = () => {\n     *   // looped!\n     * };\n     */\n    public onLoop?: () => void;\n\n    /** The total duration of animation in milliseconds. */\n    public readonly duration: number = 0;\n\n    /** Whether to play the animation after constructing. */\n    public readonly autoPlay: boolean = true;\n\n    /** Collection of frame to render. */\n    private _frames: FrameObject[];\n\n    /** Drawing context reference. */\n    private _context: CanvasRenderingContext2D;\n\n    /** Dirty means the image needs to be redrawn. Set to `true` to force redraw. */\n    public dirty = false;\n\n    /** The current frame number (zero-based index). */\n    private _currentFrame = 0;\n\n    /** `true` uses PIXI.Ticker.shared to auto update animation time.*/\n    private _autoUpdate = false;\n\n    /** `true` if the instance is currently connected to PIXI.Ticker.shared to auto update animation time. */\n    private _isConnectedToTicker = false;\n\n    /** If animation is currently playing. */\n    private _playing = false;\n\n    /** Current playback position in milliseconds. */\n    private _currentTime = 0;\n\n    /**\n     * Create an animated GIF animation from a GIF image's ArrayBuffer. The easiest way to get\n     * the buffer is to use Assets.\n     * @example\n     * import { Assets } from 'pixi.js';\n     * import '@pixi/gif';\n     *\n     * const gif = await Assets.load('file.gif');\n     * @param buffer - GIF image arraybuffer from Assets.\n     * @param options - Options to use.\n     * @returns\n     */\n    static fromBuffer(buffer: ArrayBuffer, options?: Partial<AnimatedGIFOptions>): AnimatedGIF\n    {\n        if (!buffer || buffer.byteLength === 0)\n        {\n            throw new Error('Invalid buffer');\n        }\n\n        // fix https://github.com/matt-way/gifuct-js/issues/30\n        const validateAndFix = (gif: any): void =>\n        {\n            let currentGce = null;\n\n            for (const frame of gif.frames)\n            {\n                currentGce = frame.gce ?? currentGce;\n\n                // fix loosing graphic control extension for same frames\n                if ('image' in frame && !('gce' in frame))\n                {\n                    frame.gce = currentGce;\n                }\n            }\n        };\n\n        const gif = parseGIF(buffer);\n\n        validateAndFix(gif);\n        const gifFrames = decompressFrames(gif, true);\n        const frames: FrameObject[] = [];\n\n        // Temporary canvases required for compositing frames\n        const canvas = DOMAdapter.get().createCanvas(gif.lsd.width, gif.lsd.height) as HTMLCanvasElement;\n        const context = canvas.getContext('2d', {\n            willReadFrequently: true,\n        }) as CanvasRenderingContext2D;\n        const patchCanvas = DOMAdapter.get().createCanvas() as HTMLCanvasElement;\n        const patchContext = patchCanvas.getContext('2d') as CanvasRenderingContext2D;\n\n        let time = 0;\n        let previousFrame: ImageData | null = null;\n\n        // Some GIFs have a non-zero frame delay, so we need to calculate the fallback\n        const { fps } = Object.assign({}, AnimatedGIF.defaultOptions, options);\n        const defaultDelay = 1000 / (fps as number);\n\n        // Precompute each frame and store as ImageData\n        for (let i = 0; i < gifFrames.length; i++)\n        {\n            // Some GIF's omit the disposalType, so let's assume clear if missing\n            const {\n                disposalType = 2,\n                delay = defaultDelay,\n                patch,\n                dims: { width, height, left, top },\n            } = gifFrames[i] as ParsedFrame;\n\n            patchCanvas.width = width;\n            patchCanvas.height = height;\n            patchContext.clearRect(0, 0, width, height);\n            const patchData = patchContext.createImageData(width, height);\n\n            patchData.data.set(patch);\n            patchContext.putImageData(patchData, 0, 0);\n\n            if (disposalType === 3)\n            {\n                previousFrame = context.getImageData(0, 0, canvas.width, canvas.height);\n            }\n\n            context.drawImage(patchCanvas, left, top);\n            const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n\n            if (disposalType === 2)\n            {\n                context.clearRect(0, 0, canvas.width, canvas.height);\n            }\n            else if (disposalType === 3)\n            {\n                context.putImageData(previousFrame as ImageData, 0, 0);\n            }\n\n            frames.push({\n                start: time,\n                end: time + delay,\n                imageData,\n            });\n            time += delay;\n        }\n\n        // clear the canvases\n        canvas.width = canvas.height = 0;\n        patchCanvas.width = patchCanvas.height = 0;\n        const { width, height } = gif.lsd;\n\n        return new AnimatedGIF(frames, { width, height, ...options });\n    }\n\n    /**\n     * @param frames - Data of the GIF image.\n     * @param options - Options for the AnimatedGIF\n     */\n    constructor(frames: FrameObject[], options: Partial<AnimatedGIFOptions> & AnimatedGIFSize)\n    {\n        super(Texture.EMPTY);\n\n        // Handle rerenders\n        this.onRender = () => this.updateFrame();\n\n        // Get the options, apply defaults\n        const { scaleMode, width, height, ...rest } = Object.assign({},\n            AnimatedGIF.defaultOptions,\n            options\n        );\n\n        // Create the texture\n        const canvas = DOMAdapter.get().createCanvas(width, height) as HTMLCanvasElement;\n        const context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n        this.texture = Texture.from(canvas);\n        this.texture.source.scaleMode = scaleMode;\n\n        this.duration = (frames[frames.length - 1] as FrameObject).end;\n        this._frames = frames;\n        this._context = context;\n        this._playing = false;\n        this._currentTime = 0;\n        this._isConnectedToTicker = false;\n        Object.assign(this, rest);\n\n        // Draw the first frame\n        this.currentFrame = 0;\n        if (rest.autoPlay)\n        {\n            this.play();\n        }\n    }\n\n    /** Stops the animation. */\n    public stop(): void\n    {\n        if (!this._playing)\n        {\n            return;\n        }\n\n        this._playing = false;\n        if (this._autoUpdate && this._isConnectedToTicker)\n        {\n            Ticker.shared.remove(this.update, this);\n            this._isConnectedToTicker = false;\n        }\n    }\n\n    /** Plays the animation. */\n    public play(): void\n    {\n        if (this._playing)\n        {\n            return;\n        }\n\n        this._playing = true;\n        if (this._autoUpdate && !this._isConnectedToTicker)\n        {\n            Ticker.shared.add(this.update, this, UPDATE_PRIORITY.HIGH);\n            this._isConnectedToTicker = true;\n        }\n\n        // If were on the last frame and stopped, play should resume from beginning\n        if (!this.loop && this.currentFrame === this._frames.length - 1)\n        {\n            this._currentTime = 0;\n        }\n    }\n\n    /**\n     * Get the current progress of the animation from 0 to 1.\n     * @readonly\n     */\n    public get progress(): number\n    {\n        return this._currentTime / this.duration;\n    }\n\n    /** `true` if the current animation is playing */\n    public get playing(): boolean\n    {\n        return this._playing;\n    }\n\n    /**\n     * Updates the object transform for rendering. You only need to call this\n     * if the `autoUpdate` property is set to `false`.\n     *\n     * @param deltaTime - Time since last tick.\n     */\n    update(ticker: Ticker): void\n    {\n        if (!this._playing)\n        {\n            return;\n        }\n\n        const elapsed = this.animationSpeed * ticker.deltaTime / Ticker.targetFPMS;\n        const currentTime = this._currentTime + elapsed;\n        const localTime = currentTime % this.duration;\n\n        const localFrame = this._frames.findIndex((frame) =>\n            frame.start <= localTime && frame.end > localTime);\n\n        if (currentTime >= this.duration)\n        {\n            if (this.loop)\n            {\n                this._currentTime = localTime;\n                this.updateFrameIndex(localFrame);\n                this.onLoop?.();\n            }\n            else\n            {\n                this._currentTime = this.duration;\n                this.updateFrameIndex(this._frames.length - 1);\n                this.onComplete?.();\n                this.stop();\n            }\n        }\n        else\n        {\n            this._currentTime = localTime;\n            this.updateFrameIndex(localFrame);\n        }\n    }\n\n    /**\n     * Redraw the current frame, is necessary for the animation to work when\n     */\n    private updateFrame(): void\n    {\n        if (!this.dirty)\n        {\n            return;\n        }\n\n        // Update the current frame\n        const { imageData } = this._frames[this._currentFrame] as FrameObject;\n\n        this._context.putImageData(imageData, 0, 0);\n\n        // Workaround hack for Safari & iOS\n        // which fails to upload canvas after putImageData\n        // See: https://bugs.webkit.org/show_bug.cgi?id=229986\n        this._context.fillStyle = 'transparent';\n        this._context.fillRect(0, 0, 0, 1);\n        this.texture.source.update();\n\n        // Mark as clean\n        this.dirty = false;\n    }\n\n    /**\n     * Whether to use PIXI.Ticker.shared to auto update animation time.\n     * @default true\n     */\n    get autoUpdate(): boolean\n    {\n        return this._autoUpdate;\n    }\n\n    set autoUpdate(value: boolean)\n    {\n        if (value !== this._autoUpdate)\n        {\n            this._autoUpdate = value;\n\n            if (!this._autoUpdate && this._isConnectedToTicker)\n            {\n                Ticker.shared.remove(this.update, this);\n                this._isConnectedToTicker = false;\n            }\n            else if (this._autoUpdate && !this._isConnectedToTicker && this._playing)\n            {\n                Ticker.shared.add(this.update, this);\n                this._isConnectedToTicker = true;\n            }\n        }\n    }\n\n    /** Set the current frame number */\n    get currentFrame(): number\n    {\n        return this._currentFrame;\n    }\n    set currentFrame(value: number)\n    {\n        this.updateFrameIndex(value);\n        this._currentTime = (this._frames[value] as FrameObject).start;\n    }\n\n    /** Internally handle updating the frame index */\n    private updateFrameIndex(value: number): void\n    {\n        if (value < 0 || value >= this._frames.length)\n        {\n            throw new Error(`Frame index out of range, expecting 0 to ${this.totalFrames}, got ${value}`);\n        }\n        if (this._currentFrame !== value)\n        {\n            this._currentFrame = value;\n            this.dirty = true;\n            this.onFrameChange?.(value);\n        }\n    }\n\n    /**\n     * Get the total number of frame in the GIF.\n     */\n    get totalFrames(): number\n    {\n        return this._frames.length;\n    }\n\n    /** Destroy and don't use after this. */\n    destroy(): void\n    {\n        this.stop();\n        super.destroy(true);\n\n        const forceClear = null as any;\n\n        this._context = forceClear;\n        this._frames = forceClear;\n        this.onComplete = forceClear;\n        this.onFrameChange = forceClear;\n        this.onLoop = forceClear;\n    }\n\n    /**\n     * Cloning the animation is a useful way to create a duplicate animation.\n     * This maintains all the properties of the original animation but allows\n     * you to control playback independent of the original animation.\n     * If you want to create a simple copy, and not control independently,\n     * then you can simply create a new Sprite, e.g. `const sprite = new Sprite(animation.texture)`.\n     *\n     * The clone will be flagged as `dirty` to immediatly trigger an update\n     */\n    clone(): AnimatedGIF\n    {\n        const clone = new AnimatedGIF([...this._frames], {\n            autoUpdate: this._autoUpdate,\n            loop: this.loop,\n            autoPlay: this.autoPlay,\n            scaleMode: this.texture.source.scaleMode,\n            animationSpeed: this.animationSpeed,\n            width: this._context.canvas.width,\n            height: this._context.canvas.height,\n            onComplete: this.onComplete,\n            onFrameChange: this.onFrameChange,\n            onLoop: this.onLoop,\n        });\n\n        clone.dirty = true;\n\n        return clone;\n    }\n}\n\nexport { AnimatedGIF };\nexport type { AnimatedGIFOptions };\n","import { DOMAdapter, extensions, ExtensionType, path } from 'pixi.js';\nimport { AnimatedGIF, AnimatedGIFOptions } from './AnimatedGIF';\n\nimport type { AssetExtension } from 'pixi.js';\n\n/**\n * Handle the loading of GIF images. Registering this loader plugin will\n * load all `.gif` images as an ArrayBuffer and transform into an\n * AnimatedGIF object.\n * @ignore\n */\nconst AnimatedGIFAsset = {\n    extension: ExtensionType.Asset,\n    detection: {\n        test: async () => true,\n        add: async (formats) => [...formats, 'gif'],\n        remove: async (formats) => formats.filter((format) => format !== 'gif'),\n    },\n    loader: {\n        name: 'gifLoader',\n        test: (url) => path.extname(url) === '.gif',\n        load: async (url, asset) =>\n        {\n            const response = await DOMAdapter.get().fetch(url);\n            const buffer = await response.arrayBuffer();\n\n            return AnimatedGIF.fromBuffer(buffer, asset?.data);\n        },\n        unload: async (asset) =>\n        {\n            asset.destroy();\n        },\n    }\n} as AssetExtension<AnimatedGIF, AnimatedGIFOptions>;\n\nextensions.add(AnimatedGIFAsset);\n\nexport { AnimatedGIFAsset };\n"],"names":["lib","loop_1","conditional_1","parse_1","parse","stream","schema","result","parent","partSchema","key","conditional","conditionFunc","loop","continueFunc","arr","lastStreamPos","newParent","uint8","readBits_1","readArray_1","readUnsigned_1","readString_1","peekBytes_1","readBytes_1","peekByte_1","readByte_1","buildStream_1","buildStream","uint8Data","readByte","peekByte","offset","readBytes","length","peekBytes","readString","value","readUnsigned","littleEndian","bytes","readArray","byteSize","totalOrFunc","total","parser","i","subBitsTotal","bits","startIndex","readBits","_byte","res","def","exports","_","require$$0","_uint","require$$1","subBlocksSchema","terminator","chunks","streamSize","size","availableSize","gceSchema","codes","imageSchema","textSchema","applicationSchema","commentSchema","nextCode","_default","deinterlace_1","deinterlace_2","deinterlace","pixels","width","newPixels","rows","cpRow","toRow","fromRow","fromPixels","offsets","steps","pass","lzw_1","lzw_2","lzw","minCodeSize","data","pixelCount","MAX_STACK_SIZE","nullCode","npix","available","clear","code_mask","code_size","end_of_information","in_code","old_code","code","datum","data_size","first","top","bi","pi","dstPixels","prefix","suffix","pixelStack","count","decompressFrames_1","decompressFrame_1","parseGIF_1","_gif","_interopRequireDefault","_jsBinarySchemaParser","require$$2","_deinterlace","require$$3","_lzw","require$$4","obj","parseGIF","arrayBuffer","byteData","generatePatch","image","totalPixels","patchData","pos","colorIndex","color","decompressFrame","frame","gct","buildImagePatch","resultImage","decompressFrames","parsedGif","buildImagePatches","f","_AnimatedGIF","Sprite","frames","options","Texture","_a","scaleMode","height","rest","__objRest","canvas","DOMAdapter","context","buffer","validateAndFix","gif","currentGce","gifFrames","patchCanvas","patchContext","time","previousFrame","fps","defaultDelay","disposalType","delay","patch","left","imageData","__spreadValues","Ticker","UPDATE_PRIORITY","ticker","_b","elapsed","currentTime","localTime","localFrame","forceClear","clone","AnimatedGIF","AnimatedGIFAsset","ExtensionType","formats","format","url","path","asset","extensions"],"mappings":"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"}