@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
@@ -1,27 +1,12 @@
1
1
  import { defaultAlpha, defaultRatio, double, } from "@tsparticles/engine";
2
- import { replaceImageColor } from "./Utils.js";
2
+ import { replaceImageColor, shapeTypes } from "./Utils.js";
3
3
  import { drawGif } from "./GifUtils/Utils.js";
4
4
  const sides = 12;
5
5
  export class ImageDrawer {
6
+ _engine;
6
7
  constructor(engine) {
7
- this.validTypes = ["image", "images"];
8
- this.loadImageShape = async (imageShape) => {
9
- if (!this._engine.loadImage) {
10
- throw new Error(`Image shape not initialized`);
11
- }
12
- await this._engine.loadImage({
13
- gif: imageShape.gif,
14
- name: imageShape.name,
15
- replaceColor: imageShape.replaceColor,
16
- src: imageShape.src,
17
- });
18
- };
19
8
  this._engine = engine;
20
9
  }
21
- addImage(image) {
22
- this._engine.images ??= [];
23
- this._engine.images.push(image);
24
- }
25
10
  draw(data) {
26
11
  const { context, radius, particle, opacity } = data, image = particle.image, element = image?.element;
27
12
  if (!image) {
@@ -29,7 +14,7 @@ export class ImageDrawer {
29
14
  }
30
15
  context.globalAlpha = opacity;
31
16
  if (image.gif && image.gifData) {
32
- drawGif(data);
17
+ drawGif(data, particle.container.canvas.settings);
33
18
  }
34
19
  else if (element) {
35
20
  const ratio = image.ratio, pos = {
@@ -48,36 +33,38 @@ export class ImageDrawer {
48
33
  if (!options.preload || !this._engine.loadImage) {
49
34
  return;
50
35
  }
36
+ const promises = [];
51
37
  for (const imageData of options.preload) {
52
- await this._engine.loadImage(imageData);
38
+ promises.push(this._engine.loadImage(container, imageData));
53
39
  }
40
+ await Promise.all(promises);
54
41
  }
55
42
  loadShape(particle) {
56
- if (particle.shape !== "image" && particle.shape !== "images") {
43
+ const { container } = particle;
44
+ if (!particle.shape || !shapeTypes.includes(particle.shape)) {
57
45
  return;
58
46
  }
59
- this._engine.images ??= [];
60
47
  const imageData = particle.shapeData;
61
48
  if (!imageData) {
62
49
  return;
63
50
  }
64
- const image = this._engine.images.find((t) => t.name === imageData.name || t.source === imageData.src);
65
- if (!image) {
66
- void this.loadImageShape(imageData).then(() => {
67
- this.loadShape(particle);
68
- });
51
+ const images = this._engine.getImages?.(container), image = images?.find((t) => t.name === imageData.name || t.source === imageData.src);
52
+ if (image) {
53
+ return;
69
54
  }
55
+ void this.loadImageShape(container, imageData).then(() => {
56
+ this.loadShape(particle);
57
+ });
70
58
  }
71
59
  particleInit(container, particle) {
72
60
  if (particle.shape !== "image" && particle.shape !== "images") {
73
61
  return;
74
62
  }
75
- this._engine.images ??= [];
76
- const images = this._engine.images, imageData = particle.shapeData;
63
+ const images = this._engine.getImages?.(container), imageData = particle.shapeData;
77
64
  if (!imageData) {
78
65
  return;
79
66
  }
80
- const color = particle.getFillColor(), image = images.find((t) => t.name === imageData.name || t.source === imageData.src);
67
+ const color = particle.getFillColor(), image = images?.find((t) => t.name === imageData.name || t.source === imageData.src);
81
68
  if (!image) {
82
69
  return;
83
70
  }
@@ -110,14 +97,23 @@ export class ImageDrawer {
110
97
  if (!imageRes.ratio) {
111
98
  imageRes.ratio = 1;
112
99
  }
113
- const fill = imageData.fill ?? particle.shapeFill, close = imageData.close ?? particle.shapeClose, imageShape = {
100
+ const close = imageData.close ?? particle.shapeClose, imageShape = {
114
101
  image: imageRes,
115
- fill,
116
102
  close,
117
103
  };
118
104
  particle.image = imageShape.image;
119
- particle.shapeFill = imageShape.fill;
120
105
  particle.shapeClose = imageShape.close;
121
106
  })();
122
107
  }
108
+ loadImageShape = async (container, imageShape) => {
109
+ if (!this._engine.loadImage) {
110
+ throw new Error(`Image shape not initialized`);
111
+ }
112
+ await this._engine.loadImage(container, {
113
+ gif: imageShape.gif,
114
+ name: imageShape.name,
115
+ replaceColor: imageShape.replaceColor,
116
+ src: imageShape.src,
117
+ });
118
+ };
123
119
  }
@@ -1,11 +1,13 @@
1
1
  import { Preload } from "./Options/Classes/Preload.js";
2
2
  export class ImagePreloaderPlugin {
3
- constructor() {
4
- this.id = "imagePreloader";
3
+ id = "image-preloader";
4
+ _engine;
5
+ constructor(engine) {
6
+ this._engine = engine;
5
7
  }
6
- async getPlugin() {
7
- await Promise.resolve();
8
- return {};
8
+ async getPlugin(container) {
9
+ const { ImagePreloaderInstance } = await import("./ImagePreloaderInstance.js");
10
+ return new ImagePreloaderInstance(this._engine, container);
9
11
  }
10
12
  loadOptions(_container, options, source) {
11
13
  if (!source?.preload) {
@@ -0,0 +1,11 @@
1
+ export class ImagePreloaderInstance {
2
+ _container;
3
+ _engine;
4
+ constructor(engine, container) {
5
+ this._engine = engine;
6
+ this._container = container;
7
+ }
8
+ destroy() {
9
+ this._engine.images?.delete(this._container);
10
+ }
11
+ }
@@ -1,5 +1,11 @@
1
1
  import { isNull } from "@tsparticles/engine";
2
2
  export class Preload {
3
+ gif;
4
+ height;
5
+ name;
6
+ replaceColor;
7
+ src;
8
+ width;
3
9
  constructor() {
4
10
  this.src = "";
5
11
  this.gif = false;
package/esm/Utils.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { getLogger, getStyleFromHsl } from "@tsparticles/engine";
2
+ export const shapeTypes = ["image", "images"];
2
3
  const stringStart = 0, defaultOpacity = 1;
3
4
  const currentColorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;
4
5
  function replaceColorSvg(imageShape, color, opacity, hdr = false) {
@@ -8,13 +9,13 @@ function replaceColorSvg(imageShape, color, opacity, hdr = false) {
8
9
  }
9
10
  const colorStyle = getStyleFromHsl(color, hdr, opacity);
10
11
  if (svgData.includes("fill")) {
11
- return svgData.replace(currentColorRegex, () => colorStyle);
12
+ return svgData.replaceAll(currentColorRegex, () => colorStyle);
12
13
  }
13
14
  const preFillIndex = svgData.indexOf(">");
14
15
  return `${svgData.substring(stringStart, preFillIndex)} fill="${colorStyle}"${svgData.substring(preFillIndex)}`;
15
16
  }
16
17
  export async function loadImage(image) {
17
- return new Promise((resolve) => {
18
+ return new Promise(resolve => {
18
19
  image.loading = true;
19
20
  const img = new Image();
20
21
  image.element = img;
@@ -39,12 +40,12 @@ export async function downloadSvgImage(image) {
39
40
  }
40
41
  image.loading = true;
41
42
  const response = await fetch(image.source);
42
- if (!response.ok) {
43
- getLogger().error("Image not found");
44
- image.error = true;
43
+ if (response.ok) {
44
+ image.svgData = await response.text();
45
45
  }
46
46
  else {
47
- image.svgData = await response.text();
47
+ getLogger().error("Image not found");
48
+ image.error = true;
48
49
  }
49
50
  image.loading = false;
50
51
  }
package/esm/index.js CHANGED
@@ -1,14 +1,25 @@
1
+ import { shapeTypes } from "./Utils.js";
1
2
  const extLength = 3;
2
3
  function addLoadImageToEngine(engine) {
3
- if (engine.loadImage) {
4
- return;
5
- }
6
- engine.loadImage = async (data) => {
4
+ engine.getImages ??= (container) => {
5
+ engine.images ??= new Map();
6
+ let images = engine.images.get(container);
7
+ if (!images) {
8
+ images = [];
9
+ engine.images.set(container, images);
10
+ }
11
+ return images;
12
+ };
13
+ engine.loadImage ??= async (container, data) => {
14
+ if (!engine.getImages) {
15
+ throw new Error("No images collection found");
16
+ }
7
17
  if (!data.name && !data.src) {
8
18
  throw new Error("No image source provided");
9
19
  }
10
- engine.images ??= [];
11
- if (engine.images.some((t) => t.name === data.name || t.source === data.src)) {
20
+ engine.images ??= new Map();
21
+ const containerImages = engine.getImages(container);
22
+ if (containerImages.some((t) => t.name === data.name || t.source === data.src)) {
12
23
  return;
13
24
  }
14
25
  try {
@@ -22,11 +33,12 @@ function addLoadImageToEngine(engine) {
22
33
  replaceColor: data.replaceColor,
23
34
  ratio: data.width && data.height ? data.width / data.height : undefined,
24
35
  };
25
- engine.images.push(image);
36
+ containerImages.push(image);
37
+ engine.images.set(container, containerImages);
26
38
  let imageFunc;
27
39
  if (data.gif) {
28
40
  const { loadGifImage } = await import("./GifUtils/Utils.js");
29
- imageFunc = loadGifImage;
41
+ imageFunc = (img) => loadGifImage(img, { colorSpace: "srgb" });
30
42
  }
31
43
  else if (data.replaceColor) {
32
44
  const { downloadSvgImage } = await import("./Utils.js");
@@ -44,12 +56,14 @@ function addLoadImageToEngine(engine) {
44
56
  };
45
57
  }
46
58
  export async function loadImageShape(engine) {
47
- engine.checkVersion("4.0.0-alpha.8");
59
+ engine.checkVersion("4.0.0-beta.0");
48
60
  await engine.register(async (e) => {
49
- const { ImageDrawer } = await import("./ImageDrawer.js"), { ImagePreloaderPlugin } = await import("./ImagePreloader.js");
61
+ const { ImagePreloaderPlugin } = await import("./ImagePreloader.js");
50
62
  addLoadImageToEngine(e);
51
- const preloader = new ImagePreloaderPlugin();
52
- e.addPlugin(preloader);
53
- e.addShape(new ImageDrawer(e));
63
+ e.addPlugin(new ImagePreloaderPlugin(e));
64
+ e.addShape(shapeTypes, async () => {
65
+ const { ImageDrawer } = await import("./ImageDrawer.js");
66
+ return new ImageDrawer(e);
67
+ });
54
68
  });
55
69
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/shape-image",
3
- "version": "4.0.0-alpha.8",
3
+ "version": "4.0.0-beta.0",
4
4
  "description": "tsParticles image shape",
5
5
  "homepage": "https://particles.js.org",
6
6
  "repository": {
@@ -59,7 +59,7 @@
59
59
  "./package.json": "./package.json"
60
60
  },
61
61
  "dependencies": {
62
- "@tsparticles/engine": "4.0.0-alpha.8"
62
+ "@tsparticles/engine": "4.0.0-beta.0"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public"
package/report.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>@tsparticles/shape-image [23 Jan 2026 at 23:47]</title>
6
+ <title>@tsparticles/shape-image [19 Mar 2026 at 13:58]</title>
7
7
  <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
8
8
 
9
9
  <script>
@@ -4,7 +4,7 @@
4
4
  * Demo / Generator : https://particles.js.org/
5
5
  * GitHub : https://www.github.com/matteobruni/tsparticles
6
6
  * How to use? : Check the GitHub README
7
- * v4.0.0-alpha.8
7
+ * v4.0.0-beta.0
8
8
  */
9
9
  /*
10
10
  * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
@@ -28,23 +28,33 @@ return /******/ (() => { // webpackBootstrap
28
28
  /******/ "use strict";
29
29
  /******/ var __webpack_modules__ = ({
30
30
 
31
- /***/ "./dist/browser/index.js"
31
+ /***/ "@tsparticles/engine"
32
+ /*!*********************************************************************************************************************************!*\
33
+ !*** external {"commonjs":"@tsparticles/engine","commonjs2":"@tsparticles/engine","amd":"@tsparticles/engine","root":"window"} ***!
34
+ \*********************************************************************************************************************************/
35
+ (module) {
36
+
37
+ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
38
+
39
+ /***/ },
40
+
41
+ /***/ "./dist/browser/Utils.js"
32
42
  /*!*******************************!*\
33
- !*** ./dist/browser/index.js ***!
43
+ !*** ./dist/browser/Utils.js ***!
34
44
  \*******************************/
35
45
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
36
46
 
37
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ loadImageShape: () => (/* binding */ loadImageShape)\n/* harmony export */ });\nconst extLength = 3;\nfunction addLoadImageToEngine(engine) {\n if (engine.loadImage) {\n return;\n }\n engine.loadImage = async data => {\n if (!data.name && !data.src) {\n throw new Error(\"No image source provided\");\n }\n engine.images ??= [];\n if (engine.images.some(t => t.name === data.name || t.source === data.src)) {\n return;\n }\n try {\n const image = {\n gif: data.gif,\n name: data.name ?? data.src,\n source: data.src,\n type: data.src.substring(data.src.length - extLength),\n error: false,\n loading: true,\n replaceColor: data.replaceColor,\n ratio: data.width && data.height ? data.width / data.height : undefined\n };\n engine.images.push(image);\n let imageFunc;\n if (data.gif) {\n const {\n loadGifImage\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_GifUtils_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./GifUtils/Utils.js */ \"./dist/browser/GifUtils/Utils.js\"));\n imageFunc = loadGifImage;\n } else if (data.replaceColor) {\n const {\n downloadSvgImage\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n imageFunc = downloadSvgImage;\n } else {\n const {\n loadImage\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n imageFunc = loadImage;\n }\n await imageFunc(image);\n } catch {\n throw new Error(`${data.name ?? data.src} not found`);\n }\n };\n}\nasync function loadImageShape(engine) {\n engine.checkVersion(\"4.0.0-alpha.8\");\n await engine.register(async e => {\n const {\n ImageDrawer\n } = await Promise.all(/*! import() */[__webpack_require__.e(\"dist_browser_GifUtils_Utils_js\"), __webpack_require__.e(\"dist_browser_ImageDrawer_js\")]).then(__webpack_require__.bind(__webpack_require__, /*! ./ImageDrawer.js */ \"./dist/browser/ImageDrawer.js\")),\n {\n ImagePreloaderPlugin\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_ImagePreloader_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./ImagePreloader.js */ \"./dist/browser/ImagePreloader.js\"));\n addLoadImageToEngine(e);\n const preloader = new ImagePreloaderPlugin();\n e.addPlugin(preloader);\n e.addShape(new ImageDrawer(e));\n });\n}\n\n//# sourceURL=webpack://@tsparticles/shape-image/./dist/browser/index.js?\n}");
47
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ downloadSvgImage: () => (/* binding */ downloadSvgImage),\n/* harmony export */ loadImage: () => (/* binding */ loadImage),\n/* harmony export */ replaceImageColor: () => (/* binding */ replaceImageColor),\n/* harmony export */ shapeTypes: () => (/* binding */ shapeTypes)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst shapeTypes = [\n \"image\",\n \"images\"\n];\nconst stringStart = 0, defaultOpacity = 1;\nconst currentColorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d.]+%?\\))|currentcolor/gi;\nfunction replaceColorSvg(imageShape, color, opacity, hdr = false) {\n const { svgData } = imageShape;\n if (!svgData) {\n return \"\";\n }\n const colorStyle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getStyleFromHsl)(color, hdr, opacity);\n if (svgData.includes(\"fill\")) {\n return svgData.replaceAll(currentColorRegex, ()=>colorStyle);\n }\n const preFillIndex = svgData.indexOf(\">\");\n return `${svgData.substring(stringStart, preFillIndex)} fill=\"${colorStyle}\"${svgData.substring(preFillIndex)}`;\n}\nasync function loadImage(image) {\n return new Promise((resolve)=>{\n image.loading = true;\n const img = new Image();\n image.element = img;\n img.addEventListener(\"load\", ()=>{\n image.loading = false;\n resolve();\n });\n img.addEventListener(\"error\", ()=>{\n image.element = undefined;\n image.error = true;\n image.loading = false;\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getLogger)().error(`Error loading image: ${image.source}`);\n resolve();\n });\n img.src = image.source;\n });\n}\nasync function downloadSvgImage(image) {\n if (image.type !== \"svg\") {\n await loadImage(image);\n return;\n }\n image.loading = true;\n const response = await fetch(image.source);\n if (response.ok) {\n image.svgData = await response.text();\n } else {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getLogger)().error(\"Image not found\");\n image.error = true;\n }\n image.loading = false;\n}\nfunction replaceImageColor(image, imageData, color, particle, hdr = false) {\n const svgColoredData = replaceColorSvg(image, color, particle.opacity?.value ?? defaultOpacity, hdr), imageRes = {\n color,\n gif: imageData.gif,\n data: {\n ...image,\n svgData: svgColoredData\n },\n loaded: false,\n ratio: imageData.width / imageData.height,\n replaceColor: imageData.replaceColor,\n source: imageData.src\n };\n return new Promise((resolve)=>{\n const svg = new Blob([\n svgColoredData\n ], {\n type: \"image/svg+xml\"\n }), url = URL.createObjectURL(svg), img = new Image();\n img.addEventListener(\"load\", ()=>{\n imageRes.loaded = true;\n imageRes.element = img;\n resolve(imageRes);\n URL.revokeObjectURL(url);\n });\n const errorHandler = async ()=>{\n URL.revokeObjectURL(url);\n const img2 = {\n ...image,\n error: false,\n loading: true\n };\n await loadImage(img2);\n imageRes.loaded = true;\n imageRes.element = img2.element;\n resolve(imageRes);\n };\n img.addEventListener(\"error\", ()=>void errorHandler());\n img.src = url;\n });\n}\n\n\n//# sourceURL=webpack://@tsparticles/shape-image/./dist/browser/Utils.js?\n}");
38
48
 
39
49
  /***/ },
40
50
 
41
- /***/ "@tsparticles/engine"
42
- /*!*********************************************************************************************************************************!*\
43
- !*** external {"commonjs":"@tsparticles/engine","commonjs2":"@tsparticles/engine","amd":"@tsparticles/engine","root":"window"} ***!
44
- \*********************************************************************************************************************************/
45
- (module) {
51
+ /***/ "./dist/browser/index.js"
52
+ /*!*******************************!*\
53
+ !*** ./dist/browser/index.js ***!
54
+ \*******************************/
55
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
46
56
 
47
- module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
57
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ loadImageShape: () => (/* binding */ loadImageShape)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./dist/browser/Utils.js\");\n\nconst extLength = 3;\nfunction addLoadImageToEngine(engine) {\n engine.getImages ??= (container)=>{\n engine.images ??= new Map();\n let images = engine.images.get(container);\n if (!images) {\n images = [];\n engine.images.set(container, images);\n }\n return images;\n };\n engine.loadImage ??= async (container, data)=>{\n if (!engine.getImages) {\n throw new Error(\"No images collection found\");\n }\n if (!data.name && !data.src) {\n throw new Error(\"No image source provided\");\n }\n engine.images ??= new Map();\n const containerImages = engine.getImages(container);\n if (containerImages.some((t)=>t.name === data.name || t.source === data.src)) {\n return;\n }\n try {\n const image = {\n gif: data.gif,\n name: data.name ?? data.src,\n source: data.src,\n type: data.src.substring(data.src.length - extLength),\n error: false,\n loading: true,\n replaceColor: data.replaceColor,\n ratio: data.width && data.height ? data.width / data.height : undefined\n };\n containerImages.push(image);\n engine.images.set(container, containerImages);\n let imageFunc;\n if (data.gif) {\n const { loadGifImage } = await __webpack_require__.e(/*! import() */ \"dist_browser_GifUtils_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./GifUtils/Utils.js */ \"./dist/browser/GifUtils/Utils.js\"));\n imageFunc = (img)=>loadGifImage(img, {\n colorSpace: \"srgb\"\n });\n } else if (data.replaceColor) {\n const { downloadSvgImage } = await Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n imageFunc = downloadSvgImage;\n } else {\n const { loadImage } = await Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n imageFunc = loadImage;\n }\n await imageFunc(image);\n } catch {\n throw new Error(`${data.name ?? data.src} not found`);\n }\n };\n}\nasync function loadImageShape(engine) {\n engine.checkVersion(\"4.0.0-beta.0\");\n await engine.register(async (e)=>{\n const { ImagePreloaderPlugin } = await __webpack_require__.e(/*! import() */ \"dist_browser_ImagePreloader_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./ImagePreloader.js */ \"./dist/browser/ImagePreloader.js\"));\n addLoadImageToEngine(e);\n e.addPlugin(new ImagePreloaderPlugin(e));\n e.addShape(_Utils_js__WEBPACK_IMPORTED_MODULE_0__.shapeTypes, async ()=>{\n const { ImageDrawer } = await Promise.all(/*! import() */[__webpack_require__.e(\"dist_browser_GifUtils_Utils_js\"), __webpack_require__.e(\"dist_browser_ImageDrawer_js\")]).then(__webpack_require__.bind(__webpack_require__, /*! ./ImageDrawer.js */ \"./dist/browser/ImageDrawer.js\"));\n return new ImageDrawer(e);\n });\n });\n}\n\n\n//# sourceURL=webpack://@tsparticles/shape-image/./dist/browser/index.js?\n}");
48
58
 
49
59
  /***/ }
50
60
 
@@ -60,12 +70,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
60
70
  /******/ if (cachedModule !== undefined) {
61
71
  /******/ return cachedModule.exports;
62
72
  /******/ }
63
- /******/ // Check if module exists (development only)
64
- /******/ if (__webpack_modules__[moduleId] === undefined) {
65
- /******/ var e = new Error("Cannot find module '" + moduleId + "'");
66
- /******/ e.code = 'MODULE_NOT_FOUND';
67
- /******/ throw e;
68
- /******/ }
69
73
  /******/ // Create a new module (and put it into the cache)
70
74
  /******/ var module = __webpack_module_cache__[moduleId] = {
71
75
  /******/ // no module.id needed
@@ -74,6 +78,12 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
74
78
  /******/ };
75
79
  /******/
76
80
  /******/ // Execute the module function
81
+ /******/ if (!(moduleId in __webpack_modules__)) {
82
+ /******/ delete __webpack_module_cache__[moduleId];
83
+ /******/ var e = new Error("Cannot find module '" + moduleId + "'");
84
+ /******/ e.code = 'MODULE_NOT_FOUND';
85
+ /******/ throw e;
86
+ /******/ }
77
87
  /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
78
88
  /******/
79
89
  /******/ // Return the exports of the module
@@ -118,6 +128,18 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
118
128
  /******/ };
119
129
  /******/ })();
120
130
  /******/
131
+ /******/ /* webpack/runtime/global */
132
+ /******/ (() => {
133
+ /******/ __webpack_require__.g = (function() {
134
+ /******/ if (typeof globalThis === 'object') return globalThis;
135
+ /******/ try {
136
+ /******/ return this || new Function('return this')();
137
+ /******/ } catch (e) {
138
+ /******/ if (typeof window === 'object') return window;
139
+ /******/ }
140
+ /******/ })();
141
+ /******/ })();
142
+ /******/
121
143
  /******/ /* webpack/runtime/hasOwnProperty shorthand */
122
144
  /******/ (() => {
123
145
  /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
@@ -182,8 +204,8 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_engine__;
182
204
  /******/ /* webpack/runtime/publicPath */
183
205
  /******/ (() => {
184
206
  /******/ var scriptUrl;
185
- /******/ if (globalThis.importScripts) scriptUrl = globalThis.location + "";
186
- /******/ var document = globalThis.document;
207
+ /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
208
+ /******/ var document = __webpack_require__.g.document;
187
209
  /******/ if (!scriptUrl && document) {
188
210
  /******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')
189
211
  /******/ scriptUrl = document.currentScript.src;
@@ -1,2 +1,2 @@
1
- /*! For license information please see tsparticles.shape.image.min.js.LICENSE.txt */
2
- !function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],r);else{var t="object"==typeof exports?r(require("@tsparticles/engine")):r(e.window);for(var a in t)("object"==typeof exports?exports:e)[a]=t[a]}}(this,(e=>(()=>{var r,t,a={303(r){r.exports=e}},o={};function i(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return a[e](t,t.exports,i),t.exports}i.m=a,i.d=(e,r)=>{for(var t in r)i.o(r,t)&&!i.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((r,t)=>(i.f[t](e,r),r)),[])),i.u=e=>e+".min.js",i.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="@tsparticles/shape-image:",i.l=(e,a,o,n)=>{if(r[e])r[e].push(a);else{var s,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),p=0;p<l.length;p++){var d=l[p];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==t+o){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=e),r[e]=[a];var u=(t,a)=>{s.onerror=s.onload=null,clearTimeout(f);var o=r[e];if(delete r[e],s.parentNode&&s.parentNode.removeChild(s),o&&o.forEach((e=>e(a))),t)return t(a)},f=setTimeout(u.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=u.bind(null,s.onerror),s.onload=u.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;globalThis.importScripts&&(e=globalThis.location+"");var r=globalThis.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=e})(),(()=>{var e={999:0};i.f.j=(r,t)=>{var a=i.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var o=new Promise(((t,o)=>a=e[r]=[t,o]));t.push(a[2]=o);var n=i.p+i.u(r),s=new Error;i.l(n,(t=>{if(i.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+o+": "+n+")",s.name="ChunkLoadError",s.type=o,s.request=n,a[1](s)}}),"chunk-"+r,r)}};var r=(r,t)=>{var a,o,[n,s,c]=t,l=0;if(n.some((r=>0!==e[r]))){for(a in s)i.o(s,a)&&(i.m[a]=s[a]);if(c)c(i)}for(r&&r(t);l<n.length;l++)o=n[l],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=this.webpackChunk_tsparticles_shape_image=this.webpackChunk_tsparticles_shape_image||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})();var n={};i.r(n),i.d(n,{loadImageShape:()=>c});const s=3;async function c(e){e.checkVersion("4.0.0-alpha.8"),await e.register((async e=>{const{ImageDrawer:r}=await i.e(324).then(i.bind(i,324)),{ImagePreloaderPlugin:t}=await i.e(72).then(i.bind(i,72));!function(e){e.loadImage||(e.loadImage=async r=>{if(!r.name&&!r.src)throw new Error("No image source provided");if(e.images??=[],!e.images.some((e=>e.name===r.name||e.source===r.src)))try{const t={gif:r.gif,name:r.name??r.src,source:r.src,type:r.src.substring(r.src.length-s),error:!1,loading:!0,replaceColor:r.replaceColor,ratio:r.width&&r.height?r.width/r.height:void 0};let a;if(e.images.push(t),r.gif){const{loadGifImage:e}=await i.e(337).then(i.bind(i,337));a=e}else if(r.replaceColor){const{downloadSvgImage:e}=await i.e(413).then(i.bind(i,413));a=e}else{const{loadImage:e}=await i.e(413).then(i.bind(i,413));a=e}await a(t)}catch{throw new Error(`${r.name??r.src} not found`)}})}(e);const a=new t;e.addPlugin(a),e.addShape(new r(e))}))}return n})()));
1
+ !function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],r);else{var t="object"==typeof exports?r(require("@tsparticles/engine")):r(e.window);for(var o in t)("object"==typeof exports?exports:e)[o]=t[o]}}(this,e=>(()=>{"use strict";var r,t,o,a={303(r){r.exports=e},183(e,r,t){t.d(r,{d:()=>l,downloadSvgImage:()=>s,loadImage:()=>n,z:()=>a});var o=t(303);let a=["image","images"],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(r=>{e.loading=!0;let t=new Image;e.element=t,t.addEventListener("load",()=>{e.loading=!1,r()}),t.addEventListener("error",()=>{e.element=void 0,e.error=!0,e.loading=!1,(0,o.getLogger)().error(`Error loading image: ${e.source}`),r()}),t.src=e.source})}async function s(e){if("svg"!==e.type)return void await n(e);e.loading=!0;let r=await fetch(e.source);r.ok?e.svgData=await r.text():((0,o.getLogger)().error("Image not found"),e.error=!0),e.loading=!1}function l(e,r,t,a,s=!1){let c=function(e,r,t,a=!1){let{svgData:n}=e;if(!n)return"";let s=(0,o.getStyleFromHsl)(r,a,t);if(n.includes("fill"))return n.replaceAll(i,()=>s);let l=n.indexOf(">");return`${n.substring(0,l)} fill="${s}"${n.substring(l)}`}(e,t,a.opacity?.value??1,s),d={color:t,gif:r.gif,data:{...e,svgData:c},loaded:!1,ratio:r.width/r.height,replaceColor:r.replaceColor,source:r.src};return new Promise(r=>{let t=new Blob([c],{type:"image/svg+xml"}),o=URL.createObjectURL(t),a=new Image;a.addEventListener("load",()=>{d.loaded=!0,d.element=a,r(d),URL.revokeObjectURL(o)});let i=async()=>{URL.revokeObjectURL(o);let t={...e,error:!1,loading:!0};await n(t),d.loaded=!0,d.element=t.element,r(d)};a.addEventListener("error",()=>void i()),a.src=o})}}},i={};function n(e){var r=i[e];if(void 0!==r)return r.exports;var t=i[e]={exports:{}};return a[e](t,t.exports,n),t.exports}n.m=a,n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>""+e+".min.js",n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),s={},n.l=(e,r,t,o)=>{if(s[e])return void s[e].push(r);if(void 0!==t)for(var a,i,l=document.getElementsByTagName("script"),c=0;c<l.length;c++){var d=l[c];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")=="@tsparticles/shape-image:"+t){a=d;break}}a||(i=!0,(a=document.createElement("script")).charset="utf-8",n.nc&&a.setAttribute("nonce",n.nc),a.setAttribute("data-webpack","@tsparticles/shape-image:"+t),a.src=e),s[e]=[r];var g=(r,t)=>{a.onerror=a.onload=null,clearTimeout(u);var o=s[e];if(delete s[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach(e=>e(t)),r)return r(t)},u=setTimeout(g.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=g.bind(null,a.onerror),a.onload=g.bind(null,a.onload),i&&document.head.appendChild(a)},n.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.g.importScripts&&(l=n.g.location+"");var s,l,c=n.g.document;if(!l&&c&&(c.currentScript&&"SCRIPT"===c.currentScript.tagName.toUpperCase()&&(l=c.currentScript.src),!l)){var d=c.getElementsByTagName("script");if(d.length)for(var g=d.length-1;g>-1&&(!l||!/^http(s?):/.test(l));)l=d[g--].src}if(!l)throw Error("Automatic publicPath is not supported in this browser");n.p=l=l.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r={999:0},n.f.j=(e,t)=>{var o=n.o(r,e)?r[e]:void 0;if(0!==o)if(o)t.push(o[2]);else{var a=new Promise((t,a)=>o=r[e]=[t,a]);t.push(o[2]=a);var i=n.p+n.u(e),s=Error();n.l(i,t=>{if(n.o(r,e)&&(0!==(o=r[e])&&(r[e]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;s.message="Loading chunk "+e+` failed.
2
+ (`+a+": "+i+")",s.name="ChunkLoadError",s.type=a,s.request=i,o[1](s)}},"chunk-"+e,e)}},t=(e,t)=>{var o,a,[i,s,l]=t,c=0;if(i.some(e=>0!==r[e])){for(o in s)n.o(s,o)&&(n.m[o]=s[o]);l&&l(n)}for(e&&e(t);c<i.length;c++)a=i[c],n.o(r,a)&&r[a]&&r[a][0](),r[a]=0},(o=this.webpackChunk_tsparticles_shape_image=this.webpackChunk_tsparticles_shape_image||[]).forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o));var u={};n.r(u),n.d(u,{loadImageShape:()=>f});var p=n(183);async function f(e){e.checkVersion("4.0.0-beta.0"),await e.register(async e=>{let{ImagePreloaderPlugin:r}=await n.e(375).then(n.bind(n,375));e.getImages??=r=>{e.images??=new Map;let t=e.images.get(r);return t||(t=[],e.images.set(r,t)),t},e.loadImage??=async(r,t)=>{if(!e.getImages)throw Error("No images collection found");if(!t.name&&!t.src)throw Error("No image source provided");e.images??=new Map;let o=e.getImages(r);if(!o.some(e=>e.name===t.name||e.source===t.src))try{let a,i={gif:t.gif,name:t.name??t.src,source:t.src,type:t.src.substring(t.src.length-3),error:!1,loading:!0,replaceColor:t.replaceColor,ratio:t.width&&t.height?t.width/t.height:void 0};if(o.push(i),e.images.set(r,o),t.gif){let{loadGifImage:e}=await n.e(814).then(n.bind(n,814));a=r=>e(r,{colorSpace:"srgb"})}else if(t.replaceColor){let{downloadSvgImage:e}=await Promise.resolve().then(n.bind(n,183));a=e}else{let{loadImage:e}=await Promise.resolve().then(n.bind(n,183));a=e}await a(i)}catch{throw Error(`${t.name??t.src} not found`)}},e.addPlugin(new r(e)),e.addShape(p.z,async()=>{let{ImageDrawer:r}=await n.e(682).then(n.bind(n,682));return new r(e)})})}return u})());
@@ -1,8 +1,8 @@
1
- import { type IShapeDrawData } from "@tsparticles/engine";
2
1
  import { type IImage, type ImageParticle } from "../Utils.js";
2
+ import { type IShapeDrawData } from "@tsparticles/engine";
3
3
  import type { GIF } from "./Types/GIF.js";
4
4
  import type { GIFProgressCallbackFunction } from "./Types/GIFProgressCallbackFunction.js";
5
5
  export declare function getGIFLoopAmount(gif: GIF): number;
6
- export declare function decodeGIF(gifURL: string, progressCallback?: GIFProgressCallbackFunction, avgAlpha?: boolean): Promise<GIF>;
7
- export declare function drawGif(data: IShapeDrawData<ImageParticle>): void;
8
- export declare function loadGifImage(image: IImage): Promise<void>;
6
+ export declare function decodeGIF(gifURL: string, canvasSettings: CanvasRenderingContext2DSettings, progressCallback?: GIFProgressCallbackFunction, avgAlpha?: boolean): Promise<GIF>;
7
+ export declare function drawGif(data: IShapeDrawData<ImageParticle>, canvasSettings?: CanvasRenderingContext2DSettings): void;
8
+ export declare function loadGifImage(image: IImage, canvasSettings: CanvasRenderingContext2DSettings): Promise<void>;
@@ -1,11 +1,9 @@
1
1
  import { type Container, type IShapeDrawData, type IShapeDrawer } from "@tsparticles/engine";
2
- import { type IImage, type ImageParticle } from "./Utils.js";
2
+ import { type ImageParticle } from "./Utils.js";
3
3
  import type { ImageContainer, ImageEngine } from "./types.js";
4
4
  export declare class ImageDrawer implements IShapeDrawer<ImageParticle> {
5
- readonly validTypes: readonly ["image", "images"];
6
5
  private readonly _engine;
7
6
  constructor(engine: ImageEngine);
8
- addImage(image: IImage): void;
9
7
  draw(data: IShapeDrawData<ImageParticle>): void;
10
8
  getSidesCount(): number;
11
9
  init(container: ImageContainer): Promise<void>;
@@ -1,9 +1,10 @@
1
1
  import type { Container, IContainerPlugin, IPlugin, RecursivePartial } from "@tsparticles/engine";
2
- import type { IPreloadOptions, PreloadOptions } from "./types.js";
2
+ import type { IPreloadOptions, ImageContainer, ImageEngine, PreloadOptions } from "./types.js";
3
3
  export declare class ImagePreloaderPlugin implements IPlugin {
4
- readonly id: string;
5
- constructor();
6
- getPlugin(): Promise<IContainerPlugin>;
4
+ readonly id = "image-preloader";
5
+ private readonly _engine;
6
+ constructor(engine: ImageEngine);
7
+ getPlugin(container: ImageContainer): Promise<IContainerPlugin>;
7
8
  loadOptions(_container: Container, options: PreloadOptions, source?: RecursivePartial<IPreloadOptions>): void;
8
9
  needsPlugin(): boolean;
9
10
  }
@@ -0,0 +1,8 @@
1
+ import type { ImageContainer, ImageEngine } from "./types.js";
2
+ import type { IContainerPlugin } from "@tsparticles/engine";
3
+ export declare class ImagePreloaderInstance implements IContainerPlugin {
4
+ private readonly _container;
5
+ private readonly _engine;
6
+ constructor(engine: ImageEngine, container: ImageContainer);
7
+ destroy(): void;
8
+ }
package/types/Utils.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type IHsl, type Particle } from "@tsparticles/engine";
2
2
  import type { GIF } from "./GifUtils/Types/GIF.js";
3
3
  import type { IImageShape } from "./IImageShape.js";
4
+ export declare const shapeTypes: string[];
4
5
  export interface IImage {
5
6
  color?: IHsl;
6
7
  element?: HTMLImageElement;
package/types/types.d.ts CHANGED
@@ -3,8 +3,9 @@ import type { IImage } from "./Utils.js";
3
3
  import type { IPreload } from "./Options/Interfaces/IPreload.js";
4
4
  import type { Preload } from "./Options/Classes/Preload.js";
5
5
  export type ImageEngine = Engine & {
6
- images?: IImage[];
7
- loadImage?: (data: IPreload) => Promise<void>;
6
+ getImages?: (container: ImageContainer) => IImage[];
7
+ images?: Map<ImageContainer, IImage[]>;
8
+ loadImage?: (container: ImageContainer, data: IPreload) => Promise<void>;
8
9
  };
9
10
  export type IPreloadOptions = IOptions & {
10
11
  preload: IPreload[];
@@ -11,6 +11,8 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ByteStream = void 0;
13
13
  class ByteStream {
14
+ data;
15
+ pos;
14
16
  constructor(bytes) {
15
17
  this.pos = 0;
16
18
  this.data = new Uint8ClampedArray(bytes);
@@ -29,7 +31,7 @@
29
31
  return this.data[this.pos - increment] + (this.data[this.pos - previous] << shift);
30
32
  }
31
33
  readSubBlocks() {
32
- let blockString = "", size = 0;
34
+ let blockString = "", size;
33
35
  const minCount = 0, emptySize = 0;
34
36
  do {
35
37
  size = this.data[this.pos++];