{"version":3,"file":"canvasUtils.mjs","sources":["../src/canvasUtils.ts"],"sourcesContent":["import { settings, utils } from 'pixijs/core';\nimport { canUseNewCanvasBlendModes } from './utils/canUseNewCanvasBlendModes';\n\nimport type { ICanvas, Texture } from 'pixijs/core';\n\n/**\n * Utility methods for Sprite/Texture tinting.\n *\n * Tinting with the CanvasRenderer involves creating a new canvas to use as a texture,\n * so be aware of the performance implications.\n * @namespace PIXI.canvasUtils\n * @memberof PIXI\n */\nexport const canvasUtils = {\n    canvas: null as ICanvas,\n\n    /**\n     * Basically this method just needs a sprite and a color and tints the sprite with the given color.\n     * @memberof PIXI.canvasUtils\n     * @param {PIXI.Sprite} sprite - the sprite to tint\n     * @param sprite.texture\n     * @param {number} color - the color to use to tint the sprite with\n     * @returns {ICanvas|HTMLImageElement} The tinted canvas\n     */\n    getTintedCanvas: (sprite: { texture: Texture }, color: number): ICanvas | HTMLImageElement =>\n    {\n        const texture = sprite.texture;\n\n        color = canvasUtils.roundColor(color);\n\n        const stringColor = `#${(`00000${(color | 0).toString(16)}`).slice(-6)}`;\n\n        texture.tintCache = texture.tintCache || {};\n\n        const cachedCanvas = texture.tintCache[stringColor];\n\n        let canvas: ICanvas;\n\n        if (cachedCanvas)\n        {\n            if (cachedCanvas.tintId === texture._updateID)\n            {\n                return texture.tintCache[stringColor];\n            }\n\n            canvas = texture.tintCache[stringColor] as ICanvas;\n        }\n        else\n        {\n            canvas = settings.ADAPTER.createCanvas();\n        }\n\n        canvasUtils.tintMethod(texture, color, canvas);\n\n        canvas.tintId = texture._updateID;\n\n        // Convert tint to image only if ICanvas.toDataURL exists (e.g. OffscreenCanvas don't have toDataURL)\n        if (canvasUtils.convertTintToImage && canvas.toDataURL !== undefined)\n        {\n            // is this better?\n            const tintImage = new Image();\n\n            tintImage.src = canvas.toDataURL();\n\n            texture.tintCache[stringColor] = tintImage;\n        }\n        else\n        {\n            texture.tintCache[stringColor] = canvas;\n        }\n\n        return canvas;\n    },\n\n    /**\n     * Basically this method just needs a sprite and a color and tints the sprite with the given color.\n     * @memberof PIXI.canvasUtils\n     * @param {PIXI.Texture} texture - the sprite to tint\n     * @param {number} color - the color to use to tint the sprite with\n     * @returns {CanvasPattern} The tinted canvas\n     */\n    getTintedPattern: (texture: Texture, color: number): CanvasPattern =>\n    {\n        color = canvasUtils.roundColor(color);\n\n        const stringColor = `#${(`00000${(color | 0).toString(16)}`).slice(-6)}`;\n\n        texture.patternCache = texture.patternCache || {};\n\n        let pattern = texture.patternCache[stringColor];\n\n        if (pattern?.tintId === texture._updateID)\n        {\n            return pattern;\n        }\n        if (!canvasUtils.canvas)\n        {\n            canvasUtils.canvas = settings.ADAPTER.createCanvas();\n        }\n        canvasUtils.tintMethod(texture, color, canvasUtils.canvas);\n        pattern = canvasUtils.canvas.getContext('2d').createPattern(canvasUtils.canvas, 'repeat');\n        pattern.tintId = texture._updateID;\n        texture.patternCache[stringColor] = pattern;\n\n        return pattern;\n    },\n\n    /**\n     * Tint a texture using the 'multiply' operation.\n     * @memberof PIXI.canvasUtils\n     * @param {PIXI.Texture} texture - the texture to tint\n     * @param {number} color - the color to use to tint the sprite with\n     * @param {PIXI.ICanvas} canvas - the current canvas\n     */\n    tintWithMultiply: (texture: Texture, color: number, canvas: ICanvas): void =>\n    {\n        const context = canvas.getContext('2d');\n        const crop = texture._frame.clone();\n        const resolution = texture.baseTexture.resolution;\n\n        crop.x *= resolution;\n        crop.y *= resolution;\n        crop.width *= resolution;\n        crop.height *= resolution;\n\n        canvas.width = Math.ceil(crop.width);\n        canvas.height = Math.ceil(crop.height);\n\n        context.save();\n        context.fillStyle = `#${(`00000${(color | 0).toString(16)}`).slice(-6)}`;\n\n        context.fillRect(0, 0, crop.width, crop.height);\n\n        context.globalCompositeOperation = 'multiply';\n\n        const source = texture.baseTexture.getDrawableSource();\n\n        context.drawImage(\n            source,\n            crop.x,\n            crop.y,\n            crop.width,\n            crop.height,\n            0,\n            0,\n            crop.width,\n            crop.height\n        );\n\n        context.globalCompositeOperation = 'destination-atop';\n\n        context.drawImage(\n            source,\n            crop.x,\n            crop.y,\n            crop.width,\n            crop.height,\n            0,\n            0,\n            crop.width,\n            crop.height\n        );\n        context.restore();\n    },\n\n    /**\n     * Tint a texture using the 'overlay' operation.\n     * @memberof PIXI.canvasUtils\n     * @param {PIXI.Texture} texture - the texture to tint\n     * @param {number} color - the color to use to tint the sprite with\n     * @param {PIXI.ICanvas} canvas - the current canvas\n     */\n    tintWithOverlay: (texture: Texture, color: number, canvas: ICanvas): void =>\n    {\n        const context = canvas.getContext('2d');\n        const crop = texture._frame.clone();\n        const resolution = texture.baseTexture.resolution;\n\n        crop.x *= resolution;\n        crop.y *= resolution;\n        crop.width *= resolution;\n        crop.height *= resolution;\n\n        canvas.width = Math.ceil(crop.width);\n        canvas.height = Math.ceil(crop.height);\n\n        context.save();\n        context.globalCompositeOperation = 'copy';\n        context.fillStyle = `#${(`00000${(color | 0).toString(16)}`).slice(-6)}`;\n        context.fillRect(0, 0, crop.width, crop.height);\n\n        context.globalCompositeOperation = 'destination-atop';\n        context.drawImage(\n            texture.baseTexture.getDrawableSource(),\n            crop.x,\n            crop.y,\n            crop.width,\n            crop.height,\n            0,\n            0,\n            crop.width,\n            crop.height\n        );\n\n        // context.globalCompositeOperation = 'copy';\n        context.restore();\n    },\n\n    /**\n     * Tint a texture pixel per pixel.\n     * @memberof PIXI.canvasUtils\n     * @param {PIXI.Texture} texture - the texture to tint\n     * @param {number} color - the color to use to tint the sprite with\n     * @param {PIXI.ICanvas} canvas - the current canvas\n     */\n    tintWithPerPixel: (texture: Texture, color: number, canvas: ICanvas): void =>\n    {\n        const context = canvas.getContext('2d');\n        const crop = texture._frame.clone();\n        const resolution = texture.baseTexture.resolution;\n\n        crop.x *= resolution;\n        crop.y *= resolution;\n        crop.width *= resolution;\n        crop.height *= resolution;\n\n        canvas.width = Math.ceil(crop.width);\n        canvas.height = Math.ceil(crop.height);\n\n        context.save();\n        context.globalCompositeOperation = 'copy';\n        context.drawImage(\n            texture.baseTexture.getDrawableSource(),\n            crop.x,\n            crop.y,\n            crop.width,\n            crop.height,\n            0,\n            0,\n            crop.width,\n            crop.height\n        );\n        context.restore();\n\n        const rgbValues = utils.hex2rgb(color);\n        const r = rgbValues[0];\n        const g = rgbValues[1];\n        const b = rgbValues[2];\n\n        const pixelData = context.getImageData(0, 0, crop.width, crop.height);\n\n        const pixels = pixelData.data;\n\n        for (let i = 0; i < pixels.length; i += 4)\n        {\n            pixels[i + 0] *= r;\n            pixels[i + 1] *= g;\n            pixels[i + 2] *= b;\n        }\n\n        context.putImageData(pixelData, 0, 0);\n    },\n\n    /**\n     * Rounds the specified color according to the canvasUtils.cacheStepsPerColorChannel.\n     * @memberof PIXI.canvasUtils\n     * @param {number} color - the color to round, should be a hex color\n     * @returns {number} The rounded color.\n     */\n    roundColor: (color: number): number =>\n    {\n        const step = canvasUtils.cacheStepsPerColorChannel;\n\n        const rgbValues = utils.hex2rgb(color);\n\n        rgbValues[0] = Math.min(255, (rgbValues[0] / step) * step);\n        rgbValues[1] = Math.min(255, (rgbValues[1] / step) * step);\n        rgbValues[2] = Math.min(255, (rgbValues[2] / step) * step);\n\n        return utils.rgb2hex(rgbValues);\n    },\n\n    /**\n     * Number of steps which will be used as a cap when rounding colors.\n     * @memberof PIXI.canvasUtils\n     * @type {number}\n     */\n    cacheStepsPerColorChannel: 8,\n\n    /**\n     * Tint cache boolean flag.\n     * @memberof PIXI.canvasUtils\n     * @type {boolean}\n     */\n    convertTintToImage: false,\n\n    /**\n     * Whether or not the Canvas BlendModes are supported, consequently the ability to tint using the multiply method.\n     * @memberof PIXI.canvasUtils\n     * @type {boolean}\n     */\n    canUseMultiply: canUseNewCanvasBlendModes(),\n\n    /**\n     * The tinting method that will be used.\n     * @memberof PIXI.canvasUtils\n     * @type {Function}\n     */\n    tintMethod: null as (texture: Texture, color: number, canvas: ICanvas) => void,\n};\n\ncanvasUtils.tintMethod = canvasUtils.canUseMultiply ? canvasUtils.tintWithMultiply : canvasUtils.tintWithPerPixel;\n"],"names":[],"mappings":"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"}