{"version":3,"file":"Pixelate.mjs","sources":["../../../src/filters/Pixelate.ts"],"sourcesContent":["import type { TClassProperties } from '../typedefs';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/pixelate';\n\nexport const pixelateDefaultValues: Partial<TClassProperties<Pixelate>> = {\n  blocksize: 4,\n  mainParameter: 'blocksize',\n};\n\n/**\n * Pixelate filter class\n * @example\n * const filter = new Pixelate({\n *   blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\nexport class Pixelate extends BaseFilter {\n  declare blocksize: number;\n\n  static type = 'Pixelate';\n\n  static defaults = pixelateDefaultValues;\n\n  /**\n   * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n   *\n   * @param {Object} options\n   * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n   */\n  applyTo2d({ imageData: { data, width, height } }: T2DPipelineState) {\n    for (let i = 0; i < height; i += this.blocksize) {\n      for (let j = 0; j < width; j += this.blocksize) {\n        const index = i * 4 * width + j * 4;\n        const r = data[index];\n        const g = data[index + 1];\n        const b = data[index + 2];\n        const a = data[index + 3];\n\n        for (let _i = i; _i < Math.min(i + this.blocksize, height); _i++) {\n          for (let _j = j; _j < Math.min(j + this.blocksize, width); _j++) {\n            const index = _i * 4 * width + _j * 4;\n            data[index] = r;\n            data[index + 1] = g;\n            data[index + 2] = b;\n            data[index + 3] = a;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Indicate when the filter is not gonna apply changes to the image\n   **/\n  isNeutralState() {\n    return this.blocksize === 1;\n  }\n\n  protected getFragmentSource(): string {\n    return fragmentSource;\n  }\n\n  /**\n   * Return WebGL uniform locations for this filter's shader.\n   *\n   * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n   * @param {WebGLShaderProgram} program This filter's compiled shader program.\n   */\n  getUniformLocations(\n    gl: WebGLRenderingContext,\n    program: WebGLProgram\n  ): TWebGLUniformLocationMap {\n    return {\n      uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n      uStepW: gl.getUniformLocation(program, 'uStepW'),\n      uStepH: gl.getUniformLocation(program, 'uStepH'),\n    };\n  }\n\n  /**\n   * Send data from this filter to its shader program's uniforms.\n   *\n   * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n   * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n   */\n  sendUniformData(\n    gl: WebGLRenderingContext,\n    uniformLocations: TWebGLUniformLocationMap\n  ) {\n    gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n  }\n}\n\nclassRegistry.setClass(Pixelate);\n"],"names":["pixelateDefaultValues","blocksize","mainParameter","Pixelate","BaseFilter","applyTo2d","_ref","imageData","data","width","height","i","j","index","r","g","b","a","_i","Math","min","_j","isNeutralState","getFragmentSource","fragmentSource","getUniformLocations","gl","program","uBlocksize","getUniformLocation","uStepW","uStepH","sendUniformData","uniformLocations","uniform1f","_defineProperty","classRegistry","setClass"],"mappings":"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"}