diff --git a/src/modules/Dynamic/Module.js b/src/modules/Dynamic/Module.js index 14700727..5f29cb5d 100644 --- a/src/modules/Dynamic/Module.js +++ b/src/modules/Dynamic/Module.js @@ -1,22 +1,22 @@ module.exports = function Dynamic(options,UI) { - + options = options || {}; options.title = "Dynamic"; - + // Tell the UI that a step has been set up. UI.onSetup(options.step); var output; - + // This function is called on every draw. function draw(input,callback) { - + // Tell the UI that the step is being drawn UI.onDraw(options.step); var step = this; - + // start with monochrome, but if options.red, options.green, and options.blue are set, accept them too options.monochrome = options.monochrome || "(R+G+B)/3"; - + function generator(expression) { var func = 'f = function (r, g, b, a) { var R = r, G = g, B = b, A = a;' func = func + 'return '; @@ -25,48 +25,65 @@ module.exports = function Dynamic(options,UI) { eval(func); return f; } - + var channels = ['red', 'green', 'blue', 'alpha']; - + channels.forEach(function(channel) { if (options.hasOwnProperty(channel)) options[channel + '_function'] = generator(options[channel]); else if (channel === 'alpha') options['alpha_function'] = function() { return 255; } else options[channel + '_function'] = generator(options.monochrome); }); - + function changePixel(r, g, b, a) { + + /* neighbourpixels can be calculated by + this.getNeighbourPixel.fun(x,y) or this.getNeighborPixel.fun(x,y) + */ var combined = (r + g + b) / 3.000; return [ - options.red_function( r, g, b, a), + options.red_function(r, g, b, a), options.green_function(r, g, b, a), - options.blue_function( r, g, b, a), + options.blue_function(r, g, b, a), options.alpha_function(r, g, b, a), ]; } - + + /* Functions to get the neighbouring pixel by position (x,y) */ + function getNeighbourPixel(pixels,curX,curY,distX,distY){ + return [ + pixels.get(curX+distX,curY+distY,0) + ,pixels.get(curX+distX,curY+distY,1) + ,pixels.get(curX+distX,curY+distY,2) + ,pixels.get(curX+distX,curY+distY,3) + ] + } + + function output(image,datauri,mimetype){ - + // This output is accessible by Image Sequencer step.output = { src: datauri, format: mimetype }; - + // This output is accessible by the UI options.step.output = datauri; - + // Tell the UI that the draw is complete UI.onComplete(options.step); - + } return require('../_nomodule/PixelManipulation.js')(input, { output: output, changePixel: changePixel, + getNeighbourPixel: getNeighbourPixel, + getNeighborPixel: getNeighbourPixel, format: input.format, image: options.image, inBrowser: options.inBrowser, callback: callback }); - + } - + return { options: options, draw: draw, diff --git a/src/modules/_nomodule/PixelManipulation.js b/src/modules/_nomodule/PixelManipulation.js index d84f93e8..78928107 100644 --- a/src/modules/_nomodule/PixelManipulation.js +++ b/src/modules/_nomodule/PixelManipulation.js @@ -21,6 +21,12 @@ module.exports = function PixelManipulation(image, options) { console.log('Bad image path'); return; } + + if(options.getNeighbourPixel){ + options.getNeighbourPixel.fun = function (distX,distY) { + return options.getNeighbourPixel(pixels,x,y,distX,distY); + }; + } // iterate through pixels; // this could possibly be more efficient; see @@ -31,13 +37,13 @@ module.exports = function PixelManipulation(image, options) { for(var x = 0; x < pixels.shape[0]; x++) { for(var y = 0; y < pixels.shape[1]; y++) { - + var pixel = options.changePixel( - pixels.get(x, y, 0), - pixels.get(x, y, 1), - pixels.get(x, y, 2), - pixels.get(x, y, 3) - ); + pixels.get(x, y, 0), + pixels.get(x, y, 1), + pixels.get(x, y, 2), + pixels.get(x, y, 3) + ); pixels.set(x, y, 0, pixel[0]); pixels.set(x, y, 1, pixel[1]); @@ -48,9 +54,9 @@ module.exports = function PixelManipulation(image, options) { pace.op() } } - + if(options.extraManipulation) - pixels = options.extraManipulation(pixels) + pixels = options.extraManipulation(pixels) // there may be a more efficient means to encode an image object, // but node modules and their documentation are essentially arcane on this point