Pixastic.Actions.weighted_desaturate = {
  each_pixel : function(data, w, h, visit) {
    var w4 = w*4;
    var y = h;
    do {
      var offsetY = (y-1)*w4;
      var x = w;
      do {
        var offset = offsetY + (x-1)*4;
        var newval = visit(data[offset], data[offset+1], data[offset+2], data[offset+3]);
        data[offset]   = newval[0] || data[offset];
        data[offset+1] = newval[1] || data[offset+1];
        data[offset+2] = newval[2] || data[offset+2];
        data[offset+3] = newval[3] || data[offset+3];
      } while (--x);
    } while (--y);
  },

  process : function(params) {
    var rweight = params.options.r;
    var gweight = params.options.g;
    var bweight = params.options.b;

    var scale = 1 / (rweight + gweight + bweight);
    rweight *= scale;
    gweight *= scale;
    bweight *= scale;

    if (Pixastic.Client.hasCanvasImageData()) {
      var data = Pixastic.prepareData(params);
      var rect = params.options.rect;
      var w = rect.width;
      var h = rect.height;
      this.each_pixel(data, w, h, function(r, g, b, a) {
        var brightness = r * rweight + g * gweight + b * bweight;
        return [brightness, brightness, brightness];
      });
      return true;
    }
  },

	checkSupport : function() {
		return Pixastic.Client.hasCanvasImageData();
	}
}
