{"version":3,"file":"CanvasGraphicsAdaptor.mjs","sources":["../../../../src/scene/graphics/canvas/CanvasGraphicsAdaptor.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { groupD8 } from '../../../maths/matrix/groupD8';\nimport { Matrix } from '../../../maths/matrix/Matrix';\nimport { canvasUtils } from '../../../rendering/renderers/canvas/utils/canvasUtils';\nimport { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport { bgr2rgb } from '../../container/container-mixins/getGlobalMixin';\nimport { multiplyHexColors } from '../../container/utils/multiplyHexColors';\nimport { buildLine } from '../shared/buildCommands/buildLine';\nimport { FillGradient } from '../shared/fill/FillGradient';\nimport { FillPattern } from '../shared/fill/FillPattern';\nimport { shapeBuilders } from '../shared/utils/buildContextBatches';\nimport { generateTextureMatrix as generateTextureFillMatrix } from '../shared/utils/generateTextureFillMatrix';\n\nimport type { ShapePrimitive } from '../../../maths/shapes/ShapePrimitive';\nimport type { CrossPlatformCanvasRenderingContext2D } from '../../../rendering/renderers/canvas/CanvasContextSystem';\nimport type { CanvasRenderer } from '../../../rendering/renderers/canvas/CanvasRenderer';\nimport type { Shader } from '../../../rendering/renderers/shared/shader/Shader';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { ConvertedFillStyle, ConvertedStrokeStyle } from '../shared/FillTypes';\nimport type { Graphics } from '../shared/Graphics';\nimport type { GraphicsAdaptor, GraphicsPipeLike } from '../shared/GraphicsPipe';\nimport type { ShapePrimitiveWithHoles } from '../shared/path/ShapePath';\n\nconst emptyCanvasStyle = '#808080';\nconst tempMatrix = new Matrix();\nconst tempTextureMatrix = new Matrix();\nconst tempGradientMatrix = new Matrix();\nconst tempPatternMatrix = new Matrix();\n\nfunction fillTriangles(\n    context: CrossPlatformCanvasRenderingContext2D,\n    vertices: number[],\n    indices: number[]\n): void\n{\n    context.beginPath();\n\n    for (let i = 0; i < indices.length; i += 3)\n    {\n        const i0 = indices[i] * 2;\n        const i1 = indices[i + 1] * 2;\n        const i2 = indices[i + 2] * 2;\n\n        context.moveTo(vertices[i0], vertices[i0 + 1]);\n        context.lineTo(vertices[i1], vertices[i1 + 1]);\n        context.lineTo(vertices[i2], vertices[i2 + 1]);\n        context.closePath();\n    }\n\n    context.fill();\n}\n\nfunction colorToHex(color: number): string\n{\n    const clamped = color & 0xFFFFFF;\n\n    return `#${clamped.toString(16).padStart(6, '0')}`;\n}\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.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.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.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(context: CrossPlatformCanvasRenderingContext2D, holes?: ShapePrimitiveWithHoles[]): 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\nfunction getCanvasStyle(\n    style: ConvertedFillStyle,\n    tint: number,\n    textureMatrix?: Matrix,\n    currentTransform?: Matrix\n): string | CanvasPattern | CanvasGradient\n{\n    const fill = style.fill;\n\n    if (fill instanceof FillGradient)\n    {\n        fill.buildGradient();\n\n        const gradientTexture = fill.texture;\n\n        if (gradientTexture)\n        {\n            const pattern = canvasUtils.getTintedPattern(gradientTexture, tint);\n            const patternMatrix = textureMatrix\n                ? tempPatternMatrix\n                    .copyFrom(textureMatrix)\n                    .scale(gradientTexture.source.pixelWidth, gradientTexture.source.pixelHeight)\n                : tempPatternMatrix.copyFrom(fill.transform);\n\n            if (currentTransform && !style.textureSpace)\n            {\n                patternMatrix.append(currentTransform);\n            }\n\n            canvasUtils.applyPatternTransform(pattern, patternMatrix);\n\n            return pattern;\n        }\n    }\n\n    if (fill instanceof FillPattern)\n    {\n        const pattern = canvasUtils.getTintedPattern(fill.texture, tint);\n\n        canvasUtils.applyPatternTransform(pattern, fill.transform);\n\n        return pattern;\n    }\n\n    const texture = style.texture;\n\n    if (texture && texture !== Texture.WHITE)\n    {\n        if (!texture.source.resource)\n        {\n            return emptyCanvasStyle;\n        }\n\n        const pattern = canvasUtils.getTintedPattern(texture, tint);\n        const patternMatrix = textureMatrix\n            ? tempPatternMatrix\n                .copyFrom(textureMatrix)\n                .scale(texture.source.pixelWidth, texture.source.pixelHeight)\n            : style.matrix;\n\n        canvasUtils.applyPatternTransform(pattern, patternMatrix);\n\n        return pattern;\n    }\n\n    return colorToHex(tint);\n}\n\n/**\n * A GraphicsAdaptor that uses Canvas2D to render graphics.\n * @category rendering\n * @ignore\n */\nexport class CanvasGraphicsAdaptor implements GraphicsAdaptor\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.CanvasPipesAdaptor,\n        ],\n        name: 'graphics',\n    } as const;\n\n    public shader: Shader = null;\n\n    public contextChange(renderer: Renderer): void\n    {\n        void renderer;\n    }\n\n    public execute(graphicsPipe: GraphicsPipeLike, renderable: Graphics): void\n    {\n        const renderer = graphicsPipe.renderer as CanvasRenderer;\n        const contextSystem = renderer.canvasContext;\n        const context = contextSystem.activeContext;\n        const baseTransform = renderable.groupTransform;\n\n        const globalColor = renderer.globalUniforms.globalUniformData?.worldColor ?? 0xFFFFFFFF;\n        const groupColorAlpha = renderable.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 groupAlpha = globalAlpha * groupAlphaValue * filterAlpha;\n\n        if (groupAlpha <= 0) return;\n\n        const globalTint = globalColor & 0xFFFFFF;\n        const groupTintBGR = groupColorAlpha & 0xFFFFFF;\n\n        const groupTint = bgr2rgb(multiplyHexColors(groupTintBGR, globalTint));\n\n        const roundPixels = (renderer._roundPixels | renderable._roundPixels) as 0 | 1;\n\n        context.save();\n\n        contextSystem.setContextTransform(baseTransform, roundPixels === 1);\n        contextSystem.setBlendMode(renderable.groupBlendMode);\n\n        const instructions = renderable.context.instructions;\n\n        for (let i = 0; i < instructions.length; i++)\n        {\n            const instruction = instructions[i];\n\n            if (instruction.action === 'texture')\n            {\n                const data = instruction.data;\n                const texture = data.image;\n                const source = texture ? canvasUtils.getCanvasSource(texture) : null;\n\n                if (!source) continue;\n\n                const alpha = data.alpha * groupAlpha;\n\n                if (alpha <= 0) continue;\n\n                const tint = multiplyHexColors(data.style, groupTint);\n\n                context.globalAlpha = alpha;\n\n                let drawSource: CanvasImageSource = source;\n\n                if (tint !== 0xFFFFFF)\n                {\n                    drawSource = canvasUtils.getTintedCanvas({ texture }, tint) as CanvasImageSource;\n                }\n\n                const frame = texture.frame;\n                const resolution = texture.source._resolution ?? texture.source.resolution ?? 1;\n\n                let sx = frame.x * resolution;\n                let sy = frame.y * resolution;\n                const sw = frame.width * resolution;\n                const sh = frame.height * resolution;\n\n                if (drawSource !== source)\n                {\n                    sx = 0;\n                    sy = 0;\n                }\n\n                const transform = data.transform;\n                const hasTransform = transform && !transform.isIdentity();\n                const rotate = texture.rotate;\n\n                if (hasTransform || rotate)\n                {\n                    tempMatrix.copyFrom(baseTransform);\n\n                    if (hasTransform)\n                    {\n                        tempMatrix.append(transform);\n                    }\n\n                    if (rotate)\n                    {\n                        groupD8.matrixAppendRotationInv(tempMatrix, rotate, data.dx, data.dy, data.dw, data.dh);\n                    }\n\n                    contextSystem.setContextTransform(tempMatrix, roundPixels === 1);\n                }\n                else\n                {\n                    contextSystem.setContextTransform(baseTransform, roundPixels === 1);\n                }\n\n                context.drawImage(\n                    drawSource,\n                    sx,\n                    sy,\n                    drawSource === source ? sw : (drawSource as any).width,\n                    drawSource === source ? sh : (drawSource as any).height,\n                    rotate ? 0 : data.dx,\n                    rotate ? 0 : data.dy,\n                    data.dw,\n                    data.dh\n                );\n\n                if (hasTransform || rotate)\n                {\n                    contextSystem.setContextTransform(baseTransform, roundPixels === 1);\n                }\n\n                continue;\n            }\n\n            const data = instruction.data;\n            const shapePath = data?.path?.shapePath;\n\n            if (!shapePath?.shapePrimitives?.length) continue;\n\n            const style = data.style as ConvertedFillStyle | ConvertedStrokeStyle;\n            const tint = multiplyHexColors(style.color, groupTint);\n            const alpha = style.alpha * groupAlpha;\n\n            if (alpha <= 0) continue;\n\n            const isStroke = instruction.action === 'stroke';\n\n            context.globalAlpha = alpha;\n\n            if (isStroke)\n            {\n                const strokeStyle = style as ConvertedStrokeStyle;\n\n                context.lineWidth = strokeStyle.width;\n                context.lineCap = strokeStyle.cap;\n                context.lineJoin = strokeStyle.join;\n                context.miterLimit = strokeStyle.miterLimit;\n            }\n\n            const shapePrimitives = shapePath.shapePrimitives;\n\n            if (!isStroke && data.hole?.shapePath?.shapePrimitives?.length)\n            {\n                const lastShape = shapePrimitives[shapePrimitives.length - 1];\n\n                lastShape.holes = data.hole.shapePath.shapePrimitives;\n            }\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                const hasTexture = style.texture && style.texture !== Texture.WHITE;\n                const textureTransform = style.textureSpace === 'global' ? transform : null;\n                const textureMatrix = hasTexture\n                    ? generateTextureFillMatrix(tempTextureMatrix, style, primitive.shape, textureTransform)\n                    : null;\n                const currentTransform = hasTransform\n                    ? tempGradientMatrix.copyFrom(baseTransform).append(transform)\n                    : baseTransform;\n                const canvasStyle = getCanvasStyle(\n                    style,\n                    tint,\n                    textureMatrix,\n                    currentTransform\n                );\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                if (isStroke)\n                {\n                    const strokeStyle = style as ConvertedStrokeStyle;\n                    const useStrokeGeometry = strokeStyle.alignment !== 0.5 && !strokeStyle.pixelLine;\n\n                    if (useStrokeGeometry)\n                    {\n                        const points: number[] = [];\n                        const vertices: number[] = [];\n                        const indices: number[] = [];\n                        const shapeBuilder = shapeBuilders[primitive.shape.type];\n\n                        if (shapeBuilder?.build(primitive.shape, points))\n                        {\n                            const close = (primitive.shape as { closePath?: boolean }).closePath ?? true;\n\n                            buildLine(points, strokeStyle, false, close, vertices, indices);\n                            context.fillStyle = canvasStyle as string | CanvasPattern | CanvasGradient;\n                            fillTriangles(context, vertices, indices);\n                        }\n                        else\n                        {\n                            context.strokeStyle = canvasStyle as string | CanvasPattern | CanvasGradient;\n                            context.beginPath();\n                            buildShapePath(context, primitive.shape);\n                            context.stroke();\n                        }\n                    }\n                    else\n                    {\n                        context.strokeStyle = canvasStyle as string | CanvasPattern | CanvasGradient;\n                        context.beginPath();\n                        buildShapePath(context, primitive.shape);\n                        context.stroke();\n                    }\n                }\n                else\n                {\n                    context.fillStyle = canvasStyle as string | CanvasPattern | CanvasGradient;\n                    context.beginPath();\n                    buildShapePath(context, primitive.shape);\n\n                    const hasHoles = addHolePaths(context, primitive.holes);\n\n                    if (hasHoles)\n                    {\n                        context.fill('evenodd');\n                    }\n                    else\n                    {\n                        context.fill();\n                    }\n                }\n\n                if (hasTransform)\n                {\n                    context.restore();\n                }\n            }\n        }\n\n        context.restore();\n    }\n\n    public destroy(): void\n    {\n        this.shader = null;\n    }\n}\n"],"names":["data","alpha","tint","generateTextureFillMatrix"],"mappings":"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"}