mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-18 22:30:01 +01:00
Built for Browser
This commit is contained in:
290
dist/image-sequencer.js
vendored
290
dist/image-sequencer.js
vendored
@@ -35027,16 +35027,16 @@ module.exports = LoadImage;
|
|||||||
* Core modules
|
* Core modules
|
||||||
*/
|
*/
|
||||||
module.exports = {
|
module.exports = {
|
||||||
'do-nothing': require('./modules/DoNothing'),
|
'do-nothing': require('./modules/DoNothing/Module'),
|
||||||
'green-channel': require('./modules/GreenChannel'),
|
'green-channel': require('./modules/GreenChannel/Module'),
|
||||||
'ndvi-red': require('./modules/NdviRed'),
|
'ndvi-red': require('./modules/NdviRed/Module'),
|
||||||
'do-nothing-pix': require('./modules/DoNothingPix'),
|
'do-nothing-pix': require('./modules/DoNothingPix/Module.js'),
|
||||||
'invert': require('./modules/Invert'),
|
'invert': require('./modules/Invert/Module'),
|
||||||
'crop': require('./modules/Crop'),
|
'crop': require('./modules/Crop/Module'),
|
||||||
'segmented-colormap': require('./modules/SegmentedColormap')
|
'segmented-colormap': require('./modules/SegmentedColormap/Module')
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"./modules/Crop":122,"./modules/DoNothing":123,"./modules/DoNothingPix":124,"./modules/GreenChannel":125,"./modules/Invert":126,"./modules/NdviRed":127,"./modules/SegmentedColormap":129}],120:[function(require,module,exports){
|
},{"./modules/Crop/Module":123,"./modules/DoNothing/Module":124,"./modules/DoNothingPix/Module.js":125,"./modules/GreenChannel/Module":126,"./modules/Invert/Module":127,"./modules/NdviRed/Module":128,"./modules/SegmentedColormap/Module":129}],120:[function(require,module,exports){
|
||||||
function ReplaceImage(ref,selector,steps,options) {
|
function ReplaceImage(ref,selector,steps,options) {
|
||||||
if(!ref.options.inBrowser) return false; // This isn't for Node.js
|
if(!ref.options.inBrowser) return false; // This isn't for Node.js
|
||||||
this_ = ref;
|
this_ = ref;
|
||||||
@@ -35123,34 +35123,12 @@ function Run(ref, json_q, callback) {
|
|||||||
module.exports = Run;
|
module.exports = Run;
|
||||||
|
|
||||||
},{}],122:[function(require,module,exports){
|
},{}],122:[function(require,module,exports){
|
||||||
/*
|
module.exports = function Crop(input,options,callback) {
|
||||||
* Image Cropping module
|
|
||||||
* Usage:
|
|
||||||
* Expected Inputs:
|
|
||||||
* options.x : x-coordinate of image where the modules starts cropping | default : 0
|
|
||||||
* options.y : y-coordinate of image where the modules starts cropping | default : 0
|
|
||||||
* options.w : width of the resulting cropped image | default : 50% of input image width
|
|
||||||
* options.h : height of the resulting cropped image | default : 50% of input image height
|
|
||||||
* Output:
|
|
||||||
* The cropped image, which is essentially a rectangle bounded by the lines:
|
|
||||||
* x = options.x
|
|
||||||
* x = options.x + options.w
|
|
||||||
* y = options.y
|
|
||||||
* y = options.y + options.h
|
|
||||||
*/
|
|
||||||
module.exports = function Crop(options) {
|
|
||||||
options = options || {};
|
|
||||||
options.title = "Do Nothing";
|
|
||||||
this_ = this;
|
|
||||||
var output
|
|
||||||
var getPixels = require("get-pixels"),
|
var getPixels = require("get-pixels"),
|
||||||
savePixels = require("save-pixels"),
|
savePixels = require("save-pixels"),
|
||||||
base64 = require('base64-stream');
|
base64 = require('base64-stream');
|
||||||
|
|
||||||
function draw(input,callback) {
|
|
||||||
|
|
||||||
const this_ = this;
|
|
||||||
|
|
||||||
getPixels(input.src,function(err,pixels){
|
getPixels(input.src,function(err,pixels){
|
||||||
var newdata = [];
|
var newdata = [];
|
||||||
var ox = options.x || 0;
|
var ox = options.x || 0;
|
||||||
@@ -35173,10 +35151,46 @@ module.exports = Run;
|
|||||||
r.pipe(w).on('finish',function(){
|
r.pipe(w).on('finish',function(){
|
||||||
data = w.read().toString();
|
data = w.read().toString();
|
||||||
datauri = 'data:image/' + options.format + ';base64,' + data;
|
datauri = 'data:image/' + options.format + ';base64,' + data;
|
||||||
this_.output = {src:datauri,format:options.format};
|
callback(datauri,options.format);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
},{"base64-stream":3,"get-pixels":27,"save-pixels":104}],123:[function(require,module,exports){
|
||||||
|
/*
|
||||||
|
* Image Cropping module
|
||||||
|
* Usage:
|
||||||
|
* Expected Inputs:
|
||||||
|
* options.x : x-coordinate of image where the modules starts cropping | default : 0
|
||||||
|
* options.y : y-coordinate of image where the modules starts cropping | default : 0
|
||||||
|
* options.w : width of the resulting cropped image | default : 50% of input image width
|
||||||
|
* options.h : height of the resulting cropped image | default : 50% of input image height
|
||||||
|
* Output:
|
||||||
|
* The cropped image, which is essentially a rectangle bounded by the lines:
|
||||||
|
* x = options.x
|
||||||
|
* x = options.x + options.w
|
||||||
|
* y = options.y
|
||||||
|
* y = options.y + options.h
|
||||||
|
*/
|
||||||
|
module.exports = function CropModule(options) {
|
||||||
|
options = options || {};
|
||||||
|
options.title = "Crop Image";
|
||||||
|
this_ = this;
|
||||||
|
var output
|
||||||
|
|
||||||
|
function draw(input,callback) {
|
||||||
|
|
||||||
|
const this_ = this;
|
||||||
|
|
||||||
|
require('./Crop')(input,options,function(out,format){
|
||||||
|
this_.output = {
|
||||||
|
src: out,
|
||||||
|
format: format
|
||||||
|
}
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35187,9 +35201,9 @@ module.exports = Run;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"base64-stream":3,"get-pixels":27,"save-pixels":104}],123:[function(require,module,exports){
|
},{"./Crop":122}],124:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* Demo Module. Does nothing.
|
* Demo Module. Does nothing. Adds a step where output is equal to input.
|
||||||
*/
|
*/
|
||||||
module.exports = function DoNothing(options) {
|
module.exports = function DoNothing(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
@@ -35209,9 +35223,9 @@ module.exports = function DoNothing(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{}],124:[function(require,module,exports){
|
},{}],125:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* Display only the green channel
|
* This module extracts pixels and saves them as it is.
|
||||||
*/
|
*/
|
||||||
module.exports = function DoNothingPix(options) {
|
module.exports = function DoNothingPix(options) {
|
||||||
|
|
||||||
@@ -35219,8 +35233,6 @@ module.exports = function DoNothingPix(options) {
|
|||||||
options.title = "Do Nothing with pixels";
|
options.title = "Do Nothing with pixels";
|
||||||
var output;
|
var output;
|
||||||
|
|
||||||
//function setup() {} // optional
|
|
||||||
|
|
||||||
function draw(input,callback) {
|
function draw(input,callback) {
|
||||||
this_ = this;
|
this_ = this;
|
||||||
function changePixel(r, g, b, a) {
|
function changePixel(r, g, b, a) {
|
||||||
@@ -35229,7 +35241,7 @@ module.exports = function DoNothingPix(options) {
|
|||||||
function output(image,datauri,mimetype){
|
function output(image,datauri,mimetype){
|
||||||
this_.output = {src:datauri,format:mimetype}
|
this_.output = {src:datauri,format:mimetype}
|
||||||
}
|
}
|
||||||
return require('./PixelManipulation.js')(input, {
|
return require('../_nomodule/PixelManipulation.js')(input, {
|
||||||
output: output,
|
output: output,
|
||||||
changePixel: changePixel,
|
changePixel: changePixel,
|
||||||
format: input.format,
|
format: input.format,
|
||||||
@@ -35240,13 +35252,12 @@ module.exports = function DoNothingPix(options) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
options: options,
|
options: options,
|
||||||
//setup: setup, // optional
|
|
||||||
draw: draw,
|
draw: draw,
|
||||||
output: output
|
output: output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"./PixelManipulation.js":128}],125:[function(require,module,exports){
|
},{"../_nomodule/PixelManipulation.js":131}],126:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* Display only the green channel
|
* Display only the green channel
|
||||||
*/
|
*/
|
||||||
@@ -35267,7 +35278,7 @@ module.exports = function GreenChannel(options) {
|
|||||||
function output(image,datauri,mimetype){
|
function output(image,datauri,mimetype){
|
||||||
this_.output = {src:datauri,format:mimetype}
|
this_.output = {src:datauri,format:mimetype}
|
||||||
}
|
}
|
||||||
return require('./PixelManipulation.js')(input, {
|
return require('../_nomodule/PixelManipulation.js')(input, {
|
||||||
output: output,
|
output: output,
|
||||||
changePixel: changePixel,
|
changePixel: changePixel,
|
||||||
format: input.format,
|
format: input.format,
|
||||||
@@ -35284,7 +35295,7 @@ module.exports = function GreenChannel(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"./PixelManipulation.js":128}],126:[function(require,module,exports){
|
},{"../_nomodule/PixelManipulation.js":131}],127:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* Display only the green channel
|
* Display only the green channel
|
||||||
*/
|
*/
|
||||||
@@ -35305,7 +35316,7 @@ module.exports = function GreenChannel(options) {
|
|||||||
function output(image,datauri,mimetype){
|
function output(image,datauri,mimetype){
|
||||||
this_.output = {src:datauri,format:mimetype}
|
this_.output = {src:datauri,format:mimetype}
|
||||||
}
|
}
|
||||||
return require('./PixelManipulation.js')(input, {
|
return require('../_nomodule/PixelManipulation.js')(input, {
|
||||||
output: output,
|
output: output,
|
||||||
changePixel: changePixel,
|
changePixel: changePixel,
|
||||||
format: input.format,
|
format: input.format,
|
||||||
@@ -35322,7 +35333,7 @@ module.exports = function GreenChannel(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"./PixelManipulation.js":128}],127:[function(require,module,exports){
|
},{"../_nomodule/PixelManipulation.js":131}],128:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* NDVI with red filter (blue channel is infrared)
|
* NDVI with red filter (blue channel is infrared)
|
||||||
*/
|
*/
|
||||||
@@ -35332,18 +35343,17 @@ module.exports = function NdviRed(options) {
|
|||||||
options.title = "NDVI for red-filtered cameras (blue is infrared)";
|
options.title = "NDVI for red-filtered cameras (blue is infrared)";
|
||||||
var output;
|
var output;
|
||||||
|
|
||||||
//function setup() {} // optional
|
|
||||||
|
|
||||||
function draw(input,callback) {
|
function draw(input,callback) {
|
||||||
this_ = this;
|
this_ = this;
|
||||||
function changePixel(r, g, b, a) {
|
function changePixel(r, g, b, a) {
|
||||||
var ndvi = 255 * (b - r) / (1.00 * b + r);
|
var ndvi = (b - r) / (1.00 * b + r);
|
||||||
return [ndvi, ndvi, ndvi, a];
|
var x = 255 * (ndvi + 1) / 2;
|
||||||
|
return [x, x, x, a];
|
||||||
}
|
}
|
||||||
function output(image,datauri,mimetype){
|
function output(image,datauri,mimetype){
|
||||||
this_.output = {src:datauri,format:mimetype}
|
this_.output = {src:datauri,format:mimetype}
|
||||||
}
|
}
|
||||||
return require('./PixelManipulation.js')(input, {
|
return require('../_nomodule/PixelManipulation.js')(input, {
|
||||||
output: output,
|
output: output,
|
||||||
changePixel: changePixel,
|
changePixel: changePixel,
|
||||||
format: input.format,
|
format: input.format,
|
||||||
@@ -35354,12 +35364,104 @@ module.exports = function NdviRed(options) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
options: options,
|
options: options,
|
||||||
//setup: setup, // optional
|
|
||||||
draw: draw
|
draw: draw
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"./PixelManipulation.js":128}],128:[function(require,module,exports){
|
},{"../_nomodule/PixelManipulation.js":131}],129:[function(require,module,exports){
|
||||||
|
module.exports = function SegmentedColormap(options) {
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
options.title = "Segmented Colormap";
|
||||||
|
var output;
|
||||||
|
|
||||||
|
function draw(input,callback) {
|
||||||
|
this_ = this;
|
||||||
|
function changePixel(r, g, b, a) {
|
||||||
|
var ndvi = (b - r) / (r + b);
|
||||||
|
var normalized = (ndvi + 1) / 2;
|
||||||
|
var res = require('./SegmentedColormap')(normalized,options);
|
||||||
|
return [res[0], res[1], res[2], 255];
|
||||||
|
}
|
||||||
|
function output(image,datauri,mimetype){
|
||||||
|
this_.output = {src:datauri,format:mimetype}
|
||||||
|
}
|
||||||
|
return require('../_nomodule/PixelManipulation.js')(input, {
|
||||||
|
output: output,
|
||||||
|
changePixel: changePixel,
|
||||||
|
format: input.format,
|
||||||
|
image: options.image,
|
||||||
|
callback: callback
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
options: options,
|
||||||
|
draw: draw,
|
||||||
|
output: output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},{"../_nomodule/PixelManipulation.js":131,"./SegmentedColormap":130}],130:[function(require,module,exports){
|
||||||
|
/*
|
||||||
|
* Accepts a normalized ndvi and returns the new color-mapped pixel
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function SegmentedColormap(normalized,options) {
|
||||||
|
options.colormap = options.colormap || "default";
|
||||||
|
if(typeof(options.colormap) == "object")
|
||||||
|
colormapFunction = segmented_colormap(options.colormap);
|
||||||
|
else if(colormaps.hasOwnProperty(options.colormap))
|
||||||
|
colormapFunction = colormaps[options.colormap];
|
||||||
|
else colormapFunction = colormaps.default;
|
||||||
|
|
||||||
|
return colormapFunction(normalized);
|
||||||
|
}
|
||||||
|
|
||||||
|
function segmented_colormap(segments) {
|
||||||
|
return function(x) {
|
||||||
|
var i, result, x0, x1, xstart, y0, y1, _i, _j, _len, _ref, _ref1, _ref2, _ref3;
|
||||||
|
_ref = [0, 0], y0 = _ref[0], y1 = _ref[1];
|
||||||
|
_ref1 = [segments[0][0], 1], x0 = _ref1[0], x1 = _ref1[1];
|
||||||
|
if (x < x0) {
|
||||||
|
return y0;
|
||||||
|
}
|
||||||
|
for (i = _i = 0, _len = segments.length; _i < _len; i = ++_i) {
|
||||||
|
_ref2 = segments[i], xstart = _ref2[0], y0 = _ref2[1], y1 = _ref2[2];
|
||||||
|
x0 = xstart;
|
||||||
|
if (i === segments.length - 1) {
|
||||||
|
x1 = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x1 = segments[i + 1][0];
|
||||||
|
if ((xstart <= x && x < x1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = [];
|
||||||
|
for (i = _j = 0, _ref3 = y0.length; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) {
|
||||||
|
result[i] = (x - x0) / (x1 - x0) * (y1[i] - y0[i]) + y0[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var greyscale_colormap = segmented_colormap([[0, [0, 0, 0], [255, 255, 255]], [1, [255, 255, 255], [255, 255, 255]]]);
|
||||||
|
|
||||||
|
var default_colormap = segmented_colormap([[0, [0, 0, 255], [38, 195, 195]], [0.5, [0, 150, 0], [255, 255, 0]], [0.75, [255, 255, 0], [255, 50, 50]]]);
|
||||||
|
|
||||||
|
var stretched_colormap = segmented_colormap([[0, [0, 0, 255], [0, 0, 255]], [0.1, [0, 0, 255], [38, 195, 195]], [0.5, [0, 150, 0], [255, 255, 0]], [0.7, [255, 255, 0], [255, 50, 50]], [0.9, [255, 50, 50], [255, 50, 50]]]);
|
||||||
|
|
||||||
|
var fastie_colormap = segmented_colormap([[0, [255, 255, 255], [0, 0, 0]], [0.167, [0, 0, 0], [255, 255, 255]], [0.33, [255, 255, 255], [0, 0, 0]], [0.5, [0, 0, 0], [140, 140, 255]], [0.55, [140, 140, 255], [0, 255, 0]], [0.63, [0, 255, 0], [255, 255, 0]], [0.75, [255, 255, 0], [255, 0, 0]], [0.95, [255, 0, 0], [255, 0, 255]]]);
|
||||||
|
|
||||||
|
var colormaps = {
|
||||||
|
greyscale: greyscale_colormap,
|
||||||
|
default: default_colormap,
|
||||||
|
stretched: stretched_colormap,
|
||||||
|
fastie: fastie_colormap
|
||||||
|
}
|
||||||
|
|
||||||
|
},{}],131:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
* General purpose per-pixel manipulation
|
* General purpose per-pixel manipulation
|
||||||
* accepting a changePixel() method to remix a pixel's channels
|
* accepting a changePixel() method to remix a pixel's channels
|
||||||
@@ -35419,82 +35521,4 @@ module.exports = function PixelManipulation(image, options) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"base64-stream":3,"get-pixels":27,"save-pixels":104}],129:[function(require,module,exports){
|
},{"base64-stream":3,"get-pixels":27,"save-pixels":104}]},{},[116]);
|
||||||
module.exports = function SegmentedColormap(options) {
|
|
||||||
|
|
||||||
options = options || {};
|
|
||||||
options.title = "Segmented Colormap";
|
|
||||||
options.colormap = options.colormap || "default";
|
|
||||||
var output;
|
|
||||||
|
|
||||||
function draw(input,callback) {
|
|
||||||
this_ = this;
|
|
||||||
function changePixel(r, g, b, a) {
|
|
||||||
var ndvi = (b - r) / (r + b);
|
|
||||||
var normalized = (ndvi + 1) / 2;
|
|
||||||
var res = colormaps[options.colormap](normalized);
|
|
||||||
return [res[0], res[1], res[2], 255];
|
|
||||||
}
|
|
||||||
function output(image,datauri,mimetype){
|
|
||||||
this_.output = {src:datauri,format:mimetype}
|
|
||||||
}
|
|
||||||
return require('./PixelManipulation.js')(input, {
|
|
||||||
output: output,
|
|
||||||
changePixel: changePixel,
|
|
||||||
format: input.format,
|
|
||||||
image: options.image,
|
|
||||||
callback: callback
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
options: options,
|
|
||||||
draw: draw,
|
|
||||||
output: output
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var greyscale_colormap = segmented_colormap([[0, [0, 0, 0], [255, 255, 255]], [1, [255, 255, 255], [255, 255, 255]]]);
|
|
||||||
|
|
||||||
var default_colormap = segmented_colormap([[0, [0, 0, 255], [38, 195, 195]], [0.5, [0, 150, 0], [255, 255, 0]], [0.75, [255, 255, 0], [255, 50, 50]]]);
|
|
||||||
|
|
||||||
var stretched_colormap = segmented_colormap([[0, [0, 0, 255], [0, 0, 255]], [0.1, [0, 0, 255], [38, 195, 195]], [0.5, [0, 150, 0], [255, 255, 0]], [0.7, [255, 255, 0], [255, 50, 50]], [0.9, [255, 50, 50], [255, 50, 50]]]);
|
|
||||||
|
|
||||||
var fastie_colormap = segmented_colormap([[0, [255, 255, 255], [0, 0, 0]], [0.167, [0, 0, 0], [255, 255, 255]], [0.33, [255, 255, 255], [0, 0, 0]], [0.5, [0, 0, 0], [140, 140, 255]], [0.55, [140, 140, 255], [0, 255, 0]], [0.63, [0, 255, 0], [255, 255, 0]], [0.75, [255, 255, 0], [255, 0, 0]], [0.95, [255, 0, 0], [255, 0, 255]]]);
|
|
||||||
|
|
||||||
var colormaps = {
|
|
||||||
greyscale: greyscale_colormap,
|
|
||||||
default: default_colormap,
|
|
||||||
stretched: stretched_colormap,
|
|
||||||
fastie: fastie_colormap
|
|
||||||
}
|
|
||||||
|
|
||||||
function segmented_colormap(segments) {
|
|
||||||
return function(x) {
|
|
||||||
var i, result, x0, x1, xstart, y0, y1, _i, _j, _len, _ref, _ref1, _ref2, _ref3;
|
|
||||||
_ref = [0, 0], y0 = _ref[0], y1 = _ref[1];
|
|
||||||
_ref1 = [segments[0][0], 1], x0 = _ref1[0], x1 = _ref1[1];
|
|
||||||
if (x < x0) {
|
|
||||||
return y0;
|
|
||||||
}
|
|
||||||
for (i = _i = 0, _len = segments.length; _i < _len; i = ++_i) {
|
|
||||||
_ref2 = segments[i], xstart = _ref2[0], y0 = _ref2[1], y1 = _ref2[2];
|
|
||||||
x0 = xstart;
|
|
||||||
if (i === segments.length - 1) {
|
|
||||||
x1 = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
x1 = segments[i + 1][0];
|
|
||||||
if ((xstart <= x && x < x1)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = [];
|
|
||||||
for (i = _j = 0, _ref3 = y0.length; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) {
|
|
||||||
result[i] = (x - x0) / (x1 - x0) * (y1[i] - y0[i]) + y0[i];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
},{"./PixelManipulation.js":128}]},{},[116]);
|
|
||||||
|
|||||||
Reference in New Issue
Block a user