{"version":3,"file":"CanvasStencilMaskPipe.mjs","sources":["../../../../src/rendering/mask/stencil/CanvasStencilMaskPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { type Matrix } from '../../../maths/matrix/Matrix';\nimport { Graphics } from '../../../scene/graphics/shared/Graphics';\nimport { warn } from '../../../utils/logging/warn';\n\nimport type { ShapePrimitive } from '../../../maths/shapes/ShapePrimitive';\nimport type { Container } from '../../../scene/container/Container';\nimport type { Effect } from '../../../scene/container/Effect';\nimport type { ShapePrimitiveWithHoles } from '../../../scene/graphics/shared/path/ShapePath';\nimport type { CrossPlatformCanvasRenderingContext2D } from '../../renderers/canvas/CanvasContextSystem';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../renderers/types';\nimport type { StencilMaskInstruction } from './StencilMaskTypes';\n\nfunction buildRoundedRectPath(\n    context: CrossPlatformCanvasRenderingContext2D,\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    radius: number\n): void\n{\n    radius = Math.max(0, Math.min(radius, Math.min(width, height) / 2));\n\n    context.moveTo(x + radius, y);\n    context.lineTo(x + width - radius, y);\n    context.quadraticCurveTo(x + width, y, x + width, y + radius);\n    context.lineTo(x + width, y + height - radius);\n    context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n    context.lineTo(x + radius, y + height);\n    context.quadraticCurveTo(x, y + height, x, y + height - radius);\n    context.lineTo(x, y + radius);\n    context.quadraticCurveTo(x, y, x + radius, y);\n}\n\nfunction buildShapePath(context: CrossPlatformCanvasRenderingContext2D, shape: ShapePrimitive): void\n{\n    switch (shape.type)\n    {\n        case 'rectangle':\n        {\n            const rect = shape as typeof shape & { width: number; height: number };\n\n            context.rect(rect.x, rect.y, rect.width, rect.height);\n            break;\n        }\n        case 'roundedRectangle':\n        {\n            const rect = shape as typeof shape & { width: number; height: number; radius: number };\n\n            buildRoundedRectPath(context, rect.x, rect.y, rect.width, rect.height, rect.radius);\n            break;\n        }\n        case 'circle':\n        {\n            const circle = shape as typeof shape & { radius: number };\n\n            context.moveTo(circle.x + circle.radius, circle.y);\n            context.arc(circle.x, circle.y, circle.radius, 0, Math.PI * 2);\n            break;\n        }\n        case 'ellipse':\n        {\n            const ellipse = shape as typeof shape & { halfWidth: number; halfHeight: number };\n\n            if (context.ellipse)\n            {\n                context.moveTo(ellipse.x + ellipse.halfWidth, ellipse.y);\n                context.ellipse(ellipse.x, ellipse.y, ellipse.halfWidth, ellipse.halfHeight, 0, 0, Math.PI * 2);\n            }\n            else\n            {\n                context.save();\n                context.translate(ellipse.x, ellipse.y);\n                context.scale(ellipse.halfWidth, ellipse.halfHeight);\n                context.moveTo(1, 0);\n                context.arc(0, 0, 1, 0, Math.PI * 2);\n                context.restore();\n            }\n            break;\n        }\n        case 'triangle':\n        {\n            const tri = shape as typeof shape & { x2: number; y2: number; x3: number; y3: number };\n\n            context.moveTo(tri.x, tri.y);\n            context.lineTo(tri.x2, tri.y2);\n            context.lineTo(tri.x3, tri.y3);\n            context.closePath();\n            break;\n        }\n        case 'polygon':\n        default:\n        {\n            const poly = shape as typeof shape & { points: number[]; closePath: boolean };\n            const points = poly.points;\n\n            if (!points?.length) break;\n\n            context.moveTo(points[0], points[1]);\n\n            for (let i = 2; i < points.length; i += 2)\n            {\n                context.lineTo(points[i], points[i + 1]);\n            }\n\n            if (poly.closePath)\n            {\n                context.closePath();\n            }\n            break;\n        }\n    }\n}\n\nfunction addHolePaths(\n    context: CrossPlatformCanvasRenderingContext2D,\n    holes?: ShapePrimitiveWithHoles[]\n): boolean\n{\n    if (!holes?.length) return false;\n\n    for (let i = 0; i < holes.length; i++)\n    {\n        const hole = holes[i];\n\n        if (!hole?.shape) continue;\n\n        const transform = hole.transform;\n        const hasTransform = transform && !transform.isIdentity();\n\n        if (hasTransform)\n        {\n            context.save();\n            context.transform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);\n        }\n\n        buildShapePath(context, hole.shape);\n\n        if (hasTransform)\n        {\n            context.restore();\n        }\n    }\n\n    return true;\n}\n\n/** @internal */\nexport class CanvasStencilMaskPipe implements InstructionPipe<StencilMaskInstruction>\n{\n    public static extension = {\n        type: [\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'stencilMask',\n    } as const;\n\n    private _renderer: Renderer;\n    private _warnedMaskTypes = new Set<string>();\n    private _canvasMaskStack: boolean[] = [];\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public push(mask: Effect, _container: Container, instructionSet: InstructionSet): void\n    {\n        this._renderer.renderPipes.batch.break(instructionSet);\n\n        instructionSet.add({\n            renderPipeId: 'stencilMask',\n            action: 'pushMaskBegin',\n            mask,\n            inverse: _container._maskOptions.inverse,\n            canBundle: false,\n        } as StencilMaskInstruction);\n    }\n\n    public pop(_mask: Effect, _container: Container, instructionSet: InstructionSet): void\n    {\n        this._renderer.renderPipes.batch.break(instructionSet);\n\n        instructionSet.add({\n            renderPipeId: 'stencilMask',\n            action: 'popMaskEnd',\n            mask: _mask,\n            inverse: _container._maskOptions.inverse,\n            canBundle: false,\n        } as StencilMaskInstruction);\n    }\n\n    public execute(instruction: StencilMaskInstruction)\n    {\n        if (instruction.action !== 'pushMaskBegin' && instruction.action !== 'popMaskEnd')\n        {\n            return;\n        }\n\n        const canvasRenderer = this._renderer as unknown as {\n            canvasContext: {\n                activeContext: CrossPlatformCanvasRenderingContext2D;\n                setContextTransform: (transform: Matrix, roundPixels?: boolean) => void;\n            };\n            _roundPixels: number;\n        };\n        const contextSystem = canvasRenderer.canvasContext;\n        const context = contextSystem?.activeContext;\n\n        if (!context) return;\n\n        if (instruction.action === 'popMaskEnd')\n        {\n            const didClip = this._canvasMaskStack.pop();\n\n            if (didClip)\n            {\n                context.restore();\n            }\n\n            return;\n        }\n\n        if (instruction.inverse)\n        {\n            this._warnOnce(\n                'inverse',\n                'CanvasRenderer: inverse masks are not supported on Canvas2D; '\n                + 'ignoring inverse flag.'\n            );\n        }\n\n        const maskContainer = instruction.mask.mask;\n\n        if (!(maskContainer instanceof Graphics))\n        {\n            this._warnOnce(\n                'nonGraphics',\n                'CanvasRenderer: only Graphics masks are supported in Canvas2D; '\n                + 'skipping mask.'\n            );\n            this._canvasMaskStack.push(false);\n\n            return;\n        }\n\n        const graphics = maskContainer;\n        const instructions = graphics.context?.instructions;\n\n        if (!instructions?.length)\n        {\n            this._canvasMaskStack.push(false);\n\n            return;\n        }\n\n        context.save();\n        contextSystem.setContextTransform(\n            graphics.groupTransform,\n            ((canvasRenderer._roundPixels | graphics._roundPixels) as 0 | 1) === 1\n        );\n        context.beginPath();\n\n        let drewPath = false;\n        let hasHoles = false;\n\n        for (let i = 0; i < instructions.length; i++)\n        {\n            const instructionData = instructions[i];\n            const action = instructionData.action;\n\n            if (action !== 'fill' && action !== 'stroke') continue;\n\n            const data = instructionData.data as {\n                path?: {\n                    shapePath?: {\n                        shapePrimitives?: ShapePrimitiveWithHoles[];\n                    };\n                };\n            };\n            const shapePath = data?.path?.shapePath;\n\n            if (!shapePath?.shapePrimitives?.length) continue;\n\n            const shapePrimitives = shapePath.shapePrimitives;\n\n            for (let j = 0; j < shapePrimitives.length; j++)\n            {\n                const primitive = shapePrimitives[j];\n\n                if (!primitive?.shape) continue;\n\n                const transform = primitive.transform;\n                const hasTransform = transform && !transform.isIdentity();\n\n                if (hasTransform)\n                {\n                    context.save();\n                    context.transform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);\n                }\n\n                buildShapePath(context, primitive.shape as ShapePrimitive);\n                hasHoles = addHolePaths(context, primitive.holes) || hasHoles;\n                drewPath = true;\n\n                if (hasTransform)\n                {\n                    context.restore();\n                }\n            }\n        }\n\n        if (!drewPath)\n        {\n            context.restore();\n            this._canvasMaskStack.push(false);\n\n            return;\n        }\n\n        if (hasHoles)\n        {\n            context.clip('evenodd');\n        }\n        else\n        {\n            context.clip();\n        }\n\n        this._canvasMaskStack.push(true);\n    }\n\n    public destroy()\n    {\n        this._renderer = null;\n        this._warnedMaskTypes = null;\n        this._canvasMaskStack = null;\n    }\n\n    private _warnOnce(key: string, message: string): void\n    {\n        if (this._warnedMaskTypes.has(key)) return;\n\n        this._warnedMaskTypes.add(key);\n        warn(message);\n    }\n}\n"],"names":[],"mappings":"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"}