@tsparticles/shape-image 3.1.0 → 3.2.1
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/21.min.js +2 -0
- package/21.min.js.LICENSE.txt +1 -0
- package/618.min.js +2 -0
- package/618.min.js.LICENSE.txt +1 -0
- package/623.min.js +2 -0
- package/623.min.js.LICENSE.txt +1 -0
- package/browser/GifUtils/ByteStream.js +2 -1
- package/browser/GifUtils/Utils.js +96 -0
- package/browser/ImageDrawer.js +42 -113
- package/browser/ImagePreloader.js +2 -1
- package/browser/Utils.js +1 -20
- package/browser/index.js +3 -3
- package/cjs/GifUtils/ByteStream.js +2 -1
- package/cjs/GifUtils/Utils.js +122 -1
- package/cjs/ImageDrawer.js +64 -112
- package/cjs/ImagePreloader.js +2 -1
- package/cjs/Utils.js +2 -22
- package/cjs/index.js +28 -5
- package/dist_browser_GifUtils_Utils_js.js +50 -0
- package/dist_browser_ImageDrawer_js.js +30 -0
- package/dist_browser_ImagePreloader_js.js +40 -0
- package/esm/GifUtils/ByteStream.js +2 -1
- package/esm/GifUtils/Utils.js +96 -0
- package/esm/ImageDrawer.js +42 -113
- package/esm/ImagePreloader.js +2 -1
- package/esm/Utils.js +1 -20
- package/esm/index.js +3 -3
- package/package.json +2 -2
- package/report.html +3 -3
- package/tsparticles.shape.image.js +251 -910
- package/tsparticles.shape.image.min.js +1 -1
- package/tsparticles.shape.image.min.js.LICENSE.txt +1 -1
- package/types/GifUtils/Utils.d.ts +4 -0
- package/types/ImageDrawer.d.ts +4 -4
- package/types/ImagePreloader.d.ts +1 -1
- package/types/Utils.d.ts +0 -1
- package/umd/GifUtils/ByteStream.js +2 -1
- package/umd/GifUtils/Utils.js +123 -1
- package/umd/ImageDrawer.js +66 -113
- package/umd/ImagePreloader.js +2 -1
- package/umd/Utils.js +3 -23
- package/umd/index.js +30 -6
package/esm/ImageDrawer.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import { errorPrefix
|
|
2
|
-
|
|
3
|
-
const origin = {
|
|
4
|
-
x: 0,
|
|
5
|
-
y: 0,
|
|
6
|
-
}, defaultLoopCount = 0, defaultFrame = 0, half = 0.5, initialTime = 0, firstIndex = 0, double = 2, defaultAlpha = 1, sides = 12, defaultRatio = 1;
|
|
1
|
+
import { errorPrefix } from "@tsparticles/engine";
|
|
2
|
+
const double = 2, defaultAlpha = 1, sides = 12, defaultRatio = 1;
|
|
7
3
|
export class ImageDrawer {
|
|
8
4
|
constructor(engine) {
|
|
9
5
|
this.loadImageShape = async (imageShape) => {
|
|
@@ -25,80 +21,15 @@ export class ImageDrawer {
|
|
|
25
21
|
}
|
|
26
22
|
this._engine.images.push(image);
|
|
27
23
|
}
|
|
28
|
-
draw(data) {
|
|
29
|
-
const { context, radius, particle, opacity
|
|
24
|
+
async draw(data) {
|
|
25
|
+
const { context, radius, particle, opacity } = data, image = particle.image, element = image?.element;
|
|
30
26
|
if (!image) {
|
|
31
27
|
return;
|
|
32
28
|
}
|
|
33
29
|
context.globalAlpha = opacity;
|
|
34
30
|
if (image.gif && image.gifData) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
throw new Error("could not create offscreen canvas context");
|
|
38
|
-
}
|
|
39
|
-
offscreenContext.imageSmoothingQuality = "low";
|
|
40
|
-
offscreenContext.imageSmoothingEnabled = false;
|
|
41
|
-
offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
42
|
-
if (particle.gifLoopCount === undefined) {
|
|
43
|
-
particle.gifLoopCount = image.gifLoopCount ?? defaultLoopCount;
|
|
44
|
-
}
|
|
45
|
-
let frameIndex = particle.gifFrame ?? defaultFrame;
|
|
46
|
-
const pos = { x: -image.gifData.width * half, y: -image.gifData.height * half }, frame = image.gifData.frames[frameIndex];
|
|
47
|
-
if (particle.gifTime === undefined) {
|
|
48
|
-
particle.gifTime = initialTime;
|
|
49
|
-
}
|
|
50
|
-
if (!frame.bitmap) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
context.scale(radius / image.gifData.width, radius / image.gifData.height);
|
|
54
|
-
switch (frame.disposalMethod) {
|
|
55
|
-
case 4:
|
|
56
|
-
case 5:
|
|
57
|
-
case 6:
|
|
58
|
-
case 7:
|
|
59
|
-
case 0:
|
|
60
|
-
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
61
|
-
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
62
|
-
offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
63
|
-
break;
|
|
64
|
-
case 1:
|
|
65
|
-
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
66
|
-
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
67
|
-
break;
|
|
68
|
-
case 2:
|
|
69
|
-
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
70
|
-
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
71
|
-
offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
72
|
-
if (!image.gifData.globalColorTable.length) {
|
|
73
|
-
offscreenContext.putImageData(image.gifData.frames[firstIndex].image, pos.x + frame.left, pos.y + frame.top);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
offscreenContext.putImageData(image.gifData.backgroundImage, pos.x, pos.y);
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
case 3:
|
|
80
|
-
{
|
|
81
|
-
const previousImageData = offscreenContext.getImageData(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
82
|
-
offscreenContext.drawImage(frame.bitmap, frame.left, frame.top);
|
|
83
|
-
context.drawImage(offscreenCanvas, pos.x, pos.y);
|
|
84
|
-
offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
85
|
-
offscreenContext.putImageData(previousImageData, origin.x, origin.y);
|
|
86
|
-
}
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
particle.gifTime += delta.value;
|
|
90
|
-
if (particle.gifTime > frame.delayTime) {
|
|
91
|
-
particle.gifTime -= frame.delayTime;
|
|
92
|
-
if (++frameIndex >= image.gifData.frames.length) {
|
|
93
|
-
if (--particle.gifLoopCount <= defaultLoopCount) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
frameIndex = firstIndex;
|
|
97
|
-
offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height);
|
|
98
|
-
}
|
|
99
|
-
particle.gifFrame = frameIndex;
|
|
100
|
-
}
|
|
101
|
-
context.scale(image.gifData.width / radius, image.gifData.height / radius);
|
|
31
|
+
const { drawGif } = await import("./GifUtils/Utils.js");
|
|
32
|
+
drawGif(data);
|
|
102
33
|
}
|
|
103
34
|
else if (element) {
|
|
104
35
|
const ratio = image.ratio, pos = {
|
|
@@ -121,7 +52,7 @@ export class ImageDrawer {
|
|
|
121
52
|
await this._engine.loadImage(imageData);
|
|
122
53
|
}
|
|
123
54
|
}
|
|
124
|
-
loadShape(particle) {
|
|
55
|
+
async loadShape(particle) {
|
|
125
56
|
if (particle.shape !== "image" && particle.shape !== "images") {
|
|
126
57
|
return;
|
|
127
58
|
}
|
|
@@ -134,12 +65,11 @@ export class ImageDrawer {
|
|
|
134
65
|
}
|
|
135
66
|
const image = this._engine.images.find((t) => t.name === imageData.name || t.source === imageData.src);
|
|
136
67
|
if (!image) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
});
|
|
68
|
+
await this.loadImageShape(imageData);
|
|
69
|
+
await this.loadShape(particle);
|
|
140
70
|
}
|
|
141
71
|
}
|
|
142
|
-
particleInit(container, particle) {
|
|
72
|
+
async particleInit(container, particle) {
|
|
143
73
|
if (particle.shape !== "image" && particle.shape !== "images") {
|
|
144
74
|
return;
|
|
145
75
|
}
|
|
@@ -157,42 +87,41 @@ export class ImageDrawer {
|
|
|
157
87
|
const replaceColor = imageData.replaceColor ?? image.replaceColor;
|
|
158
88
|
if (image.loading) {
|
|
159
89
|
setTimeout(() => {
|
|
160
|
-
this.particleInit(container, particle);
|
|
90
|
+
void this.particleInit(container, particle);
|
|
161
91
|
});
|
|
162
92
|
return;
|
|
163
93
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
if (!imageRes.ratio) {
|
|
186
|
-
imageRes.ratio = 1;
|
|
187
|
-
}
|
|
188
|
-
const fill = imageData.fill ?? particle.shapeFill, close = imageData.close ?? particle.shapeClose, imageShape = {
|
|
189
|
-
image: imageRes,
|
|
190
|
-
fill,
|
|
191
|
-
close,
|
|
94
|
+
let imageRes;
|
|
95
|
+
if (image.svgData && color) {
|
|
96
|
+
const { replaceImageColor } = await import("./Utils.js");
|
|
97
|
+
imageRes = await replaceImageColor(image, imageData, color, particle);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
imageRes = {
|
|
101
|
+
color,
|
|
102
|
+
data: image,
|
|
103
|
+
element: image.element,
|
|
104
|
+
gif: image.gif,
|
|
105
|
+
gifData: image.gifData,
|
|
106
|
+
gifLoopCount: image.gifLoopCount,
|
|
107
|
+
loaded: true,
|
|
108
|
+
ratio: imageData.width && imageData.height
|
|
109
|
+
? imageData.width / imageData.height
|
|
110
|
+
: image.ratio ?? defaultRatio,
|
|
111
|
+
replaceColor: replaceColor,
|
|
112
|
+
source: imageData.src,
|
|
192
113
|
};
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
114
|
+
}
|
|
115
|
+
if (!imageRes.ratio) {
|
|
116
|
+
imageRes.ratio = 1;
|
|
117
|
+
}
|
|
118
|
+
const fill = imageData.fill ?? particle.shapeFill, close = imageData.close ?? particle.shapeClose, imageShape = {
|
|
119
|
+
image: imageRes,
|
|
120
|
+
fill,
|
|
121
|
+
close,
|
|
122
|
+
};
|
|
123
|
+
particle.image = imageShape.image;
|
|
124
|
+
particle.shapeFill = imageShape.fill;
|
|
125
|
+
particle.shapeClose = imageShape.close;
|
|
197
126
|
}
|
|
198
127
|
}
|
package/esm/ImagePreloader.js
CHANGED
package/esm/Utils.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { errorPrefix, getLogger, getStyleFromHsl } from "@tsparticles/engine";
|
|
2
|
-
|
|
3
|
-
const stringStart = 0, defaultLoopCount = 0, defaultOpacity = 1;
|
|
2
|
+
const stringStart = 0, defaultOpacity = 1;
|
|
4
3
|
const currentColorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;
|
|
5
4
|
function replaceColorSvg(imageShape, color, opacity) {
|
|
6
5
|
const { svgData } = imageShape;
|
|
@@ -33,24 +32,6 @@ export async function loadImage(image) {
|
|
|
33
32
|
img.src = image.source;
|
|
34
33
|
});
|
|
35
34
|
}
|
|
36
|
-
export async function loadGifImage(image) {
|
|
37
|
-
if (image.type !== "gif") {
|
|
38
|
-
await loadImage(image);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
image.loading = true;
|
|
42
|
-
try {
|
|
43
|
-
image.gifData = await decodeGIF(image.source);
|
|
44
|
-
image.gifLoopCount = getGIFLoopAmount(image.gifData) ?? defaultLoopCount;
|
|
45
|
-
if (!image.gifLoopCount) {
|
|
46
|
-
image.gifLoopCount = Infinity;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
image.error = true;
|
|
51
|
-
}
|
|
52
|
-
image.loading = false;
|
|
53
|
-
}
|
|
54
35
|
export async function downloadSvgImage(image) {
|
|
55
36
|
if (image.type !== "svg") {
|
|
56
37
|
await loadImage(image);
|
package/esm/index.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { downloadSvgImage,
|
|
2
|
-
import { ImageDrawer } from "./ImageDrawer.js";
|
|
3
|
-
import { ImagePreloaderPlugin } from "./ImagePreloader.js";
|
|
1
|
+
import { downloadSvgImage, loadImage } from "./Utils.js";
|
|
4
2
|
import { errorPrefix } from "@tsparticles/engine";
|
|
5
3
|
const extLength = 3;
|
|
6
4
|
function addLoadImageToEngine(engine) {
|
|
@@ -31,6 +29,7 @@ function addLoadImageToEngine(engine) {
|
|
|
31
29
|
engine.images.push(image);
|
|
32
30
|
let imageFunc;
|
|
33
31
|
if (data.gif) {
|
|
32
|
+
const { loadGifImage } = await import("./GifUtils/Utils.js");
|
|
34
33
|
imageFunc = loadGifImage;
|
|
35
34
|
}
|
|
36
35
|
else {
|
|
@@ -45,6 +44,7 @@ function addLoadImageToEngine(engine) {
|
|
|
45
44
|
}
|
|
46
45
|
export async function loadImageShape(engine, refresh = true) {
|
|
47
46
|
addLoadImageToEngine(engine);
|
|
47
|
+
const { ImagePreloaderPlugin } = await import("./ImagePreloader.js"), { ImageDrawer } = await import("./ImageDrawer.js");
|
|
48
48
|
const preloader = new ImagePreloaderPlugin(engine);
|
|
49
49
|
await engine.addPlugin(preloader, refresh);
|
|
50
50
|
await engine.addShape(["image", "images"], new ImageDrawer(engine), refresh);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/shape-image",
|
|
3
|
-
"version": "3.1
|
|
3
|
+
"version": "3.2.1",
|
|
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": "^3.1
|
|
62
|
+
"@tsparticles/engine": "^3.2.1"
|
|
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 [
|
|
6
|
+
<title>@tsparticles/shape-image [31 Jan 2024 at 09:54]</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>
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
<body>
|
|
32
32
|
<div id="app"></div>
|
|
33
33
|
<script>
|
|
34
|
-
window.chartData = [
|
|
35
|
-
window.entrypoints = ["tsparticles.shape.image
|
|
34
|
+
window.chartData = [];
|
|
35
|
+
window.entrypoints = ["tsparticles.shape.image.min"];
|
|
36
36
|
window.defaultSizes = "parsed";
|
|
37
37
|
</script>
|
|
38
38
|
</body>
|