{"version":3,"file":"pixi-picture.mjs","sources":["../src/BlendFilter.ts","../src/FlipYFilter.ts","../src/MaskFilter.ts","../src/ShaderParts.ts","../src/Sprite.ts","../src/TilingSprite.ts","../src/FilterState.ts","../src/FilterSystemMixin.ts","../src/index.ts"],"sourcesContent":["import { Filter } from 'pixi.js';\r\n\r\n/**\r\n * This filter uses a backdrop texture to calculate the output colors.\r\n *\r\n * A backdrop filter can use existing colors in the destination framebuffer to calculate the\r\n * output colors. It does not need to rely on in-built {@link PIXI.BLEND_MODES blend modes} to\r\n * do those calculations.\r\n */\r\nexport class BackdropFilter extends Filter\r\n{\r\n    /**\r\n     * The name of the {@link Filter.uniforms uniform} for the backdrop texture.\r\n     *\r\n     * @pixi/picture's does some mixin magic to bind a copy of destination framebuffer to\r\n     * this uniform.\r\n     */\r\n    backdropUniformName: string = null;\r\n\r\n    /** @ignore */\r\n    _backdropActive = false;\r\n\r\n    /** If non-null, @pixi/picture will clear the filter's output framebuffer with this RGBA color. */\r\n    clearColor: Float32Array = null;\r\n}\r\n\r\n/** A shader part for blending source and destination colors. */\r\nexport interface IBlendShaderParts\r\n{\r\n    /**\r\n     * (optional) Code that declares any additional uniforms to be accepted by the {@link BlendFilter}.\r\n     *\r\n     * If you do use this, make sure these uniforms are passed in {@link IBlendShaderParts.uniforms uniforms}.\r\n     */\r\n    uniformCode?: string;\r\n\r\n    /**\r\n     * (optional) Uniforms to pass to the resulting {@link BlendFilter}.\r\n     *\r\n     * Make sure to declare these in {@link IBlendShaderParts.uniformCode uniformCode}.\r\n     */\r\n    uniforms?: { [key: string]: any };\r\n\r\n    /**\r\n     * The blend code that calculates the output color. The following variables are available to\r\n     * this code:\r\n     *\r\n     * | Variable | Type     | Description (colors are usually PMA)       |\r\n     * |----------|----------|--------------------------------------------|\r\n     * | b_src    | vec4     | Source color                               |\r\n     * | b_dst    | vec4     | Destination color                          |\r\n     * | b_res    | vec4     | Output / result color                      |\r\n     */\r\n    blendCode: string;\r\n}\r\n\r\nconst filterFrag = `\r\nvarying vec2 vTextureCoord;\r\n\r\nuniform sampler2D uSampler;\r\nuniform sampler2D uBackdrop;\r\nuniform vec2 uBackdrop_flipY;\r\n\r\n%UNIFORM_CODE%\r\n\r\nvoid main(void)\r\n{\r\n   vec2 backdropCoord = vec2(vTextureCoord.x, uBackdrop_flipY.x + uBackdrop_flipY.y * vTextureCoord.y);\r\n   vec4 b_src = texture2D(uSampler, vTextureCoord);\r\n   vec4 b_dest = texture2D(uBackdrop, backdropCoord);\r\n   vec4 b_res = b_dest;\r\n   \r\n   %BLEND_CODE%\r\n\r\n   gl_FragColor = b_res;\r\n}`;\r\n\r\n/**\r\n * A blend filter is a special kind of {@link BackdropFilter} that is used to implement additional blend modes.\r\n *\r\n * The blend filter takes in a {@link IBlendShaderParts} and integrates that code in its shader template to\r\n * blend the source and destination colors.\r\n *\r\n * The backdrop texture uniform for blend filters is {@code \"uBackdrop\"}.\r\n */\r\nexport class BlendFilter extends BackdropFilter\r\n{\r\n    /** @param shaderParts - The blending code shader part. */\r\n    constructor(shaderParts: IBlendShaderParts)\r\n    {\r\n        let fragCode = filterFrag;\r\n\r\n        fragCode = fragCode.replace('%UNIFORM_CODE%', shaderParts.uniformCode || '');\r\n        fragCode = fragCode.replace('%BLEND_CODE%', shaderParts.blendCode || '');\r\n\r\n        super(undefined, fragCode, shaderParts.uniforms);\r\n\r\n        this.backdropUniformName = 'uBackdrop';\r\n    }\r\n}\r\n","import { Filter } from 'pixi.js';\r\n\r\ntype Dict<T> = {[key:string]: T};\r\n\r\nconst vert = `\r\nattribute vec2 aVertexPosition;\r\n\r\nuniform mat3 projectionMatrix;\r\n\r\nvarying vec2 vTextureCoord;\r\n\r\nuniform vec4 inputSize;\r\nuniform vec4 outputFrame;\r\nuniform vec2 flipY;\r\n\r\nvec4 filterVertexPosition( void )\r\n{\r\n    vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\r\n\r\n    return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\r\n}\r\n\r\nvec2 filterTextureCoord( void )\r\n{\r\n    return aVertexPosition * (outputFrame.zw * inputSize.zw);\r\n}\r\n\r\nvoid main(void)\r\n{\r\n    gl_Position = filterVertexPosition();\r\n    vTextureCoord = filterTextureCoord();\r\n    vTextureCoord.y = flipY.x + flipY.y * vTextureCoord.y;\r\n}\r\n\r\n`;\r\n\r\nexport class FlipYFilter extends Filter\r\n{\r\n    constructor(frag?: string, uniforms?: Dict<any>)\r\n    {\r\n        const uni = uniforms || {};\r\n\r\n        if (!uni.flipY)\r\n        {\r\n            uni.flipY = new Float32Array([0.0, 1.0]);\r\n        }\r\n        super(vert, frag, uni);\r\n    }\r\n}\r\n","import { systems, RenderTexture, Filter, BLEND_MODES, CLEAR_MODES } from 'pixi.js';\r\nimport { BlendFilter } from './BlendFilter';\r\nimport { FlipYFilter } from './FlipYFilter';\r\n\r\n/**\r\n * The RGBA channel for {@link MaskFilter} to use to detect the mask region.\r\n *\r\n * When applying a {@link MaskFilter} to a mask {@link DisplayObject}, the object should render\r\n * into that channel. For example, if using the alpha channel - the mask should render with alpha\r\n * 1.0 where-ever the mask region is.\r\n *\r\n * @property {number} RED\r\n * @property {number} GREEN\r\n * @property {number} BLUE\r\n * @property {number} ALPHA\r\n */\r\nexport enum MASK_CHANNEL\r\n    {\r\n    RED = 0,\r\n    GREEN,\r\n    BLUE,\r\n    ALPHA\r\n}\r\n\r\n/** The mask configuration for {@link MaskFilter}. */\r\nexport class MaskConfig\r\n{\r\n    /**\r\n     * @param maskBefore - If true, {@link MaskFilter} will mask the input of the applied filter instead of\r\n     * \tthe output. In the case of a blur filter, this would cause cause the boundaries of the mask to soften\r\n     * \tas the blur would apply to the masked region instead of being clipped into it.\r\n     * @param channel - The mask channel indicating which pixels are in the mask region.\r\n     */\r\n    constructor(public maskBefore = false, channel: MASK_CHANNEL = MASK_CHANNEL.ALPHA)\r\n    {\r\n        this.uniforms.uChannel[channel] = 1.0;\r\n    }\r\n\r\n    /** @ignore */\r\n    uniformCode = 'uniform vec4 uChannel;';\r\n    /** @ignore */\r\n    uniforms: any = {\r\n        uChannel: new Float32Array([0, 0, 0, 0]), // shared uniform for all those shaders? ok, just set it before apply\r\n    };\r\n    /** @ignore */\r\n    blendCode = `b_res = dot(b_src, uChannel) * b_dest;`;\r\n\r\n    /**\r\n     * Flag that indicates the applied filter is Y-symmetric.\r\n     *\r\n     * {@link MaskFilter} will optimize rendering by not flipping the screen backdrop before passing it to the\r\n     * blend filter for Y-symmetric filters.\r\n     *\r\n     * A filter is Y-symmetric if giving it an inverted input and then inverting the output is equivalent\r\n     * to giving it an upright input.\r\n     */\r\n    safeFlipY = false;\r\n}\r\n\r\nconst tmpArray = new Float32Array([0, 1]);\r\n\r\n/**\r\n * A higher-order filter that applies the output of a filter to a masked region of the destination framebuffer.\r\n *\r\n * The masked region is defined by where-ever the target {@link DisplayObject} renders to in the world. For\r\n * example, if you draw a rectangle in the world and apply a masked-blur filter, the blur filter will apply\r\n * to pixels in the backdrop within the rectangle. The {@link DisplayObject} must render by drawing\r\n * a solid RGBA channel (see {@link MaskConfig}'s constructor).\r\n */\r\nexport class MaskFilter extends BlendFilter\r\n{\r\n    /**\r\n     * @param baseFilter - The filter being applied.\r\n     * @param config - The configuration for the mask.\r\n     */\r\n    constructor(public baseFilter: Filter, public config: MaskConfig = new MaskConfig())\r\n    {\r\n        super(config);\r\n        this.padding = baseFilter.padding;\r\n        this.safeFlipY = config.safeFlipY;\r\n    }\r\n\r\n    /** @ignore */\r\n    static _flipYFilter: FlipYFilter = null;\r\n\r\n    /**\r\n     * if base filter is not sensitive to flipping Y axis, you can turn this ON and save a temporary texture bind / drawcall\r\n     */\r\n    safeFlipY: boolean;\r\n\r\n    apply(filterManager: systems.FilterSystem, input: RenderTexture, output: RenderTexture,\r\n        clearMode: CLEAR_MODES): void\r\n    {\r\n        const target = filterManager.getFilterTexture(input);\r\n\r\n        if (this.config.maskBefore)\r\n        {\r\n            const { blendMode } = this.state;\r\n\r\n            this.state.blendMode = BLEND_MODES.NONE;\r\n            filterManager.applyFilter(this, input, target, CLEAR_MODES.YES);\r\n            this.baseFilter.blendMode = blendMode;\r\n            this.baseFilter.apply(filterManager, target, output, clearMode);\r\n            this.state.blendMode = blendMode;\r\n        }\r\n        else\r\n        {\r\n            const { uBackdrop, uBackdrop_flipY } = this.uniforms;\r\n\r\n            if (uBackdrop_flipY[1] > 0 || this.safeFlipY)\r\n            {\r\n                this.baseFilter.apply(filterManager, uBackdrop, target, CLEAR_MODES.YES);\r\n            }\r\n            else\r\n            {\r\n                // in case there was a flip and base filter is not flipY-safe, we have to use extra flip operation\r\n                const targetFlip = filterManager.getFilterTexture(input);\r\n\r\n                if (!MaskFilter._flipYFilter)\r\n                {\r\n                    MaskFilter._flipYFilter = new FlipYFilter();\r\n                }\r\n                MaskFilter._flipYFilter.uniforms.flipY[0] = uBackdrop_flipY[0];\r\n                MaskFilter._flipYFilter.uniforms.flipY[1] = uBackdrop_flipY[1];\r\n                MaskFilter._flipYFilter.apply(filterManager, uBackdrop, targetFlip, CLEAR_MODES.YES);\r\n                this.baseFilter.apply(filterManager, targetFlip, target, CLEAR_MODES.YES);\r\n                filterManager.returnFilterTexture(targetFlip);\r\n                this.uniforms.uBackdrop_flipY = tmpArray;\r\n            }\r\n            this.uniforms.uBackdrop = target;\r\n            filterManager.applyFilter(this, input, output, clearMode);\r\n            this.uniforms.uBackdrop = uBackdrop;\r\n            this.uniforms.uBackdrop_flipY = uBackdrop_flipY;\r\n        }\r\n        filterManager.returnFilterTexture(target);\r\n    }\r\n}\r\n","import { BlendFilter } from './BlendFilter';\r\nimport { BLEND_MODES } from 'pixi.js';\r\n\r\nexport const NPM_BLEND\r\n    = `if (b_src.a == 0.0) {\r\n  gl_FragColor = vec4(0, 0, 0, 0);\r\n  return;\r\n}\r\nif (b_dest.a == 0.0) {\r\n  gl_FragColor = b_src;\r\n  return;\r\n}\r\nvec3 Cb = b_dest.rgb / b_dest.a;\r\nvec3 Cs = b_src.rgb / b_src.a;\r\n%NPM_BLEND%\r\n// SWAP SRC WITH NPM BLEND\r\nvec3 new_src = (1.0 - b_dest.a) * Cs + b_dest.a * B;\r\n// PORTER DUFF PMA COMPOSITION MODE\r\nb_res.a = b_src.a + b_dest.a * (1.0-b_src.a);\r\nb_res.rgb = b_src.a * new_src + (1.0 - b_src.a) * b_dest.rgb;\r\n`;\r\n\r\n// reverse hardlight\r\nexport const OVERLAY_PART\r\n    = `vec3 multiply = Cb * Cs * 2.0;\r\nvec3 Cb2 = Cb * 2.0 - 1.0;\r\nvec3 screen = Cb2 + Cs - Cb2 * Cs;\r\nvec3 B;\r\nif (Cb.r <= 0.5) {\r\n  B.r = multiply.r;\r\n} else {\r\n  B.r = screen.r;\r\n}\r\nif (Cb.g <= 0.5) {\r\n  B.g = multiply.g;\r\n} else {\r\n  B.g = screen.g;\r\n}\r\nif (Cb.b <= 0.5) {\r\n  B.b = multiply.b;\r\n} else {\r\n  B.b = screen.b;\r\n}\r\n`;\r\n\r\nexport const HARDLIGHT_PART\r\n    = `vec3 multiply = Cb * Cs * 2.0;\r\nvec3 Cs2 = Cs * 2.0 - 1.0;\r\nvec3 screen = Cb + Cs2 - Cb * Cs2;\r\nvec3 B;\r\nif (Cs.r <= 0.5) {\r\n  B.r = multiply.r;\r\n} else {\r\n  B.r = screen.r;\r\n}\r\nif (Cs.g <= 0.5) {\r\n  B.g = multiply.g;\r\n} else {\r\n  B.g = screen.g;\r\n}\r\nif (Cs.b <= 0.5) {\r\n  B.b = multiply.b;\r\n} else {\r\n  B.b = screen.b;\r\n}\r\n`;\r\n\r\nexport const SOFTLIGHT_PART\r\n    = `vec3 first = Cb - (1.0 - 2.0 * Cs) * Cb * (1.0 - Cb);\r\nvec3 B;\r\nvec3 D;\r\nif (Cs.r <= 0.5)\r\n{\r\n  B.r = first.r;\r\n}\r\nelse\r\n{\r\n  if (Cb.r <= 0.25)\r\n  {\r\n    D.r = ((16.0 * Cb.r - 12.0) * Cb.r + 4.0) * Cb.r;    \r\n  }\r\n  else\r\n  {\r\n    D.r = sqrt(Cb.r);\r\n  }\r\n  B.r = Cb.r + (2.0 * Cs.r - 1.0) * (D.r - Cb.r);\r\n}\r\nif (Cs.g <= 0.5)\r\n{\r\n  B.g = first.g;\r\n}\r\nelse\r\n{\r\n  if (Cb.g <= 0.25)\r\n  {\r\n    D.g = ((16.0 * Cb.g - 12.0) * Cb.g + 4.0) * Cb.g;    \r\n  }\r\n  else\r\n  {\r\n    D.g = sqrt(Cb.g);\r\n  }\r\n  B.g = Cb.g + (2.0 * Cs.g - 1.0) * (D.g - Cb.g);\r\n}\r\nif (Cs.b <= 0.5)\r\n{\r\n  B.b = first.b;\r\n}\r\nelse\r\n{\r\n  if (Cb.b <= 0.25)\r\n  {\r\n    D.b = ((16.0 * Cb.b - 12.0) * Cb.b + 4.0) * Cb.b;    \r\n  }\r\n  else\r\n  {\r\n    D.b = sqrt(Cb.b);\r\n  }\r\n  B.b = Cb.b + (2.0 * Cs.b - 1.0) * (D.b - Cb.b);\r\n}\r\n`;\r\n\r\nexport const MULTIPLY_PART\r\n    = `vec3 B = Cs * Cb;\r\n`;\r\nexport const OVERLAY_FULL = NPM_BLEND.replace(`%NPM_BLEND%`, OVERLAY_PART);\r\nexport const HARDLIGHT_FULL = NPM_BLEND.replace(`%NPM_BLEND%`, HARDLIGHT_PART);\r\nexport const SOFTLIGHT_FULL = NPM_BLEND.replace(`%NPM_BLEND%`, SOFTLIGHT_PART);\r\nexport const MULTIPLY_FULL = NPM_BLEND.replace(`%NPM_BLEND%`, MULTIPLY_PART);\r\n\r\n/**\r\n * Maps {@link PIXI.BLEND_MODES blend modes} to {@link IBlendShaderParts.blendCode blend code}.\r\n *\r\n * This library provides blending code for {@link BLEND_MODES.MULTIPLY}, {@link BLEND_MODES.OVERLAY},\r\n * {@link BLEND_MODES.HARD_LIGHT}, {@link BLEND_MODES.SOFT_LIGHT}. If you add blend modes to the\r\n * {@link PIXI.BLEND_MODES} enumeration, you can implement them by augmenting this map with your shader\r\n * code.\r\n *\r\n * @type {object<string, string>}\r\n */\r\nexport const blendFullArray: Array<string> = [];\r\n\r\nblendFullArray[BLEND_MODES.MULTIPLY] = MULTIPLY_FULL;\r\nblendFullArray[BLEND_MODES.OVERLAY] = OVERLAY_FULL;\r\nblendFullArray[BLEND_MODES.HARD_LIGHT] = HARDLIGHT_FULL;\r\nblendFullArray[BLEND_MODES.SOFT_LIGHT] = SOFTLIGHT_FULL;\r\n\r\nconst filterCache: Array<BlendFilter> = [];\r\nconst filterCacheArray: Array<Array<BlendFilter>> = [];\r\n\r\n/**\r\n * Get a memoized {@link BlendFilter} for the passed blend mode. This expects {@link blendFullArray}\r\n * to have the blending code beforehand.\r\n *\r\n * If you changed the blending code in {@link blendFullArray}, this won't create a new blend filter\r\n * due to memoization!\r\n *\r\n * @param blendMode - The blend mode desired.\r\n */\r\nexport function getBlendFilter(blendMode: BLEND_MODES)\r\n{\r\n    if (!blendFullArray[blendMode])\r\n    {\r\n        return null;\r\n    }\r\n    if (!filterCache[blendMode])\r\n    {\r\n        filterCache[blendMode] = new BlendFilter({ blendCode: blendFullArray[blendMode] });\r\n    }\r\n\r\n    return filterCache[blendMode];\r\n}\r\n\r\n/**\r\n * Similar to {@link getBlendFilter}, but wraps the filter in a memoized array.\r\n *\r\n * This is useful when assigning {@link PIXI.Container.filters} as a new array will not be created\r\n * per re-assigment.\r\n *\r\n * ```\r\n * import { getBlendFilter, getBlendFilterArray } from '@pixi/picture';\r\n *\r\n * // Don't do\r\n * displayObject.filters = [getBlendFilter(BLEND_MODES.OVERLAY)];\r\n *\r\n * // Do\r\n * displayObject.filters = getBlendFilterArray(BLEND_MODES.OVERLAY);\r\n * ```\r\n *\r\n * @param blendMode - The blend mode desired.\r\n */\r\nexport function getBlendFilterArray(blendMode: BLEND_MODES)\r\n{\r\n    if (!blendFullArray[blendMode])\r\n    {\r\n        return null;\r\n    }\r\n    if (!filterCacheArray[blendMode])\r\n    {\r\n        filterCacheArray[blendMode] = [getBlendFilter(blendMode)];\r\n    }\r\n\r\n    return filterCacheArray[blendMode];\r\n}\r\n","import { Sprite as SpriteBase, Renderer, BLEND_MODES } from 'pixi.js';\r\nimport { getBlendFilterArray } from './ShaderParts';\r\n\r\nexport class Sprite extends SpriteBase\r\n{\r\n    _render(renderer: Renderer): void\r\n    {\r\n        const texture = (this as any)._texture;\r\n\r\n        if (!texture || !texture.valid)\r\n        {\r\n            return;\r\n        }\r\n\r\n        const blendFilterArray = getBlendFilterArray(this.blendMode);\r\n        const cacheBlend = this.blendMode;\r\n\r\n        if (blendFilterArray)\r\n        {\r\n            renderer.batch.flush();\r\n            if (!(renderer.filter as any).pushWithCheck(this, blendFilterArray))\r\n            {\r\n                return;\r\n            }\r\n            this.blendMode = BLEND_MODES.NORMAL;\r\n        }\r\n\r\n        this.calculateVertices();\r\n        renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);\r\n        renderer.plugins[this.pluginName].render(this);\r\n\r\n        if (blendFilterArray)\r\n        {\r\n            renderer.batch.flush();\r\n            renderer.filter.pop();\r\n            this.blendMode = cacheBlend;\r\n        }\r\n    }\r\n}\r\n","import { TilingSprite as TilingSpriteBase, Renderer } from 'pixi.js';\r\nimport { getBlendFilterArray } from './ShaderParts';\r\nimport { IPictureFilterSystem } from './FilterSystemMixin';\r\n\r\nexport class TilingSprite extends TilingSpriteBase\r\n{\r\n    _render(renderer: Renderer): void\r\n    {\r\n        // tweak our texture temporarily..\r\n        const texture = (this as any)._texture;\r\n\r\n        if (!texture || !texture.valid)\r\n        {\r\n            return;\r\n        }\r\n\r\n        const blendFilterArray = getBlendFilterArray(this.blendMode);\r\n\r\n        if (blendFilterArray)\r\n        {\r\n            renderer.batch.flush();\r\n            if (!(renderer.filter as any as IPictureFilterSystem).pushWithCheck(this, blendFilterArray))\r\n            {\r\n                return;\r\n            }\r\n        }\r\n\r\n        this.tileTransform.updateLocalTransform();\r\n        this.uvMatrix.update();\r\n\r\n        renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);\r\n        renderer.plugins[this.pluginName].render(this);\r\n\r\n        if (blendFilterArray)\r\n        {\r\n            renderer.batch.flush();\r\n            renderer.filter.pop();\r\n        }\r\n    }\r\n}\r\n","import { RenderTexture, Filter, Rectangle } from 'pixi.js';\r\n\r\n/**\r\n * Pixi-v5 does not export those things, we copied it\r\n */\r\n\r\nexport interface IFilterTarget\r\n{\r\n    filterArea: Rectangle;\r\n    getBounds(skipUpdate?: boolean): Rectangle;\r\n}\r\n\r\nexport class FilterState\r\n{\r\n    renderTexture: RenderTexture;\r\n    target: IFilterTarget;\r\n    legacy: boolean;\r\n    resolution: number;\r\n    sourceFrame: Rectangle;\r\n    destinationFrame: Rectangle;\r\n    filters: Array<Filter>;\r\n\r\n    constructor()\r\n    {\r\n        this.renderTexture = null;\r\n\r\n        /**\r\n         * Target of the filters\r\n         * We store for case when custom filter wants to know the element it was applied on\r\n         * @member {PIXI.DisplayObject}\r\n         * @private\r\n         */\r\n        this.target = null;\r\n\r\n        /**\r\n         * Compatibility with PixiJS v4 filters\r\n         * @member {boolean}\r\n         * @default false\r\n         * @private\r\n         */\r\n        this.legacy = false;\r\n\r\n        /**\r\n         * Resolution of filters\r\n         * @member {number}\r\n         * @default 1\r\n         * @private\r\n         */\r\n        this.resolution = 1;\r\n\r\n        // next three fields are created only for root\r\n        // re-assigned for everything else\r\n\r\n        /**\r\n         * Source frame\r\n         * @member {PIXI.Rectangle}\r\n         * @private\r\n         */\r\n        this.sourceFrame = new Rectangle();\r\n\r\n        /**\r\n         * Destination frame\r\n         * @member {PIXI.Rectangle}\r\n         * @private\r\n         */\r\n        this.destinationFrame = new Rectangle();\r\n\r\n        /**\r\n         * Collection of filters\r\n         * @member {PIXI.Filter[]}\r\n         * @private\r\n         */\r\n        this.filters = [];\r\n    }\r\n\r\n    /**\r\n     * clears the state\r\n     * @private\r\n     */\r\n    clear(): void\r\n    {\r\n        this.target = null;\r\n        this.filters = null;\r\n        this.renderTexture = null;\r\n    }\r\n}\n","import { systems, BaseTexture, RenderTexture, Filter, CLEAR_MODES,\r\n    Matrix, Rectangle, DisplayObject } from 'pixi.js';\r\nimport { BackdropFilter } from './BlendFilter';\r\nimport { FilterState } from './FilterState';\r\n\r\nexport interface IPictureFilterSystem extends systems.FilterSystem\r\n{\r\n    prepareBackdrop(sourceFrame: Rectangle, flipY: Float32Array): RenderTexture;\r\n\r\n    pushWithCheck(target: DisplayObject, filters: Array<Filter>, checkEmptyBounds?: boolean): boolean;\r\n}\r\n\r\nexport interface IPictureTextureSystem extends systems.TextureSystem\r\n{\r\n    bindForceLocation(texture: BaseTexture, location: number): void;\r\n}\r\n\r\nfunction containsRect(rectOut: Rectangle, rectIn: Rectangle): boolean\r\n{\r\n    const r1 = rectIn.x + rectIn.width;\r\n    const b1 = rectIn.y + rectIn.height;\r\n    const r2 = rectOut.x + rectOut.width;\r\n    const b2 = rectOut.y + rectOut.height;\r\n\r\n    return (rectIn.x >= rectOut.x)\r\n        && (rectIn.x <= r2)\r\n        && (rectIn.y >= rectOut.y)\r\n        && (rectIn.y <= b2)\r\n        && (r1 >= rectOut.x)\r\n        && (r1 <= r2)\r\n        && (b1 >= rectOut.y)\r\n        && (b1 <= b2);\r\n}\r\n\r\nfunction bindForceLocation(this: IPictureTextureSystem, texture: BaseTexture, location = 0)\r\n{\r\n    const thisAny = this as any;\r\n    const { gl } = thisAny;\r\n\r\n    if (this.currentLocation !== location)\r\n    {\r\n        thisAny.currentLocation = location;\r\n        gl.activeTexture(gl.TEXTURE0 + location);\r\n    }\r\n    this.bind(texture, location);\r\n}\r\n\r\nfunction pushWithCheck(this: IPictureFilterSystem,\r\n    target: DisplayObject, filters: Array<BackdropFilter>, checkEmptyBounds = true)\r\n{\r\n    const renderer = this.renderer;\r\n    const filterStack = this.defaultFilterStack;\r\n    const state = this.statePool.pop() || new FilterState();\r\n\r\n    let resolution = filters[0].resolution;\r\n    let padding = filters[0].padding;\r\n    let autoFit = filters[0].autoFit;\r\n    let legacy = filters[0].legacy;\r\n\r\n    for (let i = 1; i < filters.length; i++)\r\n    {\r\n        const filter =  filters[i];\r\n\r\n        // lets use the lowest resolution..\r\n        resolution = Math.min(resolution, filter.resolution);\r\n        // figure out the padding required for filters\r\n        padding = this.useMaxPadding\r\n            // old behavior: use largest amount of padding!\r\n            ? Math.max(padding, filter.padding)\r\n            // new behavior: sum the padding\r\n            : padding + filter.padding;\r\n        // only auto fit if all filters are autofit\r\n        autoFit = autoFit && filter.autoFit;\r\n\r\n        legacy = legacy || filter.legacy;\r\n    }\r\n\r\n    if (filterStack.length === 1)\r\n    {\r\n        this.defaultFilterStack[0].renderTexture = renderer.renderTexture.current;\r\n    }\r\n\r\n    filterStack.push(state);\r\n\r\n    state.resolution = resolution;\r\n\r\n    state.legacy = legacy;\r\n\r\n    state.target = target;\r\n\r\n    state.sourceFrame.copyFrom(target.filterArea || target.getBounds(true));\r\n\r\n    state.sourceFrame.pad(padding);\r\n    let canUseBackdrop = true;\r\n\r\n    if (autoFit)\r\n    {\r\n        state.sourceFrame.fit(this.renderer.renderTexture.sourceFrame);\r\n    }\r\n    else\r\n    {\r\n        canUseBackdrop = containsRect(this.renderer.renderTexture.sourceFrame, state.sourceFrame);\r\n    }\r\n    if (checkEmptyBounds && state.sourceFrame.width <= 1 && state.sourceFrame.height <= 1)\r\n    {\r\n        filterStack.pop();\r\n        state.clear();\r\n        this.statePool.push(state);\r\n\r\n        return false;\r\n    }\r\n\r\n    // round to whole number based on resolution\r\n    state.sourceFrame.ceil(resolution);\r\n\r\n    if (canUseBackdrop)\r\n    {\r\n        let backdrop = null;\r\n        let backdropFlip = null;\r\n\r\n        for (let i = 0; i < filters.length; i++)\r\n        {\r\n            const bName = filters[i].backdropUniformName;\r\n\r\n            if (bName)\r\n            {\r\n                const { uniforms } = filters[i];\r\n\r\n                if (!uniforms[`${bName}_flipY`])\r\n                {\r\n                    uniforms[`${bName}_flipY`] = new Float32Array([0.0, 1.0]);\r\n                }\r\n                const flip = uniforms[`${bName}_flipY`];\r\n\r\n                if (backdrop === null)\r\n                {\r\n                    backdrop = this.prepareBackdrop(state.sourceFrame, flip);\r\n                    backdropFlip = flip;\r\n                }\r\n                else\r\n                {\r\n                    flip[0] = backdropFlip[0];\r\n                    flip[1] = backdropFlip[1];\r\n                }\r\n\r\n                uniforms[bName] = backdrop;\r\n                if (backdrop)\r\n                {\r\n                    filters[i]._backdropActive = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (backdrop)\r\n        {\r\n            resolution = state.resolution = backdrop.resolution;\r\n        }\r\n    }\r\n\r\n    state.renderTexture = this.getOptimalFilterTexture(state.sourceFrame.width, state.sourceFrame.height, resolution);\r\n    state.filters = filters;\r\n\r\n    state.destinationFrame.width = state.renderTexture.width;\r\n    state.destinationFrame.height = state.renderTexture.height;\r\n\r\n    const destinationFrame = this.tempRect;\r\n\r\n    destinationFrame.width = state.sourceFrame.width;\r\n    destinationFrame.height = state.sourceFrame.height;\r\n\r\n    state.renderTexture.filterFrame = state.sourceFrame;\r\n\r\n    renderer.renderTexture.bind(state.renderTexture, state.sourceFrame, destinationFrame);\r\n    renderer.renderTexture.clear();\r\n\r\n    const cc = filters[filters.length - 1].clearColor as any;\r\n\r\n    if (cc)\r\n    {\r\n        // take clear color from filter, it helps for advanced DisplacementFilter\r\n        renderer.framebuffer.clear(cc[0], cc[1], cc[2], cc[3]);\r\n    }\r\n    else\r\n    {\r\n        renderer.framebuffer.clear(0, 0, 0, 0);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nfunction push(this: IPictureFilterSystem,\r\n    target: DisplayObject, filters: Array<Filter>)\r\n{\r\n    return this.pushWithCheck(target, filters, false);\r\n}\r\n\r\nfunction pop(this: IPictureFilterSystem)\r\n{\r\n    const filterStack = this.defaultFilterStack;\r\n    const state = filterStack.pop();\r\n    const filters = state.filters as Array<BackdropFilter>;\r\n\r\n    this.activeState = state;\r\n\r\n    const globalUniforms = this.globalUniforms.uniforms;\r\n\r\n    globalUniforms.outputFrame = state.sourceFrame;\r\n    globalUniforms.resolution = state.resolution;\r\n\r\n    const inputSize = globalUniforms.inputSize;\r\n    const inputPixel = globalUniforms.inputPixel;\r\n    const inputClamp = globalUniforms.inputClamp;\r\n\r\n    inputSize[0] = state.destinationFrame.width;\r\n    inputSize[1] = state.destinationFrame.height;\r\n    inputSize[2] = 1.0 / inputSize[0];\r\n    inputSize[3] = 1.0 / inputSize[1];\r\n\r\n    inputPixel[0] = inputSize[0] * state.resolution;\r\n    inputPixel[1] = inputSize[1] * state.resolution;\r\n    inputPixel[2] = 1.0 / inputPixel[0];\r\n    inputPixel[3] = 1.0 / inputPixel[1];\r\n\r\n    inputClamp[0] = 0.5 * inputPixel[2];\r\n    inputClamp[1] = 0.5 * inputPixel[3];\r\n    inputClamp[2] = (state.sourceFrame.width * inputSize[2]) - (0.5 * inputPixel[2]);\r\n    inputClamp[3] = (state.sourceFrame.height * inputSize[3]) - (0.5 * inputPixel[3]);\r\n\r\n    // only update the rect if its legacy..\r\n    if (state.legacy)\r\n    {\r\n        const filterArea = globalUniforms.filterArea;\r\n\r\n        filterArea[0] = state.destinationFrame.width;\r\n        filterArea[1] = state.destinationFrame.height;\r\n        filterArea[2] = state.sourceFrame.x;\r\n        filterArea[3] = state.sourceFrame.y;\r\n\r\n        globalUniforms.filterClamp = globalUniforms.inputClamp;\r\n    }\r\n\r\n    (this.globalUniforms as any).update();\r\n\r\n    const lastState = filterStack[filterStack.length - 1];\r\n\r\n    if (state.renderTexture.framebuffer.multisample > 1)\r\n    {\r\n        this.renderer.framebuffer.blit();\r\n    }\r\n\r\n    if (filters.length === 1)\r\n    {\r\n        filters[0].apply(this, state.renderTexture, lastState.renderTexture, CLEAR_MODES.BLEND, state);\r\n\r\n        this.returnFilterTexture(state.renderTexture);\r\n    }\r\n    else\r\n    {\r\n        let flip = state.renderTexture;\r\n        let flop = this.getOptimalFilterTexture(\r\n            flip.width,\r\n            flip.height,\r\n            state.resolution\r\n        );\r\n\r\n        (flop as any).filterFrame = flip.filterFrame;\r\n\r\n        let i = 0;\r\n\r\n        for (i = 0; i < filters.length - 1; ++i)\r\n        {\r\n            filters[i].apply(this, flip, flop, CLEAR_MODES.CLEAR, state);\r\n\r\n            const t = flip;\r\n\r\n            flip = flop;\r\n            flop = t;\r\n        }\r\n\r\n        filters[i].apply(this, flip, lastState.renderTexture, CLEAR_MODES.BLEND, state);\r\n\r\n        this.returnFilterTexture(flip);\r\n        this.returnFilterTexture(flop);\r\n    }\r\n\r\n    // release the backdrop!\r\n    let backdropFree = false;\r\n\r\n    for (let i = 0; i < filters.length; i++)\r\n    {\r\n        if (filters[i]._backdropActive)\r\n        {\r\n            const bName = filters[i].backdropUniformName;\r\n\r\n            if (!backdropFree)\r\n            {\r\n                this.returnFilterTexture(filters[i].uniforms[bName]);\r\n                backdropFree = true;\r\n            }\r\n            filters[i].uniforms[bName] = null;\r\n            filters[i]._backdropActive = false;\r\n        }\r\n    }\r\n\r\n    state.clear();\r\n    this.statePool.push(state);\r\n}\r\n\r\nlet hadBackbufferError = false;\r\n\r\n/**\r\n * Takes a part of current render target corresponding to bounds\r\n * fits sourceFrame to current render target frame to evade problems\r\n */\r\nfunction prepareBackdrop(bounds: Rectangle, flipY: Float32Array): RenderTexture\r\n{\r\n    const renderer = this.renderer;\r\n    const renderTarget = renderer.renderTexture.current;\r\n    const fr = this.renderer.renderTexture.sourceFrame;\r\n    const tf = renderer.projection.transform || Matrix.IDENTITY;\r\n\r\n    // TODO: take non-standart sourceFrame/destinationFrame into account, all according to ShukantPal refactoring\r\n\r\n    let resolution = 1;\r\n\r\n    if (renderTarget)\r\n    {\r\n        resolution = renderTarget.baseTexture.resolution;\r\n        flipY[1] = 1.0;\r\n    }\r\n    else\r\n    {\r\n        if (!this.renderer.transparent)\r\n        {\r\n            if (!hadBackbufferError)\r\n            {\r\n                hadBackbufferError = true;\r\n                console.warn('pixi-picture: you are trying to use Blend Filter on main framebuffer!');\r\n                console.warn('pixi-picture: please set transparent=true in renderer creation params');\r\n            }\r\n\r\n            return null;\r\n        }\r\n        resolution = renderer.resolution;\r\n        flipY[1] = -1.0;\r\n    }\r\n\r\n    // bounds.fit(fr);\r\n\r\n    const x = Math.round((bounds.x - fr.x + tf.tx) * resolution);\r\n    const dy = bounds.y - fr.y + tf.ty;\r\n    const y = Math.round((flipY[1] < 0.0 ? fr.height - (dy + bounds.height) : dy) * resolution);\r\n    const w = Math.round(bounds.width * resolution);\r\n    const h = Math.round(bounds.height * resolution);\r\n\r\n    const gl = renderer.gl;\r\n    const rt = this.getOptimalFilterTexture(w, h, 1);\r\n\r\n    if (flipY[1] < 0)\r\n    {\r\n        flipY[0] = h / rt.height;\r\n    }\r\n\r\n    (rt as any).filterFrame = fr;\r\n    rt.setResolution(resolution);\r\n    renderer.texture.bindForceLocation(rt.baseTexture, 0);\r\n    gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x, y, w, h);\r\n\r\n    return rt;\r\n}\r\n\r\nexport function applyMixins()\r\n{\r\n    (systems.TextureSystem as any).prototype.bindForceLocation = bindForceLocation;\r\n    (systems.FilterSystem as any).prototype.push = push;\r\n    (systems.FilterSystem as any).prototype.pushWithCheck = pushWithCheck as any;\r\n    (systems.FilterSystem as any).prototype.pop = pop;\r\n    (systems.FilterSystem as any).prototype.prepareBackdrop = prepareBackdrop;\r\n}\r\n","export * from './BlendFilter';\r\nexport * from './FlipYFilter';\r\nexport * from './MaskFilter';\r\nexport * from './ShaderParts';\r\nexport * from './Sprite';\r\nexport * from './TilingSprite';\r\nexport * from './FilterSystemMixin';\r\nimport { applyMixins } from './FilterSystemMixin';\r\n\r\napplyMixins();\r\n"],"names":["BackdropFilter","Filter","filterFrag","BlendFilter","shaderParts","fragCode","vert","FlipYFilter","frag","uniforms","uni","MASK_CHANNEL","i","MaskConfig","maskBefore","channel","tmpArray","_MaskFilter","baseFilter","config","filterManager","input","output","clearMode","target","blendMode","BLEND_MODES","CLEAR_MODES","uBackdrop","uBackdrop_flipY","targetFlip","MaskFilter","NPM_BLEND","OVERLAY_PART","HARDLIGHT_PART","SOFTLIGHT_PART","MULTIPLY_PART","OVERLAY_FULL","HARDLIGHT_FULL","SOFTLIGHT_FULL","MULTIPLY_FULL","blendFullArray","filterCache","filterCacheArray","getBlendFilter","getBlendFilterArray","Sprite","SpriteBase","renderer","texture","blendFilterArray","cacheBlend","TilingSprite","TilingSpriteBase","FilterState","Rectangle","containsRect","rectOut","rectIn","r1","b1","r2","b2","bindForceLocation","location","thisAny","gl","pushWithCheck","filters","checkEmptyBounds","filterStack","state","resolution","padding","autoFit","legacy","filter","canUseBackdrop","backdrop","backdropFlip","bName","flip","destinationFrame","cc","push","pop","globalUniforms","inputSize","inputPixel","inputClamp","filterArea","lastState","flop","t","backdropFree","hadBackbufferError","prepareBackdrop","bounds","flipY","renderTarget","fr","tf","Matrix","x","dy","y","w","h","rt","applyMixins","systems"],"mappings":"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"}