|
|
|
@ -18,41 +18,77 @@ var utils = require('./utils'); |
|
|
|
|
* @param {Function} cb(err, Boolean, equality, rawOutput) |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
module.exports = exports = function compare (orig, compareTo, tolerance, cb) { |
|
|
|
|
orig = utils.escape(orig); |
|
|
|
|
compareTo = utils.escape(compareTo); |
|
|
|
|
|
|
|
|
|
// outputting the diff image
|
|
|
|
|
if (typeof tolerance === 'object') { |
|
|
|
|
var diffOptions = tolerance; |
|
|
|
|
if (typeof diffOptions.file !== 'string') { |
|
|
|
|
throw new TypeError('The path for the diff output is invalid'); |
|
|
|
|
} |
|
|
|
|
// graphicsmagick defaults to red
|
|
|
|
|
var highlightColorOption = diffOptions.highlightColor |
|
|
|
|
? ' -highlight-color ' + diffOptions.highlightColor + ' ' |
|
|
|
|
: ' '; |
|
|
|
|
module.exports = exports = function (proto) { |
|
|
|
|
function compare(orig, compareTo, tolerance, cb) { |
|
|
|
|
orig = utils.escape(orig); |
|
|
|
|
compareTo = utils.escape(compareTo); |
|
|
|
|
|
|
|
|
|
return exec('gm compare' + highlightColorOption + orig + ' ' + compareTo + |
|
|
|
|
' -file ' + utils.escape(diffOptions.file), cb); |
|
|
|
|
} |
|
|
|
|
var isImageMagick = this._options && this._options.imageMagick; |
|
|
|
|
var bin = isImageMagick ? '' : 'gm '; |
|
|
|
|
|
|
|
|
|
// else, output the mean square error (mse)
|
|
|
|
|
if ('function' == typeof tolerance) { |
|
|
|
|
cb = tolerance; |
|
|
|
|
tolerance = 0.4; |
|
|
|
|
} |
|
|
|
|
// outputting the diff image
|
|
|
|
|
if (typeof tolerance === 'object') { |
|
|
|
|
var diffOptions = tolerance; |
|
|
|
|
if (typeof diffOptions.file !== 'string') { |
|
|
|
|
throw new TypeError('The path for the diff output is invalid'); |
|
|
|
|
} |
|
|
|
|
// graphicsmagick defaults to red
|
|
|
|
|
var highlightColorOption = diffOptions.highlightColor |
|
|
|
|
? ' -highlight-color ' + diffOptions.highlightColor + ' ' |
|
|
|
|
: ' '; |
|
|
|
|
var diffFilename = utils.escape(diffOptions.file); |
|
|
|
|
var diffOpt = isImageMagick ? diffFilename : ('-file ' + diffFilename); |
|
|
|
|
var cmd = bin + 'compare' + highlightColorOption + orig + ' ' + compareTo + |
|
|
|
|
' ' + diffOpt; |
|
|
|
|
|
|
|
|
|
exec('gm compare -metric mse ' + orig + ' ' + compareTo, function (err, stdout, stderr) { |
|
|
|
|
if (err) return cb(err); |
|
|
|
|
return exec(cmd, function (err, stdout, stderr) { |
|
|
|
|
if (isImageMagick && err && err.code === 1) { |
|
|
|
|
err = null; |
|
|
|
|
} |
|
|
|
|
return cb(err, stdout, stderr); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var match = /Total: (\d+\.?\d*)/m.exec(stdout); |
|
|
|
|
if (!match) { |
|
|
|
|
err = new Error('Unable to parse output.\nGot ' + stdout); |
|
|
|
|
return cb(err); |
|
|
|
|
// else, output the mean square error (mse)
|
|
|
|
|
if ('function' == typeof tolerance) { |
|
|
|
|
cb = tolerance; |
|
|
|
|
tolerance = 0.4; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var equality = parseFloat(match[1]); |
|
|
|
|
cb(null, equality <= tolerance, equality, stdout); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
var execCmd = bin + 'compare -metric mse ' + orig + ' ' + compareTo; |
|
|
|
|
// For ImageMagick diff file is required but we don't care about it, so null it out
|
|
|
|
|
isImageMagick && (execCmd += ' null:'); |
|
|
|
|
|
|
|
|
|
exec(execCmd, function (err, stdout, stderr) { |
|
|
|
|
// ImageMagick returns err code 2 if err, 0 if similar, 1 if dissimilar
|
|
|
|
|
if (isImageMagick) { |
|
|
|
|
if (!err) { |
|
|
|
|
return cb(null, 0 <= tolerance, 0, stdout); |
|
|
|
|
} |
|
|
|
|
if (err.code === 1) { |
|
|
|
|
err = null; |
|
|
|
|
stdout = stderr; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (err) { |
|
|
|
|
return cb(err); |
|
|
|
|
} |
|
|
|
|
// Since ImageMagick similar gives err code 0 and no stdout, there's really no matching
|
|
|
|
|
var regex = isImageMagick ? /\((\d+\.?\d*)\)/m : /Total: (\d+\.?\d*)/m; |
|
|
|
|
var match = regex.exec(stdout); |
|
|
|
|
if (!match) { |
|
|
|
|
err = new Error('Unable to parse output.\nGot ' + stdout); |
|
|
|
|
return cb(err); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var equality = parseFloat(match[1]); |
|
|
|
|
cb(null, equality <= tolerance, equality, stdout); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (proto) { |
|
|
|
|
proto.compare = compare; |
|
|
|
|
} |
|
|
|
|
return compare; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|