src/modules/Shadow/Module.js
/*
* Create Shadow
*/
module.exports = function canvasResize(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
const pixelSetter = require('../../util/pixelSetter.js');
var output;
function draw(input, callback, progressObj) {
options.X_value = parseInt(options.X_value || defaults.X_value);
options.Y_value = parseInt(options.Y_value || defaults.Y_value);
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function extraManipulation(pixels) {
let [w, h] = pixels.shape;
let newPixels = require('ndarray')(new Uint8Array(4 * (w + Math.abs(options.X_value)) * (h + Math.abs(options.Y_value))).fill(0), [(w + Math.abs(options.X_value)), (h + Math.abs(options.Y_value)), 4]);
let iMax = w,
jMax = h;
if (options.X_value < 0 && options.Y_value < 0) {
for (var k = 0; k < Math.abs(options.X_value); k++) {
for (var l = 0; l < (h + Math.abs(options.Y_value)); l++) {
let val = 255 - ((k / Math.abs(options.X_value)) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (var k = 0; k < (w + Math.abs(options.X_value)); k++) {
for (var l = 0; l < Math.abs(options.Y_value); l++) {
if (k < Math.abs(options.X_value) && k < l) {
continue;
}
let val = 255 - ((l / Math.abs(options.Y_value)) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (let i = 0; i < iMax && i < w; i++) {
for (let j = 0; j < jMax && j < h; j++) {
let x = i + Math.abs(options.X_value), y = j + Math.abs(options.Y_value);
pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels);
}
}
}
else if (options.X_value >= 0 && options.Y_value >= 0) {
for (var k = w; k < (w + options.X_value); k++) {
for (var l = 0; l < (h + options.Y_value); l++) {
let val = (((k - w) / options.X_value) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (var k = 0; k < (w + options.X_value); k++) {
for (var l = h; l < (h + options.Y_value); l++) {
if (k >= w && l >= h && ((k - w) >= (l - h))) {
continue;
}
let val = ((l - h) / options.Y_value * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (let i = 0; i < iMax && i < w; i++) {
for (let j = 0; j < jMax && j < h; j++) {
let x = i, y = j;
pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels);
}
}
}
else if (options.X_value < 0 && options.Y_value >= 0) {
for (var k = 0; k < (w + Math.abs(options.X_value)); k++) {
for (var l = h; l < (h + options.Y_value); l++) {
let val = ((l - h) / options.Y_value * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (var k = 0; k < Math.abs(options.X_value); k++) {
for (var l = 0; l < (h + options.Y_value); l++) {
if (l + (k * (options.Y_value / Math.abs(options.X_value))) - (options.Y_value + h) > 0 && l >= h) {
continue;
}
let val = 255 - ((k / Math.abs(options.X_value)) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (let i = 0; i < iMax && i < w; i++) {
for (let j = 0; j < jMax && j < h; j++) {
let x = i + Math.abs(options.X_value), y = j;
pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels);
}
}
}
else if (options.X_value >= 0 && options.Y_value < 0) {
for (var k = w; k < (w + options.X_value); k++) {
for (var l = 0; l < (h + Math.abs(options.Y_value)); l++) {
let val = (((k - w) / options.X_value) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (var k = 0; k < (w + options.X_value); k++) {
for (var l = 0; l < Math.abs(options.Y_value); l++) {
if (l >= ((options.X_value / Math.abs(options.Y_value)) * (w + options.X_value - k)) && k >= w) {
continue;
}
let val = 255 - (l / Math.abs(options.Y_value) * 255);
pixelSetter(k, l, [val, val, val, 255], newPixels);
}
}
for (let i = 0; i < iMax && i < w; i++) {
for (let j = 0; j < jMax && j < h; j++) {
let x = i, y = j + Math.abs(options.Y_value);
pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels);
}
}
}
return newPixels;
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};