{"version":3,"file":"CanvasSpriteRenderer.mjs","sources":["../src/CanvasSpriteRenderer.ts"],"sourcesContent":["import { canvasUtils } from 'pixijs/renderer/canvas';\nimport { BLEND_MODES, extensions, ExtensionType, groupD8, Matrix, SCALE_MODES } from 'pixijs/core';\n\nimport type { CanvasRenderer } from 'pixijs/renderer/canvas';\nimport type { ExtensionMetadata } from 'pixijs/core';\nimport type { Sprite } from 'pixijs/sprite';\n\nconst canvasRenderWorldTransform = new Matrix();\n\n/**\n * Types that can be passed to drawImage\n * @typedef {HTMLImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap} ICanvasImageSource\n * @memberof PIXI\n */\n\n/*\n * @author Mat Groves\n *\n * Big thanks to the very clever Matt DesLauriers <mattdesl> https://github.com/mattdesl/\n * for creating the original PixiJS version!\n * Also a thanks to https://github.com/bchevalier for tweaking the tint and alpha so that they now\n * share 4 bytes on the vertex buffer\n *\n * Heavily inspired by LibGDX's CanvasSpriteRenderer:\n * https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/CanvasSpriteRenderer.java\n */\n\n/**\n * Renderer dedicated to drawing and batching sprites.\n * @class\n * @protected\n * @memberof PIXI\n */\nexport class CanvasSpriteRenderer\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        name: 'sprite',\n        type: ExtensionType.CanvasRendererPlugin,\n    };\n\n    /** A reference to the current renderer */\n    protected renderer: CanvasRenderer;\n\n    /** @param renderer - A reference to the current renderer */\n    constructor(renderer: CanvasRenderer)\n    {\n        this.renderer = renderer;\n    }\n\n    /**\n     * Renders the sprite object.\n     * @param sprite - the sprite to render when using this spritebatch\n     */\n    render(sprite: Sprite): void\n    {\n        const texture = sprite._texture;\n        const renderer = this.renderer;\n        const context = renderer.canvasContext.activeContext;\n        const activeResolution = renderer.canvasContext.activeResolution;\n\n        if (!texture.valid)\n        {\n            return;\n        }\n\n        const sourceWidth = texture._frame.width;\n        const sourceHeight = texture._frame.height;\n\n        let destWidth = texture._frame.width;\n        let destHeight = texture._frame.height;\n\n        if (texture.trim)\n        {\n            destWidth = texture.trim.width;\n            destHeight = texture.trim.height;\n        }\n\n        let wt = sprite.transform.worldTransform;\n        let dx = 0;\n        let dy = 0;\n\n        const source = texture.baseTexture.getDrawableSource();\n\n        if (texture.orig.width <= 0 || texture.orig.height <= 0 || !texture.valid || !source)\n        {\n            return;\n        }\n\n        renderer.canvasContext.setBlendMode(sprite.blendMode, true);\n\n        context.globalAlpha = sprite.worldAlpha;\n\n        // If smoothingEnabled is supported and we need to change the smoothing property for sprite texture\n        const smoothingEnabled = texture.baseTexture.scaleMode === SCALE_MODES.LINEAR;\n        const smoothProperty = renderer.canvasContext.smoothProperty;\n\n        if (smoothProperty\n            && context[smoothProperty] !== smoothingEnabled)\n        {\n            context[smoothProperty] = smoothingEnabled;\n        }\n\n        if (texture.trim)\n        {\n            dx = (texture.trim.width / 2) + texture.trim.x - (sprite.anchor.x * texture.orig.width);\n            dy = (texture.trim.height / 2) + texture.trim.y - (sprite.anchor.y * texture.orig.height);\n        }\n        else\n        {\n            dx = (0.5 - sprite.anchor.x) * texture.orig.width;\n            dy = (0.5 - sprite.anchor.y) * texture.orig.height;\n        }\n\n        if (texture.rotate)\n        {\n            wt.copyTo(canvasRenderWorldTransform);\n            wt = canvasRenderWorldTransform;\n            groupD8.matrixAppendRotationInv(wt, texture.rotate, dx, dy);\n            // the anchor has already been applied above, so lets set it to zero\n            dx = 0;\n            dy = 0;\n        }\n\n        dx -= destWidth / 2;\n        dy -= destHeight / 2;\n\n        renderer.canvasContext.setContextTransform(wt, sprite.roundPixels, 1);\n        // Allow for pixel rounding\n        if (sprite.roundPixels)\n        {\n            dx = dx | 0;\n            dy = dy | 0;\n        }\n\n        const resolution = texture.baseTexture.resolution;\n\n        const outerBlend = renderer.canvasContext._outerBlend;\n\n        if (outerBlend)\n        {\n            context.save();\n            context.beginPath();\n            context.rect(\n                dx * activeResolution,\n                dy * activeResolution,\n                destWidth * activeResolution,\n                destHeight * activeResolution\n            );\n            context.clip();\n        }\n\n        if (sprite.tint !== 0xFFFFFF)\n        {\n            if (sprite._cachedTint !== sprite.tint || sprite._tintedCanvas.tintId !== sprite._texture._updateID)\n            {\n                sprite._cachedTint = sprite.tint;\n\n                // TODO clean up caching - how to clean up the caches?\n                sprite._tintedCanvas = canvasUtils.getTintedCanvas(sprite, sprite.tint);\n            }\n\n            context.drawImage(\n                sprite._tintedCanvas,\n                0,\n                0,\n                Math.floor(sourceWidth * resolution),\n                Math.floor(sourceHeight * resolution),\n                Math.floor(dx * activeResolution),\n                Math.floor(dy * activeResolution),\n                Math.floor(destWidth * activeResolution),\n                Math.floor(destHeight * activeResolution)\n            );\n        }\n        else\n        {\n            context.drawImage(\n                source,\n                texture._frame.x * resolution,\n                texture._frame.y * resolution,\n                Math.floor(sourceWidth * resolution),\n                Math.floor(sourceHeight * resolution),\n                Math.floor(dx * activeResolution),\n                Math.floor(dy * activeResolution),\n                Math.floor(destWidth * activeResolution),\n                Math.floor(destHeight * activeResolution)\n            );\n        }\n\n        if (outerBlend)\n        {\n            context.restore();\n        }\n        // just in case, leaking outer blend here will be catastrophic!\n        renderer.canvasContext.setBlendMode(BLEND_MODES.NORMAL);\n    }\n\n    /** destroy the sprite object */\n    destroy(): void\n    {\n        this.renderer = null;\n    }\n}\n\nextensions.add(CanvasSpriteRenderer);\n"],"names":[],"mappings":"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"}