{"version":3,"file":"CanvasNineSliceSpritePipe.mjs","sources":["../../../../src/scene/sprite-nine-slice/canvas/CanvasNineSliceSpritePipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { canvasUtils } from '../../../rendering/renderers/canvas/utils/canvasUtils';\nimport { bgr2rgb } from '../../../scene/container/container-mixins/getGlobalMixin';\nimport { multiplyHexColors } from '../../../scene/container/utils/multiplyHexColors';\n\nimport type { CanvasRenderer } from '../../../rendering/renderers/canvas/CanvasRenderer';\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { NineSliceSprite } from '../NineSliceSprite';\n\n/**\n * The NineSliceSpritePipe is a render pipe for rendering NineSliceSprites with Canvas2D.\n * @internal\n */\nexport class CanvasNineSliceSpritePipe implements RenderPipe<NineSliceSprite>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'nineSliceSprite',\n    } as const;\n\n    private _renderer: CanvasRenderer;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer as CanvasRenderer;\n    }\n\n    public validateRenderable(_sprite: NineSliceSprite): boolean\n    {\n        return false;\n    }\n\n    public addRenderable(sprite: NineSliceSprite, instructionSet: InstructionSet)\n    {\n        this._renderer.renderPipes.batch.break(instructionSet);\n        instructionSet.add(sprite);\n    }\n\n    public updateRenderable(_sprite: NineSliceSprite)\n    {\n        // no-op for canvas\n    }\n\n    public execute(sprite: NineSliceSprite)\n    {\n        const renderer = this._renderer;\n        const contextSystem = renderer.canvasContext;\n        const context = contextSystem.activeContext;\n\n        context.save();\n\n        const transform = sprite.groupTransform;\n        const roundPixels = (renderer._roundPixels | sprite._roundPixels) as 0 | 1;\n\n        contextSystem.setContextTransform(transform, roundPixels === 1);\n        contextSystem.setBlendMode(sprite.groupBlendMode);\n\n        const globalColor = renderer.globalUniforms.globalUniformData?.worldColor ?? 0xFFFFFFFF;\n        const groupColorAlpha = sprite.groupColorAlpha;\n\n        const globalAlpha = ((globalColor >>> 24) & 0xFF) / 255;\n        const groupAlphaValue = ((groupColorAlpha >>> 24) & 0xFF) / 255;\n\n        const filterAlpha = (renderer.filter as { alphaMultiplier?: number } | null)?.alphaMultiplier ?? 1;\n        const alpha = globalAlpha * groupAlphaValue * filterAlpha;\n\n        if (alpha <= 0)\n        {\n            context.restore();\n\n            return;\n        }\n\n        context.globalAlpha = alpha;\n\n        const globalTint = globalColor & 0xFFFFFF;\n        const groupTintBGR = groupColorAlpha & 0xFFFFFF;\n\n        const tint = bgr2rgb(multiplyHexColors(groupTintBGR, globalTint));\n\n        const texture = sprite.texture;\n\n        const drawSource = canvasUtils.getCanvasSource(texture);\n\n        if (!drawSource)\n        {\n            context.restore();\n\n            return;\n        }\n\n        const smoothProperty = contextSystem.smoothProperty;\n        const shouldSmooth = texture.source.style.scaleMode !== 'nearest';\n\n        if (context[smoothProperty] !== shouldSmooth)\n        {\n            context[smoothProperty] = shouldSmooth;\n        }\n\n        // Use getTintedCanvas when tinted OR when texture is rotated (handles rotation compensation)\n        const needsProcessing = tint !== 0xFFFFFF || texture.rotate !== 0;\n        const finalSource = needsProcessing\n            ? canvasUtils.getTintedCanvas({ texture }, tint) as CanvasImageSource\n            : drawSource;\n\n        const {\n            leftWidth,\n            topHeight,\n            rightWidth,\n            bottomHeight,\n            width,\n            height,\n        } = sprite;\n\n        const totalBorderWidth = leftWidth + rightWidth;\n        const totalBorderHeight = topHeight + bottomHeight;\n        const scale = Math.min(\n            totalBorderWidth > width ? width / totalBorderWidth : 1,\n            totalBorderHeight > height ? height / totalBorderHeight : 1,\n            1,\n        );\n\n        const destLeftWidth = leftWidth * scale;\n        const destRightWidth = rightWidth * scale;\n        const destTopHeight = topHeight * scale;\n        const destBottomHeight = bottomHeight * scale;\n        const destCenterWidth = Math.max(0, width - destLeftWidth - destRightWidth);\n        const destCenterHeight = Math.max(0, height - destTopHeight - destBottomHeight);\n\n        const anchor = sprite.anchor;\n\n        const resolution = texture.source._resolution ?? texture.source.resolution ?? 1;\n        let sx = (texture.frame.x) * resolution;\n        let sy = (texture.frame.y) * resolution;\n\n        const dx = -anchor.x * width;\n        const dy = -anchor.y * height;\n\n        const lw = leftWidth * resolution;\n        const tw = topHeight * resolution;\n        const rw = rightWidth * resolution;\n        const bw = bottomHeight * resolution;\n\n        let sw = (texture.frame.width) * resolution;\n        let sh = (texture.frame.height) * resolution;\n\n        if (needsProcessing)\n        {\n            sx = 0;\n            sy = 0;\n            sw = (finalSource as any).width;\n            sh = (finalSource as any).height;\n        }\n\n        // Top-left\n        context.drawImage(finalSource, sx, sy, lw, tw, dx, dy, destLeftWidth, destTopHeight);\n        // Top-center\n        context.drawImage(\n            finalSource,\n            sx + lw, sy,\n            sw - lw - rw, tw,\n            dx + destLeftWidth, dy,\n            destCenterWidth, destTopHeight\n        );\n        // Top-right\n        context.drawImage(\n            finalSource,\n            sx + sw - rw, sy,\n            rw, tw,\n            dx + width - destRightWidth, dy,\n            destRightWidth, destTopHeight\n        );\n\n        // Middle-left\n        context.drawImage(\n            finalSource,\n            sx, sy + tw,\n            lw, sh - tw - bw,\n            dx, dy + destTopHeight,\n            destLeftWidth, destCenterHeight\n        );\n        // Middle-center\n        context.drawImage(\n            finalSource,\n            sx + lw, sy + tw,\n            sw - lw - rw, sh - tw - bw,\n            dx + destLeftWidth, dy + destTopHeight,\n            destCenterWidth, destCenterHeight\n        );\n        // Middle-right\n        context.drawImage(\n            finalSource,\n            sx + sw - rw, sy + tw,\n            rw, sh - tw - bw,\n            dx + width - destRightWidth, dy + destTopHeight,\n            destRightWidth, destCenterHeight\n        );\n\n        // Bottom-left\n        context.drawImage(\n            finalSource,\n            sx, sy + sh - bw,\n            lw, bw,\n            dx, dy + height - destBottomHeight,\n            destLeftWidth, destBottomHeight\n        );\n        // Bottom-center\n        context.drawImage(\n            finalSource,\n            sx + lw, sy + sh - bw,\n            sw - lw - rw, bw,\n            dx + destLeftWidth, dy + height - destBottomHeight,\n            destCenterWidth, destBottomHeight\n        );\n        // Bottom-right\n        context.drawImage(\n            finalSource,\n            sx + sw - rw, sy + sh - bw,\n            rw, bw,\n            dx + width - destRightWidth, dy + height - destBottomHeight,\n            destRightWidth, destBottomHeight\n        );\n\n        context.restore();\n    }\n\n    public destroy()\n    {\n        this._renderer = null;\n    }\n}\n"],"names":[],"mappings":"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"}