blob: e759722b2023f7ccb970b1d2ca6878bc0377802c [file] [log] [blame]
(function() {
var Assert, RgbTransform, Stream,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Assert = require('assert');
Stream = require('stream');
RgbTransform = (function(_super) {
__extends(RgbTransform, _super);
function RgbTransform(meta, options) {
this.meta = meta;
this._buffer = new Buffer('');
Assert.ok(this.meta.bpp === 24 || this.meta.bpp === 32, 'Only 24-bit and 32-bit raw images with 8-bits per color are supported');
this._r_pos = this.meta.red_offset / 8;
this._g_pos = this.meta.green_offset / 8;
this._b_pos = this.meta.blue_offset / 8;
this._a_pos = this.meta.alpha_offset / 8;
this._pixel_bytes = this.meta.bpp / 8;
RgbTransform.__super__.constructor.call(this, options);
}
RgbTransform.prototype._transform = function(chunk, encoding, done) {
var b, g, r, sourceCursor, target, targetCursor;
if (this._buffer.length) {
this._buffer = Buffer.concat([this._buffer, chunk], this._buffer.length + chunk.length);
} else {
this._buffer = chunk;
}
sourceCursor = 0;
targetCursor = 0;
target = this._pixel_bytes === 3 ? this._buffer : new Buffer(Math.max(4, chunk.length / this._pixel_bytes * 3));
while (this._buffer.length - sourceCursor >= this._pixel_bytes) {
r = this._buffer[sourceCursor + this._r_pos];
g = this._buffer[sourceCursor + this._g_pos];
b = this._buffer[sourceCursor + this._b_pos];
target[targetCursor + 0] = r;
target[targetCursor + 1] = g;
target[targetCursor + 2] = b;
sourceCursor += this._pixel_bytes;
targetCursor += 3;
}
if (targetCursor) {
this.push(target.slice(0, targetCursor));
this._buffer = this._buffer.slice(sourceCursor);
}
done();
};
return RgbTransform;
})(Stream.Transform);
module.exports = RgbTransform;
}).call(this);