{"version":3,"file":"BaseFilter.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n  T2DPipelineState,\n  TWebGLAttributeLocationMap,\n  TWebGLPipelineState,\n  TWebGLProgramCacheItem,\n  TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n  highPsourceCode,\n  identityFragmentShader,\n  vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n  Name extends string,\n  OwnProps extends Record<string, any> = object\n> {\n  /**\n   * Filter type\n   * @param {String} type\n   * @default\n   */\n  get type(): Name {\n    return (this.constructor as typeof BaseFilter).type as Name;\n  }\n\n  /**\n   * The class type. Used to identify which class this is.\n   * This is used for serialization purposes and internally it can be used\n   * to identify classes. As a developer you could use `instance of Class`\n   * but to avoid importing all the code and blocking tree shaking we try\n   * to avoid doing that.\n   */\n  static type = 'BaseFilter';\n\n  /**\n   * Contains the uniform locations for the fragment shader.\n   * uStepW and uStepH are handled by the BaseFilter, each filter class\n   * needs to specify all the one that are needed\n   */\n  static uniformLocations: string[] = [];\n\n  declare static defaults: Record<string, unknown>;\n\n  /**\n   * Constructor\n   * @param {Object} [options] Options object\n   */\n  constructor({\n    type,\n    ...options\n  }: { type?: never } & Partial<OwnProps> & Record<string, any> = {}) {\n    Object.assign(\n      this,\n      (this.constructor as typeof BaseFilter).defaults,\n      options\n    );\n  }\n\n  protected getFragmentSource(): string {\n    return identityFragmentShader;\n  }\n\n  getVertexSource(): string {\n    return vertexSource;\n  }\n\n  /**\n   * Compile this filter's shader program.\n   *\n   * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n   * @param {String} fragmentSource fragmentShader source for compilation\n   * @param {String} vertexSource vertexShader source for compilation\n   */\n  createProgram(\n    gl: WebGLRenderingContext,\n    fragmentSource: string = this.getFragmentSource(),\n    vertexSource: string = this.getVertexSource()\n  ) {\n    const {\n      WebGLProbe: { GLPrecision = 'highp' },\n    } = getEnv();\n    if (GLPrecision !== 'highp') {\n      fragmentSource = fragmentSource.replace(\n        regex,\n        highPsourceCode.replace('highp', GLPrecision)\n      );\n    }\n    const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    const program = gl.createProgram();\n\n    if (!vertexShader || !fragmentShader || !program) {\n      throw new FabricError(\n        'Vertex, fragment shader or program creation error'\n      );\n    }\n    gl.shaderSource(vertexShader, vertexSource);\n    gl.compileShader(vertexShader);\n    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n      throw new FabricError(\n        `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n          vertexShader\n        )}`\n      );\n    }\n\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      throw new FabricError(\n        `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n          fragmentShader\n        )}`\n      );\n    }\n\n    gl.attachShader(program, vertexShader);\n    gl.attachShader(program, fragmentShader);\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      throw new FabricError(\n        `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n      );\n    }\n\n    const uniformLocations = this.getUniformLocations(gl, program) || {};\n    uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n    uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n    return {\n      program,\n      attributeLocations: this.getAttributeLocations(gl, program),\n      uniformLocations,\n    };\n  }\n\n  /**\n   * Return a map of attribute names to WebGLAttributeLocation objects.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n   * @returns {Object} A map of attribute names to attribute locations.\n   */\n  getAttributeLocations(\n    gl: WebGLRenderingContext,\n    program: WebGLProgram\n  ): TWebGLAttributeLocationMap {\n    return {\n      aPosition: gl.getAttribLocation(program, 'aPosition'),\n    };\n  }\n\n  /**\n   * Return a map of uniform names to WebGLUniformLocation objects.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n   * @returns {Object} A map of uniform names to uniform locations.\n   */\n  getUniformLocations(\n    gl: WebGLRenderingContext,\n    program: WebGLProgram\n  ): TWebGLUniformLocationMap {\n    const locations = (this.constructor as unknown as typeof BaseFilter<string>)\n      .uniformLocations;\n\n    const uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n    for (let i = 0; i < locations.length; i++) {\n      uniformLocations[locations[i]] = gl.getUniformLocation(\n        program,\n        locations[i]\n      );\n    }\n    return uniformLocations;\n  }\n\n  /**\n   * Send attribute data from this filter to its shader program on the GPU.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} attributeLocations A map of shader attribute names to their locations.\n   */\n  sendAttributeData(\n    gl: WebGLRenderingContext,\n    attributeLocations: Record<string, number>,\n    aPositionData: Float32Array\n  ) {\n    const attributeLocation = attributeLocations.aPosition;\n    const buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.enableVertexAttribArray(attributeLocation);\n    gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n  }\n\n  _setupFrameBuffer(options: TWebGLPipelineState) {\n    const gl = options.context;\n    if (options.passes > 1) {\n      const width = options.destinationWidth;\n      const height = options.destinationHeight;\n      if (options.sourceWidth !== width || options.sourceHeight !== height) {\n        gl.deleteTexture(options.targetTexture);\n        options.targetTexture = options.filterBackend.createTexture(\n          gl,\n          width,\n          height\n        );\n      }\n      gl.framebufferTexture2D(\n        gl.FRAMEBUFFER,\n        gl.COLOR_ATTACHMENT0,\n        gl.TEXTURE_2D,\n        options.targetTexture,\n        0\n      );\n    } else {\n      // draw last filter on canvas and not to framebuffer.\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      gl.finish();\n    }\n  }\n\n  _swapTextures(options: TWebGLPipelineState) {\n    options.passes--;\n    options.pass++;\n    const temp = options.targetTexture;\n    options.targetTexture = options.sourceTexture;\n    options.sourceTexture = temp;\n  }\n\n  /**\n   * Generic isNeutral implementation for one parameter based filters.\n   * Used only in image applyFilters to discard filters that will not have an effect\n   * on the image\n   * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n   * @param {Object} options\n   **/\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  isNeutralState(options?: any): boolean {\n    return false;\n  }\n\n  /**\n   * Apply this filter to the input image data provided.\n   *\n   * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n    if (isWebGLPipelineState(options)) {\n      this._setupFrameBuffer(options);\n      this.applyToWebGL(options);\n      this._swapTextures(options);\n    } else {\n      this.applyTo2d(options);\n    }\n  }\n\n  applyTo2d(options: T2DPipelineState): void {\n    // override by subclass\n  }\n\n  /**\n   * Returns a string that represent the current selected shader code for the filter.\n   * Used to force recompilation when parameters change or to retrieve the shader from cache\n   * @type string\n   **/\n  getCacheKey(): string {\n    return this.type;\n  }\n\n  /**\n   * Retrieves the cached shader.\n   * @param {Object} options\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   * @return {WebGLProgram} the compiled program shader\n   */\n  retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n    const key = this.getCacheKey();\n    if (!options.programCache[key]) {\n      options.programCache[key] = this.createProgram(options.context);\n    }\n    return options.programCache[key];\n  }\n\n  /**\n   * Apply this filter using webgl.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyToWebGL(options: TWebGLPipelineState) {\n    const gl = options.context;\n    const shader = this.retrieveShader(options);\n    if (options.pass === 0 && options.originalTexture) {\n      gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n    } else {\n      gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n    }\n    gl.useProgram(shader.program);\n    this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n    gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n    gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n    this.sendUniformData(gl, shader.uniformLocations);\n    gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n  }\n\n  bindAdditionalTexture(\n    gl: WebGLRenderingContext,\n    texture: WebGLTexture,\n    textureUnit: number\n  ) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // reset active texture to 0 as usual\n    gl.activeTexture(gl.TEXTURE0);\n  }\n\n  unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.activeTexture(gl.TEXTURE0);\n  }\n\n  /**\n   * Send uniform data from this filter to its shader program on the GPU.\n   *\n   * Intended to be overridden by subclasses.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} uniformLocations A map of shader uniform names to their locations.\n   */\n  sendUniformData(\n    gl: WebGLRenderingContext,\n    uniformLocations: TWebGLUniformLocationMap\n  ): void {\n    // override by subclass\n  }\n\n  /**\n   * If needed by a 2d filter, this functions can create an helper canvas to be used\n   * remember that options.targetCanvas is available for use till end of chain.\n   */\n  createHelpLayer(options: T2DPipelineState) {\n    if (!options.helpLayer) {\n      const helpLayer = createCanvasElement();\n      helpLayer.width = options.sourceWidth;\n      helpLayer.height = options.sourceHeight;\n      options.helpLayer = helpLayer;\n    }\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @return {Object} Object representation of an instance\n   */\n  toObject(): { type: Name } & OwnProps {\n    const defaultKeys = Object.keys(\n      (this.constructor as typeof BaseFilter).defaults\n    ) as (keyof OwnProps)[];\n\n    return {\n      type: this.type,\n      ...defaultKeys.reduce<OwnProps>((acc, key) => {\n        //@ts-expect-error TS doesn't get i want an object that looks like this\n        acc[key] = this[key as keyof this];\n        return acc;\n      }, {} as OwnProps),\n    };\n  }\n\n  /**\n   * Returns a JSON representation of an instance\n   * @return {Object} JSON\n   */\n  toJSON() {\n    // delegate, not alias\n    return this.toObject();\n  }\n\n  static async fromObject(\n    { type, ...filterOptions }: Record<string, any>,\n    options: Abortable\n  ): Promise<BaseFilter<string, object>> {\n    return new this(filterOptions);\n  }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","constructor","_ref","arguments","length","undefined","options","_objectWithoutProperties","_excluded","Object","assign","defaults","getFragmentSource","identityFragmentShader","getVertexSource","vertexSource","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","locations","i","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","createHelpLayer","helpLayer","createCanvasElement","toObject","defaultKeys","keys","_objectSpread","reduce","acc","toJSON","fromObject","_ref2","filterOptions","_excluded2","_defineProperty"],"mappings":"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"}