UNPKG

fabric-pure-browser

Version:

Fabric.js package with no node-specific dependencies (node-canvas, jsdom). The project is published once a day (in case if a new version appears) from 'master' branch of https://github.com/fabricjs/fabric.js repository. You can keep original imports in

137 lines (121 loc) 4.45 kB
(function(global) { 'use strict'; var fabric = global.fabric || (global.fabric = { }), filters = fabric.Image.filters, createClass = fabric.util.createClass; /** * Gamma filter class * @class fabric.Image.filters.Gamma * @memberOf fabric.Image.filters * @extends fabric.Image.filters.BaseFilter * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} * @example * var filter = new fabric.Image.filters.Gamma({ * brightness: 200 * }); * object.filters.push(filter); * object.applyFilters(); */ filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ { /** * Filter type * @param {String} type * @default */ type: 'Gamma', fragmentSource: 'precision highp float;\n' + 'uniform sampler2D uTexture;\n' + 'uniform vec3 uGamma;\n' + 'varying vec2 vTexCoord;\n' + 'void main() {\n' + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + 'vec3 correction = (1.0 / uGamma);\n' + 'color.r = pow(color.r, correction.r);\n' + 'color.g = pow(color.g, correction.g);\n' + 'color.b = pow(color.b, correction.b);\n' + 'gl_FragColor = color;\n' + 'gl_FragColor.rgb *= color.a;\n' + '}', /** * Gamma array value, from 0.01 to 2.2. * @param {Array} gamma * @default */ gamma: [1, 1, 1], /** * Describe the property that is the filter parameter * @param {String} m * @default */ mainParameter: 'gamma', /** * Constructor * @param {Object} [options] Options object */ initialize: function(options) { this.gamma = [1, 1, 1]; filters.BaseFilter.prototype.initialize.call(this, options); }, /** * Apply the Gamma operation to a Uint8Array representing the pixels of an image. * * @param {Object} options * @param {ImageData} options.imageData The Uint8Array to be filtered. */ applyTo2d: function(options) { var imageData = options.imageData, data = imageData.data, gamma = this.gamma, len = data.length, rInv = 1 / gamma[0], gInv = 1 / gamma[1], bInv = 1 / gamma[2], i; if (!this.rVals) { // eslint-disable-next-line this.rVals = new Uint8Array(256); // eslint-disable-next-line this.gVals = new Uint8Array(256); // eslint-disable-next-line this.bVals = new Uint8Array(256); } // This is an optimization - pre-compute a look-up table for each color channel // instead of performing these pow calls for each pixel in the image. for (i = 0, len = 256; i < len; i++) { this.rVals[i] = Math.pow(i / 255, rInv) * 255; this.gVals[i] = Math.pow(i / 255, gInv) * 255; this.bVals[i] = Math.pow(i / 255, bInv) * 255; } for (i = 0, len = data.length; i < len; i += 4) { data[i] = this.rVals[data[i]]; data[i + 1] = this.gVals[data[i + 1]]; data[i + 2] = this.bVals[data[i + 2]]; } }, /** * Return WebGL uniform locations for this filter's shader. * * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. * @param {WebGLShaderProgram} program This filter's compiled shader program. */ getUniformLocations: function(gl, program) { return { uGamma: gl.getUniformLocation(program, 'uGamma'), }; }, /** * Send data from this filter to its shader program's uniforms. * * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects */ sendUniformData: function(gl, uniformLocations) { gl.uniform3fv(uniformLocations.uGamma, this.gamma); }, }); /** * Returns filter instance from an object representation * @static * @param {Object} object Object to create an instance from * @param {function} [callback] to be invoked after filter creation * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma */ fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== 'undefined' ? exports : this);