{"version":3,"file":"Blur.mjs","sources":["../../../src/filters/Blur.ts"],"sourcesContent":["import type { TClassProperties } from '../typedefs';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n  TWebGLPipelineState,\n  T2DPipelineState,\n  TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blur';\n\nexport const blurDefaultValues: Partial<TClassProperties<Blur>> = {\n  blur: 0,\n  mainParameter: 'blur',\n};\n\n/**\n * Blur filter class\n * @example\n * const filter = new Blur({\n *   blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Blur extends BaseFilter {\n  /**\n   * blur value, in percentage of image dimensions.\n   * specific to keep the image blur constant at different resolutions\n   * range between 0 and 1.\n   * @type Number\n   * @default\n   */\n  declare blur: number;\n\n  declare horizontal: boolean;\n  declare aspectRatio: number;\n\n  static type = 'Blur';\n\n  static defaults = blurDefaultValues;\n\n  getFragmentSource(): string {\n    return fragmentSource;\n  }\n\n  applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n    if (isWebGLPipelineState(options)) {\n      // this aspectRatio is used to give the same blur to vertical and horizontal\n      this.aspectRatio = options.sourceWidth / options.sourceHeight;\n      options.passes++;\n      this._setupFrameBuffer(options);\n      this.horizontal = true;\n      this.applyToWebGL(options);\n      this._swapTextures(options);\n      this._setupFrameBuffer(options);\n      this.horizontal = false;\n      this.applyToWebGL(options);\n      this._swapTextures(options);\n    } else {\n      this.applyTo2d(options);\n    }\n  }\n\n  applyTo2d(options: T2DPipelineState) {\n    options.imageData = this.simpleBlur(options);\n  }\n\n  simpleBlur({\n    ctx,\n    imageData,\n    filterBackend: { resources },\n  }: T2DPipelineState) {\n    const { width, height } = imageData;\n    if (!resources.blurLayer1) {\n      resources.blurLayer1 = createCanvasElement();\n      resources.blurLayer2 = createCanvasElement();\n    }\n    const canvas1 = resources.blurLayer1!;\n    const canvas2 = resources.blurLayer2!;\n    if (canvas1.width !== width || canvas1.height !== height) {\n      canvas2.width = canvas1.width = width;\n      canvas2.height = canvas1.height = height;\n    }\n    const ctx1 = canvas1.getContext('2d')!,\n      ctx2 = canvas2.getContext('2d')!,\n      nSamples = 15,\n      blur = this.blur * 0.06 * 0.5;\n    let random, percent, j, i;\n\n    // load first canvas\n    ctx1.putImageData(imageData, 0, 0);\n    ctx2.clearRect(0, 0, width, height);\n\n    for (i = -nSamples; i <= nSamples; i++) {\n      random = (Math.random() - 0.5) / 4;\n      percent = i / nSamples;\n      j = blur * percent * width + random;\n      ctx2.globalAlpha = 1 - Math.abs(percent);\n      ctx2.drawImage(canvas1, j, random);\n      ctx1.drawImage(canvas2, 0, 0);\n      ctx2.globalAlpha = 1;\n      ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n    }\n    for (i = -nSamples; i <= nSamples; i++) {\n      random = (Math.random() - 0.5) / 4;\n      percent = i / nSamples;\n      j = blur * percent * height + random;\n      ctx2.globalAlpha = 1 - Math.abs(percent);\n      ctx2.drawImage(canvas1, random, j);\n      ctx1.drawImage(canvas2, 0, 0);\n      ctx2.globalAlpha = 1;\n      ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n    }\n    ctx.drawImage(canvas1, 0, 0);\n    const newImageData = ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n    ctx1.globalAlpha = 1;\n    ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n    return newImageData;\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      delta: gl.getUniformLocation(program, 'uDelta'),\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    const delta = this.chooseRightDelta();\n    gl.uniform2fv(uniformLocations.delta, delta);\n  }\n\n  /**\n   * choose right value of image percentage to blur with\n   * @returns {Array} a numeric array with delta values\n   */\n  chooseRightDelta() {\n    let blurScale = 1;\n    const delta = [0, 0];\n    if (this.horizontal) {\n      if (this.aspectRatio > 1) {\n        // image is wide, i want to shrink radius horizontal\n        blurScale = 1 / this.aspectRatio;\n      }\n    } else {\n      if (this.aspectRatio < 1) {\n        // image is tall, i want to shrink radius vertical\n        blurScale = this.aspectRatio;\n      }\n    }\n    const blur = blurScale * this.blur * 0.12;\n    if (this.horizontal) {\n      delta[0] = blur;\n    } else {\n      delta[1] = blur;\n    }\n    return delta;\n  }\n}\n\nclassRegistry.setClass(Blur);\n"],"names":["blurDefaultValues","blur","mainParameter","Blur","BaseFilter","getFragmentSource","fragmentSource","applyTo","options","isWebGLPipelineState","aspectRatio","sourceWidth","sourceHeight","passes","_setupFrameBuffer","horizontal","applyToWebGL","_swapTextures","applyTo2d","imageData","simpleBlur","_ref","ctx","filterBackend","resources","width","height","blurLayer1","createCanvasElement","blurLayer2","canvas1","canvas2","ctx1","getContext","ctx2","nSamples","random","percent","j","i","putImageData","clearRect","Math","globalAlpha","abs","drawImage","newImageData","getImageData","getUniformLocations","gl","program","delta","getUniformLocation","sendUniformData","uniformLocations","chooseRightDelta","uniform2fv","blurScale","_defineProperty","classRegistry","setClass"],"mappings":"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"}