Source: pad.js

const hasard = require('hasard');
const AbstractAugmenter = require('./abstract');

/**
* Add padding to the image
* @param {Object} opts options, if number or array, considered as size argument
* @param {ArraylRTB} opts.percent size of padding in percent
* @param {ArraylRTB} opts.size size of padding in piwels
* @param {ColorArgument} [opts.borderValue=[0,0,0]] if borderType is "constant" this is used as border pixel values
* @param {BorderTypeArgument} [opts.borderType="constant"] "constant", "replicate", "transparent"
* @example
// Simple usage, pad by 10px, on every side
ia.pad(10);
* @example
// pad by 10%, with transparent background
ia.pad({
	percent: 0.1,
	borderType: "transparent"
});
* @example
// pad by 10% (left, right), 20% (top, bottom), with constant blue background
ia.pad({
	percent: [0.1, 0.2],
	borderType: "transparent",
	borderValue: [0, 0, 255]
});
*/

class PadAugmenter extends AbstractAugmenter {
	constructor(opts, ia) {
		let o;
		if (typeof (opts) === 'number' || Array.isArray(opts) || hasard.isHasard(opts)) {
			o = {size: opts};
		} else {
			o = opts;
		}

		super(o, ia);
		const {size, borderValue = [0, 0, 0], borderType = 'replicate', percent = 0} = o;
		if (hasard.isHasard(size) || typeof (size) === 'number' || Array.isArray(size)) {
			this.size = this.toSize4(size);
		} else {
			this.percent = this.toSize4(percent);
		}

		this.borderValue = borderValue;
		this.borderType = borderType;
	}

	buildParams({width, height}) {
		let size;
		if (this.size) {
			size = hasard.fn(s => s.map(l => Math.round(l)))(this.size);
		} else {
			size = hasard.fn(p => [
				Math.round(width * p[0]),
				Math.round(height * p[1]),
				Math.round(width * p[2]),
				Math.round(height * p[3])
			])(this.percent);
		}

		return new hasard.Object({
			size,
			borderValue: this.borderValue,
			borderType: this.borderType
		});
	}

	checkParams({size}) {
		size.forEach(p => {
			if (p < 0) {
				throw (new Error('only positive value allowed in pad for percent'));
			}
		});
	}

	augmentImage({image}, {size, borderValue, borderType}) {
		return this.backend.pad(image, {borders: size, borderType, borderValue});
	}

	augmentPoints({points}, {size}) {
		const borders = size;
		const origin = this.backend.point(borders[0], borders[2]);
		return points.map(p => p.add(origin));
	}
}

module.exports = PadAugmenter;