mirror of https://gitgud.io/fatchan/gm
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.
133 lines
3.1 KiB
133 lines
3.1 KiB
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var Stream = require('stream').Stream;
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var util = require('util');
|
|
|
|
util.inherits(gm, EventEmitter);
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param {String|Number} path - path to img source or ReadableStream or width of img to create
|
|
* @param {Number} [height] - optional filename of ReadableStream or height of img to create
|
|
* @param {String} [color] - optional hex background color of created img
|
|
*/
|
|
|
|
function gm (source, height, color) {
|
|
var width;
|
|
|
|
if (!(this instanceof gm)) {
|
|
return new gm(source, height, color);
|
|
}
|
|
|
|
EventEmitter.call(this);
|
|
|
|
this._options = {};
|
|
this.options(this.__proto__._options);
|
|
|
|
this.data = {};
|
|
this._in = [];
|
|
this._out = [];
|
|
this._outputFormat = null;
|
|
this._subCommand = 'convert';
|
|
|
|
if (source instanceof Stream) {
|
|
this.sourceStream = source;
|
|
source = height || 'unknown.jpg';
|
|
} else if (Buffer.isBuffer(source)) {
|
|
this.sourceBuffer = source;
|
|
source = height || 'unknown.jpg';
|
|
} else if (height) {
|
|
// new images
|
|
width = source;
|
|
source = "";
|
|
|
|
this.in("-size", width + "x" + height);
|
|
|
|
if (color) {
|
|
this.in("xc:"+ color);
|
|
}
|
|
}
|
|
|
|
if (typeof source === "string") {
|
|
// then source is a path
|
|
|
|
// parse out gif frame brackets from filename
|
|
// since stream doesn't use source path
|
|
// eg. "filename.gif[0]"
|
|
var frames = source.match(/(\[.+\])$/);
|
|
if (frames) {
|
|
this.sourceFrames = source.substr(frames.index, frames[0].length);
|
|
source = source.substr(0, frames.index);
|
|
}
|
|
}
|
|
|
|
this.source = source;
|
|
|
|
this.addSrcFormatter(function (src) {
|
|
// must be first source formatter
|
|
|
|
var inputFromStdin = this.sourceStream || this.sourceBuffer;
|
|
var ret = inputFromStdin ? '-' : this.source;
|
|
|
|
if (inputFromStdin && this.source && this.source !== 'unknown.jpg') ret = this.source.split('.').pop() + ':-';
|
|
if (ret && this.sourceFrames) ret += this.sourceFrames;
|
|
|
|
src.length = 0;
|
|
src[0] = ret;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Subclasses the gm constructor with custom options.
|
|
*
|
|
* @param {options} options
|
|
* @return {gm} the subclasses gm constructor
|
|
*/
|
|
|
|
var parent = gm;
|
|
gm.subClass = function subClass (options) {
|
|
function gm (source, height, color) {
|
|
if (!(this instanceof parent)) {
|
|
return new gm(source, height, color);
|
|
}
|
|
|
|
parent.call(this, source, height, color);
|
|
}
|
|
|
|
gm.prototype.__proto__ = parent.prototype;
|
|
gm.prototype._options = {};
|
|
gm.prototype.options(options);
|
|
|
|
return gm;
|
|
}
|
|
|
|
/**
|
|
* Augment the prototype.
|
|
*/
|
|
|
|
require("./lib/options")(gm.prototype);
|
|
require("./lib/getters")(gm);
|
|
require("./lib/args")(gm.prototype);
|
|
require("./lib/drawing")(gm.prototype);
|
|
require("./lib/convenience")(gm.prototype);
|
|
require("./lib/command")(gm.prototype);
|
|
require("./lib/compare")(gm.prototype);
|
|
require("./lib/composite")(gm.prototype);
|
|
require("./lib/montage")(gm.prototype);
|
|
|
|
/**
|
|
* Expose.
|
|
*/
|
|
|
|
module.exports = exports = gm;
|
|
module.exports.utils = require('./lib/utils');
|
|
module.exports.compare = require('./lib/compare')();
|
|
module.exports.version = JSON.parse(
|
|
require('fs').readFileSync(__dirname + '/package.json', 'utf8')
|
|
).version;
|
|
|
|
|