manim-web 0.3.17 → 0.3.19
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.
- package/README.md +26 -40
- package/dist/AllPackages-C4Ha3Jps.js +7912 -0
- package/dist/AllPackages-Dwxf_-Ps.js +7912 -0
- package/dist/BaseConfiguration-D2fikupy.js +4402 -0
- package/dist/BaseConfiguration-DYpI8zxb.js +4402 -0
- package/dist/Entities-BxzKxtF2.js +458 -0
- package/dist/Entities-gIbwAkB6.js +458 -0
- package/dist/GifExporter-7EpPGupp.js +338 -0
- package/dist/GifExporter-DCrSD6FV.js +338 -0
- package/dist/InputJax-BszJvLkW.js +43 -0
- package/dist/InputJax-CgHBfQsv.js +43 -0
- package/dist/MathItem-4gYKatZT.js +77 -0
- package/dist/MathItem-BGJUnd1K.js +77 -0
- package/dist/Options-CQim5zsr.js +188 -0
- package/dist/Options-Cn9jv1mh.js +188 -0
- package/dist/PrioritizedList-C1R4aNEC.js +36 -0
- package/dist/PrioritizedList-lIkFMNlo.js +36 -0
- package/dist/Styles-Bi9Db-2J.js +411 -0
- package/dist/Styles-CzHPc-An.js +411 -0
- package/dist/TeXAtom-Cinii27y.js +2025 -0
- package/dist/TeXAtom-DFdvwkN2.js +2025 -0
- package/dist/VideoExporter-6w8xBpcV.js +102 -0
- package/dist/VideoExporter-DdQb18dC.js +102 -0
- package/dist/animation/creation/Create.d.ts +1 -1
- package/dist/animation/movement/Rotate.d.ts +2 -0
- package/dist/animation/movement/Rotate.d.ts.map +1 -1
- package/dist/animation/movement/Scale.d.ts +2 -0
- package/dist/animation/movement/Scale.d.ts.map +1 -1
- package/dist/animation/transform/ApplyTransforms.d.ts +1 -2
- package/dist/animation/transform/ApplyTransforms.d.ts.map +1 -1
- package/dist/animation/transform/Transform.d.ts +19 -0
- package/dist/animation/transform/Transform.d.ts.map +1 -1
- package/dist/animation/utility/index.d.ts +2 -0
- package/dist/animation/utility/index.d.ts.map +1 -1
- package/dist/chunk-DeC0fbbY.js +23 -0
- package/dist/core/AnimateProxy.d.ts +39 -0
- package/dist/core/AnimateProxy.d.ts.map +1 -0
- package/dist/core/CameraExtensions.d.ts +128 -0
- package/dist/core/CameraExtensions.d.ts.map +1 -1
- package/dist/core/Group.d.ts +2 -2
- package/dist/core/Group.d.ts.map +1 -1
- package/dist/core/Mobject.d.ts +40 -6
- package/dist/core/Mobject.d.ts.map +1 -1
- package/dist/core/MobjectState.d.ts +23 -2
- package/dist/core/MobjectState.d.ts.map +1 -1
- package/dist/core/NullRenderer.d.ts +42 -0
- package/dist/core/NullRenderer.d.ts.map +1 -0
- package/dist/core/Renderer.d.ts +17 -1
- package/dist/core/Renderer.d.ts.map +1 -1
- package/dist/core/Scene.d.ts +23 -5
- package/dist/core/Scene.d.ts.map +1 -1
- package/dist/core/ThreeDScene.d.ts +23 -2
- package/dist/core/ThreeDScene.d.ts.map +1 -1
- package/dist/core/VGroup.d.ts +8 -1
- package/dist/core/VGroup.d.ts.map +1 -1
- package/dist/core/ZoomedScene.d.ts +6 -2
- package/dist/core/ZoomedScene.d.ts.map +1 -1
- package/dist/html-DKkfg_ss.js +1587 -0
- package/dist/html-DpiYkktJ.js +1587 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -575
- package/dist/integrations/react.js +144 -731
- package/dist/integrations/vue.js +109 -731
- package/dist/interaction/Draggable.d.ts.map +1 -1
- package/dist/lengths-C0YS8_KC.js +65 -0
- package/dist/lengths-eBH2o1TO.js +65 -0
- package/dist/liteAdaptor-CB8lQj3d.js +828 -0
- package/dist/liteAdaptor-DvuW8HsZ.js +828 -0
- package/dist/manim-web.browser.js +72318 -83323
- package/dist/mathjax-BVz9WLAG.js +105 -0
- package/dist/mathjax-BbWkqal4.js +2 -0
- package/dist/mathjax-BrFZxFhK.js +2 -0
- package/dist/mathjax-DdKmwllV.js +105 -0
- package/dist/mo-B60kIOAG.js +3271 -0
- package/dist/mo-cSv2058o.js +3271 -0
- package/dist/mobjects/geometry/AngleShapes.d.ts +8 -0
- package/dist/mobjects/geometry/AngleShapes.d.ts.map +1 -1
- package/dist/mobjects/geometry/DashedLine.d.ts +2 -2
- package/dist/mobjects/geometry/DashedLine.d.ts.map +1 -1
- package/dist/mobjects/graphing/Axes.d.ts +2 -2
- package/dist/mobjects/graphing/Axes.d.ts.map +1 -1
- package/dist/mobjects/graphing/ComplexPlane.d.ts +4 -1
- package/dist/mobjects/graphing/ComplexPlane.d.ts.map +1 -1
- package/dist/mobjects/matrix/Matrix.d.ts +2 -2
- package/dist/mobjects/matrix/Matrix.d.ts.map +1 -1
- package/dist/mobjects/point/PGroup.d.ts +1 -1
- package/dist/mobjects/point/PGroup.d.ts.map +1 -1
- package/dist/mobjects/point/PMobject.d.ts +1 -1
- package/dist/mobjects/point/PMobject.d.ts.map +1 -1
- package/dist/mobjects/svg/Brace.d.ts +3 -3
- package/dist/mobjects/svg/Brace.d.ts.map +1 -1
- package/dist/mobjects/table/Table.d.ts +4 -4
- package/dist/mobjects/table/Table.d.ts.map +1 -1
- package/dist/mobjects/text/Code.d.ts.map +1 -1
- package/dist/mobjects/text/DecimalNumber.d.ts.map +1 -1
- package/dist/mobjects/text/MathJaxRenderer.d.ts.map +1 -1
- package/dist/mobjects/text/MathTex.d.ts +61 -202
- package/dist/mobjects/text/MathTex.d.ts.map +1 -1
- package/dist/mobjects/text/MathTexImage.d.ts +254 -0
- package/dist/mobjects/text/MathTexImage.d.ts.map +1 -0
- package/dist/mobjects/text/MathTexParts.d.ts +10 -10
- package/dist/mobjects/text/MathTexParts.d.ts.map +1 -1
- package/dist/mobjects/text/Tex.d.ts +2 -7
- package/dist/mobjects/text/Tex.d.ts.map +1 -1
- package/dist/mobjects/text/Text.d.ts.map +1 -1
- package/dist/mobjects/text/Variable.d.ts +5 -5
- package/dist/mobjects/text/Variable.d.ts.map +1 -1
- package/dist/mobjects/text/index.d.ts +2 -2
- package/dist/mobjects/text/index.d.ts.map +1 -1
- package/dist/mobjects/text/svgPathParser.d.ts.map +1 -1
- package/dist/mobjects/value-tracker/ValueTracker.d.ts +0 -14
- package/dist/mobjects/value-tracker/ValueTracker.d.ts.map +1 -1
- package/dist/player/Player.d.ts +8 -2
- package/dist/player/Player.d.ts.map +1 -1
- package/dist/player/PlayerController.d.ts +2 -0
- package/dist/player/PlayerController.d.ts.map +1 -1
- package/dist/player/PlayerUI.d.ts +5 -0
- package/dist/player/PlayerUI.d.ts.map +1 -1
- package/dist/src-0ifQdJUj.js +59703 -0
- package/dist/svg-BDTt4xHZ.js +23879 -0
- package/dist/svg-DzbC3CbJ.js +23879 -0
- package/dist/tex-CRhAZgfS.js +401 -0
- package/dist/tex-D3LEgNlQ.js +401 -0
- package/dist/utils/math.d.ts +7 -0
- package/dist/utils/math.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/featureFlags-RDWYX142.js +0 -59330
- package/dist/mobjects/text/MathTexSVG.d.ts +0 -102
- package/dist/mobjects/text/MathTexSVG.d.ts.map +0 -1
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { i as e, n as t, r as n, t as r } from "./chunk-DeC0fbbY.js";
|
|
2
|
+
//#region node_modules/gif.js/dist/gif.js
|
|
3
|
+
var i = /* @__PURE__ */ r(((e, t) => {
|
|
4
|
+
(function(n) {
|
|
5
|
+
if (typeof e == "object" && t !== void 0) t.exports = n();
|
|
6
|
+
else if (typeof define == "function" && define.amd) define([], n);
|
|
7
|
+
else {
|
|
8
|
+
var r = typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : this;
|
|
9
|
+
r.GIF = n();
|
|
10
|
+
}
|
|
11
|
+
})(function() {
|
|
12
|
+
return function e(t, r, i) {
|
|
13
|
+
function a(s, c) {
|
|
14
|
+
if (!r[s]) {
|
|
15
|
+
if (!t[s]) {
|
|
16
|
+
var l = typeof n == "function" && n;
|
|
17
|
+
if (!c && l) return l(s, !0);
|
|
18
|
+
if (o) return o(s, !0);
|
|
19
|
+
var u = /* @__PURE__ */ Error("Cannot find module '" + s + "'");
|
|
20
|
+
throw u.code = "MODULE_NOT_FOUND", u;
|
|
21
|
+
}
|
|
22
|
+
var d = r[s] = { exports: {} };
|
|
23
|
+
t[s][0].call(d.exports, function(e) {
|
|
24
|
+
var n = t[s][1][e];
|
|
25
|
+
return a(n || e);
|
|
26
|
+
}, d, d.exports, e, t, r, i);
|
|
27
|
+
}
|
|
28
|
+
return r[s].exports;
|
|
29
|
+
}
|
|
30
|
+
for (var o = typeof n == "function" && n, s = 0; s < i.length; s++) a(i[s]);
|
|
31
|
+
return a;
|
|
32
|
+
}({
|
|
33
|
+
1: [function(e, t, n) {
|
|
34
|
+
function r() {
|
|
35
|
+
this._events = this._events || {}, this._maxListeners = this._maxListeners || void 0;
|
|
36
|
+
}
|
|
37
|
+
t.exports = r, r.EventEmitter = r, r.prototype._events = void 0, r.prototype._maxListeners = void 0, r.defaultMaxListeners = 10, r.prototype.setMaxListeners = function(e) {
|
|
38
|
+
if (!a(e) || e < 0 || isNaN(e)) throw TypeError("n must be a positive number");
|
|
39
|
+
return this._maxListeners = e, this;
|
|
40
|
+
}, r.prototype.emit = function(e) {
|
|
41
|
+
var t, n, r, a, c, l;
|
|
42
|
+
if (this._events ||= {}, e === "error" && (!this._events.error || o(this._events.error) && !this._events.error.length)) {
|
|
43
|
+
if (t = arguments[1], t instanceof Error) throw t;
|
|
44
|
+
var u = /* @__PURE__ */ Error("Uncaught, unspecified \"error\" event. (" + t + ")");
|
|
45
|
+
throw u.context = t, u;
|
|
46
|
+
}
|
|
47
|
+
if (n = this._events[e], s(n)) return !1;
|
|
48
|
+
if (i(n)) switch (arguments.length) {
|
|
49
|
+
case 1:
|
|
50
|
+
n.call(this);
|
|
51
|
+
break;
|
|
52
|
+
case 2:
|
|
53
|
+
n.call(this, arguments[1]);
|
|
54
|
+
break;
|
|
55
|
+
case 3:
|
|
56
|
+
n.call(this, arguments[1], arguments[2]);
|
|
57
|
+
break;
|
|
58
|
+
default: a = Array.prototype.slice.call(arguments, 1), n.apply(this, a);
|
|
59
|
+
}
|
|
60
|
+
else if (o(n)) for (a = Array.prototype.slice.call(arguments, 1), l = n.slice(), r = l.length, c = 0; c < r; c++) l[c].apply(this, a);
|
|
61
|
+
return !0;
|
|
62
|
+
}, r.prototype.addListener = function(e, t) {
|
|
63
|
+
var n;
|
|
64
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
65
|
+
return this._events ||= {}, this._events.newListener && this.emit("newListener", e, i(t.listener) ? t.listener : t), this._events[e] ? o(this._events[e]) ? this._events[e].push(t) : this._events[e] = [this._events[e], t] : this._events[e] = t, o(this._events[e]) && !this._events[e].warned && (n = s(this._maxListeners) ? r.defaultMaxListeners : this._maxListeners, n && n > 0 && this._events[e].length > n && (this._events[e].warned = !0, console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[e].length), typeof console.trace == "function" && console.trace())), this;
|
|
66
|
+
}, r.prototype.on = r.prototype.addListener, r.prototype.once = function(e, t) {
|
|
67
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
68
|
+
var n = !1;
|
|
69
|
+
function r() {
|
|
70
|
+
this.removeListener(e, r), n || (n = !0, t.apply(this, arguments));
|
|
71
|
+
}
|
|
72
|
+
return r.listener = t, this.on(e, r), this;
|
|
73
|
+
}, r.prototype.removeListener = function(e, t) {
|
|
74
|
+
var n, r, a, s;
|
|
75
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
76
|
+
if (!this._events || !this._events[e]) return this;
|
|
77
|
+
if (n = this._events[e], a = n.length, r = -1, n === t || i(n.listener) && n.listener === t) delete this._events[e], this._events.removeListener && this.emit("removeListener", e, t);
|
|
78
|
+
else if (o(n)) {
|
|
79
|
+
for (s = a; s-- > 0;) if (n[s] === t || n[s].listener && n[s].listener === t) {
|
|
80
|
+
r = s;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (r < 0) return this;
|
|
84
|
+
n.length === 1 ? (n.length = 0, delete this._events[e]) : n.splice(r, 1), this._events.removeListener && this.emit("removeListener", e, t);
|
|
85
|
+
}
|
|
86
|
+
return this;
|
|
87
|
+
}, r.prototype.removeAllListeners = function(e) {
|
|
88
|
+
var t, n;
|
|
89
|
+
if (!this._events) return this;
|
|
90
|
+
if (!this._events.removeListener) return arguments.length === 0 ? this._events = {} : this._events[e] && delete this._events[e], this;
|
|
91
|
+
if (arguments.length === 0) {
|
|
92
|
+
for (t in this._events) t !== "removeListener" && this.removeAllListeners(t);
|
|
93
|
+
return this.removeAllListeners("removeListener"), this._events = {}, this;
|
|
94
|
+
}
|
|
95
|
+
if (n = this._events[e], i(n)) this.removeListener(e, n);
|
|
96
|
+
else if (n) for (; n.length;) this.removeListener(e, n[n.length - 1]);
|
|
97
|
+
return delete this._events[e], this;
|
|
98
|
+
}, r.prototype.listeners = function(e) {
|
|
99
|
+
return !this._events || !this._events[e] ? [] : i(this._events[e]) ? [this._events[e]] : this._events[e].slice();
|
|
100
|
+
}, r.prototype.listenerCount = function(e) {
|
|
101
|
+
if (this._events) {
|
|
102
|
+
var t = this._events[e];
|
|
103
|
+
if (i(t)) return 1;
|
|
104
|
+
if (t) return t.length;
|
|
105
|
+
}
|
|
106
|
+
return 0;
|
|
107
|
+
}, r.listenerCount = function(e, t) {
|
|
108
|
+
return e.listenerCount(t);
|
|
109
|
+
};
|
|
110
|
+
function i(e) {
|
|
111
|
+
return typeof e == "function";
|
|
112
|
+
}
|
|
113
|
+
function a(e) {
|
|
114
|
+
return typeof e == "number";
|
|
115
|
+
}
|
|
116
|
+
function o(e) {
|
|
117
|
+
return typeof e == "object" && !!e;
|
|
118
|
+
}
|
|
119
|
+
function s(e) {
|
|
120
|
+
return e === void 0;
|
|
121
|
+
}
|
|
122
|
+
}, {}],
|
|
123
|
+
2: [function(e, t, n) {
|
|
124
|
+
var r, i, a, o, s = navigator.userAgent.toLowerCase();
|
|
125
|
+
o = navigator.platform.toLowerCase(), r = s.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [
|
|
126
|
+
null,
|
|
127
|
+
"unknown",
|
|
128
|
+
0
|
|
129
|
+
], a = r[1] === "ie" && document.documentMode, i = {
|
|
130
|
+
name: r[1] === "version" ? r[3] : r[1],
|
|
131
|
+
version: a || parseFloat(r[1] === "opera" && r[4] ? r[4] : r[2]),
|
|
132
|
+
platform: { name: s.match(/ip(?:ad|od|hone)/) ? "ios" : (s.match(/(?:webos|android)/) || o.match(/mac|win|linux/) || ["other"])[0] }
|
|
133
|
+
}, i[i.name] = !0, i[i.name + parseInt(i.version, 10)] = !0, i.platform[i.platform.name] = !0, t.exports = i;
|
|
134
|
+
}, {}],
|
|
135
|
+
3: [function(e, t, n) {
|
|
136
|
+
var r, i, a, o = function(e, t) {
|
|
137
|
+
for (var n in t) s.call(t, n) && (e[n] = t[n]);
|
|
138
|
+
function r() {
|
|
139
|
+
this.constructor = e;
|
|
140
|
+
}
|
|
141
|
+
return r.prototype = t.prototype, e.prototype = new r(), e.__super__ = t.prototype, e;
|
|
142
|
+
}, s = {}.hasOwnProperty, c = [].indexOf || function(e) {
|
|
143
|
+
for (var t = 0, n = this.length; t < n; t++) if (t in this && this[t] === e) return t;
|
|
144
|
+
return -1;
|
|
145
|
+
}, l = [].slice;
|
|
146
|
+
r = e("events").EventEmitter, a = e("./browser.coffee"), i = function(e) {
|
|
147
|
+
var t, n;
|
|
148
|
+
o(r, e), t = {
|
|
149
|
+
workerScript: "gif.worker.js",
|
|
150
|
+
workers: 2,
|
|
151
|
+
repeat: 0,
|
|
152
|
+
background: "#fff",
|
|
153
|
+
quality: 10,
|
|
154
|
+
width: null,
|
|
155
|
+
height: null,
|
|
156
|
+
transparent: null,
|
|
157
|
+
debug: !1,
|
|
158
|
+
dither: !1
|
|
159
|
+
}, n = {
|
|
160
|
+
delay: 500,
|
|
161
|
+
copy: !1
|
|
162
|
+
};
|
|
163
|
+
function r(e) {
|
|
164
|
+
var n, r, i;
|
|
165
|
+
for (r in this.running = !1, this.options = {}, this.frames = [], this.freeWorkers = [], this.activeWorkers = [], this.setOptions(e), t) i = t[r], (n = this.options)[r] ?? (n[r] = i);
|
|
166
|
+
}
|
|
167
|
+
return r.prototype.setOption = function(e, t) {
|
|
168
|
+
if (this.options[e] = t, this._canvas != null && (e === "width" || e === "height")) return this._canvas[e] = t;
|
|
169
|
+
}, r.prototype.setOptions = function(e) {
|
|
170
|
+
var t, n = [], r;
|
|
171
|
+
for (t in e) s.call(e, t) && (r = e[t], n.push(this.setOption(t, r)));
|
|
172
|
+
return n;
|
|
173
|
+
}, r.prototype.addFrame = function(e, t) {
|
|
174
|
+
var r, i;
|
|
175
|
+
for (i in t ??= {}, r = {}, r.transparent = this.options.transparent, n) r[i] = t[i] || n[i];
|
|
176
|
+
if (this.options.width ?? this.setOption("width", e.width), this.options.height ?? this.setOption("height", e.height), typeof ImageData < "u" && ImageData !== null && e instanceof ImageData) r.data = e.data;
|
|
177
|
+
else if (typeof CanvasRenderingContext2D < "u" && CanvasRenderingContext2D !== null && e instanceof CanvasRenderingContext2D || typeof WebGLRenderingContext < "u" && WebGLRenderingContext !== null && e instanceof WebGLRenderingContext) t.copy ? r.data = this.getContextData(e) : r.context = e;
|
|
178
|
+
else if (e.childNodes != null) t.copy ? r.data = this.getImageData(e) : r.image = e;
|
|
179
|
+
else throw Error("Invalid image");
|
|
180
|
+
return this.frames.push(r);
|
|
181
|
+
}, r.prototype.render = function() {
|
|
182
|
+
var e, t, n;
|
|
183
|
+
if (this.running) throw Error("Already running");
|
|
184
|
+
if (this.options.width == null || this.options.height == null) throw Error("Width and height must be set prior to rendering");
|
|
185
|
+
if (this.running = !0, this.nextFrame = 0, this.finishedFrames = 0, this.imageParts = function() {
|
|
186
|
+
var e, t, n = [];
|
|
187
|
+
for (e = 0, t = this.frames.length; 0 <= t ? e < t : e > t; 0 <= t ? ++e : --e) n.push(null);
|
|
188
|
+
return n;
|
|
189
|
+
}.call(this), t = this.spawnWorkers(), this.options.globalPalette === !0) this.renderNextFrame();
|
|
190
|
+
else for (e = 0, n = t; 0 <= n ? e < n : e > n; 0 <= n ? ++e : --e) this.renderNextFrame();
|
|
191
|
+
return this.emit("start"), this.emit("progress", 0);
|
|
192
|
+
}, r.prototype.abort = function() {
|
|
193
|
+
for (var e; e = this.activeWorkers.shift(), e != null;) this.log("killing active worker"), e.terminate();
|
|
194
|
+
return this.running = !1, this.emit("abort");
|
|
195
|
+
}, r.prototype.spawnWorkers = function() {
|
|
196
|
+
var e = Math.min(this.options.workers, this.frames.length), t, n;
|
|
197
|
+
return (function() {
|
|
198
|
+
n = [];
|
|
199
|
+
for (var r = t = this.freeWorkers.length; t <= e ? r < e : r > e; t <= e ? r++ : r--) n.push(r);
|
|
200
|
+
return n;
|
|
201
|
+
}).apply(this).forEach(function(e) {
|
|
202
|
+
return function(t) {
|
|
203
|
+
var n;
|
|
204
|
+
return e.log("spawning worker " + t), n = new Worker(e.options.workerScript), n.onmessage = function(t) {
|
|
205
|
+
return e.activeWorkers.splice(e.activeWorkers.indexOf(n), 1), e.freeWorkers.push(n), e.frameFinished(t.data);
|
|
206
|
+
}, e.freeWorkers.push(n);
|
|
207
|
+
};
|
|
208
|
+
}(this)), e;
|
|
209
|
+
}, r.prototype.frameFinished = function(e) {
|
|
210
|
+
var t, n;
|
|
211
|
+
if (this.log("frame " + e.index + " finished - " + this.activeWorkers.length + " active"), this.finishedFrames++, this.emit("progress", this.finishedFrames / this.frames.length), this.imageParts[e.index] = e, this.options.globalPalette === !0 && (this.options.globalPalette = e.globalPalette, this.log("global palette analyzed"), this.frames.length > 2)) for (t = 1, n = this.freeWorkers.length; 1 <= n ? t < n : t > n; 1 <= n ? ++t : --t) this.renderNextFrame();
|
|
212
|
+
return c.call(this.imageParts, null) >= 0 ? this.renderNextFrame() : this.finishRendering();
|
|
213
|
+
}, r.prototype.finishRendering = function() {
|
|
214
|
+
var e, t, n, r, i, a, o, s = 0, c, l, u, d, f, p = this.imageParts, m, h;
|
|
215
|
+
for (i = 0, c = p.length; i < c; i++) t = p[i], s += (t.data.length - 1) * t.pageSize + t.cursor;
|
|
216
|
+
for (s += t.pageSize - t.cursor, this.log("rendering finished - filesize " + Math.round(s / 1e3) + "kb"), e = new Uint8Array(s), d = 0, m = this.imageParts, a = 0, l = m.length; a < l; a++) for (t = m[a], h = t.data, n = o = 0, u = h.length; o < u; n = ++o) f = h[n], e.set(f, d), n === t.data.length - 1 ? d += t.cursor : d += t.pageSize;
|
|
217
|
+
return r = new Blob([e], { type: "image/gif" }), this.emit("finished", r, e);
|
|
218
|
+
}, r.prototype.renderNextFrame = function() {
|
|
219
|
+
var e, t, n;
|
|
220
|
+
if (this.freeWorkers.length === 0) throw Error("No free workers");
|
|
221
|
+
if (!(this.nextFrame >= this.frames.length)) return e = this.frames[this.nextFrame++], n = this.freeWorkers.shift(), t = this.getTask(e), this.log("starting frame " + (t.index + 1) + " of " + this.frames.length), this.activeWorkers.push(n), n.postMessage(t);
|
|
222
|
+
}, r.prototype.getContextData = function(e) {
|
|
223
|
+
return e.getImageData(0, 0, this.options.width, this.options.height).data;
|
|
224
|
+
}, r.prototype.getImageData = function(e) {
|
|
225
|
+
var t;
|
|
226
|
+
return this._canvas ?? (this._canvas = document.createElement("canvas"), this._canvas.width = this.options.width, this._canvas.height = this.options.height), t = this._canvas.getContext("2d"), t.setFill = this.options.background, t.fillRect(0, 0, this.options.width, this.options.height), t.drawImage(e, 0, 0), this.getContextData(t);
|
|
227
|
+
}, r.prototype.getTask = function(e) {
|
|
228
|
+
var t = this.frames.indexOf(e), n = {
|
|
229
|
+
index: t,
|
|
230
|
+
last: t === this.frames.length - 1,
|
|
231
|
+
delay: e.delay,
|
|
232
|
+
transparent: e.transparent,
|
|
233
|
+
width: this.options.width,
|
|
234
|
+
height: this.options.height,
|
|
235
|
+
quality: this.options.quality,
|
|
236
|
+
dither: this.options.dither,
|
|
237
|
+
globalPalette: this.options.globalPalette,
|
|
238
|
+
repeat: this.options.repeat,
|
|
239
|
+
canTransfer: a.name === "chrome"
|
|
240
|
+
};
|
|
241
|
+
if (e.data != null) n.data = e.data;
|
|
242
|
+
else if (e.context != null) n.data = this.getContextData(e.context);
|
|
243
|
+
else if (e.image != null) n.data = this.getImageData(e.image);
|
|
244
|
+
else throw Error("Invalid frame");
|
|
245
|
+
return n;
|
|
246
|
+
}, r.prototype.log = function() {
|
|
247
|
+
var e = 1 <= arguments.length ? l.call(arguments, 0) : [];
|
|
248
|
+
if (this.options.debug) return console.log.apply(console, e);
|
|
249
|
+
}, r;
|
|
250
|
+
}(r), t.exports = i;
|
|
251
|
+
}, {
|
|
252
|
+
"./browser.coffee": 2,
|
|
253
|
+
events: 1
|
|
254
|
+
}]
|
|
255
|
+
}, {}, [3])(3);
|
|
256
|
+
});
|
|
257
|
+
})), a = /* @__PURE__ */ t({
|
|
258
|
+
GifExporter: () => s,
|
|
259
|
+
createGifExporter: () => c
|
|
260
|
+
}), o = /* @__PURE__ */ e(i(), 1), s = class e {
|
|
261
|
+
_scene;
|
|
262
|
+
_options;
|
|
263
|
+
constructor(e, t) {
|
|
264
|
+
this._scene = e, this._options = {
|
|
265
|
+
fps: t?.fps ?? 30,
|
|
266
|
+
quality: t?.quality ?? 10,
|
|
267
|
+
width: t?.width ?? e.renderer.width,
|
|
268
|
+
height: t?.height ?? e.renderer.height,
|
|
269
|
+
duration: t?.duration ?? 0,
|
|
270
|
+
workers: t?.workers ?? 4,
|
|
271
|
+
repeat: t?.repeat ?? 0,
|
|
272
|
+
onProgress: t?.onProgress ?? (() => {})
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
async exportTimeline(e) {
|
|
276
|
+
let t = (e || this._options.duration || this._getTimelineDuration()) ?? 5, n = Math.ceil(t * this._options.fps), r = Math.round(1e3 / this._options.fps), i = await this._createWorkerBlobUrl(), a = new o.default({
|
|
277
|
+
workers: this._options.workers,
|
|
278
|
+
quality: this._options.quality,
|
|
279
|
+
width: this._options.width,
|
|
280
|
+
height: this._options.height,
|
|
281
|
+
repeat: this._options.repeat,
|
|
282
|
+
workerScript: i
|
|
283
|
+
}), s = this._scene.getCanvas(), c = document.createElement("canvas");
|
|
284
|
+
c.width = this._options.width, c.height = this._options.height;
|
|
285
|
+
let l = c.getContext("2d");
|
|
286
|
+
for (let e = 0; e < n; e++) {
|
|
287
|
+
let t = e / this._options.fps;
|
|
288
|
+
this._scene.seek(t), l.clearRect(0, 0, c.width, c.height), l.drawImage(s, 0, 0, c.width, c.height);
|
|
289
|
+
let i = l.getImageData(0, 0, c.width, c.height);
|
|
290
|
+
a.addFrame(i, { delay: r }), this._options.onProgress(e / n * .5);
|
|
291
|
+
}
|
|
292
|
+
return new Promise((e, t) => {
|
|
293
|
+
let n = setTimeout(() => {
|
|
294
|
+
a.abort(), URL.revokeObjectURL(i), t(/* @__PURE__ */ Error("GIF encoding timed out after 60 seconds"));
|
|
295
|
+
}, 6e4);
|
|
296
|
+
a.on("progress", (e) => {
|
|
297
|
+
this._options.onProgress(.5 + e * .5);
|
|
298
|
+
}), a.on("finished", (t) => {
|
|
299
|
+
clearTimeout(n), URL.revokeObjectURL(i), e(t);
|
|
300
|
+
}), a.on("abort", () => {
|
|
301
|
+
clearTimeout(n), URL.revokeObjectURL(i), t(/* @__PURE__ */ Error("GIF encoding was aborted"));
|
|
302
|
+
});
|
|
303
|
+
try {
|
|
304
|
+
a.render();
|
|
305
|
+
} catch (e) {
|
|
306
|
+
clearTimeout(n), URL.revokeObjectURL(i), t(e);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
_getTimelineDuration() {
|
|
311
|
+
let e = this._scene.timeline;
|
|
312
|
+
return e ? e.getDuration() : null;
|
|
313
|
+
}
|
|
314
|
+
async _createWorkerBlobUrl() {
|
|
315
|
+
let e = await fetch("/node_modules/gif.js/dist/gif.worker.js");
|
|
316
|
+
if (!e.ok) {
|
|
317
|
+
let e = await fetch("https://cdn.jsdelivr.net/npm/gif.js@0.2.0/dist/gif.worker.js");
|
|
318
|
+
if (!e.ok) throw Error("Failed to load gif.js worker script");
|
|
319
|
+
let t = await e.text();
|
|
320
|
+
return URL.createObjectURL(new Blob([t], { type: "application/javascript" }));
|
|
321
|
+
}
|
|
322
|
+
let t = await e.text();
|
|
323
|
+
return URL.createObjectURL(new Blob([t], { type: "application/javascript" }));
|
|
324
|
+
}
|
|
325
|
+
static download(e, t = "animation.gif") {
|
|
326
|
+
let n = URL.createObjectURL(e), r = document.createElement("a");
|
|
327
|
+
r.href = n, r.download = t, document.body.appendChild(r), r.click(), document.body.removeChild(r), URL.revokeObjectURL(n);
|
|
328
|
+
}
|
|
329
|
+
async exportAndDownload(t = "animation.gif", n) {
|
|
330
|
+
let r = await this.exportTimeline(n);
|
|
331
|
+
e.download(r, t);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
function c(e, t) {
|
|
335
|
+
return new s(e, t);
|
|
336
|
+
}
|
|
337
|
+
//#endregion
|
|
338
|
+
export { a as n, c as r, s as t };
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { i as e, n as t, r as n, t as r } from "./chunk-DeC0fbbY.js";
|
|
2
|
+
//#region node_modules/gif.js/dist/gif.js
|
|
3
|
+
var i = /* @__PURE__ */ r(((e, t) => {
|
|
4
|
+
(function(n) {
|
|
5
|
+
if (typeof e == "object" && t !== void 0) t.exports = n();
|
|
6
|
+
else if (typeof define == "function" && define.amd) define([], n);
|
|
7
|
+
else {
|
|
8
|
+
var r = typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : this;
|
|
9
|
+
r.GIF = n();
|
|
10
|
+
}
|
|
11
|
+
})(function() {
|
|
12
|
+
return function e(t, r, i) {
|
|
13
|
+
function a(s, c) {
|
|
14
|
+
if (!r[s]) {
|
|
15
|
+
if (!t[s]) {
|
|
16
|
+
var l = typeof n == "function" && n;
|
|
17
|
+
if (!c && l) return l(s, !0);
|
|
18
|
+
if (o) return o(s, !0);
|
|
19
|
+
var u = /* @__PURE__ */ Error("Cannot find module '" + s + "'");
|
|
20
|
+
throw u.code = "MODULE_NOT_FOUND", u;
|
|
21
|
+
}
|
|
22
|
+
var d = r[s] = { exports: {} };
|
|
23
|
+
t[s][0].call(d.exports, function(e) {
|
|
24
|
+
var n = t[s][1][e];
|
|
25
|
+
return a(n || e);
|
|
26
|
+
}, d, d.exports, e, t, r, i);
|
|
27
|
+
}
|
|
28
|
+
return r[s].exports;
|
|
29
|
+
}
|
|
30
|
+
for (var o = typeof n == "function" && n, s = 0; s < i.length; s++) a(i[s]);
|
|
31
|
+
return a;
|
|
32
|
+
}({
|
|
33
|
+
1: [function(e, t, n) {
|
|
34
|
+
function r() {
|
|
35
|
+
this._events = this._events || {}, this._maxListeners = this._maxListeners || void 0;
|
|
36
|
+
}
|
|
37
|
+
t.exports = r, r.EventEmitter = r, r.prototype._events = void 0, r.prototype._maxListeners = void 0, r.defaultMaxListeners = 10, r.prototype.setMaxListeners = function(e) {
|
|
38
|
+
if (!a(e) || e < 0 || isNaN(e)) throw TypeError("n must be a positive number");
|
|
39
|
+
return this._maxListeners = e, this;
|
|
40
|
+
}, r.prototype.emit = function(e) {
|
|
41
|
+
var t, n, r, a, c, l;
|
|
42
|
+
if (this._events ||= {}, e === "error" && (!this._events.error || o(this._events.error) && !this._events.error.length)) {
|
|
43
|
+
if (t = arguments[1], t instanceof Error) throw t;
|
|
44
|
+
var u = /* @__PURE__ */ Error("Uncaught, unspecified \"error\" event. (" + t + ")");
|
|
45
|
+
throw u.context = t, u;
|
|
46
|
+
}
|
|
47
|
+
if (n = this._events[e], s(n)) return !1;
|
|
48
|
+
if (i(n)) switch (arguments.length) {
|
|
49
|
+
case 1:
|
|
50
|
+
n.call(this);
|
|
51
|
+
break;
|
|
52
|
+
case 2:
|
|
53
|
+
n.call(this, arguments[1]);
|
|
54
|
+
break;
|
|
55
|
+
case 3:
|
|
56
|
+
n.call(this, arguments[1], arguments[2]);
|
|
57
|
+
break;
|
|
58
|
+
default: a = Array.prototype.slice.call(arguments, 1), n.apply(this, a);
|
|
59
|
+
}
|
|
60
|
+
else if (o(n)) for (a = Array.prototype.slice.call(arguments, 1), l = n.slice(), r = l.length, c = 0; c < r; c++) l[c].apply(this, a);
|
|
61
|
+
return !0;
|
|
62
|
+
}, r.prototype.addListener = function(e, t) {
|
|
63
|
+
var n;
|
|
64
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
65
|
+
return this._events ||= {}, this._events.newListener && this.emit("newListener", e, i(t.listener) ? t.listener : t), this._events[e] ? o(this._events[e]) ? this._events[e].push(t) : this._events[e] = [this._events[e], t] : this._events[e] = t, o(this._events[e]) && !this._events[e].warned && (n = s(this._maxListeners) ? r.defaultMaxListeners : this._maxListeners, n && n > 0 && this._events[e].length > n && (this._events[e].warned = !0, console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[e].length), typeof console.trace == "function" && console.trace())), this;
|
|
66
|
+
}, r.prototype.on = r.prototype.addListener, r.prototype.once = function(e, t) {
|
|
67
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
68
|
+
var n = !1;
|
|
69
|
+
function r() {
|
|
70
|
+
this.removeListener(e, r), n || (n = !0, t.apply(this, arguments));
|
|
71
|
+
}
|
|
72
|
+
return r.listener = t, this.on(e, r), this;
|
|
73
|
+
}, r.prototype.removeListener = function(e, t) {
|
|
74
|
+
var n, r, a, s;
|
|
75
|
+
if (!i(t)) throw TypeError("listener must be a function");
|
|
76
|
+
if (!this._events || !this._events[e]) return this;
|
|
77
|
+
if (n = this._events[e], a = n.length, r = -1, n === t || i(n.listener) && n.listener === t) delete this._events[e], this._events.removeListener && this.emit("removeListener", e, t);
|
|
78
|
+
else if (o(n)) {
|
|
79
|
+
for (s = a; s-- > 0;) if (n[s] === t || n[s].listener && n[s].listener === t) {
|
|
80
|
+
r = s;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (r < 0) return this;
|
|
84
|
+
n.length === 1 ? (n.length = 0, delete this._events[e]) : n.splice(r, 1), this._events.removeListener && this.emit("removeListener", e, t);
|
|
85
|
+
}
|
|
86
|
+
return this;
|
|
87
|
+
}, r.prototype.removeAllListeners = function(e) {
|
|
88
|
+
var t, n;
|
|
89
|
+
if (!this._events) return this;
|
|
90
|
+
if (!this._events.removeListener) return arguments.length === 0 ? this._events = {} : this._events[e] && delete this._events[e], this;
|
|
91
|
+
if (arguments.length === 0) {
|
|
92
|
+
for (t in this._events) t !== "removeListener" && this.removeAllListeners(t);
|
|
93
|
+
return this.removeAllListeners("removeListener"), this._events = {}, this;
|
|
94
|
+
}
|
|
95
|
+
if (n = this._events[e], i(n)) this.removeListener(e, n);
|
|
96
|
+
else if (n) for (; n.length;) this.removeListener(e, n[n.length - 1]);
|
|
97
|
+
return delete this._events[e], this;
|
|
98
|
+
}, r.prototype.listeners = function(e) {
|
|
99
|
+
return !this._events || !this._events[e] ? [] : i(this._events[e]) ? [this._events[e]] : this._events[e].slice();
|
|
100
|
+
}, r.prototype.listenerCount = function(e) {
|
|
101
|
+
if (this._events) {
|
|
102
|
+
var t = this._events[e];
|
|
103
|
+
if (i(t)) return 1;
|
|
104
|
+
if (t) return t.length;
|
|
105
|
+
}
|
|
106
|
+
return 0;
|
|
107
|
+
}, r.listenerCount = function(e, t) {
|
|
108
|
+
return e.listenerCount(t);
|
|
109
|
+
};
|
|
110
|
+
function i(e) {
|
|
111
|
+
return typeof e == "function";
|
|
112
|
+
}
|
|
113
|
+
function a(e) {
|
|
114
|
+
return typeof e == "number";
|
|
115
|
+
}
|
|
116
|
+
function o(e) {
|
|
117
|
+
return typeof e == "object" && !!e;
|
|
118
|
+
}
|
|
119
|
+
function s(e) {
|
|
120
|
+
return e === void 0;
|
|
121
|
+
}
|
|
122
|
+
}, {}],
|
|
123
|
+
2: [function(e, t, n) {
|
|
124
|
+
var r, i, a, o, s = navigator.userAgent.toLowerCase();
|
|
125
|
+
o = navigator.platform.toLowerCase(), r = s.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [
|
|
126
|
+
null,
|
|
127
|
+
"unknown",
|
|
128
|
+
0
|
|
129
|
+
], a = r[1] === "ie" && document.documentMode, i = {
|
|
130
|
+
name: r[1] === "version" ? r[3] : r[1],
|
|
131
|
+
version: a || parseFloat(r[1] === "opera" && r[4] ? r[4] : r[2]),
|
|
132
|
+
platform: { name: s.match(/ip(?:ad|od|hone)/) ? "ios" : (s.match(/(?:webos|android)/) || o.match(/mac|win|linux/) || ["other"])[0] }
|
|
133
|
+
}, i[i.name] = !0, i[i.name + parseInt(i.version, 10)] = !0, i.platform[i.platform.name] = !0, t.exports = i;
|
|
134
|
+
}, {}],
|
|
135
|
+
3: [function(e, t, n) {
|
|
136
|
+
var r, i, a, o = function(e, t) {
|
|
137
|
+
for (var n in t) s.call(t, n) && (e[n] = t[n]);
|
|
138
|
+
function r() {
|
|
139
|
+
this.constructor = e;
|
|
140
|
+
}
|
|
141
|
+
return r.prototype = t.prototype, e.prototype = new r(), e.__super__ = t.prototype, e;
|
|
142
|
+
}, s = {}.hasOwnProperty, c = [].indexOf || function(e) {
|
|
143
|
+
for (var t = 0, n = this.length; t < n; t++) if (t in this && this[t] === e) return t;
|
|
144
|
+
return -1;
|
|
145
|
+
}, l = [].slice;
|
|
146
|
+
r = e("events").EventEmitter, a = e("./browser.coffee"), i = function(e) {
|
|
147
|
+
var t, n;
|
|
148
|
+
o(r, e), t = {
|
|
149
|
+
workerScript: "gif.worker.js",
|
|
150
|
+
workers: 2,
|
|
151
|
+
repeat: 0,
|
|
152
|
+
background: "#fff",
|
|
153
|
+
quality: 10,
|
|
154
|
+
width: null,
|
|
155
|
+
height: null,
|
|
156
|
+
transparent: null,
|
|
157
|
+
debug: !1,
|
|
158
|
+
dither: !1
|
|
159
|
+
}, n = {
|
|
160
|
+
delay: 500,
|
|
161
|
+
copy: !1
|
|
162
|
+
};
|
|
163
|
+
function r(e) {
|
|
164
|
+
var n, r, i;
|
|
165
|
+
for (r in this.running = !1, this.options = {}, this.frames = [], this.freeWorkers = [], this.activeWorkers = [], this.setOptions(e), t) i = t[r], (n = this.options)[r] ?? (n[r] = i);
|
|
166
|
+
}
|
|
167
|
+
return r.prototype.setOption = function(e, t) {
|
|
168
|
+
if (this.options[e] = t, this._canvas != null && (e === "width" || e === "height")) return this._canvas[e] = t;
|
|
169
|
+
}, r.prototype.setOptions = function(e) {
|
|
170
|
+
var t, n = [], r;
|
|
171
|
+
for (t in e) s.call(e, t) && (r = e[t], n.push(this.setOption(t, r)));
|
|
172
|
+
return n;
|
|
173
|
+
}, r.prototype.addFrame = function(e, t) {
|
|
174
|
+
var r, i;
|
|
175
|
+
for (i in t ??= {}, r = {}, r.transparent = this.options.transparent, n) r[i] = t[i] || n[i];
|
|
176
|
+
if (this.options.width ?? this.setOption("width", e.width), this.options.height ?? this.setOption("height", e.height), typeof ImageData < "u" && ImageData !== null && e instanceof ImageData) r.data = e.data;
|
|
177
|
+
else if (typeof CanvasRenderingContext2D < "u" && CanvasRenderingContext2D !== null && e instanceof CanvasRenderingContext2D || typeof WebGLRenderingContext < "u" && WebGLRenderingContext !== null && e instanceof WebGLRenderingContext) t.copy ? r.data = this.getContextData(e) : r.context = e;
|
|
178
|
+
else if (e.childNodes != null) t.copy ? r.data = this.getImageData(e) : r.image = e;
|
|
179
|
+
else throw Error("Invalid image");
|
|
180
|
+
return this.frames.push(r);
|
|
181
|
+
}, r.prototype.render = function() {
|
|
182
|
+
var e, t, n;
|
|
183
|
+
if (this.running) throw Error("Already running");
|
|
184
|
+
if (this.options.width == null || this.options.height == null) throw Error("Width and height must be set prior to rendering");
|
|
185
|
+
if (this.running = !0, this.nextFrame = 0, this.finishedFrames = 0, this.imageParts = function() {
|
|
186
|
+
var e, t, n = [];
|
|
187
|
+
for (e = 0, t = this.frames.length; 0 <= t ? e < t : e > t; 0 <= t ? ++e : --e) n.push(null);
|
|
188
|
+
return n;
|
|
189
|
+
}.call(this), t = this.spawnWorkers(), this.options.globalPalette === !0) this.renderNextFrame();
|
|
190
|
+
else for (e = 0, n = t; 0 <= n ? e < n : e > n; 0 <= n ? ++e : --e) this.renderNextFrame();
|
|
191
|
+
return this.emit("start"), this.emit("progress", 0);
|
|
192
|
+
}, r.prototype.abort = function() {
|
|
193
|
+
for (var e; e = this.activeWorkers.shift(), e != null;) this.log("killing active worker"), e.terminate();
|
|
194
|
+
return this.running = !1, this.emit("abort");
|
|
195
|
+
}, r.prototype.spawnWorkers = function() {
|
|
196
|
+
var e = Math.min(this.options.workers, this.frames.length), t, n;
|
|
197
|
+
return (function() {
|
|
198
|
+
n = [];
|
|
199
|
+
for (var r = t = this.freeWorkers.length; t <= e ? r < e : r > e; t <= e ? r++ : r--) n.push(r);
|
|
200
|
+
return n;
|
|
201
|
+
}).apply(this).forEach(function(e) {
|
|
202
|
+
return function(t) {
|
|
203
|
+
var n;
|
|
204
|
+
return e.log("spawning worker " + t), n = new Worker(e.options.workerScript), n.onmessage = function(t) {
|
|
205
|
+
return e.activeWorkers.splice(e.activeWorkers.indexOf(n), 1), e.freeWorkers.push(n), e.frameFinished(t.data);
|
|
206
|
+
}, e.freeWorkers.push(n);
|
|
207
|
+
};
|
|
208
|
+
}(this)), e;
|
|
209
|
+
}, r.prototype.frameFinished = function(e) {
|
|
210
|
+
var t, n;
|
|
211
|
+
if (this.log("frame " + e.index + " finished - " + this.activeWorkers.length + " active"), this.finishedFrames++, this.emit("progress", this.finishedFrames / this.frames.length), this.imageParts[e.index] = e, this.options.globalPalette === !0 && (this.options.globalPalette = e.globalPalette, this.log("global palette analyzed"), this.frames.length > 2)) for (t = 1, n = this.freeWorkers.length; 1 <= n ? t < n : t > n; 1 <= n ? ++t : --t) this.renderNextFrame();
|
|
212
|
+
return c.call(this.imageParts, null) >= 0 ? this.renderNextFrame() : this.finishRendering();
|
|
213
|
+
}, r.prototype.finishRendering = function() {
|
|
214
|
+
var e, t, n, r, i, a, o, s = 0, c, l, u, d, f, p = this.imageParts, m, h;
|
|
215
|
+
for (i = 0, c = p.length; i < c; i++) t = p[i], s += (t.data.length - 1) * t.pageSize + t.cursor;
|
|
216
|
+
for (s += t.pageSize - t.cursor, this.log("rendering finished - filesize " + Math.round(s / 1e3) + "kb"), e = new Uint8Array(s), d = 0, m = this.imageParts, a = 0, l = m.length; a < l; a++) for (t = m[a], h = t.data, n = o = 0, u = h.length; o < u; n = ++o) f = h[n], e.set(f, d), n === t.data.length - 1 ? d += t.cursor : d += t.pageSize;
|
|
217
|
+
return r = new Blob([e], { type: "image/gif" }), this.emit("finished", r, e);
|
|
218
|
+
}, r.prototype.renderNextFrame = function() {
|
|
219
|
+
var e, t, n;
|
|
220
|
+
if (this.freeWorkers.length === 0) throw Error("No free workers");
|
|
221
|
+
if (!(this.nextFrame >= this.frames.length)) return e = this.frames[this.nextFrame++], n = this.freeWorkers.shift(), t = this.getTask(e), this.log("starting frame " + (t.index + 1) + " of " + this.frames.length), this.activeWorkers.push(n), n.postMessage(t);
|
|
222
|
+
}, r.prototype.getContextData = function(e) {
|
|
223
|
+
return e.getImageData(0, 0, this.options.width, this.options.height).data;
|
|
224
|
+
}, r.prototype.getImageData = function(e) {
|
|
225
|
+
var t;
|
|
226
|
+
return this._canvas ?? (this._canvas = document.createElement("canvas"), this._canvas.width = this.options.width, this._canvas.height = this.options.height), t = this._canvas.getContext("2d"), t.setFill = this.options.background, t.fillRect(0, 0, this.options.width, this.options.height), t.drawImage(e, 0, 0), this.getContextData(t);
|
|
227
|
+
}, r.prototype.getTask = function(e) {
|
|
228
|
+
var t = this.frames.indexOf(e), n = {
|
|
229
|
+
index: t,
|
|
230
|
+
last: t === this.frames.length - 1,
|
|
231
|
+
delay: e.delay,
|
|
232
|
+
transparent: e.transparent,
|
|
233
|
+
width: this.options.width,
|
|
234
|
+
height: this.options.height,
|
|
235
|
+
quality: this.options.quality,
|
|
236
|
+
dither: this.options.dither,
|
|
237
|
+
globalPalette: this.options.globalPalette,
|
|
238
|
+
repeat: this.options.repeat,
|
|
239
|
+
canTransfer: a.name === "chrome"
|
|
240
|
+
};
|
|
241
|
+
if (e.data != null) n.data = e.data;
|
|
242
|
+
else if (e.context != null) n.data = this.getContextData(e.context);
|
|
243
|
+
else if (e.image != null) n.data = this.getImageData(e.image);
|
|
244
|
+
else throw Error("Invalid frame");
|
|
245
|
+
return n;
|
|
246
|
+
}, r.prototype.log = function() {
|
|
247
|
+
var e = 1 <= arguments.length ? l.call(arguments, 0) : [];
|
|
248
|
+
if (this.options.debug) return console.log.apply(console, e);
|
|
249
|
+
}, r;
|
|
250
|
+
}(r), t.exports = i;
|
|
251
|
+
}, {
|
|
252
|
+
"./browser.coffee": 2,
|
|
253
|
+
events: 1
|
|
254
|
+
}]
|
|
255
|
+
}, {}, [3])(3);
|
|
256
|
+
});
|
|
257
|
+
})), a = /* @__PURE__ */ t({
|
|
258
|
+
GifExporter: () => s,
|
|
259
|
+
createGifExporter: () => c
|
|
260
|
+
}), o = /* @__PURE__ */ e(i(), 1), s = class e {
|
|
261
|
+
_scene;
|
|
262
|
+
_options;
|
|
263
|
+
constructor(e, t) {
|
|
264
|
+
this._scene = e, this._options = {
|
|
265
|
+
fps: t?.fps ?? 30,
|
|
266
|
+
quality: t?.quality ?? 10,
|
|
267
|
+
width: t?.width ?? e.renderer.width,
|
|
268
|
+
height: t?.height ?? e.renderer.height,
|
|
269
|
+
duration: t?.duration ?? 0,
|
|
270
|
+
workers: t?.workers ?? 4,
|
|
271
|
+
repeat: t?.repeat ?? 0,
|
|
272
|
+
onProgress: t?.onProgress ?? (() => {})
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
async exportTimeline(e) {
|
|
276
|
+
let t = (e || this._options.duration || this._getTimelineDuration()) ?? 5, n = Math.ceil(t * this._options.fps), r = Math.round(1e3 / this._options.fps), i = await this._createWorkerBlobUrl(), a = new o.default({
|
|
277
|
+
workers: this._options.workers,
|
|
278
|
+
quality: this._options.quality,
|
|
279
|
+
width: this._options.width,
|
|
280
|
+
height: this._options.height,
|
|
281
|
+
repeat: this._options.repeat,
|
|
282
|
+
workerScript: i
|
|
283
|
+
}), s = this._scene.getCanvas(), c = document.createElement("canvas");
|
|
284
|
+
c.width = this._options.width, c.height = this._options.height;
|
|
285
|
+
let l = c.getContext("2d");
|
|
286
|
+
for (let e = 0; e < n; e++) {
|
|
287
|
+
let t = e / this._options.fps;
|
|
288
|
+
this._scene.seek(t), l.clearRect(0, 0, c.width, c.height), l.drawImage(s, 0, 0, c.width, c.height);
|
|
289
|
+
let i = l.getImageData(0, 0, c.width, c.height);
|
|
290
|
+
a.addFrame(i, { delay: r }), this._options.onProgress(e / n * .5);
|
|
291
|
+
}
|
|
292
|
+
return new Promise((e, t) => {
|
|
293
|
+
let n = setTimeout(() => {
|
|
294
|
+
a.abort(), URL.revokeObjectURL(i), t(/* @__PURE__ */ Error("GIF encoding timed out after 60 seconds"));
|
|
295
|
+
}, 6e4);
|
|
296
|
+
a.on("progress", (e) => {
|
|
297
|
+
this._options.onProgress(.5 + e * .5);
|
|
298
|
+
}), a.on("finished", (t) => {
|
|
299
|
+
clearTimeout(n), URL.revokeObjectURL(i), e(t);
|
|
300
|
+
}), a.on("abort", () => {
|
|
301
|
+
clearTimeout(n), URL.revokeObjectURL(i), t(/* @__PURE__ */ Error("GIF encoding was aborted"));
|
|
302
|
+
});
|
|
303
|
+
try {
|
|
304
|
+
a.render();
|
|
305
|
+
} catch (e) {
|
|
306
|
+
clearTimeout(n), URL.revokeObjectURL(i), t(e);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
_getTimelineDuration() {
|
|
311
|
+
let e = this._scene.timeline;
|
|
312
|
+
return e ? e.getDuration() : null;
|
|
313
|
+
}
|
|
314
|
+
async _createWorkerBlobUrl() {
|
|
315
|
+
let e = await fetch("/node_modules/gif.js/dist/gif.worker.js");
|
|
316
|
+
if (!e.ok) {
|
|
317
|
+
let e = await fetch("https://cdn.jsdelivr.net/npm/gif.js@0.2.0/dist/gif.worker.js");
|
|
318
|
+
if (!e.ok) throw Error("Failed to load gif.js worker script");
|
|
319
|
+
let t = await e.text();
|
|
320
|
+
return URL.createObjectURL(new Blob([t], { type: "application/javascript" }));
|
|
321
|
+
}
|
|
322
|
+
let t = await e.text();
|
|
323
|
+
return URL.createObjectURL(new Blob([t], { type: "application/javascript" }));
|
|
324
|
+
}
|
|
325
|
+
static download(e, t = "animation.gif") {
|
|
326
|
+
let n = URL.createObjectURL(e), r = document.createElement("a");
|
|
327
|
+
r.href = n, r.download = t, document.body.appendChild(r), r.click(), document.body.removeChild(r), URL.revokeObjectURL(n);
|
|
328
|
+
}
|
|
329
|
+
async exportAndDownload(t = "animation.gif", n) {
|
|
330
|
+
let r = await this.exportTimeline(n);
|
|
331
|
+
e.download(r, t);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
function c(e, t) {
|
|
335
|
+
return new s(e, t);
|
|
336
|
+
}
|
|
337
|
+
//#endregion
|
|
338
|
+
export { a as n, c as r, s as t };
|