(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);
