You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
334 lines
7.3 KiB
334 lines
7.3 KiB
// Copyright 2015 Yahoo! Inc.
|
|
// Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms.
|
|
|
|
var Base = require('./base');
|
|
var utils = require('preceptor-core').utils;
|
|
|
|
var constants = require('../constants');
|
|
|
|
/**
|
|
* @class Output
|
|
* @extends Base
|
|
* @module Configuration
|
|
*
|
|
* @property {string} _imagePath
|
|
* #property {int} _limit
|
|
* @property {int} _composition
|
|
* @property {int} _copyImage
|
|
*/
|
|
var Output = Base.extend(
|
|
|
|
/**
|
|
* Output constructor
|
|
*
|
|
* @param {object} options
|
|
* @param {string} options.imagePath Path to the output image
|
|
* @param {int} options.limit Limiting options for output image
|
|
* @param {int} options.composition Composition options for output image
|
|
* @param {int} options.copyImage Copy-image options for output image
|
|
* @constructor
|
|
*/
|
|
function (options) {
|
|
this.__super(options);
|
|
|
|
options = utils.deepExtend({
|
|
imagePath: null,
|
|
limit: constants.OUTPUT_DIFFERENT,
|
|
composition: constants.COMPOSITION_AUTO,
|
|
copyImage: constants.COPY_IMAGE_B
|
|
}, [options]);
|
|
|
|
this.setImagePath(options.imagePath);
|
|
|
|
this.setLimitMode(options.limit);
|
|
this.setCompositionMode(options.composition);
|
|
this.setCopyImage(options.copyImage);
|
|
},
|
|
|
|
{
|
|
/**
|
|
* Gets the path of the output image
|
|
*
|
|
* @method getImagePath
|
|
* @return {string}
|
|
*/
|
|
getImagePath: function () {
|
|
return this._imagePath;
|
|
},
|
|
|
|
/**
|
|
* Sets the path of the output image
|
|
*
|
|
* @method setImagePath
|
|
* @param {string} path
|
|
*/
|
|
setImagePath: function (path) {
|
|
this._imagePath = path;
|
|
},
|
|
|
|
/**
|
|
* Writes the image to a file if a path was given
|
|
*
|
|
* @method writeImage
|
|
* @param {PNGImage} image
|
|
* @return {boolean} Written?
|
|
*/
|
|
writeImage: function (image) {
|
|
if (this.getImagePath()) {
|
|
image.writeImageSync(this.getImagePath());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
|
|
/**
|
|
* Gets the limit mode
|
|
*
|
|
* @method getLimitMode
|
|
* @return {int}
|
|
*/
|
|
getLimitMode: function () {
|
|
return this._limit;
|
|
},
|
|
|
|
/**
|
|
* Sets the limit mode
|
|
*
|
|
* @method setLimitMode
|
|
* @param {int} value
|
|
*/
|
|
setLimitMode: function (value) {
|
|
this._limit = value;
|
|
},
|
|
|
|
|
|
/**
|
|
* Is there an output limit?
|
|
*
|
|
* @method hasLimit
|
|
* @return {boolean}
|
|
*/
|
|
hasLimit: function () {
|
|
return (this.getLimitMode() != constants.OUTPUT_ALL);
|
|
},
|
|
|
|
/**
|
|
* Is the output-limit for different images only?
|
|
*
|
|
* @method isLimitDifferent
|
|
* @return {boolean}
|
|
*/
|
|
isLimitDifferent: function () {
|
|
return (this.getLimitMode() == constants.OUTPUT_DIFFERENT);
|
|
},
|
|
|
|
/**
|
|
* Is the output-limit for similar and different images?
|
|
*
|
|
* @method isLimitSimilar
|
|
* @return {boolean}
|
|
*/
|
|
isLimitSimilar: function () {
|
|
return (this.getLimitMode() == constants.OUTPUT_SIMILAR);
|
|
},
|
|
|
|
/**
|
|
* Determines if a result-code is within the output limits
|
|
*
|
|
* @method withinOutputLimit
|
|
* @param resultCode
|
|
* @return {boolean}
|
|
*/
|
|
withinOutputLimit: function (resultCode) {
|
|
if (!this.hasLimit()) {
|
|
return true;
|
|
} else {
|
|
return resultCode <= this.getLimitMode();
|
|
}
|
|
},
|
|
|
|
|
|
/**
|
|
* Gets the composition mode
|
|
*
|
|
* @method getCompositionMode
|
|
* @return {int}
|
|
*/
|
|
getCompositionMode: function () {
|
|
return this._composition;
|
|
},
|
|
|
|
/**
|
|
* Sets the composition mode
|
|
*
|
|
* @method setCompositionMode
|
|
* @param {int} value
|
|
*/
|
|
setCompositionMode: function (value) {
|
|
this._composition = value;
|
|
},
|
|
|
|
|
|
/**
|
|
* Is composition off?
|
|
*
|
|
* @method isCompositionOff
|
|
* @return {boolean}
|
|
*/
|
|
isCompositionOff: function () {
|
|
return (this.getCompositionMode() == constants.COMPOSITION_OFF);
|
|
},
|
|
|
|
/**
|
|
* Is composition in auto-mode?
|
|
*
|
|
* @method isAutoComposition
|
|
* @return {boolean}
|
|
*/
|
|
isAutoComposition: function () {
|
|
return (this.getCompositionMode() == constants.COMPOSITION_AUTO);
|
|
},
|
|
|
|
/**
|
|
* Is composition from left to right?
|
|
*
|
|
* @method isCompositionLeftToRight
|
|
* @return {boolean}
|
|
*/
|
|
isCompositionLeftToRight: function () {
|
|
return (this.getCompositionMode() == constants.COMPOSITION_LEFT_TO_RIGHT);
|
|
},
|
|
|
|
/**
|
|
* Is composition from top to bottom?
|
|
*
|
|
* @method isCompositionTopToBottom
|
|
* @return {boolean}
|
|
*/
|
|
isCompositionTopToBottom: function () {
|
|
return (this.getCompositionMode() == constants.COMPOSITION_TOP_TO_BOTTOM);
|
|
},
|
|
|
|
/**
|
|
* Creates a composition according to the configuration
|
|
*
|
|
* @method createComposition
|
|
* @param {PNGImage} imageA
|
|
* @param {PNGImage} imageB
|
|
* @param {PNGImage} imageOutput
|
|
* @return {PNGImage}
|
|
*/
|
|
createComposition: function (imageA, imageB, imageOutput) {
|
|
|
|
var width, height, image = imageOutput;
|
|
|
|
if (!this.isCompositionOff()) {
|
|
this.log('Create composition');
|
|
|
|
width = Math.max(imageA.getWidth(), imageB.getWidth());
|
|
height = Math.max(imageA.getHeight(), imageB.getHeight());
|
|
|
|
if (((width > height) && this.isAutoComposition()) || this.isCompositionTopToBottom()) {
|
|
image = PNGImage.createImage(width, height * 3);
|
|
|
|
imageA.getImage().bitblt(image.getImage(), 0, 0, imageA.getWidth(), imageA.getHeight(), 0, 0);
|
|
imageOutput.getImage().bitblt(image.getImage(), 0, 0, imageOutput.getWidth(), imageOutput.getHeight(), 0, height);
|
|
imageB.getImage().bitblt(image.getImage(), 0, 0, imageB.getWidth(), imageB.getHeight(), 0, height * 2);
|
|
} else {
|
|
image = PNGImage.createImage(width * 3, height);
|
|
|
|
imageA.getImage().bitblt(image.getImage(), 0, 0, imageA.getWidth(), imageA.getHeight(), 0, 0);
|
|
imageOutput.getImage().bitblt(image.getImage(), 0, 0, imageOutput.getWidth(), imageOutput.getHeight(), width, 0);
|
|
imageB.getImage().bitblt(image.getImage(), 0, 0, imageB.getWidth(), imageB.getHeight(), width * 2, 0);
|
|
}
|
|
}
|
|
|
|
return image;
|
|
},
|
|
|
|
|
|
/**
|
|
* Gets the copy-image mode
|
|
*
|
|
* @method getCopyImage
|
|
* @return {int}
|
|
*/
|
|
getCopyImage: function () {
|
|
return this._copyImage;
|
|
},
|
|
|
|
/**
|
|
* Sets the copy-image mode
|
|
*
|
|
* @method setCopyImage
|
|
* @param {int} value
|
|
*/
|
|
setCopyImage: function (value) {
|
|
this._copyImage = value;
|
|
},
|
|
|
|
|
|
/**
|
|
* Should any image be copied as base for the result?
|
|
*
|
|
* @method shouldCopyImage
|
|
* @return {boolean}
|
|
*/
|
|
shouldCopyImage: function () {
|
|
return (this.getCopyImage() != constants.COPY_IMAGE_OFF);
|
|
},
|
|
|
|
/**
|
|
* Should image A be copied as base of result?
|
|
*
|
|
* @method shouldCopyImageA
|
|
* @return {boolean}
|
|
*/
|
|
shouldCopyImageA: function () {
|
|
return (this.getCopyImage() == constants.COPY_IMAGE_A);
|
|
},
|
|
|
|
/**
|
|
* Should image B be copied as base of result?
|
|
*
|
|
* @method shouldCopyImageB
|
|
* @return {boolean}
|
|
*/
|
|
shouldCopyImageB: function () {
|
|
return (this.getCopyImage() == constants.COPY_IMAGE_B);
|
|
},
|
|
|
|
|
|
/**
|
|
* Copies the image to the output-image as defined in the configuration
|
|
*
|
|
* @method copyImage
|
|
* @param {PNGImage} imageA
|
|
* @param {PNGImage} imageB
|
|
* @param {PNGImage} imageOutput
|
|
*/
|
|
copyImage: function (imageA, imageB, imageOutput) {
|
|
|
|
if (this.shouldCopyImageA()) {
|
|
imageA.getImage().bitblt(imageOutput.getImage(), 0, 0, imageA.getWidth(), imageA.getHeight(), 0, 0);
|
|
|
|
} else if (this.shouldCopyImageB()) {
|
|
imageB.getImage().bitblt(imageOutput.getImage(), 0, 0, imageB.getWidth(), imageB.getHeight(), 0, 0);
|
|
}
|
|
}
|
|
},
|
|
|
|
{
|
|
/**
|
|
* @property TYPE
|
|
* @type {string}
|
|
* @static
|
|
*/
|
|
TYPE: 'CONFIGURATION_OUTPUT'
|
|
}
|
|
);
|
|
|
|
module.exports = Output;
|