@tsparticles/plugin-canvas-mask 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/262.min.js +2 -0
- package/262.min.js.LICENSE.txt +1 -0
- package/73.min.js +2 -0
- package/73.min.js.LICENSE.txt +1 -0
- package/browser/CanvasMaskInstance.js +1 -1
- package/browser/CanvasMaskPlugin.js +23 -0
- package/browser/index.js +1 -23
- package/browser/utils.js +2 -2
- package/cjs/CanvasMaskInstance.js +1 -1
- package/cjs/CanvasMaskPlugin.js +50 -0
- package/cjs/index.js +24 -23
- package/cjs/utils.js +2 -2
- package/dist_browser_CanvasMaskInstance_js.js +40 -0
- package/dist_browser_CanvasMaskPlugin_js.js +100 -0
- package/esm/CanvasMaskInstance.js +1 -1
- package/esm/CanvasMaskPlugin.js +23 -0
- package/esm/index.js +1 -23
- package/esm/utils.js +2 -2
- package/package.json +2 -2
- package/report.html +3 -3
- package/tsparticles.plugin.canvas-mask.js +241 -434
- package/tsparticles.plugin.canvas-mask.min.js +1 -1
- package/tsparticles.plugin.canvas-mask.min.js.LICENSE.txt +1 -1
- package/types/CanvasMaskPlugin.d.ts +10 -0
- package/types/utils.d.ts +1 -1
- package/umd/CanvasMaskInstance.js +1 -1
- package/umd/CanvasMaskPlugin.js +61 -0
- package/umd/index.js +26 -24
- package/umd/utils.js +2 -2
package/262.min.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 262.min.js.LICENSE.txt */
|
|
2
|
+
(this.webpackChunk_tsparticles_plugin_canvas_mask=this.webpackChunk_tsparticles_plugin_canvas_mask||[]).push([[262],{262:(s,i,t)=>{t.d(i,{CanvasMaskPlugin:()=>d});class e{constructor(){this.color=!0,this.opacity=!1}load(s){s&&(void 0!==s.color&&(this.color=s.color),void 0!==s.opacity&&(this.opacity=s.opacity))}}var o=t(533);class a{constructor(){this.filter=s=>s.a>0,this.offset=4}load(s){if(s){if(void 0!==s.filter)if((0,o.isString)(s.filter)){if(Object.hasOwn(window,s.filter)){const i=window[s.filter];(0,o.isFunction)(i)&&(this.filter=i)}}else this.filter=s.filter;void 0!==s.offset&&(this.offset=s.offset)}}}class n{constructor(){this.src=""}load(s){s&&void 0!==s.src&&(this.src=s.src)}}class l{constructor(){this.family="sans-serif",this.size=100}load(s){s&&(void 0!==s.family&&(this.family=s.family),void 0!==s.size&&(this.size=s.size),void 0!==s.style&&(this.style=s.style),void 0!==s.variant&&(this.variant=s.variant),void 0!==s.weight&&(this.weight=s.weight))}}class c{constructor(){this.separator="\n",this.spacing=10}load(s){s&&(void 0!==s.separator&&(this.separator=s.separator),void 0!==s.spacing&&(this.spacing=s.spacing))}}class r{constructor(){this.color="#000000",this.font=new l,this.lines=new c,this.text=""}load(s){s&&(void 0!==s.color&&(this.color=s.color),this.font.load(s.font),this.lines.load(s.lines),void 0!==s.text&&(this.text=s.text))}}class h{constructor(){this.enable=!1,this.override=new e,this.pixels=new a,this.position={x:50,y:50},this.scale=1}load(s){s&&(void 0!==s.element&&s.element instanceof HTMLCanvasElement&&(this.element=s.element),void 0!==s.enable&&(this.enable=s.enable),s.image&&(this.image||(this.image=new n),this.image.load(s.image)),this.pixels.load(s.pixels),s.position&&(this.position={x:s.position.x??this.position.x,y:s.position.y??this.position.y}),this.override.load(s.override),void 0!==s.scale&&(this.scale=s.scale),void 0!==s.selector&&(this.selector=s.selector),s.text&&(this.text||(this.text=new r),this.text.load(s.text)))}}class d{constructor(){this.id="canvasMask"}async getPlugin(s){const{CanvasMaskInstance:i}=await t.e(73).then(t.bind(t,73));return new i(s)}loadOptions(s,i){if(!this.needsPlugin(s)&&!this.needsPlugin(i))return;let t=s.canvasMask;void 0===t?.load&&(s.canvasMask=t=new h),t.load(i?.canvasMask)}needsPlugin(s){return s?.canvasMask?.enable??!1}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tsParticles Canvas Mask Plugin v3.2.1 by Matteo Bruni */
|
package/73.min.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 73.min.js.LICENSE.txt */
|
|
2
|
+
(this.webpackChunk_tsparticles_plugin_canvas_mask=this.webpackChunk_tsparticles_plugin_canvas_mask||[]).push([[73],{73:(t,e,n)=>{n.d(e,{CanvasMaskInstance:()=>r});var i=n(533);const o={x:0,y:0};async function a(t,e,n,o,a,s){const{height:r,width:h}=e,l=r*h,u=function(t){const e=1,n=0;for(let o=t.length-e;o>=n;o--){const e=Math.floor((0,i.getRandom)()*o);[t[o],t[e]]=[t[e],t[o]]}return t}(c(l)),g=Math.min(l,t.actualOptions.particles.number.value),f=t.canvas.size;let x=0;const d=f.width*n.x/i.percentDenominator-h*o*.5,m=f.height*n.y/i.percentDenominator-r*o*.5;for(;x<g&&u.length;){const n=0,i=u.pop()??n,c={x:i%h,y:Math.floor(i/h)},r=e.pixels[c.y][c.x];if(!s(r))continue;const l={x:c.x*o+d,y:c.y*o+m},g={};a.color&&(g.color={value:r}),a.opacity&&(g.opacity={value:r.a}),await t.particles.addParticle(l,g),x++}}function s(t,e,n,i=!0){const a=t.getImageData(o.x,o.y,e.width,e.height).data;i&&t.clearRect(o.x,o.y,e.width,e.height);const s=[];for(let t=0;t<a.length;t+=n){const i=t/n,o={x:i%e.width,y:Math.floor(i/e.width)};s[o.y]||(s[o.y]=[]);const c={r:0,g:1,b:2,a:3},r=255;s[o.y][o.x]={r:a[t+c.r],g:a[t+c.g],b:a[t+c.b],a:a[t+c.a]/r}}return{pixels:s,width:Math.min(...s.map((t=>t.length))),height:s.length}}const c=t=>[...Array(t).keys()];class r{constructor(t){this._container=t}async init(){const t=this._container,e=t.actualOptions.canvasMask;if(!e?.enable)return;let n={pixels:[],height:0,width:0};const c=e.pixels.offset;if(e.image){const t=e.image.src;if(!t)return;n=await function(t,e){const n=new Image;n.crossOrigin="Anonymous";const a=new Promise(((t,a)=>{n.onerror=a,n.onload=()=>{const c=document.createElement("canvas");c.width=n.width,c.height=n.height;const r=c.getContext("2d");if(!r)return a(new Error(`${i.errorPrefix} Could not get canvas context`));r.drawImage(n,o.x,o.y,n.width,n.height,o.x,o.y,c.width,c.height),t(s(r,c,e))}}));return n.src=t,a}(t,c)}else if(e.text){const t=function(t,e){const n=document.createElement("canvas"),a=n.getContext("2d"),{font:c,text:r,lines:h,color:l}=t;if(!r||!a)return;const u=r.split(h.separator),g=(0,i.isNumber)(c.size)?`${c.size}px`:c.size,f=[];let x=0,d=0;for(const t of u){a.font=`${c.style??""} ${c.variant??""} ${c.weight??""} ${g} ${c.family}`;const e=a.measureText(t),n={measure:e,text:t,height:e.actualBoundingBoxAscent+e.actualBoundingBoxDescent,width:e.width};x=Math.max(x||0,n.width),d+=n.height+h.spacing,f.push(n)}n.width=x,n.height=d;let m=0;for(const t of f)a.font=`${c.style??""} ${c.variant??""} ${c.weight??""} ${g} ${c.family}`,a.fillStyle=l,a.fillText(t.text,o.x,m+t.measure.actualBoundingBoxAscent),m+=t.height+h.spacing;return s(a,n,e)}(e.text,c);if(!t)return;n=t}else if(e.element??e.selector){const t=e.element??(e.selector&&document.querySelector(e.selector));if(!t)return;const i=t.getContext("2d");if(!i)return;n=s(i,t,c)}await a(t,n,e.position,e.scale,e.override,e.pixels.filter)}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tsParticles Canvas Mask Plugin v3.2.1 by Matteo Bruni */
|
|
@@ -40,6 +40,6 @@ export class CanvasMaskInstance {
|
|
|
40
40
|
}
|
|
41
41
|
pixelData = getCanvasImageData(context, canvas, offset);
|
|
42
42
|
}
|
|
43
|
-
addParticlesFromCanvasPixels(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
43
|
+
await addParticlesFromCanvasPixels(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CanvasMask } from "./Options/Classes/CanvasMask.js";
|
|
2
|
+
export class CanvasMaskPlugin {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.id = "canvasMask";
|
|
5
|
+
}
|
|
6
|
+
async getPlugin(container) {
|
|
7
|
+
const { CanvasMaskInstance } = await import("./CanvasMaskInstance.js");
|
|
8
|
+
return new CanvasMaskInstance(container);
|
|
9
|
+
}
|
|
10
|
+
loadOptions(options, source) {
|
|
11
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
let canvasMaskOptions = options.canvasMask;
|
|
15
|
+
if (canvasMaskOptions?.load === undefined) {
|
|
16
|
+
options.canvasMask = canvasMaskOptions = new CanvasMask();
|
|
17
|
+
}
|
|
18
|
+
canvasMaskOptions.load(source?.canvasMask);
|
|
19
|
+
}
|
|
20
|
+
needsPlugin(options) {
|
|
21
|
+
return options?.canvasMask?.enable ?? false;
|
|
22
|
+
}
|
|
23
|
+
}
|
package/browser/index.js
CHANGED
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
import { CanvasMask } from "./Options/Classes/CanvasMask.js";
|
|
2
|
-
import { CanvasMaskInstance } from "./CanvasMaskInstance.js";
|
|
3
|
-
class CanvasMaskPlugin {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.id = "canvasMask";
|
|
6
|
-
}
|
|
7
|
-
getPlugin(container) {
|
|
8
|
-
return new CanvasMaskInstance(container);
|
|
9
|
-
}
|
|
10
|
-
loadOptions(options, source) {
|
|
11
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
let canvasMaskOptions = options.canvasMask;
|
|
15
|
-
if (canvasMaskOptions?.load === undefined) {
|
|
16
|
-
options.canvasMask = canvasMaskOptions = new CanvasMask();
|
|
17
|
-
}
|
|
18
|
-
canvasMaskOptions.load(source?.canvasMask);
|
|
19
|
-
}
|
|
20
|
-
needsPlugin(options) {
|
|
21
|
-
return options?.canvasMask?.enable ?? false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
1
|
export async function loadCanvasMaskPlugin(engine, refresh = true) {
|
|
2
|
+
const { CanvasMaskPlugin } = await import("./CanvasMaskPlugin.js");
|
|
25
3
|
await engine.addPlugin(new CanvasMaskPlugin(), refresh);
|
|
26
4
|
}
|
package/browser/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ const half = 0.5, origin = {
|
|
|
3
3
|
x: 0,
|
|
4
4
|
y: 0,
|
|
5
5
|
}, defaultWidth = 0;
|
|
6
|
-
export function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
6
|
+
export async function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
7
7
|
const { height, width } = data, numPixels = height * width, indexArray = shuffle(range(numPixels)), maxParticles = Math.min(numPixels, container.actualOptions.particles.number.value), canvasSize = container.canvas.size;
|
|
8
8
|
let selectedPixels = 0;
|
|
9
9
|
const positionOffset = {
|
|
@@ -32,7 +32,7 @@ export function addParticlesFromCanvasPixels(container, data, position, scale, o
|
|
|
32
32
|
value: pixel.a,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
container.particles.addParticle(pos, pOptions);
|
|
35
|
+
await container.particles.addParticle(pos, pOptions);
|
|
36
36
|
selectedPixels++;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -43,7 +43,7 @@ class CanvasMaskInstance {
|
|
|
43
43
|
}
|
|
44
44
|
pixelData = (0, utils_js_1.getCanvasImageData)(context, canvas, offset);
|
|
45
45
|
}
|
|
46
|
-
(0, utils_js_1.addParticlesFromCanvasPixels)(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
46
|
+
await (0, utils_js_1.addParticlesFromCanvasPixels)(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
exports.CanvasMaskInstance = CanvasMaskInstance;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.CanvasMaskPlugin = void 0;
|
|
27
|
+
const CanvasMask_js_1 = require("./Options/Classes/CanvasMask.js");
|
|
28
|
+
class CanvasMaskPlugin {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.id = "canvasMask";
|
|
31
|
+
}
|
|
32
|
+
async getPlugin(container) {
|
|
33
|
+
const { CanvasMaskInstance } = await Promise.resolve().then(() => __importStar(require("./CanvasMaskInstance.js")));
|
|
34
|
+
return new CanvasMaskInstance(container);
|
|
35
|
+
}
|
|
36
|
+
loadOptions(options, source) {
|
|
37
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let canvasMaskOptions = options.canvasMask;
|
|
41
|
+
if (canvasMaskOptions?.load === undefined) {
|
|
42
|
+
options.canvasMask = canvasMaskOptions = new CanvasMask_js_1.CanvasMask();
|
|
43
|
+
}
|
|
44
|
+
canvasMaskOptions.load(source?.canvasMask);
|
|
45
|
+
}
|
|
46
|
+
needsPlugin(options) {
|
|
47
|
+
return options?.canvasMask?.enable ?? false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.CanvasMaskPlugin = CanvasMaskPlugin;
|
package/cjs/index.js
CHANGED
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.loadCanvasMaskPlugin = void 0;
|
|
4
|
-
const CanvasMask_js_1 = require("./Options/Classes/CanvasMask.js");
|
|
5
|
-
const CanvasMaskInstance_js_1 = require("./CanvasMaskInstance.js");
|
|
6
|
-
class CanvasMaskPlugin {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.id = "canvasMask";
|
|
9
|
-
}
|
|
10
|
-
getPlugin(container) {
|
|
11
|
-
return new CanvasMaskInstance_js_1.CanvasMaskInstance(container);
|
|
12
|
-
}
|
|
13
|
-
loadOptions(options, source) {
|
|
14
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
let canvasMaskOptions = options.canvasMask;
|
|
18
|
-
if (canvasMaskOptions?.load === undefined) {
|
|
19
|
-
options.canvasMask = canvasMaskOptions = new CanvasMask_js_1.CanvasMask();
|
|
20
|
-
}
|
|
21
|
-
canvasMaskOptions.load(source?.canvasMask);
|
|
22
|
-
}
|
|
23
|
-
needsPlugin(options) {
|
|
24
|
-
return options?.canvasMask?.enable ?? false;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
27
|
async function loadCanvasMaskPlugin(engine, refresh = true) {
|
|
28
|
+
const { CanvasMaskPlugin } = await Promise.resolve().then(() => __importStar(require("./CanvasMaskPlugin.js")));
|
|
28
29
|
await engine.addPlugin(new CanvasMaskPlugin(), refresh);
|
|
29
30
|
}
|
|
30
31
|
exports.loadCanvasMaskPlugin = loadCanvasMaskPlugin;
|
package/cjs/utils.js
CHANGED
|
@@ -6,7 +6,7 @@ const half = 0.5, origin = {
|
|
|
6
6
|
x: 0,
|
|
7
7
|
y: 0,
|
|
8
8
|
}, defaultWidth = 0;
|
|
9
|
-
function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
9
|
+
async function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
10
10
|
const { height, width } = data, numPixels = height * width, indexArray = shuffle(range(numPixels)), maxParticles = Math.min(numPixels, container.actualOptions.particles.number.value), canvasSize = container.canvas.size;
|
|
11
11
|
let selectedPixels = 0;
|
|
12
12
|
const positionOffset = {
|
|
@@ -35,7 +35,7 @@ function addParticlesFromCanvasPixels(container, data, position, scale, override
|
|
|
35
35
|
value: pixel.a,
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
|
-
container.particles.addParticle(pos, pOptions);
|
|
38
|
+
await container.particles.addParticle(pos, pOptions);
|
|
39
39
|
selectedPixels++;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Author : Matteo Bruni
|
|
3
|
+
* MIT license: https://opensource.org/licenses/MIT
|
|
4
|
+
* Demo / Generator : https://particles.js.org/
|
|
5
|
+
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
|
+
* How to use? : Check the GitHub README
|
|
7
|
+
* v3.2.1
|
|
8
|
+
*/
|
|
9
|
+
"use strict";
|
|
10
|
+
/*
|
|
11
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
12
|
+
* This devtool is neither made for production nor for readable output files.
|
|
13
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
14
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
15
|
+
* or disable the default devtool with "devtool: false".
|
|
16
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
17
|
+
*/
|
|
18
|
+
(this["webpackChunk_tsparticles_plugin_canvas_mask"] = this["webpackChunk_tsparticles_plugin_canvas_mask"] || []).push([["dist_browser_CanvasMaskInstance_js"],{
|
|
19
|
+
|
|
20
|
+
/***/ "./dist/browser/CanvasMaskInstance.js":
|
|
21
|
+
/*!********************************************!*\
|
|
22
|
+
!*** ./dist/browser/CanvasMaskInstance.js ***!
|
|
23
|
+
\********************************************/
|
|
24
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
25
|
+
|
|
26
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CanvasMaskInstance: () => (/* binding */ CanvasMaskInstance)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ \"./dist/browser/utils.js\");\n\nclass CanvasMaskInstance {\n constructor(container) {\n this._container = container;\n }\n async init() {\n const container = this._container,\n options = container.actualOptions.canvasMask;\n if (!options?.enable) {\n return;\n }\n let pixelData = {\n pixels: [],\n height: 0,\n width: 0\n };\n const offset = options.pixels.offset;\n if (options.image) {\n const url = options.image.src;\n if (!url) {\n return;\n }\n pixelData = await (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getImageData)(url, offset);\n } else if (options.text) {\n const textOptions = options.text;\n const data = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getTextData)(textOptions, offset);\n if (!data) {\n return;\n }\n pixelData = data;\n } else if (options.element ?? options.selector) {\n const canvas = options.element ?? (options.selector && document.querySelector(options.selector));\n if (!canvas) {\n return;\n }\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return;\n }\n pixelData = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getCanvasImageData)(context, canvas, offset);\n }\n await (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.addParticlesFromCanvasPixels)(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/CanvasMaskInstance.js?");
|
|
27
|
+
|
|
28
|
+
/***/ }),
|
|
29
|
+
|
|
30
|
+
/***/ "./dist/browser/utils.js":
|
|
31
|
+
/*!*******************************!*\
|
|
32
|
+
!*** ./dist/browser/utils.js ***!
|
|
33
|
+
\*******************************/
|
|
34
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
35
|
+
|
|
36
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addParticlesFromCanvasPixels: () => (/* binding */ addParticlesFromCanvasPixels),\n/* harmony export */ getCanvasImageData: () => (/* binding */ getCanvasImageData),\n/* harmony export */ getImageData: () => (/* binding */ getImageData),\n/* harmony export */ getTextData: () => (/* binding */ getTextData)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n\nconst half = 0.5,\n origin = {\n x: 0,\n y: 0\n },\n defaultWidth = 0;\nasync function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {\n const {\n height,\n width\n } = data,\n numPixels = height * width,\n indexArray = shuffle(range(numPixels)),\n maxParticles = Math.min(numPixels, container.actualOptions.particles.number.value),\n canvasSize = container.canvas.size;\n let selectedPixels = 0;\n const positionOffset = {\n x: canvasSize.width * position.x / _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.percentDenominator - width * scale * half,\n y: canvasSize.height * position.y / _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.percentDenominator - height * scale * half\n };\n while (selectedPixels < maxParticles && indexArray.length) {\n const defaultIndex = 0,\n nextIndex = indexArray.pop() ?? defaultIndex,\n pixelPos = {\n x: nextIndex % width,\n y: Math.floor(nextIndex / width)\n },\n pixel = data.pixels[pixelPos.y][pixelPos.x],\n shouldCreateParticle = filter(pixel);\n if (!shouldCreateParticle) {\n continue;\n }\n const pos = {\n x: pixelPos.x * scale + positionOffset.x,\n y: pixelPos.y * scale + positionOffset.y\n },\n pOptions = {};\n if (override.color) {\n pOptions.color = {\n value: pixel\n };\n }\n if (override.opacity) {\n pOptions.opacity = {\n value: pixel.a\n };\n }\n await container.particles.addParticle(pos, pOptions);\n selectedPixels++;\n }\n}\nfunction getCanvasImageData(ctx, size, offset, clear = true) {\n const imageData = ctx.getImageData(origin.x, origin.y, size.width, size.height).data;\n if (clear) {\n ctx.clearRect(origin.x, origin.y, size.width, size.height);\n }\n const pixels = [];\n for (let i = 0; i < imageData.length; i += offset) {\n const idx = i / offset,\n pos = {\n x: idx % size.width,\n y: Math.floor(idx / size.width)\n };\n if (!pixels[pos.y]) {\n pixels[pos.y] = [];\n }\n const indexesOffset = {\n r: 0,\n g: 1,\n b: 2,\n a: 3\n },\n alphaFactor = 255;\n pixels[pos.y][pos.x] = {\n r: imageData[i + indexesOffset.r],\n g: imageData[i + indexesOffset.g],\n b: imageData[i + indexesOffset.b],\n a: imageData[i + indexesOffset.a] / alphaFactor\n };\n }\n return {\n pixels,\n width: Math.min(...pixels.map(row => row.length)),\n height: pixels.length\n };\n}\nfunction getImageData(src, offset) {\n const image = new Image();\n image.crossOrigin = \"Anonymous\";\n const p = new Promise((resolve, reject) => {\n image.onerror = reject;\n image.onload = () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return reject(new Error(`${_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.errorPrefix} Could not get canvas context`));\n }\n context.drawImage(image, origin.x, origin.y, image.width, image.height, origin.x, origin.y, canvas.width, canvas.height);\n resolve(getCanvasImageData(context, canvas, offset));\n };\n });\n image.src = src;\n return p;\n}\nfunction getTextData(textOptions, offset) {\n const canvas = document.createElement(\"canvas\"),\n context = canvas.getContext(\"2d\"),\n {\n font,\n text,\n lines: linesOptions,\n color\n } = textOptions;\n if (!text || !context) {\n return;\n }\n const lines = text.split(linesOptions.separator),\n fontSize = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(font.size) ? `${font.size}px` : font.size,\n linesData = [];\n let maxWidth = 0,\n totalHeight = 0;\n for (const line of lines) {\n context.font = `${font.style ?? \"\"} ${font.variant ?? \"\"} ${font.weight ?? \"\"} ${fontSize} ${font.family}`;\n const measure = context.measureText(line),\n lineData = {\n measure,\n text: line,\n height: measure.actualBoundingBoxAscent + measure.actualBoundingBoxDescent,\n width: measure.width\n };\n maxWidth = Math.max(maxWidth || defaultWidth, lineData.width);\n totalHeight += lineData.height + linesOptions.spacing;\n linesData.push(lineData);\n }\n canvas.width = maxWidth;\n canvas.height = totalHeight;\n let currentHeight = 0;\n for (const line of linesData) {\n context.font = `${font.style ?? \"\"} ${font.variant ?? \"\"} ${font.weight ?? \"\"} ${fontSize} ${font.family}`;\n context.fillStyle = color;\n context.fillText(line.text, origin.x, currentHeight + line.measure.actualBoundingBoxAscent);\n currentHeight += line.height + linesOptions.spacing;\n }\n return getCanvasImageData(context, canvas, offset);\n}\nfunction shuffle(array) {\n const lengthOffset = 1,\n minIndex = 0;\n for (let currentIndex = array.length - lengthOffset; currentIndex >= minIndex; currentIndex--) {\n const randomIndex = Math.floor((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * currentIndex);\n [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\n }\n return array;\n}\nconst range = n => [...Array(n).keys()];\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/utils.js?");
|
|
37
|
+
|
|
38
|
+
/***/ })
|
|
39
|
+
|
|
40
|
+
}]);
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Author : Matteo Bruni
|
|
3
|
+
* MIT license: https://opensource.org/licenses/MIT
|
|
4
|
+
* Demo / Generator : https://particles.js.org/
|
|
5
|
+
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
|
+
* How to use? : Check the GitHub README
|
|
7
|
+
* v3.2.1
|
|
8
|
+
*/
|
|
9
|
+
"use strict";
|
|
10
|
+
/*
|
|
11
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
12
|
+
* This devtool is neither made for production nor for readable output files.
|
|
13
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
14
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
15
|
+
* or disable the default devtool with "devtool: false".
|
|
16
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
17
|
+
*/
|
|
18
|
+
(this["webpackChunk_tsparticles_plugin_canvas_mask"] = this["webpackChunk_tsparticles_plugin_canvas_mask"] || []).push([["dist_browser_CanvasMaskPlugin_js"],{
|
|
19
|
+
|
|
20
|
+
/***/ "./dist/browser/CanvasMaskPlugin.js":
|
|
21
|
+
/*!******************************************!*\
|
|
22
|
+
!*** ./dist/browser/CanvasMaskPlugin.js ***!
|
|
23
|
+
\******************************************/
|
|
24
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
25
|
+
|
|
26
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CanvasMaskPlugin: () => (/* binding */ CanvasMaskPlugin)\n/* harmony export */ });\n/* harmony import */ var _Options_Classes_CanvasMask_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Options/Classes/CanvasMask.js */ \"./dist/browser/Options/Classes/CanvasMask.js\");\n\nclass CanvasMaskPlugin {\n constructor() {\n this.id = \"canvasMask\";\n }\n async getPlugin(container) {\n const {\n CanvasMaskInstance\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_CanvasMaskInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./CanvasMaskInstance.js */ \"./dist/browser/CanvasMaskInstance.js\"));\n return new CanvasMaskInstance(container);\n }\n loadOptions(options, source) {\n if (!this.needsPlugin(options) && !this.needsPlugin(source)) {\n return;\n }\n let canvasMaskOptions = options.canvasMask;\n if (canvasMaskOptions?.load === undefined) {\n options.canvasMask = canvasMaskOptions = new _Options_Classes_CanvasMask_js__WEBPACK_IMPORTED_MODULE_0__.CanvasMask();\n }\n canvasMaskOptions.load(source?.canvasMask);\n }\n needsPlugin(options) {\n return options?.canvasMask?.enable ?? false;\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/CanvasMaskPlugin.js?");
|
|
27
|
+
|
|
28
|
+
/***/ }),
|
|
29
|
+
|
|
30
|
+
/***/ "./dist/browser/Options/Classes/CanvasMask.js":
|
|
31
|
+
/*!****************************************************!*\
|
|
32
|
+
!*** ./dist/browser/Options/Classes/CanvasMask.js ***!
|
|
33
|
+
\****************************************************/
|
|
34
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
35
|
+
|
|
36
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CanvasMask: () => (/* binding */ CanvasMask)\n/* harmony export */ });\n/* harmony import */ var _CanvasMaskOverride_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CanvasMaskOverride.js */ \"./dist/browser/Options/Classes/CanvasMaskOverride.js\");\n/* harmony import */ var _CanvasMaskPixels_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CanvasMaskPixels.js */ \"./dist/browser/Options/Classes/CanvasMaskPixels.js\");\n/* harmony import */ var _ImageMask_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ImageMask.js */ \"./dist/browser/Options/Classes/ImageMask.js\");\n/* harmony import */ var _TextMask_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TextMask.js */ \"./dist/browser/Options/Classes/TextMask.js\");\n\n\n\n\nclass CanvasMask {\n constructor() {\n this.enable = false;\n this.override = new _CanvasMaskOverride_js__WEBPACK_IMPORTED_MODULE_0__.CanvasMaskOverride();\n this.pixels = new _CanvasMaskPixels_js__WEBPACK_IMPORTED_MODULE_1__.CanvasMaskPixels();\n this.position = {\n x: 50,\n y: 50\n };\n this.scale = 1;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.element !== undefined && data.element instanceof HTMLCanvasElement) {\n this.element = data.element;\n }\n if (data.enable !== undefined) {\n this.enable = data.enable;\n }\n if (data.image) {\n if (!this.image) {\n this.image = new _ImageMask_js__WEBPACK_IMPORTED_MODULE_2__.ImageMask();\n }\n this.image.load(data.image);\n }\n this.pixels.load(data.pixels);\n if (data.position) {\n this.position = {\n x: data.position.x ?? this.position.x,\n y: data.position.y ?? this.position.y\n };\n }\n this.override.load(data.override);\n if (data.scale !== undefined) {\n this.scale = data.scale;\n }\n if (data.selector !== undefined) {\n this.selector = data.selector;\n }\n if (data.text) {\n if (!this.text) {\n this.text = new _TextMask_js__WEBPACK_IMPORTED_MODULE_3__.TextMask();\n }\n this.text.load(data.text);\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/CanvasMask.js?");
|
|
37
|
+
|
|
38
|
+
/***/ }),
|
|
39
|
+
|
|
40
|
+
/***/ "./dist/browser/Options/Classes/CanvasMaskOverride.js":
|
|
41
|
+
/*!************************************************************!*\
|
|
42
|
+
!*** ./dist/browser/Options/Classes/CanvasMaskOverride.js ***!
|
|
43
|
+
\************************************************************/
|
|
44
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
45
|
+
|
|
46
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CanvasMaskOverride: () => (/* binding */ CanvasMaskOverride)\n/* harmony export */ });\nclass CanvasMaskOverride {\n constructor() {\n this.color = true;\n this.opacity = false;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.color !== undefined) {\n this.color = data.color;\n }\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/CanvasMaskOverride.js?");
|
|
47
|
+
|
|
48
|
+
/***/ }),
|
|
49
|
+
|
|
50
|
+
/***/ "./dist/browser/Options/Classes/CanvasMaskPixels.js":
|
|
51
|
+
/*!**********************************************************!*\
|
|
52
|
+
!*** ./dist/browser/Options/Classes/CanvasMaskPixels.js ***!
|
|
53
|
+
\**********************************************************/
|
|
54
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
55
|
+
|
|
56
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CanvasMaskPixels: () => (/* binding */ CanvasMaskPixels)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n\nconst minAlpha = 0;\nclass CanvasMaskPixels {\n constructor() {\n this.filter = pixel => pixel.a > minAlpha;\n this.offset = 4;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.filter !== undefined) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isString)(data.filter)) {\n if (Object.hasOwn(window, data.filter)) {\n const filter = window[data.filter];\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isFunction)(filter)) {\n this.filter = filter;\n }\n }\n } else {\n this.filter = data.filter;\n }\n }\n if (data.offset !== undefined) {\n this.offset = data.offset;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/CanvasMaskPixels.js?");
|
|
57
|
+
|
|
58
|
+
/***/ }),
|
|
59
|
+
|
|
60
|
+
/***/ "./dist/browser/Options/Classes/FontTextMask.js":
|
|
61
|
+
/*!******************************************************!*\
|
|
62
|
+
!*** ./dist/browser/Options/Classes/FontTextMask.js ***!
|
|
63
|
+
\******************************************************/
|
|
64
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
65
|
+
|
|
66
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FontTextMask: () => (/* binding */ FontTextMask)\n/* harmony export */ });\nclass FontTextMask {\n constructor() {\n this.family = \"sans-serif\";\n this.size = 100;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.family !== undefined) {\n this.family = data.family;\n }\n if (data.size !== undefined) {\n this.size = data.size;\n }\n if (data.style !== undefined) {\n this.style = data.style;\n }\n if (data.variant !== undefined) {\n this.variant = data.variant;\n }\n if (data.weight !== undefined) {\n this.weight = data.weight;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/FontTextMask.js?");
|
|
67
|
+
|
|
68
|
+
/***/ }),
|
|
69
|
+
|
|
70
|
+
/***/ "./dist/browser/Options/Classes/ImageMask.js":
|
|
71
|
+
/*!***************************************************!*\
|
|
72
|
+
!*** ./dist/browser/Options/Classes/ImageMask.js ***!
|
|
73
|
+
\***************************************************/
|
|
74
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
75
|
+
|
|
76
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ImageMask: () => (/* binding */ ImageMask)\n/* harmony export */ });\nclass ImageMask {\n constructor() {\n this.src = \"\";\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.src !== undefined) {\n this.src = data.src;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/ImageMask.js?");
|
|
77
|
+
|
|
78
|
+
/***/ }),
|
|
79
|
+
|
|
80
|
+
/***/ "./dist/browser/Options/Classes/TextMask.js":
|
|
81
|
+
/*!**************************************************!*\
|
|
82
|
+
!*** ./dist/browser/Options/Classes/TextMask.js ***!
|
|
83
|
+
\**************************************************/
|
|
84
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
85
|
+
|
|
86
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextMask: () => (/* binding */ TextMask)\n/* harmony export */ });\n/* harmony import */ var _FontTextMask_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FontTextMask.js */ \"./dist/browser/Options/Classes/FontTextMask.js\");\n/* harmony import */ var _TextMaskLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TextMaskLine.js */ \"./dist/browser/Options/Classes/TextMaskLine.js\");\n\n\nclass TextMask {\n constructor() {\n this.color = \"#000000\";\n this.font = new _FontTextMask_js__WEBPACK_IMPORTED_MODULE_0__.FontTextMask();\n this.lines = new _TextMaskLine_js__WEBPACK_IMPORTED_MODULE_1__.TextMaskLine();\n this.text = \"\";\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.color !== undefined) {\n this.color = data.color;\n }\n this.font.load(data.font);\n this.lines.load(data.lines);\n if (data.text !== undefined) {\n this.text = data.text;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/TextMask.js?");
|
|
87
|
+
|
|
88
|
+
/***/ }),
|
|
89
|
+
|
|
90
|
+
/***/ "./dist/browser/Options/Classes/TextMaskLine.js":
|
|
91
|
+
/*!******************************************************!*\
|
|
92
|
+
!*** ./dist/browser/Options/Classes/TextMaskLine.js ***!
|
|
93
|
+
\******************************************************/
|
|
94
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
95
|
+
|
|
96
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TextMaskLine: () => (/* binding */ TextMaskLine)\n/* harmony export */ });\nclass TextMaskLine {\n constructor() {\n this.separator = \"\\n\";\n this.spacing = 10;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.separator !== undefined) {\n this.separator = data.separator;\n }\n if (data.spacing !== undefined) {\n this.spacing = data.spacing;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-canvas-mask/./dist/browser/Options/Classes/TextMaskLine.js?");
|
|
97
|
+
|
|
98
|
+
/***/ })
|
|
99
|
+
|
|
100
|
+
}]);
|
|
@@ -40,6 +40,6 @@ export class CanvasMaskInstance {
|
|
|
40
40
|
}
|
|
41
41
|
pixelData = getCanvasImageData(context, canvas, offset);
|
|
42
42
|
}
|
|
43
|
-
addParticlesFromCanvasPixels(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
43
|
+
await addParticlesFromCanvasPixels(container, pixelData, options.position, options.scale, options.override, options.pixels.filter);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CanvasMask } from "./Options/Classes/CanvasMask.js";
|
|
2
|
+
export class CanvasMaskPlugin {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.id = "canvasMask";
|
|
5
|
+
}
|
|
6
|
+
async getPlugin(container) {
|
|
7
|
+
const { CanvasMaskInstance } = await import("./CanvasMaskInstance.js");
|
|
8
|
+
return new CanvasMaskInstance(container);
|
|
9
|
+
}
|
|
10
|
+
loadOptions(options, source) {
|
|
11
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
let canvasMaskOptions = options.canvasMask;
|
|
15
|
+
if (canvasMaskOptions?.load === undefined) {
|
|
16
|
+
options.canvasMask = canvasMaskOptions = new CanvasMask();
|
|
17
|
+
}
|
|
18
|
+
canvasMaskOptions.load(source?.canvasMask);
|
|
19
|
+
}
|
|
20
|
+
needsPlugin(options) {
|
|
21
|
+
return options?.canvasMask?.enable ?? false;
|
|
22
|
+
}
|
|
23
|
+
}
|
package/esm/index.js
CHANGED
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
import { CanvasMask } from "./Options/Classes/CanvasMask.js";
|
|
2
|
-
import { CanvasMaskInstance } from "./CanvasMaskInstance.js";
|
|
3
|
-
class CanvasMaskPlugin {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.id = "canvasMask";
|
|
6
|
-
}
|
|
7
|
-
getPlugin(container) {
|
|
8
|
-
return new CanvasMaskInstance(container);
|
|
9
|
-
}
|
|
10
|
-
loadOptions(options, source) {
|
|
11
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
let canvasMaskOptions = options.canvasMask;
|
|
15
|
-
if (canvasMaskOptions?.load === undefined) {
|
|
16
|
-
options.canvasMask = canvasMaskOptions = new CanvasMask();
|
|
17
|
-
}
|
|
18
|
-
canvasMaskOptions.load(source?.canvasMask);
|
|
19
|
-
}
|
|
20
|
-
needsPlugin(options) {
|
|
21
|
-
return options?.canvasMask?.enable ?? false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
1
|
export async function loadCanvasMaskPlugin(engine, refresh = true) {
|
|
2
|
+
const { CanvasMaskPlugin } = await import("./CanvasMaskPlugin.js");
|
|
25
3
|
await engine.addPlugin(new CanvasMaskPlugin(), refresh);
|
|
26
4
|
}
|
package/esm/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ const half = 0.5, origin = {
|
|
|
3
3
|
x: 0,
|
|
4
4
|
y: 0,
|
|
5
5
|
}, defaultWidth = 0;
|
|
6
|
-
export function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
6
|
+
export async function addParticlesFromCanvasPixels(container, data, position, scale, override, filter) {
|
|
7
7
|
const { height, width } = data, numPixels = height * width, indexArray = shuffle(range(numPixels)), maxParticles = Math.min(numPixels, container.actualOptions.particles.number.value), canvasSize = container.canvas.size;
|
|
8
8
|
let selectedPixels = 0;
|
|
9
9
|
const positionOffset = {
|
|
@@ -32,7 +32,7 @@ export function addParticlesFromCanvasPixels(container, data, position, scale, o
|
|
|
32
32
|
value: pixel.a,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
container.particles.addParticle(pos, pOptions);
|
|
35
|
+
await container.particles.addParticle(pos, pOptions);
|
|
36
36
|
selectedPixels++;
|
|
37
37
|
}
|
|
38
38
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/plugin-canvas-mask",
|
|
3
|
-
"version": "3.1
|
|
3
|
+
"version": "3.2.1",
|
|
4
4
|
"description": "tsParticles canvas mask plugin",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"repository": {
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"./package.json": "./package.json"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
|
-
"@tsparticles/engine": "^3.1
|
|
89
|
+
"@tsparticles/engine": "^3.2.1"
|
|
90
90
|
},
|
|
91
91
|
"publishConfig": {
|
|
92
92
|
"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/plugin-canvas-mask [
|
|
6
|
+
<title>@tsparticles/plugin-canvas-mask [31 Jan 2024 at 09:51]</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.plugin.canvas-mask
|
|
34
|
+
window.chartData = [];
|
|
35
|
+
window.entrypoints = ["tsparticles.plugin.canvas-mask.min"];
|
|
36
36
|
window.defaultSizes = "parsed";
|
|
37
37
|
</script>
|
|
38
38
|
</body>
|