mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-11 19:00:00 +01:00
* add support for transparent image overlay * replaced var for const/let Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com> Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
109 lines
3.0 KiB
JavaScript
109 lines
3.0 KiB
JavaScript
module.exports = function Dynamic(options, UI, util) {
|
|
|
|
const defaults = require('./../../util/getDefaults.js')(require('./info.json'));
|
|
options.x = options.x || defaults.x;
|
|
options.y = options.y || defaults.y;
|
|
|
|
if(options.step.inBrowser && !options.noUI && sequencer.getSteps().length < 2)
|
|
options.offset = -1;
|
|
|
|
let ui;
|
|
|
|
if (options.step.inBrowser && !options.noUI) ui = require('./Ui.js')(options.step, UI);
|
|
|
|
let output;
|
|
|
|
// This function is called on every draw.
|
|
function draw(input, callback, progressObj) {
|
|
|
|
options.offset = parseInt(options.offset || defaults.offset);
|
|
|
|
progressObj.stop(true);
|
|
progressObj.overrideFlag = true;
|
|
|
|
const step = this;
|
|
|
|
const parseCornerCoordinateInputs = require('../../util/ParseInputCoordinates');
|
|
|
|
// save the pixels of the base image
|
|
const baseStepImage = this.getStep(options.offset).image;
|
|
const baseStepOutput = this.getOutput(options.offset);
|
|
|
|
const getPixels = require('get-pixels');
|
|
|
|
getPixels(input.src, function(err, pixels) {
|
|
// parse the inputs
|
|
parseCornerCoordinateInputs({
|
|
iw: pixels.shape[0],
|
|
ih: pixels.shape[1]
|
|
},
|
|
{
|
|
x: { valInp: options.x, type: 'horizontal' },
|
|
y: { valInp: options.y, type: 'vertical' },
|
|
}, function(opt, input) {
|
|
options.x = parseInt(input.x.valInp);
|
|
options.y = parseInt(input.y.valInp);
|
|
});
|
|
|
|
options.secondImagePixels = pixels;
|
|
|
|
function changePixel(r1, g1, b1, a1, x, y) {
|
|
|
|
const firstImagePixels = [r1, g1, b1, a1];
|
|
|
|
// overlay
|
|
const p = options.secondImagePixels;
|
|
if (x >= options.x
|
|
&& x - options.x < p.shape[0]
|
|
&& y >= options.y
|
|
&& y - options.y < p.shape[1]){
|
|
|
|
const secondImagePixels = [
|
|
p.get(x - options.x, y - options.y, 0),
|
|
p.get(x - options.x, y - options.y, 1),
|
|
p.get(x - options.x, y - options.y, 2),
|
|
p.get(x - options.x, y - options.y, 3)
|
|
];
|
|
|
|
if(secondImagePixels[3] === 0)
|
|
return firstImagePixels;
|
|
else
|
|
return secondImagePixels;
|
|
}
|
|
else
|
|
return firstImagePixels;
|
|
}
|
|
|
|
function output(image, datauri, mimetype, wasmSuccess) {
|
|
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
|
|
}
|
|
|
|
function modifiedCallback() {
|
|
if (options.step.inBrowser && !options.noUI) {
|
|
ui.setup();
|
|
}
|
|
callback();
|
|
}
|
|
|
|
// run PixelManipulation on first Image pixels
|
|
return require('../_nomodule/PixelManipulation.js')(baseStepOutput, {
|
|
output: output,
|
|
ui: options.step.ui,
|
|
changePixel: changePixel,
|
|
format: baseStepOutput.format,
|
|
image: baseStepImage,
|
|
inBrowser: options.inBrowser,
|
|
callback: modifiedCallback,
|
|
useWasm:options.useWasm
|
|
});
|
|
});
|
|
}
|
|
|
|
return {
|
|
options: options,
|
|
draw: draw,
|
|
output: output,
|
|
UI: UI
|
|
};
|
|
};
|