@leafer-in/film 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"film.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/film/src/FilmDecoder.ts","../../../../../node_modules/.pnpm/omggif@1.0.10/node_modules/omggif/omggif.js","../../../../../../src/in/packages/film/src/data/FilmData.ts","../../../../../../src/in/packages/film/src/PaintFilm.ts","../../../../../../src/in/packages/film/src/Film.ts","../../../../../../src/in/packages/film/src/index.ts","../../../../../../src/in/packages/film/src/OmgFilmDecoder.ts","../../../../../../src/in/packages/film/src/helper/ext.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { isUndefined, Platform } from '@leafer-ui/draw'\nimport { ICanvasContext2D, IFilmDecoder, IFilmFileType, IFilmFrame, ILeaf, IPointData, IBooleanMap, IFilmPlayOptions } from '@leafer-ui/interface'\n\n\ninterface IFilmDecoderMap {\n [name: string]: { Decoder: any, force?: boolean }\n}\n\nexport class FilmDecoder implements IFilmDecoder {\n\n public width: number // 宽度\n public height: number // 高度\n\n public total: number // 总的帧数\n public loop: number // 循环次数,为0表示无限循环\n\n public frames: IFilmFrame[] = [] // 帧数据\n public decodedIndex = -1 // 当前解码到第几帧\n\n public atlas?: any // 合并图\n public atlasContext?: ICanvasContext2D // 合并图的上下文手柄\n public atlasGrid?: IPointData // 横竖的排列数量\n\n public decoder: ImageDecoder // 解码器\n\n // 缓冲画布\n public bufferCanvas?: any\n public bufferContext?: ICanvasContext2D\n\n\n static decoderMap: IFilmDecoderMap = {}\n static supportMap: IBooleanMap = {}\n static maxAtlasSize = Platform.image.maxPatternSize\n\n static register(type: IFilmFileType, Decoder: any, force?: boolean): void {\n FilmDecoder.decoderMap[type] = { Decoder, force }\n }\n\n static async canUse(mimeType: string) {\n const { supportMap } = this\n let canUse = supportMap[mimeType]\n if (!isUndefined(canUse)) return canUse\n if (typeof ImageDecoder === 'undefined') return false\n canUse = await ImageDecoder.isTypeSupported(mimeType)\n return supportMap[mimeType] = canUse\n }\n\n\n public createAtlas(): void {\n const { width, height, total } = this\n if (width * height * total <= FilmDecoder.maxAtlasSize) {\n // 合并所有帧到一张大图里(画布能放下所有帧时)\n const columns = Math.ceil(Math.sqrt(total * height / width))\n const rows = Math.ceil(total / columns)\n this.atlasGrid = { x: columns, y: rows }\n this.atlas = Platform.origin.createCanvas(width * columns, height * rows)\n this.atlasContext = this.atlas.getContext('2d')\n }\n }\n\n public async decodeHeader(data: ArrayBuffer, type: string): Promise<void> {\n this.decoder = new ImageDecoder({ data, type })\n\n await this.decoder.tracks.ready\n const first = await this.decodeFrame(0)\n\n const { displayWidth, displayHeight } = first.image, { selectedTrack } = this.decoder.tracks\n this.width = displayWidth\n this.height = displayHeight\n this.total = selectedTrack.frameCount\n this.loop = selectedTrack.repetitionCount\n\n this.createAtlas()\n if (this.atlas) this.mergeFrame(0) // 因为已经读取了第一帧,存在合并图时,必须再次合并进去\n }\n\n public async decodeFrame(frameIndex: number): Promise<IFilmFrame> {\n const { frames } = this, frame = frames[frameIndex]\n if (frame && !frame.decoding) return frame\n\n // 必须顺序解码\n for (let i = this.decodedIndex + 1; i <= frameIndex; i++) {\n await this.decodeOneFrame(i)\n this.decodedIndex = i\n }\n\n return frames[frameIndex]\n }\n\n public async decodeOneFrame(frameIndex: number): Promise<IFilmFrame> {\n return new Promise((resolve) => {\n this.decoder.decode({ frameIndex }).then(result => {\n const { image } = result\n const frame: IFilmFrame = { image, duration: image.duration / 1000 / 1000 } // duration单位为秒\n this.frames[frameIndex] = frame\n if (this.atlas) this.mergeFrame(frameIndex)\n resolve(frame)\n })\n })\n }\n\n // 绘制当前帧到atlas合并图中\n public mergeFrame(frameIndex: number, destoryFrameImage: boolean = true): void {\n const frame = this.frames[frameIndex], { atlasGrid, width, height } = this\n frame.x = (frameIndex % atlasGrid.x) * width\n frame.y = Math.floor(frameIndex / atlasGrid.x) * height\n this.atlasContext.drawImage(frame.image, frame.x, frame.y)\n if (destoryFrameImage) this.destoryFrameImage(frame)\n else delete frame.image\n }\n\n public render(canvas: ICanvasContext2D, x: number, y: number, width: number, height: number, leaf: ILeaf, playOptions: IFilmPlayOptions, _imageScaleX: number, _imageScaleY: number): void {\n let { nowIndex, paused, speed, pauseIndex, loop, frameTimer } = playOptions\n\n if (isUndefined(nowIndex)) nowIndex = 0\n\n const { frames } = this, frame = frames[nowIndex]\n\n if (this.renderFrame(frame, canvas, x, y, width, height)) {\n\n if (frameTimer) return // 避免重复等待下一帧\n if (!isUndefined(pauseIndex) && nowIndex === pauseIndex) { // 播放到暂停帧为止\n playOptions.paused = true\n return\n }\n\n let nextIndex = nowIndex + 1\n\n if (nextIndex >= this.total) {\n if (this.loop && isFinite(this.loop)) { // 限制循环次数\n loop = (loop as number || 0) + 1\n if (loop > this.loop) return\n playOptions.loop = loop\n }\n nextIndex = 0\n }\n\n if (nextIndex < this.total && !frames[nextIndex]) {\n frames[nextIndex] = { duration: 0, decoding: true } // 先占位,表示正在解码中\n this.decodeFrame(nextIndex).finally(() => {\n if (this.decodedIndex === this.total - 1) this.destroyDecoder()\n })\n }\n\n if (paused) return\n\n playOptions.frameTimer = setTimeout(() => {\n\n playOptions.nowIndex = nextIndex\n delete playOptions.frameTimer\n leaf.forceRender()\n\n }, frame.duration * (speed || 1) * 1000)\n\n } else {\n\n this.renderFrame(frames[nowIndex - 1], canvas, x, y, width, height) // 暂时渲染上一帧顶替\n leaf.forceRender() // 防止停掉\n }\n }\n\n private renderFrame(frame: IFilmFrame, canvas: ICanvasContext2D, x: number, y: number, width: number, height: number): boolean {\n const canRender = frame && !frame.decoding, { atlas } = this\n if (canRender) {\n if (atlas) canvas.drawImage(atlas, frame.x, frame.y, this.width, this.height, x, y, width, height)\n else canvas.drawImage(frame.image, x, y, width, height)\n }\n return canRender\n }\n\n // 销毁单帧\n public destoryFrame(frameIndex: number, deleteIndex: boolean = true): void {\n const { frames } = this, frame = frames[frameIndex]\n if (frame) {\n this.destoryFrameImage(frame)\n if (deleteIndex) delete frames[frameIndex]\n }\n }\n\n // 销毁单帧内的VideoFrame或canvas对象\n public destoryFrameImage(frame: IFilmFrame): void {\n const { image } = frame\n if (image && image.close) image.close()\n delete frame.image\n }\n\n public destroyDecoder(): void {\n if (this.decoder) {\n this.decoder.close()\n this.decoder = null\n }\n }\n\n public close(): void {\n if (this.atlas) this.atlas = this.atlasContext = null\n this.frames.forEach((_item, index) => this.destoryFrame(index, false))\n this.frames.length = 0\n this.destroyDecoder()\n }\n\n}\n","// (c) Dean McNamee <dean@gmail.com>, 2013.\n//\n// https://github.com/deanm/omggif\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n//\n// omggif is a JavaScript implementation of a GIF 89a encoder and decoder,\n// including animation and compression. It does not rely on any specific\n// underlying system, so should run in the browser, Node, or Plask.\n\n\"use strict\";\n\nfunction GifWriter(buf, width, height, gopts) {\n var p = 0;\n\n var gopts = gopts === undefined ? { } : gopts;\n var loop_count = gopts.loop === undefined ? null : gopts.loop;\n var global_palette = gopts.palette === undefined ? null : gopts.palette;\n\n if (width <= 0 || height <= 0 || width > 65535 || height > 65535)\n throw new Error(\"Width/Height invalid.\");\n\n function check_palette_and_num_colors(palette) {\n var num_colors = palette.length;\n if (num_colors < 2 || num_colors > 256 || num_colors & (num_colors-1)) {\n throw new Error(\n \"Invalid code/color length, must be power of 2 and 2 .. 256.\");\n }\n return num_colors;\n }\n\n // - Header.\n buf[p++] = 0x47; buf[p++] = 0x49; buf[p++] = 0x46; // GIF\n buf[p++] = 0x38; buf[p++] = 0x39; buf[p++] = 0x61; // 89a\n\n // Handling of Global Color Table (palette) and background index.\n var gp_num_colors_pow2 = 0;\n var background = 0;\n if (global_palette !== null) {\n var gp_num_colors = check_palette_and_num_colors(global_palette);\n while (gp_num_colors >>= 1) ++gp_num_colors_pow2;\n gp_num_colors = 1 << gp_num_colors_pow2;\n --gp_num_colors_pow2;\n if (gopts.background !== undefined) {\n background = gopts.background;\n if (background >= gp_num_colors)\n throw new Error(\"Background index out of range.\");\n // The GIF spec states that a background index of 0 should be ignored, so\n // this is probably a mistake and you really want to set it to another\n // slot in the palette. But actually in the end most browsers, etc end\n // up ignoring this almost completely (including for dispose background).\n if (background === 0)\n throw new Error(\"Background index explicitly passed as 0.\");\n }\n }\n\n // - Logical Screen Descriptor.\n // NOTE(deanm): w/h apparently ignored by implementations, but set anyway.\n buf[p++] = width & 0xff; buf[p++] = width >> 8 & 0xff;\n buf[p++] = height & 0xff; buf[p++] = height >> 8 & 0xff;\n // NOTE: Indicates 0-bpp original color resolution (unused?).\n buf[p++] = (global_palette !== null ? 0x80 : 0) | // Global Color Table Flag.\n gp_num_colors_pow2; // NOTE: No sort flag (unused?).\n buf[p++] = background; // Background Color Index.\n buf[p++] = 0; // Pixel aspect ratio (unused?).\n\n // - Global Color Table\n if (global_palette !== null) {\n for (var i = 0, il = global_palette.length; i < il; ++i) {\n var rgb = global_palette[i];\n buf[p++] = rgb >> 16 & 0xff;\n buf[p++] = rgb >> 8 & 0xff;\n buf[p++] = rgb & 0xff;\n }\n }\n\n if (loop_count !== null) { // Netscape block for looping.\n if (loop_count < 0 || loop_count > 65535)\n throw new Error(\"Loop count invalid.\")\n // Extension code, label, and length.\n buf[p++] = 0x21; buf[p++] = 0xff; buf[p++] = 0x0b;\n // NETSCAPE2.0\n buf[p++] = 0x4e; buf[p++] = 0x45; buf[p++] = 0x54; buf[p++] = 0x53;\n buf[p++] = 0x43; buf[p++] = 0x41; buf[p++] = 0x50; buf[p++] = 0x45;\n buf[p++] = 0x32; buf[p++] = 0x2e; buf[p++] = 0x30;\n // Sub-block\n buf[p++] = 0x03; buf[p++] = 0x01;\n buf[p++] = loop_count & 0xff; buf[p++] = loop_count >> 8 & 0xff;\n buf[p++] = 0x00; // Terminator.\n }\n\n\n var ended = false;\n\n this.addFrame = function(x, y, w, h, indexed_pixels, opts) {\n if (ended === true) { --p; ended = false; } // Un-end.\n\n opts = opts === undefined ? { } : opts;\n\n // TODO(deanm): Bounds check x, y. Do they need to be within the virtual\n // canvas width/height, I imagine?\n if (x < 0 || y < 0 || x > 65535 || y > 65535)\n throw new Error(\"x/y invalid.\")\n\n if (w <= 0 || h <= 0 || w > 65535 || h > 65535)\n throw new Error(\"Width/Height invalid.\")\n\n if (indexed_pixels.length < w * h)\n throw new Error(\"Not enough pixels for the frame size.\");\n\n var using_local_palette = true;\n var palette = opts.palette;\n if (palette === undefined || palette === null) {\n using_local_palette = false;\n palette = global_palette;\n }\n\n if (palette === undefined || palette === null)\n throw new Error(\"Must supply either a local or global palette.\");\n\n var num_colors = check_palette_and_num_colors(palette);\n\n // Compute the min_code_size (power of 2), destroying num_colors.\n var min_code_size = 0;\n while (num_colors >>= 1) ++min_code_size;\n num_colors = 1 << min_code_size; // Now we can easily get it back.\n\n var delay = opts.delay === undefined ? 0 : opts.delay;\n\n // From the spec:\n // 0 - No disposal specified. The decoder is\n // not required to take any action.\n // 1 - Do not dispose. The graphic is to be left\n // in place.\n // 2 - Restore to background color. The area used by the\n // graphic must be restored to the background color.\n // 3 - Restore to previous. The decoder is required to\n // restore the area overwritten by the graphic with\n // what was there prior to rendering the graphic.\n // 4-7 - To be defined.\n // NOTE(deanm): Dispose background doesn't really work, apparently most\n // browsers ignore the background palette index and clear to transparency.\n var disposal = opts.disposal === undefined ? 0 : opts.disposal;\n if (disposal < 0 || disposal > 3) // 4-7 is reserved.\n throw new Error(\"Disposal out of range.\");\n\n var use_transparency = false;\n var transparent_index = 0;\n if (opts.transparent !== undefined && opts.transparent !== null) {\n use_transparency = true;\n transparent_index = opts.transparent;\n if (transparent_index < 0 || transparent_index >= num_colors)\n throw new Error(\"Transparent color index.\");\n }\n\n if (disposal !== 0 || use_transparency || delay !== 0) {\n // - Graphics Control Extension\n buf[p++] = 0x21; buf[p++] = 0xf9; // Extension / Label.\n buf[p++] = 4; // Byte size.\n\n buf[p++] = disposal << 2 | (use_transparency === true ? 1 : 0);\n buf[p++] = delay & 0xff; buf[p++] = delay >> 8 & 0xff;\n buf[p++] = transparent_index; // Transparent color index.\n buf[p++] = 0; // Block Terminator.\n }\n\n // - Image Descriptor\n buf[p++] = 0x2c; // Image Seperator.\n buf[p++] = x & 0xff; buf[p++] = x >> 8 & 0xff; // Left.\n buf[p++] = y & 0xff; buf[p++] = y >> 8 & 0xff; // Top.\n buf[p++] = w & 0xff; buf[p++] = w >> 8 & 0xff;\n buf[p++] = h & 0xff; buf[p++] = h >> 8 & 0xff;\n // NOTE: No sort flag (unused?).\n // TODO(deanm): Support interlace.\n buf[p++] = using_local_palette === true ? (0x80 | (min_code_size-1)) : 0;\n\n // - Local Color Table\n if (using_local_palette === true) {\n for (var i = 0, il = palette.length; i < il; ++i) {\n var rgb = palette[i];\n buf[p++] = rgb >> 16 & 0xff;\n buf[p++] = rgb >> 8 & 0xff;\n buf[p++] = rgb & 0xff;\n }\n }\n\n p = GifWriterOutputLZWCodeStream(\n buf, p, min_code_size < 2 ? 2 : min_code_size, indexed_pixels);\n\n return p;\n };\n\n this.end = function() {\n if (ended === false) {\n buf[p++] = 0x3b; // Trailer.\n ended = true;\n }\n return p;\n };\n\n this.getOutputBuffer = function() { return buf; };\n this.setOutputBuffer = function(v) { buf = v; };\n this.getOutputBufferPosition = function() { return p; };\n this.setOutputBufferPosition = function(v) { p = v; };\n}\n\n// Main compression routine, palette indexes -> LZW code stream.\n// |index_stream| must have at least one entry.\nfunction GifWriterOutputLZWCodeStream(buf, p, min_code_size, index_stream) {\n buf[p++] = min_code_size;\n var cur_subblock = p++; // Pointing at the length field.\n\n var clear_code = 1 << min_code_size;\n var code_mask = clear_code - 1;\n var eoi_code = clear_code + 1;\n var next_code = eoi_code + 1;\n\n var cur_code_size = min_code_size + 1; // Number of bits per code.\n var cur_shift = 0;\n // We have at most 12-bit codes, so we should have to hold a max of 19\n // bits here (and then we would write out).\n var cur = 0;\n\n function emit_bytes_to_buffer(bit_block_size) {\n while (cur_shift >= bit_block_size) {\n buf[p++] = cur & 0xff;\n cur >>= 8; cur_shift -= 8;\n if (p === cur_subblock + 256) { // Finished a subblock.\n buf[cur_subblock] = 255;\n cur_subblock = p++;\n }\n }\n }\n\n function emit_code(c) {\n cur |= c << cur_shift;\n cur_shift += cur_code_size;\n emit_bytes_to_buffer(8);\n }\n\n // I am not an expert on the topic, and I don't want to write a thesis.\n // However, it is good to outline here the basic algorithm and the few data\n // structures and optimizations here that make this implementation fast.\n // The basic idea behind LZW is to build a table of previously seen runs\n // addressed by a short id (herein called output code). All data is\n // referenced by a code, which represents one or more values from the\n // original input stream. All input bytes can be referenced as the same\n // value as an output code. So if you didn't want any compression, you\n // could more or less just output the original bytes as codes (there are\n // some details to this, but it is the idea). In order to achieve\n // compression, values greater then the input range (codes can be up to\n // 12-bit while input only 8-bit) represent a sequence of previously seen\n // inputs. The decompressor is able to build the same mapping while\n // decoding, so there is always a shared common knowledge between the\n // encoding and decoder, which is also important for \"timing\" aspects like\n // how to handle variable bit width code encoding.\n //\n // One obvious but very important consequence of the table system is there\n // is always a unique id (at most 12-bits) to map the runs. 'A' might be\n // 4, then 'AA' might be 10, 'AAA' 11, 'AAAA' 12, etc. This relationship\n // can be used for an effecient lookup strategy for the code mapping. We\n // need to know if a run has been seen before, and be able to map that run\n // to the output code. Since we start with known unique ids (input bytes),\n // and then from those build more unique ids (table entries), we can\n // continue this chain (almost like a linked list) to always have small\n // integer values that represent the current byte chains in the encoder.\n // This means instead of tracking the input bytes (AAAABCD) to know our\n // current state, we can track the table entry for AAAABC (it is guaranteed\n // to exist by the nature of the algorithm) and the next character D.\n // Therefor the tuple of (table_entry, byte) is guaranteed to also be\n // unique. This allows us to create a simple lookup key for mapping input\n // sequences to codes (table indices) without having to store or search\n // any of the code sequences. So if 'AAAA' has a table entry of 12, the\n // tuple of ('AAAA', K) for any input byte K will be unique, and can be our\n // key. This leads to a integer value at most 20-bits, which can always\n // fit in an SMI value and be used as a fast sparse array / object key.\n\n // Output code for the current contents of the index buffer.\n var ib_code = index_stream[0] & code_mask; // Load first input index.\n var code_table = { }; // Key'd on our 20-bit \"tuple\".\n\n emit_code(clear_code); // Spec says first code should be a clear code.\n\n // First index already loaded, process the rest of the stream.\n for (var i = 1, il = index_stream.length; i < il; ++i) {\n var k = index_stream[i] & code_mask;\n var cur_key = ib_code << 8 | k; // (prev, k) unique tuple.\n var cur_code = code_table[cur_key]; // buffer + k.\n\n // Check if we have to create a new code table entry.\n if (cur_code === undefined) { // We don't have buffer + k.\n // Emit index buffer (without k).\n // This is an inline version of emit_code, because this is the core\n // writing routine of the compressor (and V8 cannot inline emit_code\n // because it is a closure here in a different context). Additionally\n // we can call emit_byte_to_buffer less often, because we can have\n // 30-bits (from our 31-bit signed SMI), and we know our codes will only\n // be 12-bits, so can safely have 18-bits there without overflow.\n // emit_code(ib_code);\n cur |= ib_code << cur_shift;\n cur_shift += cur_code_size;\n while (cur_shift >= 8) {\n buf[p++] = cur & 0xff;\n cur >>= 8; cur_shift -= 8;\n if (p === cur_subblock + 256) { // Finished a subblock.\n buf[cur_subblock] = 255;\n cur_subblock = p++;\n }\n }\n\n if (next_code === 4096) { // Table full, need a clear.\n emit_code(clear_code);\n next_code = eoi_code + 1;\n cur_code_size = min_code_size + 1;\n code_table = { };\n } else { // Table not full, insert a new entry.\n // Increase our variable bit code sizes if necessary. This is a bit\n // tricky as it is based on \"timing\" between the encoding and\n // decoder. From the encoders perspective this should happen after\n // we've already emitted the index buffer and are about to create the\n // first table entry that would overflow our current code bit size.\n if (next_code >= (1 << cur_code_size)) ++cur_code_size;\n code_table[cur_key] = next_code++; // Insert into code table.\n }\n\n ib_code = k; // Index buffer to single input k.\n } else {\n ib_code = cur_code; // Index buffer to sequence in code table.\n }\n }\n\n emit_code(ib_code); // There will still be something in the index buffer.\n emit_code(eoi_code); // End Of Information.\n\n // Flush / finalize the sub-blocks stream to the buffer.\n emit_bytes_to_buffer(1);\n\n // Finish the sub-blocks, writing out any unfinished lengths and\n // terminating with a sub-block of length 0. If we have already started\n // but not yet used a sub-block it can just become the terminator.\n if (cur_subblock + 1 === p) { // Started but unused.\n buf[cur_subblock] = 0;\n } else { // Started and used, write length and additional terminator block.\n buf[cur_subblock] = p - cur_subblock - 1;\n buf[p++] = 0;\n }\n return p;\n}\n\nfunction GifReader(buf) {\n var p = 0;\n\n // - Header (GIF87a or GIF89a).\n if (buf[p++] !== 0x47 || buf[p++] !== 0x49 || buf[p++] !== 0x46 ||\n buf[p++] !== 0x38 || (buf[p++]+1 & 0xfd) !== 0x38 || buf[p++] !== 0x61) {\n throw new Error(\"Invalid GIF 87a/89a header.\");\n }\n\n // - Logical Screen Descriptor.\n var width = buf[p++] | buf[p++] << 8;\n var height = buf[p++] | buf[p++] << 8;\n var pf0 = buf[p++]; // <Packed Fields>.\n var global_palette_flag = pf0 >> 7;\n var num_global_colors_pow2 = pf0 & 0x7;\n var num_global_colors = 1 << (num_global_colors_pow2 + 1);\n var background = buf[p++];\n buf[p++]; // Pixel aspect ratio (unused?).\n\n var global_palette_offset = null;\n var global_palette_size = null;\n\n if (global_palette_flag) {\n global_palette_offset = p;\n global_palette_size = num_global_colors;\n p += num_global_colors * 3; // Seek past palette.\n }\n\n var no_eof = true;\n\n var frames = [ ];\n\n var delay = 0;\n var transparent_index = null;\n var disposal = 0; // 0 - No disposal specified.\n var loop_count = null;\n\n this.width = width;\n this.height = height;\n\n while (no_eof && p < buf.length) {\n switch (buf[p++]) {\n case 0x21: // Graphics Control Extension Block\n switch (buf[p++]) {\n case 0xff: // Application specific block\n // Try if it's a Netscape block (with animation loop counter).\n if (buf[p ] !== 0x0b || // 21 FF already read, check block size.\n // NETSCAPE2.0\n buf[p+1 ] == 0x4e && buf[p+2 ] == 0x45 && buf[p+3 ] == 0x54 &&\n buf[p+4 ] == 0x53 && buf[p+5 ] == 0x43 && buf[p+6 ] == 0x41 &&\n buf[p+7 ] == 0x50 && buf[p+8 ] == 0x45 && buf[p+9 ] == 0x32 &&\n buf[p+10] == 0x2e && buf[p+11] == 0x30 &&\n // Sub-block\n buf[p+12] == 0x03 && buf[p+13] == 0x01 && buf[p+16] == 0) {\n p += 14;\n loop_count = buf[p++] | buf[p++] << 8;\n p++; // Skip terminator.\n } else { // We don't know what it is, just try to get past it.\n p += 12;\n while (true) { // Seek through subblocks.\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n p += block_size;\n }\n }\n break;\n\n case 0xf9: // Graphics Control Extension\n if (buf[p++] !== 0x4 || buf[p+4] !== 0)\n throw new Error(\"Invalid graphics extension block.\");\n var pf1 = buf[p++];\n delay = buf[p++] | buf[p++] << 8;\n transparent_index = buf[p++];\n if ((pf1 & 1) === 0) transparent_index = null;\n disposal = pf1 >> 2 & 0x7;\n p++; // Skip terminator.\n break;\n\n case 0xfe: // Comment Extension.\n while (true) { // Seek through subblocks.\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n // console.log(buf.slice(p, p+block_size).toString('ascii'));\n p += block_size;\n }\n break;\n\n default:\n throw new Error(\n \"Unknown graphic control label: 0x\" + buf[p-1].toString(16));\n }\n break;\n\n case 0x2c: // Image Descriptor.\n var x = buf[p++] | buf[p++] << 8;\n var y = buf[p++] | buf[p++] << 8;\n var w = buf[p++] | buf[p++] << 8;\n var h = buf[p++] | buf[p++] << 8;\n var pf2 = buf[p++];\n var local_palette_flag = pf2 >> 7;\n var interlace_flag = pf2 >> 6 & 1;\n var num_local_colors_pow2 = pf2 & 0x7;\n var num_local_colors = 1 << (num_local_colors_pow2 + 1);\n var palette_offset = global_palette_offset;\n var palette_size = global_palette_size;\n var has_local_palette = false;\n if (local_palette_flag) {\n var has_local_palette = true;\n palette_offset = p; // Override with local palette.\n palette_size = num_local_colors;\n p += num_local_colors * 3; // Seek past palette.\n }\n\n var data_offset = p;\n\n p++; // codesize\n while (true) {\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n p += block_size;\n }\n\n frames.push({x: x, y: y, width: w, height: h,\n has_local_palette: has_local_palette,\n palette_offset: palette_offset,\n palette_size: palette_size,\n data_offset: data_offset,\n data_length: p - data_offset,\n transparent_index: transparent_index,\n interlaced: !!interlace_flag,\n delay: delay,\n disposal: disposal});\n break;\n\n case 0x3b: // Trailer Marker (end of file).\n no_eof = false;\n break;\n\n default:\n throw new Error(\"Unknown gif block: 0x\" + buf[p-1].toString(16));\n break;\n }\n }\n\n this.numFrames = function() {\n return frames.length;\n };\n\n this.loopCount = function() {\n return loop_count;\n };\n\n this.frameInfo = function(frame_num) {\n if (frame_num < 0 || frame_num >= frames.length)\n throw new Error(\"Frame index out of range.\");\n return frames[frame_num];\n }\n\n this.decodeAndBlitFrameBGRA = function(frame_num, pixels) {\n var frame = this.frameInfo(frame_num);\n var num_pixels = frame.width * frame.height;\n var index_stream = new Uint8Array(num_pixels); // At most 8-bit indices.\n GifReaderLZWOutputIndexStream(\n buf, frame.data_offset, index_stream, num_pixels);\n var palette_offset = frame.palette_offset;\n\n // NOTE(deanm): It seems to be much faster to compare index to 256 than\n // to === null. Not sure why, but CompareStub_EQ_STRICT shows up high in\n // the profile, not sure if it's related to using a Uint8Array.\n var trans = frame.transparent_index;\n if (trans === null) trans = 256;\n\n // We are possibly just blitting to a portion of the entire frame.\n // That is a subrect within the framerect, so the additional pixels\n // must be skipped over after we finished a scanline.\n var framewidth = frame.width;\n var framestride = width - framewidth;\n var xleft = framewidth; // Number of subrect pixels left in scanline.\n\n // Output indicies of the top left and bottom right corners of the subrect.\n var opbeg = ((frame.y * width) + frame.x) * 4;\n var opend = ((frame.y + frame.height) * width + frame.x) * 4;\n var op = opbeg;\n\n var scanstride = framestride * 4;\n\n // Use scanstride to skip past the rows when interlacing. This is skipping\n // 7 rows for the first two passes, then 3 then 1.\n if (frame.interlaced === true) {\n scanstride += width * 4 * 7; // Pass 1.\n }\n\n var interlaceskip = 8; // Tracking the row interval in the current pass.\n\n for (var i = 0, il = index_stream.length; i < il; ++i) {\n var index = index_stream[i];\n\n if (xleft === 0) { // Beginning of new scan line\n op += scanstride;\n xleft = framewidth;\n if (op >= opend) { // Catch the wrap to switch passes when interlacing.\n scanstride = framestride * 4 + width * 4 * (interlaceskip-1);\n // interlaceskip / 2 * 4 is interlaceskip << 1.\n op = opbeg + (framewidth + framestride) * (interlaceskip << 1);\n interlaceskip >>= 1;\n }\n }\n\n if (index === trans) {\n op += 4;\n } else {\n var r = buf[palette_offset + index * 3];\n var g = buf[palette_offset + index * 3 + 1];\n var b = buf[palette_offset + index * 3 + 2];\n pixels[op++] = b;\n pixels[op++] = g;\n pixels[op++] = r;\n pixels[op++] = 255;\n }\n --xleft;\n }\n };\n\n // I will go to copy and paste hell one day...\n this.decodeAndBlitFrameRGBA = function(frame_num, pixels) {\n var frame = this.frameInfo(frame_num);\n var num_pixels = frame.width * frame.height;\n var index_stream = new Uint8Array(num_pixels); // At most 8-bit indices.\n GifReaderLZWOutputIndexStream(\n buf, frame.data_offset, index_stream, num_pixels);\n var palette_offset = frame.palette_offset;\n\n // NOTE(deanm): It seems to be much faster to compare index to 256 than\n // to === null. Not sure why, but CompareStub_EQ_STRICT shows up high in\n // the profile, not sure if it's related to using a Uint8Array.\n var trans = frame.transparent_index;\n if (trans === null) trans = 256;\n\n // We are possibly just blitting to a portion of the entire frame.\n // That is a subrect within the framerect, so the additional pixels\n // must be skipped over after we finished a scanline.\n var framewidth = frame.width;\n var framestride = width - framewidth;\n var xleft = framewidth; // Number of subrect pixels left in scanline.\n\n // Output indicies of the top left and bottom right corners of the subrect.\n var opbeg = ((frame.y * width) + frame.x) * 4;\n var opend = ((frame.y + frame.height) * width + frame.x) * 4;\n var op = opbeg;\n\n var scanstride = framestride * 4;\n\n // Use scanstride to skip past the rows when interlacing. This is skipping\n // 7 rows for the first two passes, then 3 then 1.\n if (frame.interlaced === true) {\n scanstride += width * 4 * 7; // Pass 1.\n }\n\n var interlaceskip = 8; // Tracking the row interval in the current pass.\n\n for (var i = 0, il = index_stream.length; i < il; ++i) {\n var index = index_stream[i];\n\n if (xleft === 0) { // Beginning of new scan line\n op += scanstride;\n xleft = framewidth;\n if (op >= opend) { // Catch the wrap to switch passes when interlacing.\n scanstride = framestride * 4 + width * 4 * (interlaceskip-1);\n // interlaceskip / 2 * 4 is interlaceskip << 1.\n op = opbeg + (framewidth + framestride) * (interlaceskip << 1);\n interlaceskip >>= 1;\n }\n }\n\n if (index === trans) {\n op += 4;\n } else {\n var r = buf[palette_offset + index * 3];\n var g = buf[palette_offset + index * 3 + 1];\n var b = buf[palette_offset + index * 3 + 2];\n pixels[op++] = r;\n pixels[op++] = g;\n pixels[op++] = b;\n pixels[op++] = 255;\n }\n --xleft;\n }\n };\n}\n\nfunction GifReaderLZWOutputIndexStream(code_stream, p, output, output_length) {\n var min_code_size = code_stream[p++];\n\n var clear_code = 1 << min_code_size;\n var eoi_code = clear_code + 1;\n var next_code = eoi_code + 1;\n\n var cur_code_size = min_code_size + 1; // Number of bits per code.\n // NOTE: This shares the same name as the encoder, but has a different\n // meaning here. Here this masks each code coming from the code stream.\n var code_mask = (1 << cur_code_size) - 1;\n var cur_shift = 0;\n var cur = 0;\n\n var op = 0; // Output pointer.\n\n var subblock_size = code_stream[p++];\n\n // TODO(deanm): Would using a TypedArray be any faster? At least it would\n // solve the fast mode / backing store uncertainty.\n // var code_table = Array(4096);\n var code_table = new Int32Array(4096); // Can be signed, we only use 20 bits.\n\n var prev_code = null; // Track code-1.\n\n while (true) {\n // Read up to two bytes, making sure we always 12-bits for max sized code.\n while (cur_shift < 16) {\n if (subblock_size === 0) break; // No more data to be read.\n\n cur |= code_stream[p++] << cur_shift;\n cur_shift += 8;\n\n if (subblock_size === 1) { // Never let it get to 0 to hold logic above.\n subblock_size = code_stream[p++]; // Next subblock.\n } else {\n --subblock_size;\n }\n }\n\n // TODO(deanm): We should never really get here, we should have received\n // and EOI.\n if (cur_shift < cur_code_size)\n break;\n\n var code = cur & code_mask;\n cur >>= cur_code_size;\n cur_shift -= cur_code_size;\n\n // TODO(deanm): Maybe should check that the first code was a clear code,\n // at least this is what you're supposed to do. But actually our encoder\n // now doesn't emit a clear code first anyway.\n if (code === clear_code) {\n // We don't actually have to clear the table. This could be a good idea\n // for greater error checking, but we don't really do any anyway. We\n // will just track it with next_code and overwrite old entries.\n\n next_code = eoi_code + 1;\n cur_code_size = min_code_size + 1;\n code_mask = (1 << cur_code_size) - 1;\n\n // Don't update prev_code ?\n prev_code = null;\n continue;\n } else if (code === eoi_code) {\n break;\n }\n\n // We have a similar situation as the decoder, where we want to store\n // variable length entries (code table entries), but we want to do in a\n // faster manner than an array of arrays. The code below stores sort of a\n // linked list within the code table, and then \"chases\" through it to\n // construct the dictionary entries. When a new entry is created, just the\n // last byte is stored, and the rest (prefix) of the entry is only\n // referenced by its table entry. Then the code chases through the\n // prefixes until it reaches a single byte code. We have to chase twice,\n // first to compute the length, and then to actually copy the data to the\n // output (backwards, since we know the length). The alternative would be\n // storing something in an intermediate stack, but that doesn't make any\n // more sense. I implemented an approach where it also stored the length\n // in the code table, although it's a bit tricky because you run out of\n // bits (12 + 12 + 8), but I didn't measure much improvements (the table\n // entries are generally not the long). Even when I created benchmarks for\n // very long table entries the complexity did not seem worth it.\n // The code table stores the prefix entry in 12 bits and then the suffix\n // byte in 8 bits, so each entry is 20 bits.\n\n var chase_code = code < next_code ? code : prev_code;\n\n // Chase what we will output, either {CODE} or {CODE-1}.\n var chase_length = 0;\n var chase = chase_code;\n while (chase > clear_code) {\n chase = code_table[chase] >> 8;\n ++chase_length;\n }\n\n var k = chase;\n\n var op_end = op + chase_length + (chase_code !== code ? 1 : 0);\n if (op_end > output_length) {\n console.log(\"Warning, gif stream longer than expected.\");\n return;\n }\n\n // Already have the first byte from the chase, might as well write it fast.\n output[op++] = k;\n\n op += chase_length;\n var b = op; // Track pointer, writing backwards.\n\n if (chase_code !== code) // The case of emitting {CODE-1} + k.\n output[op++] = k;\n\n chase = chase_code;\n while (chase_length--) {\n chase = code_table[chase];\n output[--b] = chase & 0xff; // Write backwards.\n chase >>= 8; // Pull down to the prefix code.\n }\n\n if (prev_code !== null && next_code < 4096) {\n code_table[next_code++] = prev_code << 8 | k;\n // TODO(deanm): Figure out this clearing vs code growth logic better. I\n // have an feeling that it should just happen somewhere else, for now it\n // is awkward between when we grow past the max and then hit a clear code.\n // For now just check if we hit the max 12-bits (then a clear code should\n // follow, also of course encoded in 12-bits).\n if (next_code >= code_mask+1 && cur_code_size < 12) {\n ++cur_code_size;\n code_mask = code_mask << 1 | 1;\n }\n }\n\n prev_code = code;\n }\n\n if (op !== output_length) {\n console.log(\"Warning, gif stream shorter than expected.\");\n }\n\n return output;\n}\n\n// CommonJS.\ntry { exports.GifWriter = GifWriter; exports.GifReader = GifReader } catch(e) {}\n","import { IMultimediaType } from '@leafer-ui/interface'\nimport { ImageData } from '@leafer-ui/draw'\n\n\nexport class FilmData extends ImageData {\n\n public get __urlType(): IMultimediaType { return 'film' }\n\n}","import { ILeafPaint, IFilmDecoder, IUI } from '@leafer-ui/interface'\nimport { isArray } from '@leafer-ui/draw'\n\nexport class PaintFilm {\n\n public element: IUI\n\n public get playerOptions(): ILeafPaint { const { fill } = (this.element || this as any).__; return isArray(fill) && fill.find(item => item.type === 'film') }\n\n public get decoder(): IFilmDecoder { const { playerOptions } = this; return playerOptions && playerOptions.image && playerOptions.image.view }\n\n\n constructor(element: IUI) {\n this.element = element\n }\n\n\n public togglePlay(): void {\n const { playerOptions } = this\n if (playerOptions) {\n if (playerOptions.paused) this.play()\n else this.pause()\n }\n }\n\n public play(): void {\n const { playerOptions } = this\n if (playerOptions && playerOptions.paused) {\n delete playerOptions.paused;\n (this.element || this as any).forceRender()\n }\n }\n\n public pause(): void {\n const { playerOptions } = this\n if (playerOptions) playerOptions.paused = true\n }\n\n public stop(): void {\n const { playerOptions } = this\n if (playerOptions) {\n delete playerOptions.frameTime\n playerOptions.nowIndex = 0\n this.pause()\n }\n }\n\n public seekFrame(frameIndex: number): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.nowIndex = frameIndex;\n (this.element || this as any).forceRender()\n }\n }\n\n}","import { IFilm, IFilmInputData, IFilmData, } from '@leafer-ui/interface'\nimport { Image, registerUI, dataProcessor, useModule } from '@leafer-ui/draw'\n\nimport { FilmData } from './data/FilmData'\nimport { PaintFilm } from './PaintFilm'\n\n\n@useModule(PaintFilm)\n@registerUI()\nexport class Film<TInputData = IFilmInputData> extends Image<TInputData> implements IFilm {\n\n public get __tag() { return 'Film' }\n\n @dataProcessor(FilmData)\n declare public __: IFilmData\n}\n\nexport interface Film {\n\n togglePlay(): void\n play(): void\n pause(): void\n stop(): void\n\n seekFrame(frameIndex: number): void\n\n}","import { LeaferFilm, Platform, Creator, FileHelper, PaintImage, Resource, Plugin } from '@leafer-ui/draw'\nimport { ILeaferFilm, ILeaferFilmConfig, IImageCrossOrigin, ILeaf, IFilmDecoder, ILeafPaint, IFilmFileType } from '@leafer-ui/interface'\n\nimport { FilmDecoder } from './FilmDecoder'\nimport { OmgFilmDecoder } from './OmgFilmDecoder'\nimport { getFileExt } from './helper/ext'\n\nexport { Film } from './Film'\nexport { FilmData } from './data/FilmData'\nexport { FilmDecoder } from './FilmDecoder'\nexport { PaintFilm } from './PaintFilm'\n\n\nPlugin.add('flim')\n\n\nPaintImage.film = function (paint: ILeafPaint): void {\n paint.film = true\n paint.nowIndex = 0\n}\n\nCreator.film = function (options?: ILeaferFilmConfig): ILeaferFilm {\n return new LeaferFilm(options)\n}\n\nResource.loadFilm = function (key: string, format?: IFilmFileType): Promise<ILeaferFilm> {\n return new Promise((resolve, reject) => {\n const config: ILeaferFilmConfig = { url: key }\n if (format) config.format = format\n const film = Creator.film(config)\n Resource.set(key, film)\n film.load(() => resolve(film), (e: any) => reject(e))\n })\n}\n\nLeaferFilm.prototype.render = function (canvas: any, x: number, y: number, width: number, height: number, leaf: ILeaf, paint: any, imageScaleX: number, imageScaleY: number): void {\n this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY)\n}\n\nFilmDecoder.register('gif', OmgFilmDecoder) // OmgFilmDecoder\n\nPlatform.origin.loadFilm = async function (url: string, _crossOrigin?: IImageCrossOrigin, leaferFilm?: ILeaferFilm): Promise<any> {\n const buffer = await Platform.origin.loadContent(url, 'arrayBuffer')\n\n let ext = getFileExt(url) // 获取文件后缀名\n\n if (!ext) {\n if (leaferFilm) ext = leaferFilm.config.format\n if (!ext) ext = 'gif'\n }\n\n const mimeType = FileHelper.mimeType(ext)\n const canUseFilmDecoder = await FilmDecoder.canUse(mimeType)\n\n let Decoder: any\n const tool = FilmDecoder.decoderMap[ext]\n\n if (!tool || (canUseFilmDecoder && !tool.force)) Decoder = FilmDecoder\n else Decoder = tool.Decoder\n\n if (!Decoder) throw new Error('no decoder: ' + mimeType)\n\n const decoder: IFilmDecoder = new Decoder()\n await decoder.decodeHeader(buffer, mimeType)\n\n return decoder\n}\n\n","import { IFilmFrame } from '@leafer-ui/interface'\nimport { Platform } from '@leafer-ui/draw'\n\nimport { GifReader } from 'omggif'\n\nimport { FilmDecoder } from './FilmDecoder'\n\n\nexport class OmgFilmDecoder extends FilmDecoder {\n\n public decoder: GifReader | any\n\n // 复用 RGBA buffer\n private decodeBuffer!: Uint8ClampedArray\n\n // 复用 ImageData(避免每帧 new)\n private sharedImageData!: ImageData\n\n // 只保留一个 restore 缓存(disposal=3)\n private restoreImageData: ImageData | null = null\n\n // --------------------------------------------------\n // 1️⃣ decodeHeader\n // --------------------------------------------------\n\n public async decodeHeader(data: ArrayBuffer): Promise<void> {\n const decoder = this.decoder = new GifReader(new Uint8Array(data))\n const { width, height } = decoder\n\n this.width = width\n this.height = height\n this.total = decoder.numFrames()\n this.loop = decoder.loopCount() || 0\n\n // 工作 canvas(永远只有一个)\n this.bufferCanvas = Platform.origin.createCanvas(width, height)\n this.bufferContext = this.bufferCanvas.getContext('2d')!\n\n // 复用 RGBA buffer\n this.decodeBuffer = new Uint8ClampedArray(width * height * 4)\n\n // 复用 ImageData\n this.sharedImageData = this.bufferContext.createImageData(width, height)\n\n this.createAtlas()\n\n // 首帧必须解\n await this.decodeFrame(0)\n }\n\n // --------------------------------------------------\n // 2️⃣ decodeFrame(顺序安全)\n // --------------------------------------------------\n\n public async decodeOneFrame(frameIndex: number): Promise<IFilmFrame> {\n const { decoder, decodeBuffer, bufferCanvas, bufferContext, sharedImageData } = this\n const info = decoder.frameInfo(frameIndex)\n\n // disposal=3 需要保存当前完整状态\n if (info.disposal === 3) this.restoreImageData = bufferContext.getImageData(0, 0, this.width, this.height)\n\n // 解码到 decodeBuffer\n decoder.decodeAndBlitFrameRGBA(frameIndex, decodeBuffer)\n\n // 复用 ImageData\n sharedImageData.data.set(decodeBuffer)\n\n // 绘制到 buffer\n bufferContext.putImageData(sharedImageData, 0, 0)\n\n let image: any\n\n if (this.atlas) {\n image = bufferCanvas\n } else {\n image = Platform.origin.createCanvas(this.width, this.height)\n const frameCtx = image.getContext('2d')!\n frameCtx.drawImage(bufferCanvas, 0, 0)\n }\n\n const frame: IFilmFrame = { image, duration: (info.delay || 10) / 100 }\n\n this.frames[frameIndex] = frame\n\n if (this.atlas) this.mergeFrame(frameIndex, false) // false 表示不物理销毁frame.image\n\n this.applyDisposal(info)\n\n return frame\n }\n\n // --------------------------------------------------\n // 3️⃣ disposal 处理\n // --------------------------------------------------\n\n private applyDisposal(info: any): void {\n const { bufferContext, restoreImageData } = this\n const disposal = info.disposal\n if (disposal === 2) {\n bufferContext.clearRect(info.x, info.y, info.width, info.height) // 恢复透明(当前帧区域)\n } else if (disposal === 3) {\n if (restoreImageData) {\n bufferContext.putImageData(restoreImageData, 0, 0)\n this.restoreImageData = null\n }\n }\n }\n\n // --------------------------------------------------\n // 5️⃣ destoryFrameImage\n // --------------------------------------------------\n\n public destoryFrameImage(frame: IFilmFrame): void {\n if (!frame.image) return\n\n const canvas = frame.image as HTMLCanvasElement\n\n // 强制释放 backing store\n canvas.width = 0\n canvas.height = 0\n\n delete frame.image\n }\n\n // --------------------------------------------------\n // 释放解码资源\n // --------------------------------------------------\n\n public destroyDecoder(): void {\n if (this.bufferCanvas) {\n this.bufferCanvas.width = 0\n this.bufferCanvas.height = 0\n\n this.decoder = null\n this.bufferCanvas = null\n this.bufferContext = null\n\n this.decodeBuffer = null\n this.sharedImageData = null\n this.restoreImageData = null\n }\n }\n}","export function getFileExt(url: string): string {\n if (!url) return ''\n\n if (url.startsWith('data:')) {\n const head = url.slice(5, url.indexOf(','))\n const slash = head.indexOf('/')\n const semi = head.indexOf(';')\n return slash > -1\n ? head.slice(slash + 1, semi > -1 ? semi : undefined).toLowerCase()\n : ''\n }\n\n let end = url.length\n const q = url.indexOf('?')\n const h = url.indexOf('#')\n if (q > -1 && q < end) end = q\n if (h > -1 && h < end) end = h\n\n const dot = url.lastIndexOf('.', end)\n const slash = url.lastIndexOf('/', end)\n\n return dot > slash ? url.slice(dot + 1, end).toLowerCase() : ''\n}"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","FilmDecoder","constructor","this","frames","decodedIndex","register","type","Decoder","force","decoderMap","canUse","mimeType","supportMap","isUndefined","ImageDecoder","isTypeSupported","createAtlas","width","height","total","maxAtlasSize","columns","Math","ceil","sqrt","rows","atlasGrid","x","y","atlas","Platform","origin","createCanvas","atlasContext","getContext","decodeHeader","data","decoder","tracks","ready","first","decodeFrame","displayWidth","displayHeight","image","selectedTrack","frameCount","loop","repetitionCount","mergeFrame","frameIndex","frame","decoding","decodeOneFrame","decode","duration","destoryFrameImage","floor","drawImage","render","canvas","leaf","playOptions","_imageScaleX","_imageScaleY","nowIndex","paused","speed","pauseIndex","frameTimer","renderFrame","nextIndex","isFinite","finally","destroyDecoder","setTimeout","forceRender","canRender","destoryFrame","deleteIndex","close","forEach","_item","index","maxPatternSize","GifReaderLZWOutputIndexStream","code_stream","p","output","output_length","min_code_size","clear_code","eoi_code","next_code","cur_code_size","code_mask","cur_shift","cur","op","subblock_size","code_table","Int32Array","prev_code","code","chase_code","chase_length","chase","k","console","log","b","omggif","GifWriter","buf","gopts","loop_count","undefined","global_palette","palette","Error","check_palette_and_num_colors","num_colors","gp_num_colors_pow2","background","gp_num_colors","il","rgb","ended","addFrame","w","h","indexed_pixels","opts","using_local_palette","delay","disposal","use_transparency","transparent_index","transparent","index_stream","cur_subblock","emit_bytes_to_buffer","bit_block_size","emit_code","ib_code","cur_key","cur_code","GifWriterOutputLZWCodeStream","end","getOutputBuffer","setOutputBuffer","v","getOutputBufferPosition","setOutputBufferPosition","GifReader_1","GifReader","pf0","global_palette_flag","num_global_colors","global_palette_offset","global_palette_size","no_eof","block_size","pf1","toString","pf2","interlace_flag","num_local_colors","palette_offset","palette_size","has_local_palette","data_offset","push","data_length","interlaced","numFrames","loopCount","frameInfo","frame_num","decodeAndBlitFrameBGRA","pixels","num_pixels","Uint8Array","trans","framewidth","framestride","xleft","opbeg","opend","scanstride","interlaceskip","g","decodeAndBlitFrameRGBA","FilmData","ImageData","__urlType","PaintFilm","playerOptions","fill","element","__","isArray","find","item","view","togglePlay","play","pause","stop","frameTime","seekFrame","Film","Image","__tag","dataProcessor","prototype","useModule","registerUI","Plugin","add","PaintImage","film","paint","Creator","options","LeaferFilm","Resource","loadFilm","format","config","url","set","load","imageScaleX","imageScaleY","restoreImageData","bufferCanvas","bufferContext","decodeBuffer","Uint8ClampedArray","sharedImageData","createImageData","info","getImageData","putImageData","applyDisposal","clearRect","_crossOrigin","leaferFilm","buffer","loadContent","ext","startsWith","head","slice","indexOf","slash","semi","toLowerCase","q","dot","lastIndexOf","getFileExt","FileHelper","canUseFilmDecoder","tool"],"mappings":"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","x_google_ignoreList":[0,2]}
1
+ {"version":3,"file":"film.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/film/src/FilmDecoder.ts","../../../../../node_modules/.pnpm/omggif@1.0.10/node_modules/omggif/omggif.js","../../../../../../src/in/packages/film/src/data/FilmData.ts","../../../../../../src/in/packages/film/src/PaintFilm.ts","../../../../../../src/in/packages/film/src/Film.ts","../../../../../../src/in/packages/film/src/index.ts","../../../../../../src/in/packages/film/src/OmgFilmDecoder.ts","../../../../../../src/in/packages/film/src/helper/ext.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { isUndefined, Platform } from '@leafer-ui/draw'\nimport { ICanvasContext2D, IFilmDecoder, IFilmFileType, IFilmFrame, ILeaf, IPointData, IBooleanMap, IFilmPlayOptions } from '@leafer-ui/interface'\n\n\ninterface IFilmDecoderMap {\n [name: string]: { Decoder: any, force?: boolean }\n}\n\nexport class FilmDecoder implements IFilmDecoder {\n\n public width: number // 宽度\n public height: number // 高度\n\n public total: number // 总的帧数\n public loop: number // 循环次数,为0表示无限循环\n\n public frames: IFilmFrame[] = [] // 帧数据\n public decodedIndex = -1 // 当前解码到第几帧\n\n public atlas?: any // 合并图\n public atlasContext?: ICanvasContext2D // 合并图的上下文手柄\n public atlasGrid?: IPointData // 横竖的排列数量\n\n public decoder: ImageDecoder // 解码器\n\n // 缓冲画布\n public bufferCanvas?: any\n public bufferContext?: ICanvasContext2D\n\n\n static decoderMap: IFilmDecoderMap = {}\n static supportMap: IBooleanMap = {}\n static maxAtlasSize = Platform.image.maxPatternSize\n\n static register(type: IFilmFileType, Decoder: any, force?: boolean): void {\n FilmDecoder.decoderMap[type] = { Decoder, force }\n }\n\n static async canUse(mimeType: string) {\n const { supportMap } = this\n let canUse = supportMap[mimeType]\n if (!isUndefined(canUse)) return canUse\n if (typeof ImageDecoder === 'undefined') return false\n canUse = await ImageDecoder.isTypeSupported(mimeType)\n return supportMap[mimeType] = canUse\n }\n\n\n public createAtlas(): void {\n const { width, height, total } = this\n if (width * height * total <= FilmDecoder.maxAtlasSize) {\n // 合并所有帧到一张大图里(画布能放下所有帧时)\n const columns = Math.ceil(Math.sqrt(total * height / width))\n const rows = Math.ceil(total / columns)\n this.atlasGrid = { x: columns, y: rows }\n this.atlas = Platform.origin.createCanvas(width * columns, height * rows)\n this.atlasContext = this.atlas.getContext('2d')\n }\n }\n\n public async decodeHeader(data: ArrayBuffer, type: string): Promise<void> {\n this.decoder = new ImageDecoder({ data, type })\n\n await this.decoder.tracks.ready\n const first = await this.decodeFrame(0)\n\n const { displayWidth, displayHeight } = first.image, { selectedTrack } = this.decoder.tracks\n this.width = displayWidth\n this.height = displayHeight\n this.total = selectedTrack.frameCount\n this.loop = selectedTrack.repetitionCount\n\n this.createAtlas()\n if (this.atlas) this.mergeFrame(0) // 因为已经读取了第一帧,存在合并图时,必须再次合并进去\n }\n\n public async decodeFrame(frameIndex: number): Promise<IFilmFrame> {\n const { frames } = this, frame = frames[frameIndex]\n if (frame && !frame.decoding) return frame\n\n // 必须顺序解码\n for (let i = this.decodedIndex + 1; i <= frameIndex; i++) {\n await this.decodeOneFrame(i)\n this.decodedIndex = i\n }\n\n return frames[frameIndex]\n }\n\n public async decodeOneFrame(frameIndex: number): Promise<IFilmFrame> {\n return new Promise((resolve) => {\n this.decoder.decode({ frameIndex }).then(result => {\n const { image } = result\n const frame: IFilmFrame = { image, duration: image.duration / 1000 / 1000 } // duration单位为秒\n this.frames[frameIndex] = frame\n if (this.atlas) this.mergeFrame(frameIndex)\n resolve(frame)\n })\n })\n }\n\n // 绘制当前帧到atlas合并图中\n public mergeFrame(frameIndex: number, destoryFrameImage: boolean = true): void {\n const frame = this.frames[frameIndex], { atlasGrid, width, height } = this\n frame.x = (frameIndex % atlasGrid.x) * width\n frame.y = Math.floor(frameIndex / atlasGrid.x) * height\n this.atlasContext.drawImage(frame.image, frame.x, frame.y)\n if (destoryFrameImage) this.destoryFrameImage(frame)\n else delete frame.image\n }\n\n public render(canvas: ICanvasContext2D, x: number, y: number, width: number, height: number, leaf: ILeaf, playOptions: IFilmPlayOptions, _imageScaleX: number, _imageScaleY: number): void {\n let { nowIndex, paused, speed, pauseIndex, loop, frameTimer } = playOptions\n\n if (isUndefined(nowIndex)) nowIndex = 0\n\n const { frames } = this, frame = frames[nowIndex]\n\n if (this.renderFrame(frame, canvas, x, y, width, height)) {\n\n if (frameTimer) return // 避免重复等待下一帧\n if (!isUndefined(pauseIndex) && nowIndex === pauseIndex) { // 播放到暂停帧为止\n playOptions.paused = true\n return\n }\n\n let nextIndex = nowIndex + 1\n\n if (nextIndex >= this.total) {\n if (this.loop && isFinite(this.loop)) { // 限制循环次数\n loop = (loop as number || 0) + 1\n if (loop > this.loop) return\n playOptions.loop = loop\n }\n nextIndex = 0\n }\n\n if (nextIndex < this.total && !frames[nextIndex]) {\n frames[nextIndex] = { duration: 0, decoding: true } // 先占位,表示正在解码中\n this.decodeFrame(nextIndex).finally(() => {\n if (this.decodedIndex === this.total - 1) this.destroyDecoder()\n })\n }\n\n if (paused) return\n\n playOptions.frameTimer = setTimeout(() => {\n\n playOptions.nowIndex = nextIndex\n delete playOptions.frameTimer\n leaf.forceRender()\n\n }, frame.duration * (speed || 1) * 1000)\n\n } else {\n\n this.renderFrame(frames[nowIndex - 1], canvas, x, y, width, height) // 暂时渲染上一帧顶替\n leaf.forceRender() // 防止停掉\n }\n }\n\n private renderFrame(frame: IFilmFrame, canvas: ICanvasContext2D, x: number, y: number, width: number, height: number): boolean {\n const canRender = frame && !frame.decoding, { atlas } = this\n if (canRender) {\n if (atlas) canvas.drawImage(atlas, frame.x, frame.y, this.width, this.height, x, y, width, height)\n else canvas.drawImage(frame.image, x, y, width, height)\n }\n return canRender\n }\n\n // 销毁单帧\n public destoryFrame(frameIndex: number, deleteIndex: boolean = true): void {\n const { frames } = this, frame = frames[frameIndex]\n if (frame) {\n this.destoryFrameImage(frame)\n if (deleteIndex) delete frames[frameIndex]\n }\n }\n\n // 销毁单帧内的VideoFrame或canvas对象\n public destoryFrameImage(frame: IFilmFrame): void {\n const { image } = frame\n if (image && image.close) image.close()\n delete frame.image\n }\n\n public destroyDecoder(): void {\n if (this.decoder) {\n this.decoder.close()\n this.decoder = null\n }\n }\n\n public close(): void {\n if (this.atlas) this.atlas = this.atlasContext = null\n this.frames.forEach((_item, index) => this.destoryFrame(index, false))\n this.frames.length = 0\n this.destroyDecoder()\n }\n\n}\n","// (c) Dean McNamee <dean@gmail.com>, 2013.\n//\n// https://github.com/deanm/omggif\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n//\n// omggif is a JavaScript implementation of a GIF 89a encoder and decoder,\n// including animation and compression. It does not rely on any specific\n// underlying system, so should run in the browser, Node, or Plask.\n\n\"use strict\";\n\nfunction GifWriter(buf, width, height, gopts) {\n var p = 0;\n\n var gopts = gopts === undefined ? { } : gopts;\n var loop_count = gopts.loop === undefined ? null : gopts.loop;\n var global_palette = gopts.palette === undefined ? null : gopts.palette;\n\n if (width <= 0 || height <= 0 || width > 65535 || height > 65535)\n throw new Error(\"Width/Height invalid.\");\n\n function check_palette_and_num_colors(palette) {\n var num_colors = palette.length;\n if (num_colors < 2 || num_colors > 256 || num_colors & (num_colors-1)) {\n throw new Error(\n \"Invalid code/color length, must be power of 2 and 2 .. 256.\");\n }\n return num_colors;\n }\n\n // - Header.\n buf[p++] = 0x47; buf[p++] = 0x49; buf[p++] = 0x46; // GIF\n buf[p++] = 0x38; buf[p++] = 0x39; buf[p++] = 0x61; // 89a\n\n // Handling of Global Color Table (palette) and background index.\n var gp_num_colors_pow2 = 0;\n var background = 0;\n if (global_palette !== null) {\n var gp_num_colors = check_palette_and_num_colors(global_palette);\n while (gp_num_colors >>= 1) ++gp_num_colors_pow2;\n gp_num_colors = 1 << gp_num_colors_pow2;\n --gp_num_colors_pow2;\n if (gopts.background !== undefined) {\n background = gopts.background;\n if (background >= gp_num_colors)\n throw new Error(\"Background index out of range.\");\n // The GIF spec states that a background index of 0 should be ignored, so\n // this is probably a mistake and you really want to set it to another\n // slot in the palette. But actually in the end most browsers, etc end\n // up ignoring this almost completely (including for dispose background).\n if (background === 0)\n throw new Error(\"Background index explicitly passed as 0.\");\n }\n }\n\n // - Logical Screen Descriptor.\n // NOTE(deanm): w/h apparently ignored by implementations, but set anyway.\n buf[p++] = width & 0xff; buf[p++] = width >> 8 & 0xff;\n buf[p++] = height & 0xff; buf[p++] = height >> 8 & 0xff;\n // NOTE: Indicates 0-bpp original color resolution (unused?).\n buf[p++] = (global_palette !== null ? 0x80 : 0) | // Global Color Table Flag.\n gp_num_colors_pow2; // NOTE: No sort flag (unused?).\n buf[p++] = background; // Background Color Index.\n buf[p++] = 0; // Pixel aspect ratio (unused?).\n\n // - Global Color Table\n if (global_palette !== null) {\n for (var i = 0, il = global_palette.length; i < il; ++i) {\n var rgb = global_palette[i];\n buf[p++] = rgb >> 16 & 0xff;\n buf[p++] = rgb >> 8 & 0xff;\n buf[p++] = rgb & 0xff;\n }\n }\n\n if (loop_count !== null) { // Netscape block for looping.\n if (loop_count < 0 || loop_count > 65535)\n throw new Error(\"Loop count invalid.\")\n // Extension code, label, and length.\n buf[p++] = 0x21; buf[p++] = 0xff; buf[p++] = 0x0b;\n // NETSCAPE2.0\n buf[p++] = 0x4e; buf[p++] = 0x45; buf[p++] = 0x54; buf[p++] = 0x53;\n buf[p++] = 0x43; buf[p++] = 0x41; buf[p++] = 0x50; buf[p++] = 0x45;\n buf[p++] = 0x32; buf[p++] = 0x2e; buf[p++] = 0x30;\n // Sub-block\n buf[p++] = 0x03; buf[p++] = 0x01;\n buf[p++] = loop_count & 0xff; buf[p++] = loop_count >> 8 & 0xff;\n buf[p++] = 0x00; // Terminator.\n }\n\n\n var ended = false;\n\n this.addFrame = function(x, y, w, h, indexed_pixels, opts) {\n if (ended === true) { --p; ended = false; } // Un-end.\n\n opts = opts === undefined ? { } : opts;\n\n // TODO(deanm): Bounds check x, y. Do they need to be within the virtual\n // canvas width/height, I imagine?\n if (x < 0 || y < 0 || x > 65535 || y > 65535)\n throw new Error(\"x/y invalid.\")\n\n if (w <= 0 || h <= 0 || w > 65535 || h > 65535)\n throw new Error(\"Width/Height invalid.\")\n\n if (indexed_pixels.length < w * h)\n throw new Error(\"Not enough pixels for the frame size.\");\n\n var using_local_palette = true;\n var palette = opts.palette;\n if (palette === undefined || palette === null) {\n using_local_palette = false;\n palette = global_palette;\n }\n\n if (palette === undefined || palette === null)\n throw new Error(\"Must supply either a local or global palette.\");\n\n var num_colors = check_palette_and_num_colors(palette);\n\n // Compute the min_code_size (power of 2), destroying num_colors.\n var min_code_size = 0;\n while (num_colors >>= 1) ++min_code_size;\n num_colors = 1 << min_code_size; // Now we can easily get it back.\n\n var delay = opts.delay === undefined ? 0 : opts.delay;\n\n // From the spec:\n // 0 - No disposal specified. The decoder is\n // not required to take any action.\n // 1 - Do not dispose. The graphic is to be left\n // in place.\n // 2 - Restore to background color. The area used by the\n // graphic must be restored to the background color.\n // 3 - Restore to previous. The decoder is required to\n // restore the area overwritten by the graphic with\n // what was there prior to rendering the graphic.\n // 4-7 - To be defined.\n // NOTE(deanm): Dispose background doesn't really work, apparently most\n // browsers ignore the background palette index and clear to transparency.\n var disposal = opts.disposal === undefined ? 0 : opts.disposal;\n if (disposal < 0 || disposal > 3) // 4-7 is reserved.\n throw new Error(\"Disposal out of range.\");\n\n var use_transparency = false;\n var transparent_index = 0;\n if (opts.transparent !== undefined && opts.transparent !== null) {\n use_transparency = true;\n transparent_index = opts.transparent;\n if (transparent_index < 0 || transparent_index >= num_colors)\n throw new Error(\"Transparent color index.\");\n }\n\n if (disposal !== 0 || use_transparency || delay !== 0) {\n // - Graphics Control Extension\n buf[p++] = 0x21; buf[p++] = 0xf9; // Extension / Label.\n buf[p++] = 4; // Byte size.\n\n buf[p++] = disposal << 2 | (use_transparency === true ? 1 : 0);\n buf[p++] = delay & 0xff; buf[p++] = delay >> 8 & 0xff;\n buf[p++] = transparent_index; // Transparent color index.\n buf[p++] = 0; // Block Terminator.\n }\n\n // - Image Descriptor\n buf[p++] = 0x2c; // Image Seperator.\n buf[p++] = x & 0xff; buf[p++] = x >> 8 & 0xff; // Left.\n buf[p++] = y & 0xff; buf[p++] = y >> 8 & 0xff; // Top.\n buf[p++] = w & 0xff; buf[p++] = w >> 8 & 0xff;\n buf[p++] = h & 0xff; buf[p++] = h >> 8 & 0xff;\n // NOTE: No sort flag (unused?).\n // TODO(deanm): Support interlace.\n buf[p++] = using_local_palette === true ? (0x80 | (min_code_size-1)) : 0;\n\n // - Local Color Table\n if (using_local_palette === true) {\n for (var i = 0, il = palette.length; i < il; ++i) {\n var rgb = palette[i];\n buf[p++] = rgb >> 16 & 0xff;\n buf[p++] = rgb >> 8 & 0xff;\n buf[p++] = rgb & 0xff;\n }\n }\n\n p = GifWriterOutputLZWCodeStream(\n buf, p, min_code_size < 2 ? 2 : min_code_size, indexed_pixels);\n\n return p;\n };\n\n this.end = function() {\n if (ended === false) {\n buf[p++] = 0x3b; // Trailer.\n ended = true;\n }\n return p;\n };\n\n this.getOutputBuffer = function() { return buf; };\n this.setOutputBuffer = function(v) { buf = v; };\n this.getOutputBufferPosition = function() { return p; };\n this.setOutputBufferPosition = function(v) { p = v; };\n}\n\n// Main compression routine, palette indexes -> LZW code stream.\n// |index_stream| must have at least one entry.\nfunction GifWriterOutputLZWCodeStream(buf, p, min_code_size, index_stream) {\n buf[p++] = min_code_size;\n var cur_subblock = p++; // Pointing at the length field.\n\n var clear_code = 1 << min_code_size;\n var code_mask = clear_code - 1;\n var eoi_code = clear_code + 1;\n var next_code = eoi_code + 1;\n\n var cur_code_size = min_code_size + 1; // Number of bits per code.\n var cur_shift = 0;\n // We have at most 12-bit codes, so we should have to hold a max of 19\n // bits here (and then we would write out).\n var cur = 0;\n\n function emit_bytes_to_buffer(bit_block_size) {\n while (cur_shift >= bit_block_size) {\n buf[p++] = cur & 0xff;\n cur >>= 8; cur_shift -= 8;\n if (p === cur_subblock + 256) { // Finished a subblock.\n buf[cur_subblock] = 255;\n cur_subblock = p++;\n }\n }\n }\n\n function emit_code(c) {\n cur |= c << cur_shift;\n cur_shift += cur_code_size;\n emit_bytes_to_buffer(8);\n }\n\n // I am not an expert on the topic, and I don't want to write a thesis.\n // However, it is good to outline here the basic algorithm and the few data\n // structures and optimizations here that make this implementation fast.\n // The basic idea behind LZW is to build a table of previously seen runs\n // addressed by a short id (herein called output code). All data is\n // referenced by a code, which represents one or more values from the\n // original input stream. All input bytes can be referenced as the same\n // value as an output code. So if you didn't want any compression, you\n // could more or less just output the original bytes as codes (there are\n // some details to this, but it is the idea). In order to achieve\n // compression, values greater then the input range (codes can be up to\n // 12-bit while input only 8-bit) represent a sequence of previously seen\n // inputs. The decompressor is able to build the same mapping while\n // decoding, so there is always a shared common knowledge between the\n // encoding and decoder, which is also important for \"timing\" aspects like\n // how to handle variable bit width code encoding.\n //\n // One obvious but very important consequence of the table system is there\n // is always a unique id (at most 12-bits) to map the runs. 'A' might be\n // 4, then 'AA' might be 10, 'AAA' 11, 'AAAA' 12, etc. This relationship\n // can be used for an effecient lookup strategy for the code mapping. We\n // need to know if a run has been seen before, and be able to map that run\n // to the output code. Since we start with known unique ids (input bytes),\n // and then from those build more unique ids (table entries), we can\n // continue this chain (almost like a linked list) to always have small\n // integer values that represent the current byte chains in the encoder.\n // This means instead of tracking the input bytes (AAAABCD) to know our\n // current state, we can track the table entry for AAAABC (it is guaranteed\n // to exist by the nature of the algorithm) and the next character D.\n // Therefor the tuple of (table_entry, byte) is guaranteed to also be\n // unique. This allows us to create a simple lookup key for mapping input\n // sequences to codes (table indices) without having to store or search\n // any of the code sequences. So if 'AAAA' has a table entry of 12, the\n // tuple of ('AAAA', K) for any input byte K will be unique, and can be our\n // key. This leads to a integer value at most 20-bits, which can always\n // fit in an SMI value and be used as a fast sparse array / object key.\n\n // Output code for the current contents of the index buffer.\n var ib_code = index_stream[0] & code_mask; // Load first input index.\n var code_table = { }; // Key'd on our 20-bit \"tuple\".\n\n emit_code(clear_code); // Spec says first code should be a clear code.\n\n // First index already loaded, process the rest of the stream.\n for (var i = 1, il = index_stream.length; i < il; ++i) {\n var k = index_stream[i] & code_mask;\n var cur_key = ib_code << 8 | k; // (prev, k) unique tuple.\n var cur_code = code_table[cur_key]; // buffer + k.\n\n // Check if we have to create a new code table entry.\n if (cur_code === undefined) { // We don't have buffer + k.\n // Emit index buffer (without k).\n // This is an inline version of emit_code, because this is the core\n // writing routine of the compressor (and V8 cannot inline emit_code\n // because it is a closure here in a different context). Additionally\n // we can call emit_byte_to_buffer less often, because we can have\n // 30-bits (from our 31-bit signed SMI), and we know our codes will only\n // be 12-bits, so can safely have 18-bits there without overflow.\n // emit_code(ib_code);\n cur |= ib_code << cur_shift;\n cur_shift += cur_code_size;\n while (cur_shift >= 8) {\n buf[p++] = cur & 0xff;\n cur >>= 8; cur_shift -= 8;\n if (p === cur_subblock + 256) { // Finished a subblock.\n buf[cur_subblock] = 255;\n cur_subblock = p++;\n }\n }\n\n if (next_code === 4096) { // Table full, need a clear.\n emit_code(clear_code);\n next_code = eoi_code + 1;\n cur_code_size = min_code_size + 1;\n code_table = { };\n } else { // Table not full, insert a new entry.\n // Increase our variable bit code sizes if necessary. This is a bit\n // tricky as it is based on \"timing\" between the encoding and\n // decoder. From the encoders perspective this should happen after\n // we've already emitted the index buffer and are about to create the\n // first table entry that would overflow our current code bit size.\n if (next_code >= (1 << cur_code_size)) ++cur_code_size;\n code_table[cur_key] = next_code++; // Insert into code table.\n }\n\n ib_code = k; // Index buffer to single input k.\n } else {\n ib_code = cur_code; // Index buffer to sequence in code table.\n }\n }\n\n emit_code(ib_code); // There will still be something in the index buffer.\n emit_code(eoi_code); // End Of Information.\n\n // Flush / finalize the sub-blocks stream to the buffer.\n emit_bytes_to_buffer(1);\n\n // Finish the sub-blocks, writing out any unfinished lengths and\n // terminating with a sub-block of length 0. If we have already started\n // but not yet used a sub-block it can just become the terminator.\n if (cur_subblock + 1 === p) { // Started but unused.\n buf[cur_subblock] = 0;\n } else { // Started and used, write length and additional terminator block.\n buf[cur_subblock] = p - cur_subblock - 1;\n buf[p++] = 0;\n }\n return p;\n}\n\nfunction GifReader(buf) {\n var p = 0;\n\n // - Header (GIF87a or GIF89a).\n if (buf[p++] !== 0x47 || buf[p++] !== 0x49 || buf[p++] !== 0x46 ||\n buf[p++] !== 0x38 || (buf[p++]+1 & 0xfd) !== 0x38 || buf[p++] !== 0x61) {\n throw new Error(\"Invalid GIF 87a/89a header.\");\n }\n\n // - Logical Screen Descriptor.\n var width = buf[p++] | buf[p++] << 8;\n var height = buf[p++] | buf[p++] << 8;\n var pf0 = buf[p++]; // <Packed Fields>.\n var global_palette_flag = pf0 >> 7;\n var num_global_colors_pow2 = pf0 & 0x7;\n var num_global_colors = 1 << (num_global_colors_pow2 + 1);\n var background = buf[p++];\n buf[p++]; // Pixel aspect ratio (unused?).\n\n var global_palette_offset = null;\n var global_palette_size = null;\n\n if (global_palette_flag) {\n global_palette_offset = p;\n global_palette_size = num_global_colors;\n p += num_global_colors * 3; // Seek past palette.\n }\n\n var no_eof = true;\n\n var frames = [ ];\n\n var delay = 0;\n var transparent_index = null;\n var disposal = 0; // 0 - No disposal specified.\n var loop_count = null;\n\n this.width = width;\n this.height = height;\n\n while (no_eof && p < buf.length) {\n switch (buf[p++]) {\n case 0x21: // Graphics Control Extension Block\n switch (buf[p++]) {\n case 0xff: // Application specific block\n // Try if it's a Netscape block (with animation loop counter).\n if (buf[p ] !== 0x0b || // 21 FF already read, check block size.\n // NETSCAPE2.0\n buf[p+1 ] == 0x4e && buf[p+2 ] == 0x45 && buf[p+3 ] == 0x54 &&\n buf[p+4 ] == 0x53 && buf[p+5 ] == 0x43 && buf[p+6 ] == 0x41 &&\n buf[p+7 ] == 0x50 && buf[p+8 ] == 0x45 && buf[p+9 ] == 0x32 &&\n buf[p+10] == 0x2e && buf[p+11] == 0x30 &&\n // Sub-block\n buf[p+12] == 0x03 && buf[p+13] == 0x01 && buf[p+16] == 0) {\n p += 14;\n loop_count = buf[p++] | buf[p++] << 8;\n p++; // Skip terminator.\n } else { // We don't know what it is, just try to get past it.\n p += 12;\n while (true) { // Seek through subblocks.\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n p += block_size;\n }\n }\n break;\n\n case 0xf9: // Graphics Control Extension\n if (buf[p++] !== 0x4 || buf[p+4] !== 0)\n throw new Error(\"Invalid graphics extension block.\");\n var pf1 = buf[p++];\n delay = buf[p++] | buf[p++] << 8;\n transparent_index = buf[p++];\n if ((pf1 & 1) === 0) transparent_index = null;\n disposal = pf1 >> 2 & 0x7;\n p++; // Skip terminator.\n break;\n\n case 0xfe: // Comment Extension.\n while (true) { // Seek through subblocks.\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n // console.log(buf.slice(p, p+block_size).toString('ascii'));\n p += block_size;\n }\n break;\n\n default:\n throw new Error(\n \"Unknown graphic control label: 0x\" + buf[p-1].toString(16));\n }\n break;\n\n case 0x2c: // Image Descriptor.\n var x = buf[p++] | buf[p++] << 8;\n var y = buf[p++] | buf[p++] << 8;\n var w = buf[p++] | buf[p++] << 8;\n var h = buf[p++] | buf[p++] << 8;\n var pf2 = buf[p++];\n var local_palette_flag = pf2 >> 7;\n var interlace_flag = pf2 >> 6 & 1;\n var num_local_colors_pow2 = pf2 & 0x7;\n var num_local_colors = 1 << (num_local_colors_pow2 + 1);\n var palette_offset = global_palette_offset;\n var palette_size = global_palette_size;\n var has_local_palette = false;\n if (local_palette_flag) {\n var has_local_palette = true;\n palette_offset = p; // Override with local palette.\n palette_size = num_local_colors;\n p += num_local_colors * 3; // Seek past palette.\n }\n\n var data_offset = p;\n\n p++; // codesize\n while (true) {\n var block_size = buf[p++];\n // Bad block size (ex: undefined from an out of bounds read).\n if (!(block_size >= 0)) throw Error(\"Invalid block size\");\n if (block_size === 0) break; // 0 size is terminator\n p += block_size;\n }\n\n frames.push({x: x, y: y, width: w, height: h,\n has_local_palette: has_local_palette,\n palette_offset: palette_offset,\n palette_size: palette_size,\n data_offset: data_offset,\n data_length: p - data_offset,\n transparent_index: transparent_index,\n interlaced: !!interlace_flag,\n delay: delay,\n disposal: disposal});\n break;\n\n case 0x3b: // Trailer Marker (end of file).\n no_eof = false;\n break;\n\n default:\n throw new Error(\"Unknown gif block: 0x\" + buf[p-1].toString(16));\n break;\n }\n }\n\n this.numFrames = function() {\n return frames.length;\n };\n\n this.loopCount = function() {\n return loop_count;\n };\n\n this.frameInfo = function(frame_num) {\n if (frame_num < 0 || frame_num >= frames.length)\n throw new Error(\"Frame index out of range.\");\n return frames[frame_num];\n }\n\n this.decodeAndBlitFrameBGRA = function(frame_num, pixels) {\n var frame = this.frameInfo(frame_num);\n var num_pixels = frame.width * frame.height;\n var index_stream = new Uint8Array(num_pixels); // At most 8-bit indices.\n GifReaderLZWOutputIndexStream(\n buf, frame.data_offset, index_stream, num_pixels);\n var palette_offset = frame.palette_offset;\n\n // NOTE(deanm): It seems to be much faster to compare index to 256 than\n // to === null. Not sure why, but CompareStub_EQ_STRICT shows up high in\n // the profile, not sure if it's related to using a Uint8Array.\n var trans = frame.transparent_index;\n if (trans === null) trans = 256;\n\n // We are possibly just blitting to a portion of the entire frame.\n // That is a subrect within the framerect, so the additional pixels\n // must be skipped over after we finished a scanline.\n var framewidth = frame.width;\n var framestride = width - framewidth;\n var xleft = framewidth; // Number of subrect pixels left in scanline.\n\n // Output indicies of the top left and bottom right corners of the subrect.\n var opbeg = ((frame.y * width) + frame.x) * 4;\n var opend = ((frame.y + frame.height) * width + frame.x) * 4;\n var op = opbeg;\n\n var scanstride = framestride * 4;\n\n // Use scanstride to skip past the rows when interlacing. This is skipping\n // 7 rows for the first two passes, then 3 then 1.\n if (frame.interlaced === true) {\n scanstride += width * 4 * 7; // Pass 1.\n }\n\n var interlaceskip = 8; // Tracking the row interval in the current pass.\n\n for (var i = 0, il = index_stream.length; i < il; ++i) {\n var index = index_stream[i];\n\n if (xleft === 0) { // Beginning of new scan line\n op += scanstride;\n xleft = framewidth;\n if (op >= opend) { // Catch the wrap to switch passes when interlacing.\n scanstride = framestride * 4 + width * 4 * (interlaceskip-1);\n // interlaceskip / 2 * 4 is interlaceskip << 1.\n op = opbeg + (framewidth + framestride) * (interlaceskip << 1);\n interlaceskip >>= 1;\n }\n }\n\n if (index === trans) {\n op += 4;\n } else {\n var r = buf[palette_offset + index * 3];\n var g = buf[palette_offset + index * 3 + 1];\n var b = buf[palette_offset + index * 3 + 2];\n pixels[op++] = b;\n pixels[op++] = g;\n pixels[op++] = r;\n pixels[op++] = 255;\n }\n --xleft;\n }\n };\n\n // I will go to copy and paste hell one day...\n this.decodeAndBlitFrameRGBA = function(frame_num, pixels) {\n var frame = this.frameInfo(frame_num);\n var num_pixels = frame.width * frame.height;\n var index_stream = new Uint8Array(num_pixels); // At most 8-bit indices.\n GifReaderLZWOutputIndexStream(\n buf, frame.data_offset, index_stream, num_pixels);\n var palette_offset = frame.palette_offset;\n\n // NOTE(deanm): It seems to be much faster to compare index to 256 than\n // to === null. Not sure why, but CompareStub_EQ_STRICT shows up high in\n // the profile, not sure if it's related to using a Uint8Array.\n var trans = frame.transparent_index;\n if (trans === null) trans = 256;\n\n // We are possibly just blitting to a portion of the entire frame.\n // That is a subrect within the framerect, so the additional pixels\n // must be skipped over after we finished a scanline.\n var framewidth = frame.width;\n var framestride = width - framewidth;\n var xleft = framewidth; // Number of subrect pixels left in scanline.\n\n // Output indicies of the top left and bottom right corners of the subrect.\n var opbeg = ((frame.y * width) + frame.x) * 4;\n var opend = ((frame.y + frame.height) * width + frame.x) * 4;\n var op = opbeg;\n\n var scanstride = framestride * 4;\n\n // Use scanstride to skip past the rows when interlacing. This is skipping\n // 7 rows for the first two passes, then 3 then 1.\n if (frame.interlaced === true) {\n scanstride += width * 4 * 7; // Pass 1.\n }\n\n var interlaceskip = 8; // Tracking the row interval in the current pass.\n\n for (var i = 0, il = index_stream.length; i < il; ++i) {\n var index = index_stream[i];\n\n if (xleft === 0) { // Beginning of new scan line\n op += scanstride;\n xleft = framewidth;\n if (op >= opend) { // Catch the wrap to switch passes when interlacing.\n scanstride = framestride * 4 + width * 4 * (interlaceskip-1);\n // interlaceskip / 2 * 4 is interlaceskip << 1.\n op = opbeg + (framewidth + framestride) * (interlaceskip << 1);\n interlaceskip >>= 1;\n }\n }\n\n if (index === trans) {\n op += 4;\n } else {\n var r = buf[palette_offset + index * 3];\n var g = buf[palette_offset + index * 3 + 1];\n var b = buf[palette_offset + index * 3 + 2];\n pixels[op++] = r;\n pixels[op++] = g;\n pixels[op++] = b;\n pixels[op++] = 255;\n }\n --xleft;\n }\n };\n}\n\nfunction GifReaderLZWOutputIndexStream(code_stream, p, output, output_length) {\n var min_code_size = code_stream[p++];\n\n var clear_code = 1 << min_code_size;\n var eoi_code = clear_code + 1;\n var next_code = eoi_code + 1;\n\n var cur_code_size = min_code_size + 1; // Number of bits per code.\n // NOTE: This shares the same name as the encoder, but has a different\n // meaning here. Here this masks each code coming from the code stream.\n var code_mask = (1 << cur_code_size) - 1;\n var cur_shift = 0;\n var cur = 0;\n\n var op = 0; // Output pointer.\n\n var subblock_size = code_stream[p++];\n\n // TODO(deanm): Would using a TypedArray be any faster? At least it would\n // solve the fast mode / backing store uncertainty.\n // var code_table = Array(4096);\n var code_table = new Int32Array(4096); // Can be signed, we only use 20 bits.\n\n var prev_code = null; // Track code-1.\n\n while (true) {\n // Read up to two bytes, making sure we always 12-bits for max sized code.\n while (cur_shift < 16) {\n if (subblock_size === 0) break; // No more data to be read.\n\n cur |= code_stream[p++] << cur_shift;\n cur_shift += 8;\n\n if (subblock_size === 1) { // Never let it get to 0 to hold logic above.\n subblock_size = code_stream[p++]; // Next subblock.\n } else {\n --subblock_size;\n }\n }\n\n // TODO(deanm): We should never really get here, we should have received\n // and EOI.\n if (cur_shift < cur_code_size)\n break;\n\n var code = cur & code_mask;\n cur >>= cur_code_size;\n cur_shift -= cur_code_size;\n\n // TODO(deanm): Maybe should check that the first code was a clear code,\n // at least this is what you're supposed to do. But actually our encoder\n // now doesn't emit a clear code first anyway.\n if (code === clear_code) {\n // We don't actually have to clear the table. This could be a good idea\n // for greater error checking, but we don't really do any anyway. We\n // will just track it with next_code and overwrite old entries.\n\n next_code = eoi_code + 1;\n cur_code_size = min_code_size + 1;\n code_mask = (1 << cur_code_size) - 1;\n\n // Don't update prev_code ?\n prev_code = null;\n continue;\n } else if (code === eoi_code) {\n break;\n }\n\n // We have a similar situation as the decoder, where we want to store\n // variable length entries (code table entries), but we want to do in a\n // faster manner than an array of arrays. The code below stores sort of a\n // linked list within the code table, and then \"chases\" through it to\n // construct the dictionary entries. When a new entry is created, just the\n // last byte is stored, and the rest (prefix) of the entry is only\n // referenced by its table entry. Then the code chases through the\n // prefixes until it reaches a single byte code. We have to chase twice,\n // first to compute the length, and then to actually copy the data to the\n // output (backwards, since we know the length). The alternative would be\n // storing something in an intermediate stack, but that doesn't make any\n // more sense. I implemented an approach where it also stored the length\n // in the code table, although it's a bit tricky because you run out of\n // bits (12 + 12 + 8), but I didn't measure much improvements (the table\n // entries are generally not the long). Even when I created benchmarks for\n // very long table entries the complexity did not seem worth it.\n // The code table stores the prefix entry in 12 bits and then the suffix\n // byte in 8 bits, so each entry is 20 bits.\n\n var chase_code = code < next_code ? code : prev_code;\n\n // Chase what we will output, either {CODE} or {CODE-1}.\n var chase_length = 0;\n var chase = chase_code;\n while (chase > clear_code) {\n chase = code_table[chase] >> 8;\n ++chase_length;\n }\n\n var k = chase;\n\n var op_end = op + chase_length + (chase_code !== code ? 1 : 0);\n if (op_end > output_length) {\n console.log(\"Warning, gif stream longer than expected.\");\n return;\n }\n\n // Already have the first byte from the chase, might as well write it fast.\n output[op++] = k;\n\n op += chase_length;\n var b = op; // Track pointer, writing backwards.\n\n if (chase_code !== code) // The case of emitting {CODE-1} + k.\n output[op++] = k;\n\n chase = chase_code;\n while (chase_length--) {\n chase = code_table[chase];\n output[--b] = chase & 0xff; // Write backwards.\n chase >>= 8; // Pull down to the prefix code.\n }\n\n if (prev_code !== null && next_code < 4096) {\n code_table[next_code++] = prev_code << 8 | k;\n // TODO(deanm): Figure out this clearing vs code growth logic better. I\n // have an feeling that it should just happen somewhere else, for now it\n // is awkward between when we grow past the max and then hit a clear code.\n // For now just check if we hit the max 12-bits (then a clear code should\n // follow, also of course encoded in 12-bits).\n if (next_code >= code_mask+1 && cur_code_size < 12) {\n ++cur_code_size;\n code_mask = code_mask << 1 | 1;\n }\n }\n\n prev_code = code;\n }\n\n if (op !== output_length) {\n console.log(\"Warning, gif stream shorter than expected.\");\n }\n\n return output;\n}\n\n// CommonJS.\ntry { exports.GifWriter = GifWriter; exports.GifReader = GifReader } catch(e) {}\n","import { IMultimediaType } from '@leafer-ui/interface'\nimport { ImageData } from '@leafer-ui/draw'\n\n\nexport class FilmData extends ImageData {\n\n public get __urlType(): IMultimediaType { return 'film' }\n\n}","import { ILeafPaint, IFilmDecoder, IUI } from '@leafer-ui/interface'\nimport { isArray } from '@leafer-ui/draw'\n\nexport class PaintFilm {\n\n public element: IUI\n\n public get playerOptions(): ILeafPaint { const { fill } = (this.element || this as any).__; return isArray(fill) && fill.find(item => item.type === 'film') }\n\n public get decoder(): IFilmDecoder { const { playerOptions } = this; return playerOptions && playerOptions.image && playerOptions.image.view }\n\n\n constructor(element: IUI) {\n this.element = element\n }\n\n\n public togglePlay(): void {\n const { playerOptions } = this\n if (playerOptions) {\n if (playerOptions.paused) this.play()\n else this.pause()\n }\n }\n\n public play(): void {\n const { playerOptions } = this\n if (playerOptions && playerOptions.paused) {\n delete playerOptions.paused;\n (this.element || this as any).forceRender()\n }\n }\n\n public pause(): void {\n const { playerOptions } = this\n if (playerOptions) playerOptions.paused = true\n }\n\n public stop(): void {\n const { playerOptions } = this\n if (playerOptions) {\n delete playerOptions.frameTime\n playerOptions.nowIndex = 0\n this.pause()\n }\n }\n\n public seekFrame(frameIndex: number): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.nowIndex = frameIndex;\n (this.element || this as any).forceRender()\n }\n }\n\n}","import { IFilm, IFilmInputData, IFilmData, } from '@leafer-ui/interface'\nimport { Image, registerUI, dataProcessor, useModule } from '@leafer-ui/draw'\n\nimport { FilmData } from './data/FilmData'\nimport { PaintFilm } from './PaintFilm'\n\n\n@useModule(PaintFilm)\n@registerUI()\nexport class Film<TInputData = IFilmInputData> extends Image<TInputData> implements IFilm {\n\n public get __tag() { return 'Film' }\n\n @dataProcessor(FilmData)\n declare public __: IFilmData\n}\n\nexport interface Film {\n\n togglePlay(): void\n play(): void\n pause(): void\n stop(): void\n\n seekFrame(frameIndex: number): void\n\n}","import { LeaferFilm, Platform, Creator, FileHelper, PaintImage, Resource, Plugin, isObject } from '@leafer-ui/draw'\nimport { ILeaferFilm, ILeaferFilmConfig, IImageCrossOrigin, ILeaf, IFilmDecoder, ILeafPaint, IFilmFileType } from '@leafer-ui/interface'\n\nimport { FilmDecoder } from './FilmDecoder'\nimport { OmgFilmDecoder } from './OmgFilmDecoder'\nimport { getFileExt } from './helper/ext'\n\nexport { Film } from './Film'\nexport { FilmData } from './data/FilmData'\nexport { FilmDecoder } from './FilmDecoder'\nexport { PaintFilm } from './PaintFilm'\n\n\nPlugin.add('flim')\n\n\nPaintImage.film = function (paint: ILeafPaint, oldPaint?: ILeafPaint): void {\n paint.film = true\n paint.nowIndex = 0\n if (isObject(oldPaint)) {\n paint.nowIndex = oldPaint.nowIndex\n paint.pauseIndex = oldPaint.pauseIndex\n paint.speed = oldPaint.speed\n paint.paused = oldPaint.paused\n paint.loop = oldPaint.loop\n }\n}\n\nCreator.film = function (options?: ILeaferFilmConfig): ILeaferFilm {\n return new LeaferFilm(options)\n}\n\nResource.loadFilm = function (key: string, format?: IFilmFileType): Promise<ILeaferFilm> {\n return new Promise((resolve, reject) => {\n const config: ILeaferFilmConfig = { url: key }\n if (format) config.format = format\n const film = Creator.film(config)\n Resource.set(key, film)\n film.load(() => resolve(film), (e: any) => reject(e))\n })\n}\n\nLeaferFilm.prototype.render = function (canvas: any, x: number, y: number, width: number, height: number, leaf: ILeaf, paint: any, imageScaleX: number, imageScaleY: number): void {\n this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY)\n}\n\nFilmDecoder.register('gif', OmgFilmDecoder) // OmgFilmDecoder\n\nPlatform.origin.loadFilm = async function (url: string, _crossOrigin?: IImageCrossOrigin, leaferFilm?: ILeaferFilm): Promise<any> {\n const buffer = await Platform.origin.loadContent(url, 'arrayBuffer')\n\n let ext = getFileExt(url) // 获取文件后缀名\n\n if (!ext) {\n if (leaferFilm) ext = leaferFilm.config.format\n if (!ext) ext = 'gif'\n }\n\n const mimeType = FileHelper.mimeType(ext)\n const canUseFilmDecoder = await FilmDecoder.canUse(mimeType)\n\n let Decoder: any\n const tool = FilmDecoder.decoderMap[ext]\n\n if (!tool || (canUseFilmDecoder && !tool.force)) Decoder = FilmDecoder\n else Decoder = tool.Decoder\n\n if (!Decoder) throw new Error('no decoder: ' + mimeType)\n\n const decoder: IFilmDecoder = new Decoder()\n await decoder.decodeHeader(buffer, mimeType)\n\n return decoder\n}\n\n","import { IFilmFrame } from '@leafer-ui/interface'\nimport { Platform } from '@leafer-ui/draw'\n\nimport { GifReader } from 'omggif'\n\nimport { FilmDecoder } from './FilmDecoder'\n\n\nexport class OmgFilmDecoder extends FilmDecoder {\n\n public decoder: GifReader | any\n\n // 复用 RGBA buffer\n private decodeBuffer!: Uint8ClampedArray\n\n // 复用 ImageData(避免每帧 new)\n private sharedImageData!: ImageData\n\n // 只保留一个 restore 缓存(disposal=3)\n private restoreImageData: ImageData | null = null\n\n // --------------------------------------------------\n // 1️⃣ decodeHeader\n // --------------------------------------------------\n\n public async decodeHeader(data: ArrayBuffer): Promise<void> {\n const decoder = this.decoder = new GifReader(new Uint8Array(data))\n const { width, height } = decoder\n\n this.width = width\n this.height = height\n this.total = decoder.numFrames()\n this.loop = decoder.loopCount() || 0\n\n // 工作 canvas(永远只有一个)\n this.bufferCanvas = Platform.origin.createCanvas(width, height)\n this.bufferContext = this.bufferCanvas.getContext('2d')!\n\n // 复用 RGBA buffer\n this.decodeBuffer = new Uint8ClampedArray(width * height * 4)\n\n // 复用 ImageData\n this.sharedImageData = this.bufferContext.createImageData(width, height)\n\n this.createAtlas()\n\n // 首帧必须解\n await this.decodeFrame(0)\n }\n\n // --------------------------------------------------\n // 2️⃣ decodeFrame(顺序安全)\n // --------------------------------------------------\n\n public async decodeOneFrame(frameIndex: number): Promise<IFilmFrame> {\n const { decoder, decodeBuffer, bufferCanvas, bufferContext, sharedImageData } = this\n const info = decoder.frameInfo(frameIndex)\n\n // disposal=3 需要保存当前完整状态\n if (info.disposal === 3) this.restoreImageData = bufferContext.getImageData(0, 0, this.width, this.height)\n\n // 解码到 decodeBuffer\n decoder.decodeAndBlitFrameRGBA(frameIndex, decodeBuffer)\n\n // 复用 ImageData\n sharedImageData.data.set(decodeBuffer)\n\n // 绘制到 buffer\n bufferContext.putImageData(sharedImageData, 0, 0)\n\n let image: any\n\n if (this.atlas) {\n image = bufferCanvas\n } else {\n image = Platform.origin.createCanvas(this.width, this.height)\n const frameCtx = image.getContext('2d')!\n frameCtx.drawImage(bufferCanvas, 0, 0)\n }\n\n const frame: IFilmFrame = { image, duration: (info.delay || 10) / 100 }\n\n this.frames[frameIndex] = frame\n\n if (this.atlas) this.mergeFrame(frameIndex, false) // false 表示不物理销毁frame.image\n\n this.applyDisposal(info)\n\n return frame\n }\n\n // --------------------------------------------------\n // 3️⃣ disposal 处理\n // --------------------------------------------------\n\n private applyDisposal(info: any): void {\n const { bufferContext, restoreImageData } = this\n const disposal = info.disposal\n if (disposal === 2) {\n bufferContext.clearRect(info.x, info.y, info.width, info.height) // 恢复透明(当前帧区域)\n } else if (disposal === 3) {\n if (restoreImageData) {\n bufferContext.putImageData(restoreImageData, 0, 0)\n this.restoreImageData = null\n }\n }\n }\n\n // --------------------------------------------------\n // 5️⃣ destoryFrameImage\n // --------------------------------------------------\n\n public destoryFrameImage(frame: IFilmFrame): void {\n if (!frame.image) return\n\n const canvas = frame.image as HTMLCanvasElement\n\n // 强制释放 backing store\n canvas.width = 0\n canvas.height = 0\n\n delete frame.image\n }\n\n // --------------------------------------------------\n // 释放解码资源\n // --------------------------------------------------\n\n public destroyDecoder(): void {\n if (this.bufferCanvas) {\n this.bufferCanvas.width = 0\n this.bufferCanvas.height = 0\n\n this.decoder = null\n this.bufferCanvas = null\n this.bufferContext = null\n\n this.decodeBuffer = null\n this.sharedImageData = null\n this.restoreImageData = null\n }\n }\n}","export function getFileExt(url: string): string {\n if (!url) return ''\n\n if (url.startsWith('data:')) {\n const head = url.slice(5, url.indexOf(','))\n const slash = head.indexOf('/')\n const semi = head.indexOf(';')\n return slash > -1\n ? head.slice(slash + 1, semi > -1 ? semi : undefined).toLowerCase()\n : ''\n }\n\n let end = url.length\n const q = url.indexOf('?')\n const h = url.indexOf('#')\n if (q > -1 && q < end) end = q\n if (h > -1 && h < end) end = h\n\n const dot = url.lastIndexOf('.', end)\n const slash = url.lastIndexOf('/', end)\n\n return dot > slash ? url.slice(dot + 1, end).toLowerCase() : ''\n}"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","FilmDecoder","constructor","this","frames","decodedIndex","register","type","Decoder","force","decoderMap","canUse","mimeType","supportMap","isUndefined","ImageDecoder","isTypeSupported","createAtlas","width","height","total","maxAtlasSize","columns","Math","ceil","sqrt","rows","atlasGrid","x","y","atlas","Platform","origin","createCanvas","atlasContext","getContext","decodeHeader","data","decoder","tracks","ready","first","decodeFrame","displayWidth","displayHeight","image","selectedTrack","frameCount","loop","repetitionCount","mergeFrame","frameIndex","frame","decoding","decodeOneFrame","decode","duration","destoryFrameImage","floor","drawImage","render","canvas","leaf","playOptions","_imageScaleX","_imageScaleY","nowIndex","paused","speed","pauseIndex","frameTimer","renderFrame","nextIndex","isFinite","finally","destroyDecoder","setTimeout","forceRender","canRender","destoryFrame","deleteIndex","close","forEach","_item","index","maxPatternSize","GifReaderLZWOutputIndexStream","code_stream","p","output","output_length","min_code_size","clear_code","eoi_code","next_code","cur_code_size","code_mask","cur_shift","cur","op","subblock_size","code_table","Int32Array","prev_code","code","chase_code","chase_length","chase","k","console","log","b","omggif","GifWriter","buf","gopts","loop_count","undefined","global_palette","palette","Error","check_palette_and_num_colors","num_colors","gp_num_colors_pow2","background","gp_num_colors","il","rgb","ended","addFrame","w","h","indexed_pixels","opts","using_local_palette","delay","disposal","use_transparency","transparent_index","transparent","index_stream","cur_subblock","emit_bytes_to_buffer","bit_block_size","emit_code","ib_code","cur_key","cur_code","GifWriterOutputLZWCodeStream","end","getOutputBuffer","setOutputBuffer","v","getOutputBufferPosition","setOutputBufferPosition","GifReader_1","GifReader","pf0","global_palette_flag","num_global_colors","global_palette_offset","global_palette_size","no_eof","block_size","pf1","toString","pf2","interlace_flag","num_local_colors","palette_offset","palette_size","has_local_palette","data_offset","push","data_length","interlaced","numFrames","loopCount","frameInfo","frame_num","decodeAndBlitFrameBGRA","pixels","num_pixels","Uint8Array","trans","framewidth","framestride","xleft","opbeg","opend","scanstride","interlaceskip","g","decodeAndBlitFrameRGBA","FilmData","ImageData","__urlType","PaintFilm","playerOptions","fill","element","__","isArray","find","item","view","togglePlay","play","pause","stop","frameTime","seekFrame","Film","Image","__tag","dataProcessor","prototype","useModule","registerUI","Plugin","add","PaintImage","film","paint","oldPaint","isObject","Creator","options","LeaferFilm","Resource","loadFilm","format","config","url","set","load","imageScaleX","imageScaleY","restoreImageData","bufferCanvas","bufferContext","decodeBuffer","Uint8ClampedArray","sharedImageData","createImageData","info","getImageData","putImageData","applyDisposal","clearRect","_crossOrigin","leaferFilm","buffer","loadContent","ext","startsWith","head","slice","indexOf","slash","semi","toLowerCase","q","dot","lastIndexOf","getFileExt","FileHelper","canUseFilmDecoder","tool"],"mappings":"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","x_google_ignoreList":[0,2]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leafer-in/film",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "@leafer-in/film",
5
5
  "author": "Chao (Leafer) Wan",
6
6
  "license": "MIT",
@@ -14,7 +14,11 @@
14
14
  "types": "types/index.d.ts",
15
15
  "unpkg": "dist/film.min.js",
16
16
  "jsdelivr": "dist/film.min.js",
17
- "files": ["src","types","dist"],
17
+ "files": [
18
+ "src",
19
+ "types",
20
+ "dist"
21
+ ],
18
22
  "repository": {
19
23
  "type": "git",
20
24
  "url": "https://github.com/leaferjs/leafer-in.git"
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LeaferFilm, Platform, Creator, FileHelper, PaintImage, Resource, Plugin } from '@leafer-ui/draw'
1
+ import { LeaferFilm, Platform, Creator, FileHelper, PaintImage, Resource, Plugin, isObject } from '@leafer-ui/draw'
2
2
  import { ILeaferFilm, ILeaferFilmConfig, IImageCrossOrigin, ILeaf, IFilmDecoder, ILeafPaint, IFilmFileType } from '@leafer-ui/interface'
3
3
 
4
4
  import { FilmDecoder } from './FilmDecoder'
@@ -14,9 +14,16 @@ export { PaintFilm } from './PaintFilm'
14
14
  Plugin.add('flim')
15
15
 
16
16
 
17
- PaintImage.film = function (paint: ILeafPaint): void {
17
+ PaintImage.film = function (paint: ILeafPaint, oldPaint?: ILeafPaint): void {
18
18
  paint.film = true
19
19
  paint.nowIndex = 0
20
+ if (isObject(oldPaint)) {
21
+ paint.nowIndex = oldPaint.nowIndex
22
+ paint.pauseIndex = oldPaint.pauseIndex
23
+ paint.speed = oldPaint.speed
24
+ paint.paused = oldPaint.paused
25
+ paint.loop = oldPaint.loop
26
+ }
20
27
  }
21
28
 
22
29
  Creator.film = function (options?: ILeaferFilmConfig): ILeaferFilm {