@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.
Files changed (60) hide show
  1. package/375.min.js +1 -0
  2. package/550.min.js +1 -0
  3. package/682.min.js +1 -0
  4. package/814.min.js +1 -0
  5. package/browser/GifUtils/ByteStream.js +3 -1
  6. package/browser/GifUtils/Utils.js +36 -42
  7. package/browser/ImageDrawer.js +28 -32
  8. package/browser/ImagePreloader.js +7 -5
  9. package/browser/ImagePreloaderInstance.js +11 -0
  10. package/browser/Options/Classes/Preload.js +6 -0
  11. package/browser/Utils.js +7 -6
  12. package/browser/index.js +27 -13
  13. package/cjs/GifUtils/ByteStream.js +3 -1
  14. package/cjs/GifUtils/Utils.js +36 -42
  15. package/cjs/ImageDrawer.js +28 -32
  16. package/cjs/ImagePreloader.js +7 -5
  17. package/cjs/ImagePreloaderInstance.js +11 -0
  18. package/cjs/Options/Classes/Preload.js +6 -0
  19. package/cjs/Utils.js +7 -6
  20. package/cjs/index.js +27 -13
  21. package/dist_browser_GifUtils_Utils_js.js +6 -16
  22. package/dist_browser_ImageDrawer_js.js +2 -2
  23. package/dist_browser_ImagePreloaderInstance_js.js +30 -0
  24. package/dist_browser_ImagePreloader_js.js +3 -3
  25. package/esm/GifUtils/ByteStream.js +3 -1
  26. package/esm/GifUtils/Utils.js +36 -42
  27. package/esm/ImageDrawer.js +28 -32
  28. package/esm/ImagePreloader.js +7 -5
  29. package/esm/ImagePreloaderInstance.js +11 -0
  30. package/esm/Options/Classes/Preload.js +6 -0
  31. package/esm/Utils.js +7 -6
  32. package/esm/index.js +27 -13
  33. package/package.json +2 -2
  34. package/report.html +1 -1
  35. package/tsparticles.shape.image.js +40 -18
  36. package/tsparticles.shape.image.min.js +2 -2
  37. package/types/GifUtils/Utils.d.ts +4 -4
  38. package/types/ImageDrawer.d.ts +1 -3
  39. package/types/ImagePreloader.d.ts +5 -4
  40. package/types/ImagePreloaderInstance.d.ts +8 -0
  41. package/types/Utils.d.ts +1 -0
  42. package/types/types.d.ts +3 -2
  43. package/umd/GifUtils/ByteStream.js +3 -1
  44. package/umd/GifUtils/Utils.js +37 -43
  45. package/umd/ImageDrawer.js +27 -31
  46. package/umd/ImagePreloader.js +41 -5
  47. package/umd/ImagePreloaderInstance.js +25 -0
  48. package/umd/Options/Classes/Preload.js +6 -0
  49. package/umd/Utils.js +8 -6
  50. package/umd/index.js +28 -14
  51. package/324.min.js +0 -2
  52. package/324.min.js.LICENSE.txt +0 -1
  53. package/337.min.js +0 -2
  54. package/337.min.js.LICENSE.txt +0 -1
  55. package/413.min.js +0 -2
  56. package/413.min.js.LICENSE.txt +0 -1
  57. package/72.min.js +0 -2
  58. package/72.min.js.LICENSE.txt +0 -1
  59. package/dist_browser_Utils_js.js +0 -30
  60. package/tsparticles.shape.image.min.js.LICENSE.txt +0 -1
@@ -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", "../Utils.js", "./Constants.js", "./ByteStream.js", "./Enums/DisposalMethod.js", "./Types/GIFDataHeaders.js"], factory);
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 origin = {
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
- async function parseImageBlock(byteStream, gif, avgAlpha, getFrameIndex, getTransparencyIndex, progressCallback) {
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, { colorSpace: "srgb" });
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, { colorSpace: "srgb" }),
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, { colorSpace: "srgb" });
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, { colorSpace: "srgb" }),
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
405
- offscreenContext.putImageData(previousImageData, origin.x, origin.y);
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(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
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;
@@ -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
- await this._engine.loadImage(imageData);
50
+ promises.push(this._engine.loadImage(container, imageData));
65
51
  }
52
+ await Promise.all(promises);
66
53
  }
67
54
  loadShape(particle) {
68
- if (particle.shape !== "image" && particle.shape !== "images") {
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 image = this._engine.images.find((t) => t.name === imageData.name || t.source === imageData.src);
77
- if (!image) {
78
- void this.loadImageShape(imageData).then(() => {
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.images ??= [];
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.find((t) => t.name === imageData.name || t.source === imageData.src);
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 fill = imageData.fill ?? particle.shapeFill, close = imageData.close ?? particle.shapeClose, imageShape = {
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
  });
@@ -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
- constructor() {
16
- this.id = "imagePreloader";
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
+ });
@@ -12,6 +12,12 @@
12
12
  exports.Preload = void 0;
13
13
  const engine_1 = require("@tsparticles/engine");
14
14
  class Preload {
15
+ gif;
16
+ height;
17
+ name;
18
+ replaceColor;
19
+ src;
20
+ width;
15
21
  constructor() {
16
22
  this.src = "";
17
23
  this.gif = false;
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.replace(currentColorRegex, () => colorStyle);
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((resolve) => {
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 (!response.ok) {
57
- (0, engine_1.getLogger)().error("Image not found");
58
- image.error = true;
58
+ if (response.ok) {
59
+ image.svgData = await response.text();
59
60
  }
60
61
  else {
61
- image.svgData = await response.text();
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
- if (engine.loadImage) {
50
- return;
51
- }
52
- engine.loadImage = async (data) => {
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
- if (engine.images.some((t) => t.name === data.name || t.source === data.src)) {
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
- engine.images.push(image);
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-alpha.8");
105
+ engine.checkVersion("4.0.0-beta.0");
94
106
  await engine.register(async (e) => {
95
- const { ImageDrawer } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./ImageDrawer.js"))) : new Promise((resolve_4, reject_4) => { require(["./ImageDrawer.js"], resolve_4, reject_4); }).then(__importStar)), { ImagePreloaderPlugin } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./ImagePreloader.js"))) : new Promise((resolve_5, reject_5) => { require(["./ImagePreloader.js"], resolve_5, reject_5); }).then(__importStar));
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
- const preloader = new ImagePreloaderPlugin();
98
- e.addPlugin(preloader);
99
- e.addShape(new ImageDrawer(e));
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}))}}}]);
@@ -1 +0,0 @@
1
- /*! tsParticles Image Shape v4.0.0-alpha.8 by Matteo Bruni */