UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

86 lines (73 loc) 2.43 kB
import { BaseFilter } from './BaseFilter'; import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs'; import { classRegistry } from '../ClassRegistry'; import { fragmentSource } from './shaders/pixelate'; export type PixelateOwnProps = { blocksize: number; }; export const pixelateDefaultValues: PixelateOwnProps = { blocksize: 4, }; /** * Pixelate filter class * @example * const filter = new Pixelate({ * blocksize: 8 * }); * object.filters.push(filter); * object.applyFilters(); */ export class Pixelate extends BaseFilter<'Pixelate', PixelateOwnProps> { declare blocksize: PixelateOwnProps['blocksize']; static type = 'Pixelate'; static defaults = pixelateDefaultValues; static uniformLocations = ['uBlocksize']; /** * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image. * * @param {Object} options * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. */ applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) { for (let i = 0; i < height; i += this.blocksize) { for (let j = 0; j < width; j += this.blocksize) { const index = i * 4 * width + j * 4; const r = data[index]; const g = data[index + 1]; const b = data[index + 2]; const a = data[index + 3]; for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) { for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) { const index = _i * 4 * width + _j * 4; data[index] = r; data[index + 1] = g; data[index + 2] = b; data[index + 3] = a; } } } } } /** * Indicate when the filter is not gonna apply changes to the image **/ isNeutralState() { return this.blocksize === 1; } protected getFragmentSource(): string { return fragmentSource; } /** * 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( gl: WebGLRenderingContext, uniformLocations: TWebGLUniformLocationMap, ) { gl.uniform1f(uniformLocations.uBlocksize, this.blocksize); } } classRegistry.setClass(Pixelate);