mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-11 19:00:00 +01:00
New Shadow module (#1507)
* circular gradient module * Shadow module added * fixed minor documentation error * fixed small errors * added test for shadow module * updated shadow module to receive x and y inputs * final shadow module with two inputs * fixed test for shadow module Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com> Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
This commit is contained in:
146
src/modules/Shadow/Module.js
Normal file
146
src/modules/Shadow/Module.js
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* 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
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user