@tsparticles/shape-image 4.0.0-alpha.8 → 4.0.0-beta.0
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/375.min.js +1 -0
- package/550.min.js +1 -0
- package/682.min.js +1 -0
- package/814.min.js +1 -0
- package/browser/GifUtils/ByteStream.js +3 -1
- package/browser/GifUtils/Utils.js +36 -42
- package/browser/ImageDrawer.js +28 -32
- package/browser/ImagePreloader.js +7 -5
- package/browser/ImagePreloaderInstance.js +11 -0
- package/browser/Options/Classes/Preload.js +6 -0
- package/browser/Utils.js +7 -6
- package/browser/index.js +27 -13
- package/cjs/GifUtils/ByteStream.js +3 -1
- package/cjs/GifUtils/Utils.js +36 -42
- package/cjs/ImageDrawer.js +28 -32
- package/cjs/ImagePreloader.js +7 -5
- package/cjs/ImagePreloaderInstance.js +11 -0
- package/cjs/Options/Classes/Preload.js +6 -0
- package/cjs/Utils.js +7 -6
- package/cjs/index.js +27 -13
- package/dist_browser_GifUtils_Utils_js.js +6 -16
- package/dist_browser_ImageDrawer_js.js +2 -2
- package/dist_browser_ImagePreloaderInstance_js.js +30 -0
- package/dist_browser_ImagePreloader_js.js +3 -3
- package/esm/GifUtils/ByteStream.js +3 -1
- package/esm/GifUtils/Utils.js +36 -42
- package/esm/ImageDrawer.js +28 -32
- package/esm/ImagePreloader.js +7 -5
- package/esm/ImagePreloaderInstance.js +11 -0
- package/esm/Options/Classes/Preload.js +6 -0
- package/esm/Utils.js +7 -6
- package/esm/index.js +27 -13
- package/package.json +2 -2
- package/report.html +1 -1
- package/tsparticles.shape.image.js +40 -18
- package/tsparticles.shape.image.min.js +2 -2
- package/types/GifUtils/Utils.d.ts +4 -4
- package/types/ImageDrawer.d.ts +1 -3
- package/types/ImagePreloader.d.ts +5 -4
- package/types/ImagePreloaderInstance.d.ts +8 -0
- package/types/Utils.d.ts +1 -0
- package/types/types.d.ts +3 -2
- package/umd/GifUtils/ByteStream.js +3 -1
- package/umd/GifUtils/Utils.js +37 -43
- package/umd/ImageDrawer.js +27 -31
- package/umd/ImagePreloader.js +41 -5
- package/umd/ImagePreloaderInstance.js +25 -0
- package/umd/Options/Classes/Preload.js +6 -0
- package/umd/Utils.js +8 -6
- package/umd/index.js +28 -14
- package/324.min.js +0 -2
- package/324.min.js.LICENSE.txt +0 -1
- package/337.min.js +0 -2
- package/337.min.js.LICENSE.txt +0 -1
- package/413.min.js +0 -2
- package/413.min.js.LICENSE.txt +0 -1
- package/72.min.js +0 -2
- package/72.min.js.LICENSE.txt +0 -1
- package/dist_browser_Utils_js.js +0 -30
- package/tsparticles.shape.image.min.js.LICENSE.txt +0 -1
package/umd/GifUtils/Utils.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
if (v !== undefined) module.exports = v;
|
|
5
5
|
}
|
|
6
6
|
else if (typeof define === "function" && define.amd) {
|
|
7
|
-
define(["require", "exports", "@tsparticles/engine", "
|
|
7
|
+
define(["require", "exports", "../Utils.js", "@tsparticles/engine", "./Constants.js", "./ByteStream.js", "./Enums/DisposalMethod.js", "./Types/GIFDataHeaders.js"], factory);
|
|
8
8
|
}
|
|
9
9
|
})(function (require, exports) {
|
|
10
10
|
"use strict";
|
|
@@ -13,16 +13,13 @@
|
|
|
13
13
|
exports.decodeGIF = decodeGIF;
|
|
14
14
|
exports.drawGif = drawGif;
|
|
15
15
|
exports.loadGifImage = loadGifImage;
|
|
16
|
-
const engine_1 = require("@tsparticles/engine");
|
|
17
16
|
const Utils_js_1 = require("../Utils.js");
|
|
17
|
+
const engine_1 = require("@tsparticles/engine");
|
|
18
18
|
const Constants_js_1 = require("./Constants.js");
|
|
19
19
|
const ByteStream_js_1 = require("./ByteStream.js");
|
|
20
20
|
const DisposalMethod_js_1 = require("./Enums/DisposalMethod.js");
|
|
21
21
|
const GIFDataHeaders_js_1 = require("./Types/GIFDataHeaders.js");
|
|
22
|
-
const
|
|
23
|
-
x: 0,
|
|
24
|
-
y: 0,
|
|
25
|
-
}, defaultFrame = 0, initialTime = 0, firstIndex = 0, defaultLoopCount = 0;
|
|
22
|
+
const defaultFrame = 0, initialTime = 0, firstIndex = 0, defaultLoopCount = 0;
|
|
26
23
|
function parseColorTable(byteStream, count) {
|
|
27
24
|
const colors = [];
|
|
28
25
|
for (let i = 0; i < count; i++) {
|
|
@@ -92,7 +89,13 @@
|
|
|
92
89
|
break;
|
|
93
90
|
}
|
|
94
91
|
}
|
|
95
|
-
|
|
92
|
+
function readBits(imageData, pos, len) {
|
|
93
|
+
const bytePos = pos >>> 3, bitPos = pos & 7;
|
|
94
|
+
return (((imageData[bytePos] + (imageData[bytePos + 1] << 8) + (imageData[bytePos + 2] << 16)) &
|
|
95
|
+
(((1 << len) - 1) << bitPos)) >>>
|
|
96
|
+
bitPos);
|
|
97
|
+
}
|
|
98
|
+
async function parseImageBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, canvasSettings, progressCallback) {
|
|
96
99
|
const frame = gif.frames[getFrameIndex(true)];
|
|
97
100
|
frame.left = byteStream.nextTwoBytes();
|
|
98
101
|
frame.top = byteStream.nextTwoBytes();
|
|
@@ -111,10 +114,9 @@
|
|
|
111
114
|
return { r, g, b, a: 255 };
|
|
112
115
|
}
|
|
113
116
|
return { r, g, b, a: avgAlpha ? Math.trunc((r + g + b) / 3) : 0 };
|
|
114
|
-
}
|
|
115
|
-
const image = (() => {
|
|
117
|
+
}, image = (() => {
|
|
116
118
|
try {
|
|
117
|
-
return new ImageData(frame.width, frame.height,
|
|
119
|
+
return new ImageData(frame.width, frame.height, canvasSettings);
|
|
118
120
|
}
|
|
119
121
|
catch (error) {
|
|
120
122
|
if (error instanceof DOMException && error.name === "IndexSizeError") {
|
|
@@ -127,19 +129,13 @@
|
|
|
127
129
|
throw new EvalError("GIF frame size is to large");
|
|
128
130
|
}
|
|
129
131
|
const minCodeSize = byteStream.nextByte(), imageData = byteStream.readSubBlocksBin(), clearCode = 1 << minCodeSize;
|
|
130
|
-
const readBits = (pos, len) => {
|
|
131
|
-
const bytePos = pos >>> 3, bitPos = pos & 7;
|
|
132
|
-
return (((imageData[bytePos] + (imageData[bytePos + 1] << 8) + (imageData[bytePos + 2] << 16)) &
|
|
133
|
-
(((1 << len) - 1) << bitPos)) >>>
|
|
134
|
-
bitPos);
|
|
135
|
-
};
|
|
136
132
|
if (interlacedFlag) {
|
|
137
133
|
for (let code = 0, size = minCodeSize + 1, pos = 0, dic = [[0]], pass = 0; pass < 4; pass++) {
|
|
138
134
|
if (Constants_js_1.InterlaceOffsets[pass] < frame.height) {
|
|
139
135
|
let pixelPos = 0, lineIndex = 0, exit = false;
|
|
140
136
|
while (!exit) {
|
|
141
137
|
const last = code;
|
|
142
|
-
code = readBits(pos, size);
|
|
138
|
+
code = readBits(imageData, pos, size);
|
|
143
139
|
pos += size + 1;
|
|
144
140
|
if (code === clearCode) {
|
|
145
141
|
size = minCodeSize + 1;
|
|
@@ -184,7 +180,7 @@
|
|
|
184
180
|
const dic = [[0]];
|
|
185
181
|
for (;;) {
|
|
186
182
|
const last = code;
|
|
187
|
-
code = readBits(pos, size);
|
|
183
|
+
code = readBits(imageData, pos, size);
|
|
188
184
|
pos += size;
|
|
189
185
|
if (code === clearCode) {
|
|
190
186
|
size = minCodeSize + 1;
|
|
@@ -205,8 +201,8 @@
|
|
|
205
201
|
}
|
|
206
202
|
for (const item of dic[code]) {
|
|
207
203
|
const { r, g, b, a } = getColor(item);
|
|
208
|
-
image.data.set([r, g, b, a], pixelPos);
|
|
209
204
|
pixelPos += 4;
|
|
205
|
+
image.data.set([r, g, b, a], pixelPos);
|
|
210
206
|
}
|
|
211
207
|
if (dic.length >= 1 << size && size < 0xc) {
|
|
212
208
|
size++;
|
|
@@ -218,12 +214,12 @@
|
|
|
218
214
|
progressCallback?.((byteStream.pos + 1) / byteStream.data.length, getFrameIndex(false) + 1, frame.image, { x: frame.left, y: frame.top }, { width: gif.width, height: gif.height });
|
|
219
215
|
}
|
|
220
216
|
}
|
|
221
|
-
async function parseBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, progressCallback) {
|
|
217
|
+
async function parseBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, canvasSettings, progressCallback) {
|
|
222
218
|
switch (byteStream.nextByte()) {
|
|
223
219
|
case GIFDataHeaders_js_1.GIFDataHeaders.EndOfFile:
|
|
224
220
|
return true;
|
|
225
221
|
case GIFDataHeaders_js_1.GIFDataHeaders.Image:
|
|
226
|
-
await parseImageBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, progressCallback);
|
|
222
|
+
await parseImageBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, canvasSettings, progressCallback);
|
|
227
223
|
break;
|
|
228
224
|
case GIFDataHeaders_js_1.GIFDataHeaders.Extension:
|
|
229
225
|
parseExtensionBlock(byteStream, gif, getFrameIndex, getTransparencyIndex);
|
|
@@ -240,16 +236,15 @@
|
|
|
240
236
|
}
|
|
241
237
|
return extension.data[1] + (extension.data[2] << 8);
|
|
242
238
|
}
|
|
243
|
-
return NaN;
|
|
239
|
+
return Number.NaN;
|
|
244
240
|
}
|
|
245
|
-
async function decodeGIF(gifURL, progressCallback, avgAlpha) {
|
|
241
|
+
async function decodeGIF(gifURL, canvasSettings, progressCallback, avgAlpha) {
|
|
246
242
|
avgAlpha ??= false;
|
|
247
243
|
const res = await fetch(gifURL);
|
|
248
244
|
if (!res.ok && res.status === 404) {
|
|
249
245
|
throw new EvalError("file not found");
|
|
250
246
|
}
|
|
251
|
-
const buffer = await res.arrayBuffer()
|
|
252
|
-
const gif = {
|
|
247
|
+
const buffer = await res.arrayBuffer(), gif = {
|
|
253
248
|
width: 0,
|
|
254
249
|
height: 0,
|
|
255
250
|
totalTime: 0,
|
|
@@ -258,7 +253,7 @@
|
|
|
258
253
|
frames: [],
|
|
259
254
|
sortFlag: false,
|
|
260
255
|
globalColorTable: [],
|
|
261
|
-
backgroundImage: new ImageData(1, 1,
|
|
256
|
+
backgroundImage: new ImageData(1, 1, canvasSettings),
|
|
262
257
|
comments: [],
|
|
263
258
|
applicationExtensions: [],
|
|
264
259
|
}, byteStream = new ByteStream_js_1.ByteStream(new Uint8ClampedArray(buffer));
|
|
@@ -280,7 +275,7 @@
|
|
|
280
275
|
}
|
|
281
276
|
const backgroundImage = (() => {
|
|
282
277
|
try {
|
|
283
|
-
return new ImageData(gif.width, gif.height,
|
|
278
|
+
return new ImageData(gif.width, gif.height, canvasSettings);
|
|
284
279
|
}
|
|
285
280
|
catch (error) {
|
|
286
281
|
if (error instanceof DOMException && error.name === "IndexSizeError") {
|
|
@@ -304,8 +299,7 @@
|
|
|
304
299
|
incrementFrameIndex = true;
|
|
305
300
|
}
|
|
306
301
|
return frameIndex;
|
|
307
|
-
}
|
|
308
|
-
const getTransparencyIndex = (newValue) => {
|
|
302
|
+
}, getTransparencyIndex = (newValue) => {
|
|
309
303
|
if (newValue != null) {
|
|
310
304
|
transparencyIndex = newValue;
|
|
311
305
|
}
|
|
@@ -320,7 +314,7 @@
|
|
|
320
314
|
width: 0,
|
|
321
315
|
height: 0,
|
|
322
316
|
disposalMethod: DisposalMethod_js_1.DisposalMethod.Replace,
|
|
323
|
-
image: new ImageData(1, 1,
|
|
317
|
+
image: new ImageData(1, 1, canvasSettings),
|
|
324
318
|
plainTextData: null,
|
|
325
319
|
userInputDelayFlag: false,
|
|
326
320
|
delayTime: 0,
|
|
@@ -333,7 +327,7 @@
|
|
|
333
327
|
transparencyIndex = -1;
|
|
334
328
|
incrementFrameIndex = false;
|
|
335
329
|
}
|
|
336
|
-
} while (!(await parseBlock(byteStream, gif, avgAlpha, getframeIndex, getTransparencyIndex, progressCallback)));
|
|
330
|
+
} while (!(await parseBlock(byteStream, gif, avgAlpha, getframeIndex, getTransparencyIndex, canvasSettings, progressCallback)));
|
|
337
331
|
gif.frames.length--;
|
|
338
332
|
for (const frame of gif.frames) {
|
|
339
333
|
if (frame.userInputDelayFlag && frame.delayTime === 0) {
|
|
@@ -346,23 +340,23 @@
|
|
|
346
340
|
}
|
|
347
341
|
catch (error) {
|
|
348
342
|
if (error instanceof EvalError) {
|
|
349
|
-
throw new Error(`error while parsing frame ${frameIndex.toString()} "${error.message}"
|
|
343
|
+
throw new Error(`error while parsing frame ${frameIndex.toString()} "${error.message}"`, { cause: error });
|
|
350
344
|
}
|
|
351
345
|
throw error;
|
|
352
346
|
}
|
|
353
347
|
}
|
|
354
|
-
function drawGif(data) {
|
|
348
|
+
function drawGif(data, canvasSettings) {
|
|
355
349
|
const { context, radius, particle, delta } = data, image = particle.image;
|
|
356
350
|
if (!image?.gifData || !image.gif) {
|
|
357
351
|
return;
|
|
358
352
|
}
|
|
359
|
-
const offscreenCanvas = new OffscreenCanvas(image.gifData.width, image.gifData.height), offscreenContext = offscreenCanvas.getContext("2d");
|
|
353
|
+
const offscreenCanvas = new OffscreenCanvas(image.gifData.width, image.gifData.height), offscreenContext = offscreenCanvas.getContext("2d", canvasSettings);
|
|
360
354
|
if (!offscreenContext) {
|
|
361
355
|
throw new Error("could not create offscreen canvas context");
|
|
362
356
|
}
|
|
363
357
|
offscreenContext.imageSmoothingQuality = "low";
|
|
364
358
|
offscreenContext.imageSmoothingEnabled = false;
|
|
365
|
-
offscreenContext.clearRect(
|
|
359
|
+
offscreenContext.clearRect(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
366
360
|
particle.gifLoopCount ??= image.gifLoopCount ?? defaultLoopCount;
|
|
367
361
|
let frameIndex = particle.gifFrame ?? defaultFrame;
|
|
368
362
|
const pos = { x: -image.gifData.width * engine_1.half, y: -image.gifData.height * engine_1.half }, frame = image.gifData.frames[frameIndex];
|
|
@@ -379,7 +373,7 @@
|
|
|
379
373
|
case DisposalMethod_js_1.DisposalMethod.Replace:
|
|
380
374
|
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
381
375
|
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
382
|
-
offscreenContext.clearRect(
|
|
376
|
+
offscreenContext.clearRect(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
383
377
|
break;
|
|
384
378
|
case DisposalMethod_js_1.DisposalMethod.Combine:
|
|
385
379
|
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
@@ -388,7 +382,7 @@
|
|
|
388
382
|
case DisposalMethod_js_1.DisposalMethod.RestoreBackground:
|
|
389
383
|
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
390
384
|
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
391
|
-
offscreenContext.clearRect(
|
|
385
|
+
offscreenContext.clearRect(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
392
386
|
if (!image.gifData.globalColorTable.length) {
|
|
393
387
|
offscreenContext.putImageData(image.gifData.frames[firstIndex].image, pos.x + frame.left, pos.y + frame.top);
|
|
394
388
|
}
|
|
@@ -398,11 +392,11 @@
|
|
|
398
392
|
break;
|
|
399
393
|
case DisposalMethod_js_1.DisposalMethod.RestorePrevious:
|
|
400
394
|
{
|
|
401
|
-
const previousImageData = offscreenContext.getImageData(
|
|
395
|
+
const previousImageData = offscreenContext.getImageData(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
402
396
|
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
403
397
|
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
404
|
-
offscreenContext.clearRect(
|
|
405
|
-
offscreenContext.putImageData(previousImageData,
|
|
398
|
+
offscreenContext.clearRect(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
399
|
+
offscreenContext.putImageData(previousImageData, engine_1.originPoint.x, engine_1.originPoint.y);
|
|
406
400
|
}
|
|
407
401
|
break;
|
|
408
402
|
}
|
|
@@ -414,20 +408,20 @@
|
|
|
414
408
|
return;
|
|
415
409
|
}
|
|
416
410
|
frameIndex = firstIndex;
|
|
417
|
-
offscreenContext.clearRect(
|
|
411
|
+
offscreenContext.clearRect(engine_1.originPoint.x, engine_1.originPoint.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
418
412
|
}
|
|
419
413
|
particle.gifFrame = frameIndex;
|
|
420
414
|
}
|
|
421
415
|
context.scale(image.gifData.width / radius, image.gifData.height / radius);
|
|
422
416
|
}
|
|
423
|
-
async function loadGifImage(image) {
|
|
417
|
+
async function loadGifImage(image, canvasSettings) {
|
|
424
418
|
if (image.type !== "gif") {
|
|
425
419
|
await (0, Utils_js_1.loadImage)(image);
|
|
426
420
|
return;
|
|
427
421
|
}
|
|
428
422
|
image.loading = true;
|
|
429
423
|
try {
|
|
430
|
-
image.gifData = await decodeGIF(image.source);
|
|
424
|
+
image.gifData = await decodeGIF(image.source, canvasSettings);
|
|
431
425
|
image.gifLoopCount = getGIFLoopAmount(image.gifData);
|
|
432
426
|
if (!image.gifLoopCount) {
|
|
433
427
|
image.gifLoopCount = Infinity;
|
package/umd/ImageDrawer.js
CHANGED
|
@@ -15,25 +15,10 @@
|
|
|
15
15
|
const Utils_js_2 = require("./GifUtils/Utils.js");
|
|
16
16
|
const sides = 12;
|
|
17
17
|
class ImageDrawer {
|
|
18
|
+
_engine;
|
|
18
19
|
constructor(engine) {
|
|
19
|
-
this.validTypes = ["image", "images"];
|
|
20
|
-
this.loadImageShape = async (imageShape) => {
|
|
21
|
-
if (!this._engine.loadImage) {
|
|
22
|
-
throw new Error(`Image shape not initialized`);
|
|
23
|
-
}
|
|
24
|
-
await this._engine.loadImage({
|
|
25
|
-
gif: imageShape.gif,
|
|
26
|
-
name: imageShape.name,
|
|
27
|
-
replaceColor: imageShape.replaceColor,
|
|
28
|
-
src: imageShape.src,
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
20
|
this._engine = engine;
|
|
32
21
|
}
|
|
33
|
-
addImage(image) {
|
|
34
|
-
this._engine.images ??= [];
|
|
35
|
-
this._engine.images.push(image);
|
|
36
|
-
}
|
|
37
22
|
draw(data) {
|
|
38
23
|
const { context, radius, particle, opacity } = data, image = particle.image, element = image?.element;
|
|
39
24
|
if (!image) {
|
|
@@ -41,7 +26,7 @@
|
|
|
41
26
|
}
|
|
42
27
|
context.globalAlpha = opacity;
|
|
43
28
|
if (image.gif && image.gifData) {
|
|
44
|
-
(0, Utils_js_2.drawGif)(data);
|
|
29
|
+
(0, Utils_js_2.drawGif)(data, particle.container.canvas.settings);
|
|
45
30
|
}
|
|
46
31
|
else if (element) {
|
|
47
32
|
const ratio = image.ratio, pos = {
|
|
@@ -60,36 +45,38 @@
|
|
|
60
45
|
if (!options.preload || !this._engine.loadImage) {
|
|
61
46
|
return;
|
|
62
47
|
}
|
|
48
|
+
const promises = [];
|
|
63
49
|
for (const imageData of options.preload) {
|
|
64
|
-
|
|
50
|
+
promises.push(this._engine.loadImage(container, imageData));
|
|
65
51
|
}
|
|
52
|
+
await Promise.all(promises);
|
|
66
53
|
}
|
|
67
54
|
loadShape(particle) {
|
|
68
|
-
|
|
55
|
+
const { container } = particle;
|
|
56
|
+
if (!particle.shape || !Utils_js_1.shapeTypes.includes(particle.shape)) {
|
|
69
57
|
return;
|
|
70
58
|
}
|
|
71
|
-
this._engine.images ??= [];
|
|
72
59
|
const imageData = particle.shapeData;
|
|
73
60
|
if (!imageData) {
|
|
74
61
|
return;
|
|
75
62
|
}
|
|
76
|
-
const
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
this.loadShape(particle);
|
|
80
|
-
});
|
|
63
|
+
const images = this._engine.getImages?.(container), image = images?.find((t) => t.name === imageData.name || t.source === imageData.src);
|
|
64
|
+
if (image) {
|
|
65
|
+
return;
|
|
81
66
|
}
|
|
67
|
+
void this.loadImageShape(container, imageData).then(() => {
|
|
68
|
+
this.loadShape(particle);
|
|
69
|
+
});
|
|
82
70
|
}
|
|
83
71
|
particleInit(container, particle) {
|
|
84
72
|
if (particle.shape !== "image" && particle.shape !== "images") {
|
|
85
73
|
return;
|
|
86
74
|
}
|
|
87
|
-
this._engine.
|
|
88
|
-
const images = this._engine.images, imageData = particle.shapeData;
|
|
75
|
+
const images = this._engine.getImages?.(container), imageData = particle.shapeData;
|
|
89
76
|
if (!imageData) {
|
|
90
77
|
return;
|
|
91
78
|
}
|
|
92
|
-
const color = particle.getFillColor(), image = images
|
|
79
|
+
const color = particle.getFillColor(), image = images?.find((t) => t.name === imageData.name || t.source === imageData.src);
|
|
93
80
|
if (!image) {
|
|
94
81
|
return;
|
|
95
82
|
}
|
|
@@ -122,16 +109,25 @@
|
|
|
122
109
|
if (!imageRes.ratio) {
|
|
123
110
|
imageRes.ratio = 1;
|
|
124
111
|
}
|
|
125
|
-
const
|
|
112
|
+
const close = imageData.close ?? particle.shapeClose, imageShape = {
|
|
126
113
|
image: imageRes,
|
|
127
|
-
fill,
|
|
128
114
|
close,
|
|
129
115
|
};
|
|
130
116
|
particle.image = imageShape.image;
|
|
131
|
-
particle.shapeFill = imageShape.fill;
|
|
132
117
|
particle.shapeClose = imageShape.close;
|
|
133
118
|
})();
|
|
134
119
|
}
|
|
120
|
+
loadImageShape = async (container, imageShape) => {
|
|
121
|
+
if (!this._engine.loadImage) {
|
|
122
|
+
throw new Error(`Image shape not initialized`);
|
|
123
|
+
}
|
|
124
|
+
await this._engine.loadImage(container, {
|
|
125
|
+
gif: imageShape.gif,
|
|
126
|
+
name: imageShape.name,
|
|
127
|
+
replaceColor: imageShape.replaceColor,
|
|
128
|
+
src: imageShape.src,
|
|
129
|
+
});
|
|
130
|
+
};
|
|
135
131
|
}
|
|
136
132
|
exports.ImageDrawer = ImageDrawer;
|
|
137
133
|
});
|
package/umd/ImagePreloader.js
CHANGED
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
2
|
+
if (k2 === undefined) k2 = k;
|
|
3
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(o, k2, desc);
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
13
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
14
|
+
}) : function(o, v) {
|
|
15
|
+
o["default"] = v;
|
|
16
|
+
});
|
|
17
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
18
|
+
var ownKeys = function(o) {
|
|
19
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
20
|
+
var ar = [];
|
|
21
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
22
|
+
return ar;
|
|
23
|
+
};
|
|
24
|
+
return ownKeys(o);
|
|
25
|
+
};
|
|
26
|
+
return function (mod) {
|
|
27
|
+
if (mod && mod.__esModule) return mod;
|
|
28
|
+
var result = {};
|
|
29
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
30
|
+
__setModuleDefault(result, mod);
|
|
31
|
+
return result;
|
|
32
|
+
};
|
|
33
|
+
})();
|
|
1
34
|
(function (factory) {
|
|
2
35
|
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
36
|
var v = factory(require, exports);
|
|
@@ -8,16 +41,19 @@
|
|
|
8
41
|
}
|
|
9
42
|
})(function (require, exports) {
|
|
10
43
|
"use strict";
|
|
44
|
+
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
|
|
11
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
46
|
exports.ImagePreloaderPlugin = void 0;
|
|
13
47
|
const Preload_js_1 = require("./Options/Classes/Preload.js");
|
|
14
48
|
class ImagePreloaderPlugin {
|
|
15
|
-
|
|
16
|
-
|
|
49
|
+
id = "image-preloader";
|
|
50
|
+
_engine;
|
|
51
|
+
constructor(engine) {
|
|
52
|
+
this._engine = engine;
|
|
17
53
|
}
|
|
18
|
-
async getPlugin() {
|
|
19
|
-
await Promise.resolve();
|
|
20
|
-
return
|
|
54
|
+
async getPlugin(container) {
|
|
55
|
+
const { ImagePreloaderInstance } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./ImagePreloaderInstance.js"))) : new Promise((resolve_1, reject_1) => { require(["./ImagePreloaderInstance.js"], resolve_1, reject_1); }).then(__importStar));
|
|
56
|
+
return new ImagePreloaderInstance(this._engine, container);
|
|
21
57
|
}
|
|
22
58
|
loadOptions(_container, options, source) {
|
|
23
59
|
if (!source?.preload) {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ImagePreloaderInstance = void 0;
|
|
13
|
+
class ImagePreloaderInstance {
|
|
14
|
+
_container;
|
|
15
|
+
_engine;
|
|
16
|
+
constructor(engine, container) {
|
|
17
|
+
this._engine = engine;
|
|
18
|
+
this._container = container;
|
|
19
|
+
}
|
|
20
|
+
destroy() {
|
|
21
|
+
this._engine.images?.delete(this._container);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ImagePreloaderInstance = ImagePreloaderInstance;
|
|
25
|
+
});
|
package/umd/Utils.js
CHANGED
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
})(function (require, exports) {
|
|
10
10
|
"use strict";
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.shapeTypes = void 0;
|
|
12
13
|
exports.loadImage = loadImage;
|
|
13
14
|
exports.downloadSvgImage = downloadSvgImage;
|
|
14
15
|
exports.replaceImageColor = replaceImageColor;
|
|
15
16
|
const engine_1 = require("@tsparticles/engine");
|
|
17
|
+
exports.shapeTypes = ["image", "images"];
|
|
16
18
|
const stringStart = 0, defaultOpacity = 1;
|
|
17
19
|
const currentColorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;
|
|
18
20
|
function replaceColorSvg(imageShape, color, opacity, hdr = false) {
|
|
@@ -22,13 +24,13 @@
|
|
|
22
24
|
}
|
|
23
25
|
const colorStyle = (0, engine_1.getStyleFromHsl)(color, hdr, opacity);
|
|
24
26
|
if (svgData.includes("fill")) {
|
|
25
|
-
return svgData.
|
|
27
|
+
return svgData.replaceAll(currentColorRegex, () => colorStyle);
|
|
26
28
|
}
|
|
27
29
|
const preFillIndex = svgData.indexOf(">");
|
|
28
30
|
return `${svgData.substring(stringStart, preFillIndex)} fill="${colorStyle}"${svgData.substring(preFillIndex)}`;
|
|
29
31
|
}
|
|
30
32
|
async function loadImage(image) {
|
|
31
|
-
return new Promise(
|
|
33
|
+
return new Promise(resolve => {
|
|
32
34
|
image.loading = true;
|
|
33
35
|
const img = new Image();
|
|
34
36
|
image.element = img;
|
|
@@ -53,12 +55,12 @@
|
|
|
53
55
|
}
|
|
54
56
|
image.loading = true;
|
|
55
57
|
const response = await fetch(image.source);
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
image.error = true;
|
|
58
|
+
if (response.ok) {
|
|
59
|
+
image.svgData = await response.text();
|
|
59
60
|
}
|
|
60
61
|
else {
|
|
61
|
-
|
|
62
|
+
(0, engine_1.getLogger)().error("Image not found");
|
|
63
|
+
image.error = true;
|
|
62
64
|
}
|
|
63
65
|
image.loading = false;
|
|
64
66
|
}
|
package/umd/index.js
CHANGED
|
@@ -37,24 +37,35 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
37
37
|
if (v !== undefined) module.exports = v;
|
|
38
38
|
}
|
|
39
39
|
else if (typeof define === "function" && define.amd) {
|
|
40
|
-
define(["require", "exports"], factory);
|
|
40
|
+
define(["require", "exports", "./Utils.js"], factory);
|
|
41
41
|
}
|
|
42
42
|
})(function (require, exports) {
|
|
43
43
|
"use strict";
|
|
44
44
|
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.loadImageShape = loadImageShape;
|
|
47
|
+
const Utils_js_1 = require("./Utils.js");
|
|
47
48
|
const extLength = 3;
|
|
48
49
|
function addLoadImageToEngine(engine) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
engine.getImages ??= (container) => {
|
|
51
|
+
engine.images ??= new Map();
|
|
52
|
+
let images = engine.images.get(container);
|
|
53
|
+
if (!images) {
|
|
54
|
+
images = [];
|
|
55
|
+
engine.images.set(container, images);
|
|
56
|
+
}
|
|
57
|
+
return images;
|
|
58
|
+
};
|
|
59
|
+
engine.loadImage ??= async (container, data) => {
|
|
60
|
+
if (!engine.getImages) {
|
|
61
|
+
throw new Error("No images collection found");
|
|
62
|
+
}
|
|
53
63
|
if (!data.name && !data.src) {
|
|
54
64
|
throw new Error("No image source provided");
|
|
55
65
|
}
|
|
56
|
-
engine.images ??=
|
|
57
|
-
|
|
66
|
+
engine.images ??= new Map();
|
|
67
|
+
const containerImages = engine.getImages(container);
|
|
68
|
+
if (containerImages.some((t) => t.name === data.name || t.source === data.src)) {
|
|
58
69
|
return;
|
|
59
70
|
}
|
|
60
71
|
try {
|
|
@@ -68,11 +79,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
68
79
|
replaceColor: data.replaceColor,
|
|
69
80
|
ratio: data.width && data.height ? data.width / data.height : undefined,
|
|
70
81
|
};
|
|
71
|
-
|
|
82
|
+
containerImages.push(image);
|
|
83
|
+
engine.images.set(container, containerImages);
|
|
72
84
|
let imageFunc;
|
|
73
85
|
if (data.gif) {
|
|
74
86
|
const { loadGifImage } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./GifUtils/Utils.js"))) : new Promise((resolve_1, reject_1) => { require(["./GifUtils/Utils.js"], resolve_1, reject_1); }).then(__importStar));
|
|
75
|
-
imageFunc = loadGifImage;
|
|
87
|
+
imageFunc = (img) => loadGifImage(img, { colorSpace: "srgb" });
|
|
76
88
|
}
|
|
77
89
|
else if (data.replaceColor) {
|
|
78
90
|
const { downloadSvgImage } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./Utils.js"))) : new Promise((resolve_2, reject_2) => { require(["./Utils.js"], resolve_2, reject_2); }).then(__importStar));
|
|
@@ -90,13 +102,15 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
90
102
|
};
|
|
91
103
|
}
|
|
92
104
|
async function loadImageShape(engine) {
|
|
93
|
-
engine.checkVersion("4.0.0-
|
|
105
|
+
engine.checkVersion("4.0.0-beta.0");
|
|
94
106
|
await engine.register(async (e) => {
|
|
95
|
-
const {
|
|
107
|
+
const { ImagePreloaderPlugin } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./ImagePreloader.js"))) : new Promise((resolve_4, reject_4) => { require(["./ImagePreloader.js"], resolve_4, reject_4); }).then(__importStar));
|
|
96
108
|
addLoadImageToEngine(e);
|
|
97
|
-
|
|
98
|
-
e.
|
|
99
|
-
|
|
109
|
+
e.addPlugin(new ImagePreloaderPlugin(e));
|
|
110
|
+
e.addShape(Utils_js_1.shapeTypes, async () => {
|
|
111
|
+
const { ImageDrawer } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./ImageDrawer.js"))) : new Promise((resolve_5, reject_5) => { require(["./ImageDrawer.js"], resolve_5, reject_5); }).then(__importStar));
|
|
112
|
+
return new ImageDrawer(e);
|
|
113
|
+
});
|
|
100
114
|
});
|
|
101
115
|
}
|
|
102
116
|
});
|
package/324.min.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! For license information please see 324.min.js.LICENSE.txt */
|
|
2
|
-
(this.webpackChunk_tsparticles_shape_image=this.webpackChunk_tsparticles_shape_image||[]).push([[324,337,413],{324(e,t,a){a.d(t,{ImageDrawer:()=>r});var o=a(303),i=a(413),n=a(337);class r{constructor(e){this.validTypes=["image","images"],this.loadImageShape=async e=>{if(!this._engine.loadImage)throw new Error("Image shape not initialized");await this._engine.loadImage({gif:e.gif,name:e.name,replaceColor:e.replaceColor,src:e.src})},this._engine=e}addImage(e){this._engine.images??=[],this._engine.images.push(e)}draw(e){const{context:t,radius:a,particle:i,opacity:r}=e,s=i.image,l=s?.element;if(s){if(t.globalAlpha=r,s.gif&&s.gifData)(0,n.zS)(e);else if(l){const e=s.ratio,i={x:-a,y:-a},n=a*o.double;t.drawImage(l,i.x,i.y,n,n/e)}t.globalAlpha=o.defaultAlpha}}getSidesCount(){return 12}async init(e){const t=e.actualOptions;if(t.preload&&this._engine.loadImage)for(const e of t.preload)await this._engine.loadImage(e)}loadShape(e){if("image"!==e.shape&&"images"!==e.shape)return;this._engine.images??=[];const t=e.shapeData;if(!t)return;this._engine.images.find((e=>e.name===t.name||e.source===t.src))||this.loadImageShape(t).then((()=>{this.loadShape(e)}))}particleInit(e,t){if("image"!==t.shape&&"images"!==t.shape)return;this._engine.images??=[];const a=this._engine.images,n=t.shapeData;if(!n)return;const r=t.getFillColor(),s=a.find((e=>e.name===n.name||e.source===n.src));if(!s)return;const l=n.replaceColor;s.loading?setTimeout((()=>{this.particleInit(e,t)})):(async()=>{let a;a=s.svgData&&r?await(0,i.d)(s,n,r,t,e.hdr):{color:r,data:s,element:s.element,gif:s.gif,gifData:s.gifData,gifLoopCount:s.gifLoopCount,loaded:!0,ratio:n.width&&n.height?n.width/n.height:s.ratio??o.defaultRatio,replaceColor:l,source:n.src},a.ratio||(a.ratio=1);const c={image:a,fill:n.fill??t.shapeFill,close:n.close??t.shapeClose};t.image=c.image,t.shapeFill=c.fill,t.shapeClose=c.close})()}}},337(e,t,a){a.d(t,{zS:()=>p,loadGifImage:()=>m});var o=a(303),i=a(413);const n=[0,4,2,1],r=[8,8,4,2];class s{constructor(e){this.pos=0,this.data=new Uint8ClampedArray(e)}getString(e){const t=this.data.slice(this.pos,this.pos+e);return this.pos+=t.length,t.reduce(((e,t)=>e+String.fromCharCode(t)),"")}nextByte(){return this.data[this.pos++]}nextTwoBytes(){return this.pos+=2,this.data[this.pos-2]+(this.data[this.pos-1]<<8)}readSubBlocks(){let e="",t=0;do{t=this.data[this.pos++];for(let a=t;--a>=0;e+=String.fromCharCode(this.data[this.pos++]));}while(0!==t);return e}readSubBlocksBin(){let e=this.data[this.pos],t=0;for(let a=0;0!==e;a+=e+1,e=this.data[this.pos+a])t+=e;const a=new Uint8Array(t);e=this.data[this.pos++];for(let t=0;0!==e;e=this.data[this.pos++])for(let o=e;--o>=0;a[t++]=this.data[this.pos++]);return a}skipSubBlocks(){for(const e=1,t=0;this.data[this.pos]!==t;this.pos+=this.data[this.pos]+e);this.pos++}}var l,c;!function(e){e[e.Replace=0]="Replace",e[e.Combine=1]="Combine",e[e.RestoreBackground=2]="RestoreBackground",e[e.RestorePrevious=3]="RestorePrevious",e[e.UndefinedA=4]="UndefinedA",e[e.UndefinedB=5]="UndefinedB",e[e.UndefinedC=6]="UndefinedC",e[e.UndefinedD=7]="UndefinedD"}(l||(l={})),function(e){e[e.Extension=33]="Extension",e[e.ApplicationExtension=255]="ApplicationExtension",e[e.GraphicsControlExtension=249]="GraphicsControlExtension",e[e.PlainTextExtension=1]="PlainTextExtension",e[e.CommentExtension=254]="CommentExtension",e[e.Image=44]="Image",e[e.EndOfFile=59]="EndOfFile"}(c||(c={}));const g=0,h=0;function d(e,t){const a=[];for(let o=0;o<t;o++)a.push({r:e.data[e.pos],g:e.data[e.pos+1],b:e.data[e.pos+2]}),e.pos+=3;return a}async function f(e,t,a,o,i,s){switch(e.nextByte()){case c.EndOfFile:return!0;case c.Image:await async function(e,t,a,o,i,s){const l=t.frames[o(!0)];l.left=e.nextTwoBytes(),l.top=e.nextTwoBytes(),l.width=e.nextTwoBytes(),l.height=e.nextTwoBytes();const c=e.nextByte(),g=!(128&~c),h=!(64&~c);l.sortFlag=!(32&~c),l.reserved=(24&c)>>>3;const f=1<<1+(7&c);g&&(l.localColorTable=d(e,f));const p=e=>{const{r:o,g:n,b:r}=(g?l.localColorTable:t.globalColorTable)[e];return e!==i(null)?{r:o,g:n,b:r,a:255}:{r:o,g:n,b:r,a:a?Math.trunc((o+n+r)/3):0}},m=(()=>{try{return new ImageData(l.width,l.height,{colorSpace:"srgb"})}catch(e){if(e instanceof DOMException&&"IndexSizeError"===e.name)return null;throw e}})();if(null==m)throw new EvalError("GIF frame size is to large");const u=e.nextByte(),w=e.readSubBlocksBin(),x=1<<u,b=(e,t)=>{const a=e>>>3,o=7&e;return(w[a]+(w[a+1]<<8)+(w[a+2]<<16)&(1<<t)-1<<o)>>>o};if(h){for(let a=0,i=u+1,c=0,g=[[0]],h=0;h<4;h++){if(n[h]<l.height){let e=0,t=0,o=!1;for(;!o;){const s=a;if(a=b(c,i),c+=i+1,a===x){i=u+1,g.length=x+2;for(let e=0;e<g.length;e++)g[e]=e<x?[e]:[]}else{a>=g.length?g.push(g[s].concat(g[s][0])):s!==x&&g.push(g[s].concat(g[a][0]));for(const o of g[a]){const{r:a,g:i,b:s,a:c}=p(o);m.data.set([a,i,s,c],n[h]*l.width+r[h]*t+e%(4*l.width)),e+=4}g.length===1<<i&&i<12&&i++}e===4*l.width*(t+1)&&(t++,n[h]+r[h]*t>=l.height&&(o=!0))}}s?.(e.pos/(e.data.length-1),o(!1)+1,m,{x:l.left,y:l.top},{width:t.width,height:t.height})}l.image=m,l.bitmap=await createImageBitmap(m)}else{let a=0,i=u+1,n=0,r=-4;const c=[[0]];for(;;){const e=a;if(a=b(n,i),n+=i,a===x){i=u+1,c.length=x+2;for(let e=0;e<c.length;e++)c[e]=e<x?[e]:[]}else{if(a===x+1)break;a>=c.length?c.push(c[e].concat(c[e][0])):e!==x&&c.push(c[e].concat(c[a][0]));for(const e of c[a]){const{r:t,g:a,b:o,a:i}=p(e);m.data.set([t,a,o,i],r),r+=4}c.length>=1<<i&&i<12&&i++}}l.image=m,l.bitmap=await createImageBitmap(m),s?.((e.pos+1)/e.data.length,o(!1)+1,l.image,{x:l.left,y:l.top},{width:t.width,height:t.height})}}(e,t,a,o,i,s);break;case c.Extension:!function(e,t,a,o){switch(e.nextByte()){case c.GraphicsControlExtension:{const i=t.frames[a(!1)];e.pos++;const n=e.nextByte();i.GCreserved=(224&n)>>>5,i.disposalMethod=(28&n)>>>2,i.userInputDelayFlag=!(2&~n);const r=!(1&~n);i.delayTime=10*e.nextTwoBytes();const s=e.nextByte();r&&o(s),e.pos++;break}case c.ApplicationExtension:{e.pos++;const a={identifier:e.getString(8),authenticationCode:e.getString(3),data:e.readSubBlocksBin()};t.applicationExtensions.push(a);break}case c.CommentExtension:t.comments.push([a(!1),e.readSubBlocks()]);break;case c.PlainTextExtension:if(0===t.globalColorTable.length)throw new EvalError("plain text extension without global color table");e.pos++,t.frames[a(!1)].plainTextData={left:e.nextTwoBytes(),top:e.nextTwoBytes(),width:e.nextTwoBytes(),height:e.nextTwoBytes(),charSize:{width:e.nextTwoBytes(),height:e.nextTwoBytes()},foregroundColor:e.nextByte(),backgroundColor:e.nextByte(),text:e.readSubBlocks()};break;default:e.skipSubBlocks()}}(e,t,o,i);break;default:throw new EvalError("undefined block found")}return!1}function p(e){const{context:t,radius:a,particle:i,delta:n}=e,r=i.image;if(!r?.gifData||!r.gif)return;const s=new OffscreenCanvas(r.gifData.width,r.gifData.height),c=s.getContext("2d");if(!c)throw new Error("could not create offscreen canvas context");c.imageSmoothingQuality="low",c.imageSmoothingEnabled=!1,c.clearRect(g,h,s.width,s.height),i.gifLoopCount??=r.gifLoopCount??0;let d=i.gifFrame??0;const f={x:-r.gifData.width*o.half,y:-r.gifData.height*o.half},p=r.gifData.frames[d];if(i.gifTime??=0,p.bitmap){switch(t.scale(a/r.gifData.width,a/r.gifData.height),p.disposalMethod){case l.UndefinedA:case l.UndefinedB:case l.UndefinedC:case l.UndefinedD:case l.Replace:c.drawImage(p.bitmap,p.left,p.top),t.drawImage(s,f.x,f.y),c.clearRect(g,h,s.width,s.height);break;case l.Combine:c.drawImage(p.bitmap,p.left,p.top),t.drawImage(s,f.x,f.y);break;case l.RestoreBackground:c.drawImage(p.bitmap,p.left,p.top),t.drawImage(s,f.x,f.y),c.clearRect(g,h,s.width,s.height),r.gifData.globalColorTable.length?c.putImageData(r.gifData.backgroundImage,f.x,f.y):c.putImageData(r.gifData.frames[0].image,f.x+p.left,f.y+p.top);break;case l.RestorePrevious:{const e=c.getImageData(g,h,s.width,s.height);c.drawImage(p.bitmap,p.left,p.top),t.drawImage(s,f.x,f.y),c.clearRect(g,h,s.width,s.height),c.putImageData(e,g,h)}}if(i.gifTime+=n.value,i.gifTime>p.delayTime){if(i.gifTime-=p.delayTime,++d>=r.gifData.frames.length){if(--i.gifLoopCount<=0)return;d=0,c.clearRect(g,h,s.width,s.height)}i.gifFrame=d}t.scale(r.gifData.width/a,r.gifData.height/a)}}async function m(e){if("gif"===e.type){e.loading=!0;try{e.gifData=await async function(e,t,a){a??=!1;const o=await fetch(e);if(!o.ok&&404===o.status)throw new EvalError("file not found");const i=await o.arrayBuffer(),n={width:0,height:0,totalTime:0,colorRes:0,pixelAspectRatio:0,frames:[],sortFlag:!1,globalColorTable:[],backgroundImage:new ImageData(1,1,{colorSpace:"srgb"}),comments:[],applicationExtensions:[]},r=new s(new Uint8ClampedArray(i));if("GIF89a"!==r.getString(6))throw new Error("not a supported GIF file");n.width=r.nextTwoBytes(),n.height=r.nextTwoBytes();const c=r.nextByte(),g=!(128&~c);n.colorRes=(112&c)>>>4,n.sortFlag=!(8&~c);const h=1<<1+(7&c),p=r.nextByte();n.pixelAspectRatio=r.nextByte(),0!==n.pixelAspectRatio&&(n.pixelAspectRatio=(n.pixelAspectRatio+15)/64),g&&(n.globalColorTable=d(r,h));const m=(()=>{try{return new ImageData(n.width,n.height,{colorSpace:"srgb"})}catch(e){if(e instanceof DOMException&&"IndexSizeError"===e.name)return null;throw e}})();if(null==m)throw new Error("GIF frame size is to large");const{r:u,g:w,b:x}=n.globalColorTable[p];m.data.set(g?[u,w,x,255]:[0,0,0,0]);for(let e=4;e<m.data.length;e*=2)m.data.copyWithin(e,0,e);n.backgroundImage=m;let b=-1,y=!0,C=-1;const I=e=>(e&&(y=!0),b),E=e=>(null!=e&&(C=e),C);try{do{y&&(n.frames.push({left:0,top:0,width:0,height:0,disposalMethod:l.Replace,image:new ImageData(1,1,{colorSpace:"srgb"}),plainTextData:null,userInputDelayFlag:!1,delayTime:0,sortFlag:!1,localColorTable:[],reserved:0,GCreserved:0}),b++,C=-1,y=!1)}while(!await f(r,n,a,I,E,t));n.frames.length--;for(const e of n.frames){if(e.userInputDelayFlag&&0===e.delayTime){n.totalTime=1/0;break}n.totalTime+=e.delayTime}return n}catch(e){if(e instanceof EvalError)throw new Error(`error while parsing frame ${b.toString()} "${e.message}"`);throw e}}(e.source),e.gifLoopCount=function(e){for(const t of e.applicationExtensions)if(t.identifier+t.authenticationCode==="NETSCAPE2.0")return t.data[1]+(t.data[2]<<8);return NaN}(e.gifData),e.gifLoopCount||(e.gifLoopCount=1/0)}catch{e.error=!0}e.loading=!1}else await(0,i.loadImage)(e)}},413(e,t,a){a.d(t,{d:()=>s,downloadSvgImage:()=>r,loadImage:()=>n});var o=a(303);const i=/(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;async function n(e){return new Promise((t=>{e.loading=!0;const a=new Image;e.element=a,a.addEventListener("load",(()=>{e.loading=!1,t()})),a.addEventListener("error",(()=>{e.element=void 0,e.error=!0,e.loading=!1,(0,o.getLogger)().error(`Error loading image: ${e.source}`),t()})),a.src=e.source}))}async function r(e){if("svg"!==e.type)return void await n(e);e.loading=!0;const t=await fetch(e.source);t.ok?e.svgData=await t.text():((0,o.getLogger)().error("Image not found"),e.error=!0),e.loading=!1}function s(e,t,a,r,s=!1){const l=function(e,t,a,n=!1){const{svgData:r}=e;if(!r)return"";const s=(0,o.getStyleFromHsl)(t,n,a);if(r.includes("fill"))return r.replace(i,(()=>s));const l=r.indexOf(">");return`${r.substring(0,l)} fill="${s}"${r.substring(l)}`}(e,a,r.opacity?.value??1,s),c={color:a,gif:t.gif,data:{...e,svgData:l},loaded:!1,ratio:t.width/t.height,replaceColor:t.replaceColor,source:t.src};return new Promise((t=>{const a=new Blob([l],{type:"image/svg+xml"}),o=URL.createObjectURL(a),i=new Image;i.addEventListener("load",(()=>{c.loaded=!0,c.element=i,t(c),URL.revokeObjectURL(o)}));i.addEventListener("error",(()=>{(async()=>{URL.revokeObjectURL(o);const a={...e,error:!1,loading:!0};await n(a),c.loaded=!0,c.element=a.element,t(c)})()})),i.src=o}))}}}]);
|
package/324.min.js.LICENSE.txt
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tsParticles Image Shape v4.0.0-alpha.8 by Matteo Bruni */
|