{"version":3,"file":"Canvas2dFilterBackend.mjs","sources":["../../../src/filters/Canvas2dFilterBackend.ts"],"sourcesContent":["/**\n * Canvas 2D filter backend.\n */\nimport type { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TPipelineResources } from './typedefs';\n\nexport class Canvas2dFilterBackend {\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  /**\n   * Apply a set of filters against a source image and draw the filtered output\n   * to the provided destination canvas.\n   *\n   * @param {EnhancedFilter} filters The filter to apply.\n   * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n   * @param {Number} sourceWidth The width of the source input.\n   * @param {Number} sourceHeight The height of the source input.\n   * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n   */\n  applyFilters(\n    filters: BaseFilter<string, Record<string, any>>[],\n    sourceElement: CanvasImageSource,\n    sourceWidth: number,\n    sourceHeight: number,\n    targetCanvas: HTMLCanvasElement,\n  ): T2DPipelineState | void {\n    const ctx = targetCanvas.getContext('2d', {\n      willReadFrequently: true,\n      desynchronized: true,\n    });\n    if (!ctx) {\n      return;\n    }\n    ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n    const imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n    const originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n    const pipelineState: T2DPipelineState = {\n      sourceWidth,\n      sourceHeight,\n      imageData,\n      originalEl: sourceElement,\n      originalImageData,\n      canvasEl: targetCanvas,\n      ctx,\n      filterBackend: this,\n    };\n    filters.forEach((filter) => {\n      filter.applyTo(pipelineState);\n    });\n    const { imageData: imageDataPostFilter } = pipelineState;\n    if (\n      imageDataPostFilter.width !== sourceWidth ||\n      imageDataPostFilter.height !== sourceHeight\n    ) {\n      targetCanvas.width = imageDataPostFilter.width;\n      targetCanvas.height = imageDataPostFilter.height;\n    }\n    ctx.putImageData(imageDataPostFilter, 0, 0);\n    return pipelineState;\n  }\n}\n"],"names":["Canvas2dFilterBackend","constructor","_defineProperty","applyFilters","filters","sourceElement","sourceWidth","sourceHeight","targetCanvas","ctx","getContext","willReadFrequently","desynchronized","drawImage","imageData","getImageData","originalImageData","pipelineState","originalEl","canvasEl","filterBackend","forEach","filter","applyTo","imageDataPostFilter","width","height","putImageData"],"mappings":";;AAAA;AACA;AACA;;AAIO,MAAMA,qBAAqB,CAAC;EAAAC,WAAAA,GAAA;AACjC;AACF;AACA;AACA;AACA;AACA;AACA;IANEC,eAAA,CAAA,IAAA,EAAA,WAAA,EAOgC,EAAE,CAAA;AAAA,EAAA;AAElC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,YAAYA,CACVC,OAAkD,EAClDC,aAAgC,EAChCC,WAAmB,EACnBC,YAAoB,EACpBC,YAA+B,EACN;AACzB,IAAA,MAAMC,GAAG,GAAGD,YAAY,CAACE,UAAU,CAAC,IAAI,EAAE;AACxCC,MAAAA,kBAAkB,EAAE,IAAI;AACxBC,MAAAA,cAAc,EAAE;AAClB,KAAC,CAAC;IACF,IAAI,CAACH,GAAG,EAAE;AACR,MAAA;AACF,IAAA;AACAA,IAAAA,GAAG,CAACI,SAAS,CAACR,aAAa,EAAE,CAAC,EAAE,CAAC,EAAEC,WAAW,EAAEC,YAAY,CAAC;AAC7D,IAAA,MAAMO,SAAS,GAAGL,GAAG,CAACM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAET,WAAW,EAAEC,YAAY,CAAC;AACnE,IAAA,MAAMS,iBAAiB,GAAGP,GAAG,CAACM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAET,WAAW,EAAEC,YAAY,CAAC;AAC3E,IAAA,MAAMU,aAA+B,GAAG;MACtCX,WAAW;MACXC,YAAY;MACZO,SAAS;AACTI,MAAAA,UAAU,EAAEb,aAAa;MACzBW,iBAAiB;AACjBG,MAAAA,QAAQ,EAAEX,YAAY;MACtBC,GAAG;AACHW,MAAAA,aAAa,EAAE;KAChB;AACDhB,IAAAA,OAAO,CAACiB,OAAO,CAAEC,MAAM,IAAK;AAC1BA,MAAAA,MAAM,CAACC,OAAO,CAACN,aAAa,CAAC;AAC/B,IAAA,CAAC,CAAC;IACF,MAAM;AAAEH,MAAAA,SAAS,EAAEU;AAAoB,KAAC,GAAGP,aAAa;IACxD,IACEO,mBAAmB,CAACC,KAAK,KAAKnB,WAAW,IACzCkB,mBAAmB,CAACE,MAAM,KAAKnB,YAAY,EAC3C;AACAC,MAAAA,YAAY,CAACiB,KAAK,GAAGD,mBAAmB,CAACC,KAAK;AAC9CjB,MAAAA,YAAY,CAACkB,MAAM,GAAGF,mBAAmB,CAACE,MAAM;AAClD,IAAA;IACAjB,GAAG,CAACkB,YAAY,CAACH,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3C,IAAA,OAAOP,aAAa;AACtB,EAAA;AACF;;;;"}