{"version":3,"file":"WebGLFilterBackend.mjs","sources":["../../../src/filters/WebGLFilterBackend.ts"],"sourcesContent":["import { config } from '../config';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n  TWebGLPipelineState,\n  TProgramCache,\n  TTextureCache,\n  TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n  declare tileSize: number;\n\n  /**\n   * Define ...\n   **/\n  aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n  /**\n   * If GLPut data is the fastest operation, or if forced, this buffer will be used\n   * to transfer the data back in the 2d logic\n   **/\n  declare imageBuffer?: ArrayBuffer;\n\n  declare canvas: HTMLCanvasElement;\n\n  /**\n   * The Webgl context that will execute the operations for filtering\n   **/\n  declare gl: WebGLRenderingContext;\n\n  /**\n   * Keyed map for shader cache\n   **/\n  declare programCache: TProgramCache;\n\n  /**\n   * Keyed map for texture cache\n   **/\n  declare textureCache: TTextureCache;\n\n  /**\n   * Contains GPU info for debug\n   **/\n  declare gpuInfo: any;\n\n  /**\n   * Experimental. This object is a sort of repository of help layers used to avoid\n   * of recreating them during frequent filtering. If you are previewing a filter with\n   * a slider you probably do not want to create help layers every filter step.\n   * in this object there will be appended some canvases, created once, resized sometimes\n   * cleared never. Clearing is left to the developer.\n   **/\n  resources: TPipelineResources = {};\n\n  constructor({ tileSize = config.textureSize } = {}) {\n    this.tileSize = tileSize;\n    this.setupGLContext(tileSize, tileSize);\n    this.captureGPUInfo();\n  }\n\n  /**\n   * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n   */\n  setupGLContext(width: number, height: number): void {\n    this.dispose();\n    this.createWebGLCanvas(width, height);\n  }\n\n  /**\n   * Create a canvas element and associated WebGL context and attaches them as\n   * class properties to the GLFilterBackend class.\n   */\n  createWebGLCanvas(width: number, height: number): void {\n    const canvas = createCanvasElement();\n    canvas.width = width;\n    canvas.height = height;\n    const glOptions = {\n        alpha: true,\n        premultipliedAlpha: false,\n        depth: false,\n        stencil: false,\n        antialias: false,\n      },\n      gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n    if (!gl) {\n      return;\n    }\n    gl.clearColor(0, 0, 0, 0);\n    // this canvas can fire webglcontextlost and webglcontextrestored\n    this.canvas = canvas;\n    this.gl = gl;\n  }\n\n  /**\n   * Attempts to apply the requested filters to the source provided, drawing the filtered output\n   * to the provided target canvas.\n   *\n   * @param {Array} filters The filters to apply.\n   * @param {TexImageSource} source The source to be filtered.\n   * @param {Number} width The width of the source input.\n   * @param {Number} height The height of the source input.\n   * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n   * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n   * omitted, caching will be skipped.\n   */\n  applyFilters(\n    filters: BaseFilter<string, Record<string, any>>[],\n    source: TexImageSource,\n    width: number,\n    height: number,\n    targetCanvas: HTMLCanvasElement,\n    cacheKey?: string\n  ): TWebGLPipelineState | undefined {\n    const gl = this.gl;\n    const ctx = targetCanvas.getContext('2d');\n    if (!gl || !ctx) {\n      return;\n    }\n    let cachedTexture;\n    if (cacheKey) {\n      cachedTexture = this.getCachedTexture(cacheKey, source);\n    }\n    const pipelineState: TWebGLPipelineState = {\n      originalWidth:\n        (source as HTMLImageElement).width ||\n        // @ts-expect-error is this a bug? should this be naturalWidth? or is this the pipeline state?\n        (source as HTMLImageElement).originalWidth ||\n        0,\n      originalHeight:\n        (source as HTMLImageElement).height ||\n        // @ts-expect-error is this a bug? should this be naturalHeight? or is this the pipeline state?\n        (source as HTMLImageElement).originalHeight ||\n        0,\n      sourceWidth: width,\n      sourceHeight: height,\n      destinationWidth: width,\n      destinationHeight: height,\n      context: gl,\n      sourceTexture: this.createTexture(\n        gl,\n        width,\n        height,\n        !cachedTexture ? source : undefined\n      ),\n      targetTexture: this.createTexture(gl, width, height),\n      originalTexture:\n        cachedTexture ||\n        this.createTexture(\n          gl,\n          width,\n          height,\n          !cachedTexture ? source : undefined\n        )!,\n      passes: filters.length,\n      webgl: true,\n      aPosition: this.aPosition,\n      programCache: this.programCache,\n      pass: 0,\n      filterBackend: this,\n      targetCanvas: targetCanvas,\n    };\n    const tempFbo = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n    filters.forEach((filter: any) => {\n      filter && filter.applyTo(pipelineState);\n    });\n    resizeCanvasIfNeeded(pipelineState);\n    this.copyGLTo2D(gl, pipelineState);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.deleteTexture(pipelineState.sourceTexture);\n    gl.deleteTexture(pipelineState.targetTexture);\n    gl.deleteFramebuffer(tempFbo);\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    return pipelineState;\n  }\n\n  /**\n   * Detach event listeners, remove references, and clean up caches.\n   */\n  dispose() {\n    if (this.canvas) {\n      // we are disposing, we don't care about the fact\n      // that the canvas shouldn't be null.\n      // @ts-expect-error disposing\n      this.canvas = null;\n      // @ts-expect-error disposing\n      this.gl = null;\n    }\n    this.clearWebGLCaches();\n  }\n\n  /**\n   * Wipe out WebGL-related caches.\n   */\n  clearWebGLCaches() {\n    this.programCache = {};\n    this.textureCache = {};\n  }\n\n  /**\n   * Create a WebGL texture object.\n   *\n   * Accepts specific dimensions to initialize the texture to or a source image.\n   *\n   * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n   * @param {number} width The width to initialize the texture at.\n   * @param {number} height The height to initialize the texture.\n   * @param {TexImageSource} textureImageSource A source for the texture data.\n   * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n   * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n   * @returns {WebGLTexture}\n   */\n  createTexture(\n    gl: WebGLRenderingContext,\n    width: number,\n    height: number,\n    textureImageSource?: TexImageSource,\n    filter?:\n      | WebGLRenderingContextBase['NEAREST']\n      | WebGLRenderingContextBase['LINEAR']\n  ) {\n    const {\n      NEAREST,\n      TEXTURE_2D,\n      RGBA,\n      UNSIGNED_BYTE,\n      CLAMP_TO_EDGE,\n      TEXTURE_MAG_FILTER,\n      TEXTURE_MIN_FILTER,\n      TEXTURE_WRAP_S,\n      TEXTURE_WRAP_T,\n    } = gl;\n    const texture = gl.createTexture();\n    gl.bindTexture(TEXTURE_2D, texture);\n    gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n    gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n    gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n    gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n    if (textureImageSource) {\n      gl.texImage2D(\n        TEXTURE_2D,\n        0,\n        RGBA,\n        RGBA,\n        UNSIGNED_BYTE,\n        textureImageSource\n      );\n    } else {\n      gl.texImage2D(\n        TEXTURE_2D,\n        0,\n        RGBA,\n        width,\n        height,\n        0,\n        RGBA,\n        UNSIGNED_BYTE,\n        null\n      );\n    }\n    return texture;\n  }\n\n  /**\n   * Can be optionally used to get a texture from the cache array\n   *\n   * If an existing texture is not found, a new texture is created and cached.\n   *\n   * @param {String} uniqueId A cache key to use to find an existing texture.\n   * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n   * texture cache entry if one does not already exist.\n   */\n  getCachedTexture(\n    uniqueId: string,\n    textureImageSource: TexImageSource,\n    filter?:\n      | WebGLRenderingContextBase['NEAREST']\n      | WebGLRenderingContextBase['LINEAR']\n  ): WebGLTexture | null {\n    const { textureCache } = this;\n    if (textureCache[uniqueId]) {\n      return textureCache[uniqueId];\n    } else {\n      const texture = this.createTexture(\n        this.gl,\n        (textureImageSource as HTMLImageElement).width,\n        (textureImageSource as HTMLImageElement).height,\n        textureImageSource,\n        filter\n      );\n      if (texture) {\n        textureCache[uniqueId] = texture;\n      }\n      return texture;\n    }\n  }\n\n  /**\n   * Clear out cached resources related to a source image that has been\n   * filtered previously.\n   *\n   * @param {String} cacheKey The cache key provided when the source image was filtered.\n   */\n  evictCachesForKey(cacheKey: string) {\n    if (this.textureCache[cacheKey]) {\n      this.gl.deleteTexture(this.textureCache[cacheKey]);\n      delete this.textureCache[cacheKey];\n    }\n  }\n\n  /**\n   * Copy an input WebGL canvas on to an output 2D canvas.\n   *\n   * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n   * desired output image appearing in the bottom-left corner of the WebGL canvas.\n   *\n   * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n   * @param {Object} pipelineState The 2D target canvas to copy on to.\n   */\n  copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n    const glCanvas = gl.canvas,\n      targetCanvas = pipelineState.targetCanvas,\n      ctx = targetCanvas.getContext('2d');\n    if (!ctx) {\n      return;\n    }\n    ctx.translate(0, targetCanvas.height); // move it down again\n    ctx.scale(1, -1); // vertical flip\n    // where is my image on the big glcanvas?\n    const sourceY = glCanvas.height - targetCanvas.height;\n    ctx.drawImage(\n      glCanvas,\n      0,\n      sourceY,\n      targetCanvas.width,\n      targetCanvas.height,\n      0,\n      0,\n      targetCanvas.width,\n      targetCanvas.height\n    );\n  }\n\n  /**\n   * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n   * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n   *\n   * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n   * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n   * @param {Object} pipelineState The 2D target canvas to copy on to.\n   */\n  copyGLTo2DPutImageData(\n    this: Required<WebGLFilterBackend>,\n    gl: WebGLRenderingContext,\n    pipelineState: TWebGLPipelineState\n  ) {\n    const targetCanvas = pipelineState.targetCanvas,\n      ctx = targetCanvas.getContext('2d'),\n      dWidth = pipelineState.destinationWidth,\n      dHeight = pipelineState.destinationHeight,\n      numBytes = dWidth * dHeight * 4;\n    if (!ctx) {\n      return;\n    }\n    const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n    const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n    gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n    const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n    ctx.putImageData(imgData, 0, 0);\n  }\n\n  /**\n   * Attempt to extract GPU information strings from a WebGL context.\n   *\n   * Useful information when debugging or blacklisting specific GPUs.\n   *\n   * @returns {Object} A GPU info object with renderer and vendor strings.\n   */\n  captureGPUInfo() {\n    if (this.gpuInfo) {\n      return this.gpuInfo;\n    }\n    const gl = this.gl,\n      gpuInfo = { renderer: '', vendor: '' };\n    if (!gl) {\n      return gpuInfo;\n    }\n    const ext = gl.getExtension('WEBGL_debug_renderer_info');\n    if (ext) {\n      const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n      const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n      if (renderer) {\n        gpuInfo.renderer = renderer.toLowerCase();\n      }\n      if (vendor) {\n        gpuInfo.vendor = vendor.toLowerCase();\n      }\n    }\n    this.gpuInfo = gpuInfo;\n    return gpuInfo;\n  }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n  const targetCanvas = pipelineState.targetCanvas,\n    width = targetCanvas.width,\n    height = targetCanvas.height,\n    dWidth = pipelineState.destinationWidth,\n    dHeight = pipelineState.destinationHeight;\n\n  if (width !== dWidth || height !== dHeight) {\n    targetCanvas.width = dWidth;\n    targetCanvas.height = dHeight;\n  }\n}\n"],"names":["WebGLFilterBackend","constructor","tileSize","config","textureSize","arguments","length","undefined","_defineProperty","Float32Array","setupGLContext","captureGPUInfo","width","height","dispose","createWebGLCanvas","canvas","createCanvasElement","glOptions","alpha","premultipliedAlpha","depth","stencil","antialias","gl","getContext","clearColor","applyFilters","filters","source","targetCanvas","cacheKey","ctx","cachedTexture","getCachedTexture","pipelineState","originalWidth","originalHeight","sourceWidth","sourceHeight","destinationWidth","destinationHeight","context","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","filterBackend","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","forEach","filter","applyTo","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","setTransform","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","putImageData","gpuInfo","renderer","vendor","ext","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","toLowerCase"],"mappings":"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"}