text: (function(global) {
  
    'use strict';
  
    var fabric  = global.fabric || (global.fabric = { }),
        extend = fabric.util.object.extend,
        filters = fabric.Image.filters,
        createClass = fabric.util.createClass;
  
    /**
     * Tint filter class
     * Adapted from <a href="https://github.com/mezzoblue/PaintbrushJS">https://github.com/mezzoblue/PaintbrushJS</a>
     * @class fabric.Image.filters.Tint
     * @memberOf fabric.Image.filters
     * @extends fabric.Image.filters.BaseFilter
     * @see {@link fabric.Image.filters.Tint#initialize} for constructor definition
     * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}
     * @example <caption>Tint filter with hex color and opacity</caption>
     * var filter = new fabric.Image.filters.Tint({
     *   color: '#3513B0',
     *   opacity: 0.5
     * });
     * object.filters.push(filter);
     * object.applyFilters(canvas.renderAll.bind(canvas));
     * @example <caption>Tint filter with rgba color</caption>
     * var filter = new fabric.Image.filters.Tint({
     *   color: 'rgba(53, 21, 176, 0.5)'
     * });
     * object.filters.push(filter);
     * object.applyFilters(canvas.renderAll.bind(canvas));
     */
    filters.Tint = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Tint.prototype */ {
  
      /**
       * Filter type
       * @param {String} type
       * @default
       */
      type: 'Tint',
  
      /**
       * Constructor
       * @memberOf fabric.Image.filters.Tint.prototype
       * @param {Object} [options] Options object
       * @param {String} [options.color=#000000] Color to tint the image with
       * @param {Number} [options.opacity] Opacity value that controls the tint effect's transparency (0..1)
       */
      initialize: function(options) {
        options = options || { };
  
        this.color = options.color || '#000000';
        this.opacity = typeof options.opacity !== 'undefined'
                        ? options.opacity
                        : new fabric.Color(this.color).getAlpha();
      },
  
      /**
       * Applies filter to canvas element
       * @param {Object} canvasEl Canvas element to apply filter to
       */
      applyTo: function(canvasEl) {
        var context = canvasEl.getContext('2d'),
            imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
            data = imageData.data,
            iLen = data.length, i,
            tintR, tintG, tintB,
            r, g, b, alpha1,
            source;
  
        source = new fabric.Color(this.color).getSource();
  
        tintR = source[0] * this.opacity;
        tintG = source[1] * this.opacity;
        tintB = source[2] * this.opacity;
  
        alpha1 = 1 - this.opacity;
  
        for (i = 0; i < iLen; i += 4) {
          r = data[i];
          g = data[i + 1];
          b = data[i + 2];
  
          // alpha compositing
          data[i] = tintR + r * alpha1;
          data[i + 1] = tintG + g * alpha1;
          data[i + 2] = tintB + b * alpha1;
        }
  
        context.putImageData(imageData, 0, 0);
      },
  
      /**
       * Returns object representation of an instance
       * @return {Object} Object representation of an instance
       */
      toObject: function() {
        return extend(this.callSuper('toObject'), {
          color: this.color,
          opacity: this.opacity
        });
      }
    });
  
    /**
     * Returns filter instance from an object representation
     * @static
     * @param {Object} object Object to create an instance from
     * @return {fabric.Image.filters.Tint} Instance of fabric.Image.filters.Tint
     */
    fabric.Image.filters.Tint.fromObject = function(object) {
      return new fabric.Image.filters.Tint(object);
    };
  
  })(typeof exports !== 'undefined' ? exports : this);
  