/*:
 * @target MZ
 * @plugindesc APNG形式の画像を扱うためのモジュールです。
 * @author F_
 *
 * @help
 *
 * APNG形式の画像を扱うためのモジュールです。
 *
 * このプラグインは下記のライブラリを使用しています。
 *
 *
 * -------------------------------------------------------
 *
 * apng-js (https://github.com/davidmz/apng-js)
 *
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2016 David Mzareulyan
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

var APNG = (() => {
  var H = Object.create;
  var T = Object.defineProperty;
  var W = Object.getOwnPropertyDescriptor;
  var X = Object.getOwnPropertyNames;
  var K = Object.getPrototypeOf,
    z = Object.prototype.hasOwnProperty;
  var J = (h, n) => () => (n || h((n = { exports: {} }).exports, n), n.exports),
    Q = (h, n) => {
      for (var r in n) T(h, r, { get: n[r], enumerable: !0 });
    },
    M = (h, n, r, f) => {
      if ((n && typeof n == "object") || typeof n == "function")
        for (let c of X(n))
          !z.call(h, c) &&
            c !== r &&
            T(h, c, {
              get: () => n[c],
              enumerable: !(f = W(n, c)) || f.enumerable,
            });
      return h;
    };
  var Z = (h, n, r) => (
      (r = h != null ? H(K(h)) : {}),
      M(
        n || !h || !h.__esModule
          ? T(r, "default", { value: h, enumerable: !0 })
          : r,
        h
      )
    ),
    $ = (h) => M(T({}, "__esModule", { value: !0 }), h);
  var S = J((R, I) => {
    (function (n, r) {
      typeof R == "object" && typeof I == "object"
        ? (I.exports = r())
        : typeof define == "function" && define.amd
        ? define([], r)
        : typeof R == "object"
        ? (R["apng-js"] = r())
        : (n["apng-js"] = r());
    })(R, function () {
      return (function (h) {
        var n = {};
        function r(f) {
          if (n[f]) return n[f].exports;
          var c = (n[f] = { exports: {}, id: f, loaded: !1 });
          return (
            h[f].call(c.exports, c, c.exports, r), (c.loaded = !0), c.exports
          );
        }
        return (r.m = h), (r.c = n), (r.p = ""), r(0);
      })([
        function (h, n, r) {
          "use strict";
          Object.defineProperty(n, "__esModule", { value: !0 }),
            (n.isNotPNG = s),
            (n.isNotAPNG = o),
            (n.default = t);
          var f = r(1),
            c = N(f),
            p = r(2);
          function N(v) {
            return v && v.__esModule ? v : { default: v };
          }
          var e = new Error("Not a PNG"),
            a = new Error("Not an animated PNG");
          function s(v) {
            return v === e;
          }
          function o(v) {
            return v === a;
          }
          var u = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);
          function t(v) {
            var d = new Uint8Array(v);
            if (
              Array.prototype.some.call(u, function (O, w) {
                return O !== d[w];
              })
            )
              return e;
            var y = !1;
            if (
              (l(d, function (O) {
                return !(y = O === "acTL");
              }),
              !y)
            )
              return a;
            var b = [],
              E = [],
              L = null,
              m = null,
              j = 0,
              F = new p.APNG();
            if (
              (l(d, function (O, w, g, A) {
                var k = new DataView(w.buffer);
                switch (O) {
                  case "IHDR":
                    (L = w.subarray(g + 8, g + 8 + A)),
                      (F.width = k.getUint32(g + 8)),
                      (F.height = k.getUint32(g + 12));
                    break;
                  case "acTL":
                    F.numPlays = k.getUint32(g + 8 + 4);
                    break;
                  case "fcTL":
                    m && (F.frames.push(m), j++),
                      (m = new p.Frame()),
                      (m.width = k.getUint32(g + 8 + 4)),
                      (m.height = k.getUint32(g + 8 + 8)),
                      (m.left = k.getUint32(g + 8 + 12)),
                      (m.top = k.getUint32(g + 8 + 16));
                    var Y = k.getUint16(g + 8 + 20),
                      G = k.getUint16(g + 8 + 22);
                    G === 0 && (G = 100),
                      (m.delay = (1e3 * Y) / G),
                      m.delay <= 10 && (m.delay = 100),
                      (F.playTime += m.delay),
                      (m.disposeOp = k.getUint8(g + 8 + 24)),
                      (m.blendOp = k.getUint8(g + 8 + 25)),
                      (m.dataParts = []),
                      j === 0 && m.disposeOp === 2 && (m.disposeOp = 1);
                    break;
                  case "fdAT":
                    m && m.dataParts.push(w.subarray(g + 8 + 4, g + 8 + A));
                    break;
                  case "IDAT":
                    m && m.dataParts.push(w.subarray(g + 8, g + 8 + A));
                    break;
                  case "IEND":
                    E.push(P(w, g, 12 + A));
                    break;
                  default:
                    b.push(P(w, g, 12 + A));
                }
              }),
              m && F.frames.push(m),
              F.frames.length == 0)
            )
              return a;
            var q = new Blob(b),
              V = new Blob(E);
            return (
              F.frames.forEach(function (O) {
                var w = [];
                w.push(u),
                  L.set(U(O.width), 0),
                  L.set(U(O.height), 4),
                  w.push(D("IHDR", L)),
                  w.push(q),
                  O.dataParts.forEach(function (g) {
                    return w.push(D("IDAT", g));
                  }),
                  w.push(V),
                  (O.imageData = new Blob(w, { type: "image/png" })),
                  delete O.dataParts,
                  (w = null);
              }),
              F
            );
          }
          function l(v, d) {
            var y = new DataView(v.buffer),
              b = 8,
              E = void 0,
              L = void 0,
              m = void 0;
            do
              (L = y.getUint32(b)),
                (E = i(v, b + 4, 4)),
                (m = d(E, v, b, L)),
                (b += 12 + L);
            while (m !== !1 && E != "IEND" && b < v.length);
          }
          function i(v, d, y) {
            var b = Array.prototype.slice.call(v.subarray(d, d + y));
            return String.fromCharCode.apply(String, b);
          }
          function _(v) {
            for (var d = new Uint8Array(v.length), y = 0; y < v.length; y++)
              d[y] = v.charCodeAt(y);
            return d;
          }
          function P(v, d, y) {
            var b = new Uint8Array(y);
            return b.set(v.subarray(d, d + y)), b;
          }
          var D = function (d, y) {
              var b = d.length + y.length,
                E = new Uint8Array(b + 8),
                L = new DataView(E.buffer);
              L.setUint32(0, y.length), E.set(_(d), 4), E.set(y, 8);
              var m = (0, c.default)(E, 4, b);
              return L.setUint32(b + 4, m), E;
            },
            U = function (d) {
              return new Uint8Array([
                (d >>> 24) & 255,
                (d >>> 16) & 255,
                (d >>> 8) & 255,
                d & 255,
              ]);
            };
        },
        function (h, n) {
          "use strict";
          Object.defineProperty(n, "__esModule", { value: !0 }),
            (n.default = function (N) {
              for (
                var e =
                    arguments.length > 1 && arguments[1] !== void 0
                      ? arguments[1]
                      : 0,
                  a =
                    arguments.length > 2 && arguments[2] !== void 0
                      ? arguments[2]
                      : N.length - e,
                  s = -1,
                  o = e,
                  u = e + a;
                o < u;
                o++
              )
                s = (s >>> 8) ^ r[(s ^ N[o]) & 255];
              return s ^ -1;
            });
          for (var r = new Uint32Array(256), f = 0; f < 256; f++) {
            for (var c = f, p = 0; p < 8; p++)
              c = c & 1 ? 3988292384 ^ (c >>> 1) : c >>> 1;
            r[f] = c;
          }
        },
        function (h, n, r) {
          "use strict";
          Object.defineProperty(n, "__esModule", { value: !0 }),
            (n.Frame = n.APNG = void 0);
          var f = (function () {
              function o(u, t) {
                for (var l = 0; l < t.length; l++) {
                  var i = t[l];
                  (i.enumerable = i.enumerable || !1),
                    (i.configurable = !0),
                    "value" in i && (i.writable = !0),
                    Object.defineProperty(u, i.key, i);
                }
              }
              return function (u, t, l) {
                return t && o(u.prototype, t), l && o(u, l), u;
              };
            })(),
            c = r(3),
            p = N(c);
          function N(o) {
            return o && o.__esModule ? o : { default: o };
          }
          function e(o, u) {
            if (!(o instanceof u))
              throw new TypeError("Cannot call a class as a function");
          }
          var a = (n.APNG = (function () {
              function o() {
                e(this, o),
                  (this.width = 0),
                  (this.height = 0),
                  (this.numPlays = 0),
                  (this.playTime = 0),
                  (this.frames = []);
              }
              return (
                f(o, [
                  {
                    key: "createImages",
                    value: function () {
                      return Promise.all(
                        this.frames.map(function (t) {
                          return t.createImage();
                        })
                      );
                    },
                  },
                  {
                    key: "getPlayer",
                    value: function (t) {
                      var l = this,
                        i =
                          arguments.length > 1 && arguments[1] !== void 0
                            ? arguments[1]
                            : !1;
                      return this.createImages().then(function () {
                        return new p.default(l, t, i);
                      });
                    },
                  },
                ]),
                o
              );
            })()),
            s = (n.Frame = (function () {
              function o() {
                e(this, o),
                  (this.left = 0),
                  (this.top = 0),
                  (this.width = 0),
                  (this.height = 0),
                  (this.delay = 0),
                  (this.disposeOp = 0),
                  (this.blendOp = 0),
                  (this.imageData = null),
                  (this.imageElement = null);
              }
              return (
                f(o, [
                  {
                    key: "createImage",
                    value: function () {
                      var t = this;
                      return this.imageElement
                        ? Promise.resolve()
                        : new Promise(function (l, i) {
                            var _ = URL.createObjectURL(t.imageData);
                            (t.imageElement = document.createElement("img")),
                              (t.imageElement.onload = function () {
                                URL.revokeObjectURL(_), l();
                              }),
                              (t.imageElement.onerror = function () {
                                URL.revokeObjectURL(_),
                                  (t.imageElement = null),
                                  i(new Error("Image creation error"));
                              }),
                              (t.imageElement.src = _);
                          });
                    },
                  },
                ]),
                o
              );
            })());
        },
        function (h, n, r) {
          "use strict";
          Object.defineProperty(n, "__esModule", { value: !0 });
          var f = (function () {
              function u(t, l) {
                for (var i = 0; i < l.length; i++) {
                  var _ = l[i];
                  (_.enumerable = _.enumerable || !1),
                    (_.configurable = !0),
                    "value" in _ && (_.writable = !0),
                    Object.defineProperty(t, _.key, _);
                }
              }
              return function (t, l, i) {
                return l && u(t.prototype, l), i && u(t, i), t;
              };
            })(),
            c = r(4),
            p = N(c);
          function N(u) {
            return u && u.__esModule ? u : { default: u };
          }
          function e(u, t) {
            if (!(u instanceof t))
              throw new TypeError("Cannot call a class as a function");
          }
          function a(u, t) {
            if (!u)
              throw new ReferenceError(
                "this hasn't been initialised - super() hasn't been called"
              );
            return t && (typeof t == "object" || typeof t == "function")
              ? t
              : u;
          }
          function s(u, t) {
            if (typeof t != "function" && t !== null)
              throw new TypeError(
                "Super expression must either be null or a function, not " +
                  typeof t
              );
            (u.prototype = Object.create(t && t.prototype, {
              constructor: {
                value: u,
                enumerable: !1,
                writable: !0,
                configurable: !0,
              },
            })),
              t &&
                (Object.setPrototypeOf
                  ? Object.setPrototypeOf(u, t)
                  : (u.__proto__ = t));
          }
          var o = (function (u) {
            s(t, u);
            function t(l, i, _) {
              e(this, t);
              var P = a(
                this,
                (t.__proto__ || Object.getPrototypeOf(t)).call(this)
              );
              return (
                (P.playbackRate = 1),
                (P._currentFrameNumber = 0),
                (P._ended = !1),
                (P._paused = !0),
                (P._numPlays = 0),
                (P._apng = l),
                (P.context = i),
                P.stop(),
                _ && P.play(),
                P
              );
            }
            return (
              f(t, [
                {
                  key: "renderNextFrame",
                  value: function () {
                    (this._currentFrameNumber =
                      (this._currentFrameNumber + 1) %
                      this._apng.frames.length),
                      this._currentFrameNumber ===
                        this._apng.frames.length - 1 &&
                        (this._numPlays++,
                        this._apng.numPlays !== 0 &&
                          this._numPlays >= this._apng.numPlays &&
                          ((this._ended = !0), (this._paused = !0))),
                      this._prevFrame && this._prevFrame.disposeOp == 1
                        ? this.context.clearRect(
                            this._prevFrame.left,
                            this._prevFrame.top,
                            this._prevFrame.width,
                            this._prevFrame.height
                          )
                        : this._prevFrame &&
                          this._prevFrame.disposeOp == 2 &&
                          this.context.putImageData(
                            this._prevFrameData,
                            this._prevFrame.left,
                            this._prevFrame.top
                          );
                    var i = this.currentFrame;
                    (this._prevFrame = i),
                      (this._prevFrameData = null),
                      i.disposeOp == 2 &&
                        (this._prevFrameData = this.context.getImageData(
                          i.left,
                          i.top,
                          i.width,
                          i.height
                        )),
                      i.blendOp == 0 &&
                        this.context.clearRect(
                          i.left,
                          i.top,
                          i.width,
                          i.height
                        ),
                      this.context.drawImage(i.imageElement, i.left, i.top),
                      this.emit("frame", this._currentFrameNumber),
                      this._ended && this.emit("end");
                  },
                },
                {
                  key: "play",
                  value: function () {
                    var i = this;
                    this.emit("play"),
                      this._ended && this.stop(),
                      (this._paused = !1);
                    var _ =
                        performance.now() +
                        this.currentFrame.delay / this.playbackRate,
                      P = function D(U) {
                        if (!(i._ended || i._paused)) {
                          if (U >= _) {
                            for (; U - _ >= i._apng.playTime / i.playbackRate; )
                              (_ += i._apng.playTime / i.playbackRate),
                                i._numPlays++;
                            do
                              i.renderNextFrame(),
                                (_ += i.currentFrame.delay / i.playbackRate);
                            while (!i._ended && U > _);
                          }
                          requestAnimationFrame(D);
                        }
                      };
                    requestAnimationFrame(P);
                  },
                },
                {
                  key: "pause",
                  value: function () {
                    this._paused || (this.emit("pause"), (this._paused = !0));
                  },
                },
                {
                  key: "stop",
                  value: function () {
                    this.emit("stop"),
                      (this._numPlays = 0),
                      (this._ended = !1),
                      (this._paused = !0),
                      (this._currentFrameNumber = -1),
                      this.context.clearRect(
                        0,
                        0,
                        this._apng.width,
                        this._apng.height
                      ),
                      this.renderNextFrame();
                  },
                },
                {
                  key: "currentFrameNumber",
                  get: function () {
                    return this._currentFrameNumber;
                  },
                },
                {
                  key: "currentFrame",
                  get: function () {
                    return this._apng.frames[this._currentFrameNumber];
                  },
                },
                {
                  key: "paused",
                  get: function () {
                    return this._paused;
                  },
                },
                {
                  key: "ended",
                  get: function () {
                    return this._ended;
                  },
                },
              ]),
              t
            );
          })(p.default);
          n.default = o;
        },
        function (h, n) {
          function r() {
            (this._events = this._events || {}),
              (this._maxListeners = this._maxListeners || void 0);
          }
          (h.exports = r),
            (r.EventEmitter = r),
            (r.prototype._events = void 0),
            (r.prototype._maxListeners = void 0),
            (r.defaultMaxListeners = 10),
            (r.prototype.setMaxListeners = function (e) {
              if (!c(e) || e < 0 || isNaN(e))
                throw TypeError("n must be a positive number");
              return (this._maxListeners = e), this;
            }),
            (r.prototype.emit = function (e) {
              var a, s, o, u, t, l;
              if (
                (this._events || (this._events = {}),
                e === "error" &&
                  (!this._events.error ||
                    (p(this._events.error) && !this._events.error.length)))
              ) {
                if (((a = arguments[1]), a instanceof Error)) throw a;
                var i = new Error(
                  'Uncaught, unspecified "error" event. (' + a + ")"
                );
                throw ((i.context = a), i);
              }
              if (((s = this._events[e]), N(s))) return !1;
              if (f(s))
                switch (arguments.length) {
                  case 1:
                    s.call(this);
                    break;
                  case 2:
                    s.call(this, arguments[1]);
                    break;
                  case 3:
                    s.call(this, arguments[1], arguments[2]);
                    break;
                  default:
                    (u = Array.prototype.slice.call(arguments, 1)),
                      s.apply(this, u);
                }
              else if (p(s))
                for (
                  u = Array.prototype.slice.call(arguments, 1),
                    l = s.slice(),
                    o = l.length,
                    t = 0;
                  t < o;
                  t++
                )
                  l[t].apply(this, u);
              return !0;
            }),
            (r.prototype.addListener = function (e, a) {
              var s;
              if (!f(a)) throw TypeError("listener must be a function");
              return (
                this._events || (this._events = {}),
                this._events.newListener &&
                  this.emit("newListener", e, f(a.listener) ? a.listener : a),
                this._events[e]
                  ? p(this._events[e])
                    ? this._events[e].push(a)
                    : (this._events[e] = [this._events[e], a])
                  : (this._events[e] = a),
                p(this._events[e]) &&
                  !this._events[e].warned &&
                  (N(this._maxListeners)
                    ? (s = r.defaultMaxListeners)
                    : (s = this._maxListeners),
                  s &&
                    s > 0 &&
                    this._events[e].length > s &&
                    ((this._events[e].warned = !0),
                    console.error(
                      "(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",
                      this._events[e].length
                    ),
                    typeof console.trace == "function" && console.trace())),
                this
              );
            }),
            (r.prototype.on = r.prototype.addListener),
            (r.prototype.once = function (e, a) {
              if (!f(a)) throw TypeError("listener must be a function");
              var s = !1;
              function o() {
                this.removeListener(e, o),
                  s || ((s = !0), a.apply(this, arguments));
              }
              return (o.listener = a), this.on(e, o), this;
            }),
            (r.prototype.removeListener = function (e, a) {
              var s, o, u, t;
              if (!f(a)) throw TypeError("listener must be a function");
              if (!this._events || !this._events[e]) return this;
              if (
                ((s = this._events[e]),
                (u = s.length),
                (o = -1),
                s === a || (f(s.listener) && s.listener === a))
              )
                delete this._events[e],
                  this._events.removeListener &&
                    this.emit("removeListener", e, a);
              else if (p(s)) {
                for (t = u; t-- > 0; )
                  if (s[t] === a || (s[t].listener && s[t].listener === a)) {
                    o = t;
                    break;
                  }
                if (o < 0) return this;
                s.length === 1
                  ? ((s.length = 0), delete this._events[e])
                  : s.splice(o, 1),
                  this._events.removeListener &&
                    this.emit("removeListener", e, a);
              }
              return this;
            }),
            (r.prototype.removeAllListeners = function (e) {
              var a, s;
              if (!this._events) return this;
              if (!this._events.removeListener)
                return (
                  arguments.length === 0
                    ? (this._events = {})
                    : this._events[e] && delete this._events[e],
                  this
                );
              if (arguments.length === 0) {
                for (a in this._events)
                  a !== "removeListener" && this.removeAllListeners(a);
                return (
                  this.removeAllListeners("removeListener"),
                  (this._events = {}),
                  this
                );
              }
              if (((s = this._events[e]), f(s))) this.removeListener(e, s);
              else if (s)
                for (; s.length; ) this.removeListener(e, s[s.length - 1]);
              return delete this._events[e], this;
            }),
            (r.prototype.listeners = function (e) {
              var a;
              return (
                !this._events || !this._events[e]
                  ? (a = [])
                  : f(this._events[e])
                  ? (a = [this._events[e]])
                  : (a = this._events[e].slice()),
                a
              );
            }),
            (r.prototype.listenerCount = function (e) {
              if (this._events) {
                var a = this._events[e];
                if (f(a)) return 1;
                if (a) return a.length;
              }
              return 0;
            }),
            (r.listenerCount = function (e, a) {
              return e.listenerCount(a);
            });
          function f(e) {
            return typeof e == "function";
          }
          function c(e) {
            return typeof e == "number";
          }
          function p(e) {
            return typeof e == "object" && e !== null;
          }
          function N(e) {
            return e === void 0;
          }
        },
      ]);
    });
  });
  var oe = {};
  Q(oe, {
    BLEND_OP_OVER: () => re,
    BLEND_OP_SOURCE: () => C,
    DISPOSE_OP_BACKGROUND: () => B,
    DISPOSE_OP_NONE: () => ee,
    DISPOSE_OP_PREVIOUS: () => te,
    EMPTY: () => ne,
    parse: () => ie,
  });
  var x = Z(S()),
    ee = 0,
    B = 1,
    te = 2,
    C = 0,
    re = 1,
    ne = { width: 1, height: 1, numPlays: 1, duration: 0, frames: [] };
  async function ie(h) {
    let n = (0, x.default)(h);
    if ((0, x.isNotPNG)(n)) throw n;
    return (0, x.isNotAPNG)(n) ? await ae(h) : await se(n);
  }
  async function ae(h) {
    let n = new Blob([h], { type: "image/png" }),
      r = await ue(n);
    return {
      width: r.width,
      height: r.height,
      numPlays: 1,
      duration: 0,
      frames: [
        {
          width: r.width,
          height: r.height,
          offsetX: 0,
          offsetY: 0,
          delay: 0,
          disposeOp: B,
          blendOp: C,
          image: r,
        },
      ],
    };
  }
  async function se(h) {
    await h.createImages();
    let { width: n, height: r, numPlays: f, playTime: c } = h,
      p = h.frames.map((N) => {
        let {
          left: e,
          top: a,
          width: s,
          height: o,
          delay: u,
          disposeOp: t,
          blendOp: l,
          imageElement: i,
        } = N;
        return {
          width: s,
          height: o,
          offsetX: e,
          offsetY: a,
          delay: u,
          disposeOp: t,
          blendOp: l,
          image: i,
        };
      });
    return { width: n, height: r, numPlays: f, duration: c, frames: p };
  }
  function ue(h) {
    let n = URL.createObjectURL(h);
    return new Promise((r, f) => {
      let c = new Image();
      c.addEventListener("load", () => {
        URL.revokeObjectURL(n), r(c);
      }),
        c.addEventListener("error", (p) => {
          URL.revokeObjectURL(n),
            f(p.error instanceof Error ? p.error : new Error(p.message));
        }),
        (c.src = n);
    });
  }
  return $(oe);
})();
