diff --git a/src/modules/Blend/Module.js b/src/modules/Blend/Module.js index a066cd58..30874485 100644 --- a/src/modules/Blend/Module.js +++ b/src/modules/Blend/Module.js @@ -1,63 +1,67 @@ module.exports = function Dynamic(options, UI, util) { - options.func = options.func || "function(r1, g1, b1, a1, r2, g2, b2, a2) { return [ r1, g2, b2, a2 ] }"; + options.func = options.func || "function(r1, g1, b1, a1, r2, g2, b2, a2) { return [ r1, g2, b2, a2 ] }"; + options.offset = options.offset || -2; - var output; + var output; - // This function is called on every draw. - function draw(input, callback, progressObj) { + // This function is called on every draw. + function draw(input, callback, progressObj) { - progressObj.stop(true); - progressObj.overrideFlag = true; + progressObj.stop(true); + progressObj.overrideFlag = true; - var step = this; + var step = this; - // convert to runnable code: - if (typeof options.func === "string") eval('options.func = ' + options.func); + // convert to runnable code: + if (typeof options.func === "string") eval('options.func = ' + options.func); - var getPixels = require('get-pixels'); + var getPixels = require('get-pixels'); - // save first image's pixels - var priorStep = this.getStep(-2); + // convert offset as string to int + if(typeof options.offset === "string") options.offset = parseInt(options.offset); - getPixels(priorStep.output.src, function(err, pixels) { - options.firstImagePixels = pixels; + // save first image's pixels + var priorStep = this.getStep(options.offset); - function changePixel(r2, g2, b2, a2, x, y) { - // blend! - var p = options.firstImagePixels; - return options.func( - r2, g2, b2, a2, - p.get(x, y, 0), - p.get(x, y, 1), - p.get(x, y, 2), - p.get(x, y, 3) - ) - } + getPixels(priorStep.output.src, function(err, pixels) { + options.firstImagePixels = pixels; - function output(image, datauri, mimetype) { + function changePixel(r2, g2, b2, a2, x, y) { + // blend! + var p = options.firstImagePixels; + return options.func( + r2, g2, b2, a2, + p.get(x, y, 0), + p.get(x, y, 1), + p.get(x, y, 2), + p.get(x, y, 3) + ) + } - // This output is accessible by Image Sequencer - step.output = { src: datauri, format: mimetype }; + function output(image, datauri, mimetype) { - } + // This output is accessible by Image Sequencer + step.output = { src: datauri, format: mimetype }; - // run PixelManipulatin on second image's pixels - return require('../_nomodule/PixelManipulation.js')(input, { + } + + // run PixelManipulatin on second image's pixels + return require('../_nomodule/PixelManipulation.js')(input, { + output: output, + changePixel: changePixel, + format: input.format, + image: options.image, + inBrowser: options.inBrowser, + callback: callback + }); + }); + } + + return { + options: options, + draw: draw, output: output, - changePixel: changePixel, - format: input.format, - image: options.image, - inBrowser: options.inBrowser, - callback: callback - }); - }); - } - - return { - options: options, - draw: draw, - output: output, - UI: UI - } + UI: UI + } } diff --git a/src/modules/Blend/info.json b/src/modules/Blend/info.json index 390d99bb..fc32ab0b 100755 --- a/src/modules/Blend/info.json +++ b/src/modules/Blend/info.json @@ -1,7 +1,12 @@ { "name": "Blend", - "description": "Blend the past two image steps with the given function. Defaults to using the red channel from image 1 and the green and blue and alpha channels of image 2. Easier to use interfaces coming soon!", + "description": "Blend two chosen image steps with the given function. Defaults to using the red channel from image 1 and the green and blue and alpha channels of image 2. Easier to use interfaces coming soon!", "inputs": { + "offset": { + "type": "integer", + "desc": "Choose which image to blend the current image with. Two steps back is -2, three steps back is -3 etc.", + "default": -2 + }, "blend": { "type": "input", "desc": "Function to use to blend the two images.", diff --git a/test/modules/image-sequencer.js b/test/modules/image-sequencer.js index 6cc100d6..de1843cb 100644 --- a/test/modules/image-sequencer.js +++ b/test/modules/image-sequencer.js @@ -184,10 +184,23 @@ test('getStep(offset) returns the step at offset distance relative to current st }); test('toCliString() returns the CLI command for the sequence', function(t) { - t.deepEqual(sequencer.toCliString(), `sequencer -i [PATH] -s "channel channel channel channel channel invert blend" -d '{"channel":"green"}'`, "works correctly"); + t.deepEqual(sequencer.toCliString(), `sequencer -i [PATH] -s "channel channel channel channel channel invert blend" -d '{"channel":"green","offset":-2}'`, "works correctly"); t.end(); }); +test('blend returns different output depending on the set offset', function(t) { + var blend_2; + sequencer.addSteps('test', 'invert', {}); + sequencer.addSteps('test', 'invert', {}); + sequencer.addSteps('test', 'blend', {}); + // because we've added blend before, so instead of -3 we set it to -4 + sequencer.addSteps('test', 'blend', {'offset': -4}); + sequencer.run({ mode: 'test' }, function(out) { + t.notStrictEqual(out, sequencer.images.test.steps[sequencer.images.test.steps.length - 2].output.src, 'different offsets give different output'); + t.end(); + }); +}); + test('replaceImage returns false in NodeJS', function(t) { var returnvalue = (sequencer.options.inBrowser) ? false : sequencer.replaceImage("#selector", "test"); t.equal(returnvalue, false, "It does.");