{"version":3,"file":"CanvasGraphicsRenderer.mjs","sources":["../src/CanvasGraphicsRenderer.ts"],"sourcesContent":["import { canvasUtils } from 'pixijs/renderer/canvas';\nimport { extensions, ExtensionType, Matrix, SHAPES, Texture } from 'pixijs/core';\nimport { PolygonUtils } from './utils/PolygonUtils';\n\nimport type { CanvasRenderer, CrossPlatformCanvasRenderingContext2D } from 'pixijs/renderer/canvas';\nimport type { Circle, Ellipse, ExtensionMetadata, Polygon, Rectangle, RoundedRectangle } from 'pixijs/core';\nimport type { FillStyle, Graphics, GraphicsData, LineStyle } from 'pixijs/graphics';\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\n * now share 4 bytes on the vertex buffer\n *\n * Heavily inspired by LibGDX's CanvasGraphicsRenderer:\n * https://github.com/libgdx/libgdx/blob/1.0.0/gdx/src/com/badlogic/gdx/graphics/glutils/ShapeRenderer.java\n */\n\n/**\n * Renderer dedicated to drawing and batching graphics objects.\n * @class\n * @protected\n * @memberof PIXI\n */\nexport class CanvasGraphicsRenderer\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        name: 'graphics',\n        type: ExtensionType.CanvasRendererPlugin,\n    };\n\n    /** A reference to the current renderer */\n    public renderer: CanvasRenderer;\n    private _svgMatrix: DOMMatrix | boolean = null;\n    private _tempMatrix: Matrix = new Matrix();\n\n    /**\n     * @param renderer - A reference to the current renderer.\n     */\n    constructor(renderer: CanvasRenderer)\n    {\n        this.renderer = renderer;\n    }\n\n    /**\n     * calculates fill/stroke style for canvas\n     * @private\n     * @param style - A graphics {@link PIXI.FILL_STYLE} where if `texture` is specified then a tinted CanvasPattern\n     * will be used for the fill.stroke\n     * @param tint - color to set the fill/stroke too.\n     */\n    private _calcCanvasStyle(style: FillStyle, tint: number): string | CanvasPattern\n    {\n        let res;\n\n        if (style.texture && style.texture.baseTexture !== Texture.WHITE.baseTexture)\n        {\n            if (style.texture.valid)\n            {\n                res = canvasUtils.getTintedPattern(style.texture, tint);\n                this.setPatternTransform(res, style.matrix || Matrix.IDENTITY);\n            }\n            else\n            {\n                res = '#808080';\n            }\n        }\n        else\n        {\n            res = `#${(`00000${(tint | 0).toString(16)}`).slice(-6)}`;\n        }\n\n        return res;\n    }\n\n    /**\n     * Renders a Graphics object to a canvas.\n     * @param graphics - the actual graphics object to render\n     */\n    public render(graphics: Graphics): void\n    {\n        const renderer = this.renderer;\n\n        const context = renderer.canvasContext.activeContext;\n        const worldAlpha = graphics.worldAlpha;\n        const transform = graphics.transform.worldTransform;\n\n        renderer.canvasContext.setContextTransform(transform);\n        renderer.canvasContext.setBlendMode(graphics.blendMode);\n\n        const graphicsData = graphics.geometry.graphicsData;\n\n        let contextFillStyle;\n        let contextStrokeStyle;\n\n        const tintR = ((graphics.tint >> 16) & 0xFF) / 255;\n        const tintG = ((graphics.tint >> 8) & 0xFF) / 255;\n        const tintB = (graphics.tint & 0xFF) / 255;\n\n        for (let i = 0; i < graphicsData.length; i++)\n        {\n            const data = graphicsData[i];\n            const shape = data.shape;\n            const fillStyle = data.fillStyle;\n            const lineStyle = data.lineStyle;\n\n            const fillColor = data.fillStyle.color | 0;\n            const lineColor = data.lineStyle.color | 0;\n\n            if (data.matrix)\n            {\n                renderer.canvasContext.setContextTransform(transform.copyTo(this._tempMatrix).append(data.matrix));\n            }\n\n            if (fillStyle.visible)\n            {\n                const fillTint = (\n                    (((fillColor >> 16) & 0xFF) / 255 * tintR * 255 << 16)\n                    + (((fillColor >> 8) & 0xFF) / 255 * tintG * 255 << 8)\n                    + (((fillColor & 0xFF) / 255) * tintB * 255)\n                );\n\n                contextFillStyle = this._calcCanvasStyle(fillStyle, fillTint);\n            }\n            if (lineStyle.visible)\n            {\n                const lineTint = (\n                    (((lineColor >> 16) & 0xFF) / 255 * tintR * 255 << 16)\n                    + (((lineColor >> 8) & 0xFF) / 255 * tintG * 255 << 8)\n                    + (((lineColor & 0xFF) / 255) * tintB * 255)\n                );\n\n                contextStrokeStyle = this._calcCanvasStyle(lineStyle, lineTint);\n            }\n\n            context.lineWidth = lineStyle.width;\n            context.lineCap = lineStyle.cap;\n            context.lineJoin = lineStyle.join;\n            context.miterLimit = lineStyle.miterLimit;\n\n            if (data.type === SHAPES.POLY)\n            {\n                context.beginPath();\n\n                const tempShape = shape as Polygon;\n                let points = tempShape.points;\n                const holes = data.holes;\n                let outerArea;\n                let innerArea;\n                let px;\n                let py;\n                let holesDirection: boolean[];\n\n                context.moveTo(points[0], points[1]);\n\n                for (let j = 2; j < points.length; j += 2)\n                {\n                    context.lineTo(points[j], points[j + 1]);\n                }\n\n                if (tempShape.closeStroke)\n                {\n                    context.closePath();\n                }\n\n                if (holes.length > 0)\n                {\n                    holesDirection = [];\n                    outerArea = 0;\n                    px = points[0];\n                    py = points[1];\n                    for (let j = 2; j + 2 < points.length; j += 2)\n                    {\n                        outerArea += ((points[j] - px) * (points[j + 3] - py))\n                            - ((points[j + 2] - px) * (points[j + 1] - py));\n                    }\n\n                    for (let k = 0; k < holes.length; k++)\n                    {\n                        points = (holes[k].shape as Polygon).points;\n\n                        if (!points)\n                        {\n                            continue;\n                        }\n\n                        innerArea = 0;\n                        px = points[0];\n                        py = points[1];\n                        for (let j = 2; j + 2 < points.length; j += 2)\n                        {\n                            innerArea += ((points[j] - px) * (points[j + 3] - py))\n                                - ((points[j + 2] - px) * (points[j + 1] - py));\n                        }\n\n                        if (innerArea * outerArea < 0)\n                        {\n                            context.moveTo(points[0], points[1]);\n\n                            for (let j = 2; j < points.length; j += 2)\n                            {\n                                context.lineTo(points[j], points[j + 1]);\n                            }\n                        }\n                        else\n                        {\n                            context.moveTo(points[points.length - 2], points[points.length - 1]);\n\n                            for (let j = points.length - 4; j >= 0; j -= 2)\n                            {\n                                context.lineTo(points[j], points[j + 1]);\n                            }\n                        }\n\n                        if ((holes[k].shape as Polygon).closeStroke)\n                        {\n                            context.closePath();\n                        }\n\n                        holesDirection[k] = innerArea * outerArea < 0;\n                    }\n                }\n\n                if (fillStyle.visible)\n                {\n                    context.globalAlpha = fillStyle.alpha * worldAlpha;\n                    context.fillStyle = contextFillStyle;\n                    context.fill();\n                }\n\n                if (lineStyle.visible)\n                {\n                    this.paintPolygonStroke(\n                        tempShape, lineStyle, contextStrokeStyle, holes, holesDirection, worldAlpha, context\n                    );\n                }\n            }\n            else if (data.type === SHAPES.RECT)\n            {\n                const tempShape = shape as Rectangle;\n\n                if (fillStyle.visible)\n                {\n                    context.globalAlpha = fillStyle.alpha * worldAlpha;\n                    context.fillStyle = contextFillStyle;\n                    context.fillRect(tempShape.x, tempShape.y, tempShape.width, tempShape.height);\n                }\n\n                if (lineStyle.visible)\n                {\n                    const alignmentOffset = lineStyle.width * (0.5 - (1 - lineStyle.alignment));\n                    const width = tempShape.width + (2 * alignmentOffset);\n                    const height = tempShape.height + (2 * alignmentOffset);\n\n                    context.globalAlpha = lineStyle.alpha * worldAlpha;\n                    context.strokeStyle = contextStrokeStyle;\n                    context.strokeRect(tempShape.x - alignmentOffset, tempShape.y - alignmentOffset, width, height);\n                }\n            }\n            else if (data.type === SHAPES.CIRC)\n            {\n                const tempShape = shape as Circle;\n\n                // TODO - need to be Undefined!\n                context.beginPath();\n                context.arc(tempShape.x, tempShape.y, tempShape.radius, 0, 2 * Math.PI);\n                context.closePath();\n\n                if (fillStyle.visible)\n                {\n                    context.globalAlpha = fillStyle.alpha * worldAlpha;\n                    context.fillStyle = contextFillStyle;\n                    context.fill();\n                }\n\n                if (lineStyle.visible)\n                {\n                    if (lineStyle.alignment !== 0.5)\n                    {\n                        const alignmentOffset = lineStyle.width * (0.5 - (1 - lineStyle.alignment));\n\n                        context.beginPath();\n                        context.arc(tempShape.x, tempShape.y, tempShape.radius + alignmentOffset, 0, 2 * Math.PI);\n                        context.closePath();\n                    }\n\n                    context.globalAlpha = lineStyle.alpha * worldAlpha;\n                    context.strokeStyle = contextStrokeStyle;\n                    context.stroke();\n                }\n            }\n            else if (data.type === SHAPES.ELIP)\n            {\n                const tempShape = shape as Ellipse;\n                const drawShapeOverStroke = lineStyle.alignment === 1;\n\n                if (!drawShapeOverStroke)\n                {\n                    this.paintEllipse(tempShape, fillStyle, lineStyle, contextFillStyle, worldAlpha, context);\n                }\n\n                if (lineStyle.visible)\n                {\n                    if (lineStyle.alignment !== 0.5)\n                    {\n                        const kappa = 0.5522848;\n                        const alignmentOffset = lineStyle.width * (0.5 - (1 - lineStyle.alignment));\n                        const sW = (tempShape.width + alignmentOffset) * 2;\n                        const sH = (tempShape.height + alignmentOffset) * 2;\n                        const sX = tempShape.x - (sW / 2);\n                        const sY = tempShape.y - (sH / 2);\n                        const sOx = (sW / 2) * kappa;\n                        const sOy = (sH / 2) * kappa;\n                        const sXe = sX + sW;\n                        const sYe = sY + sH;\n                        const sXm = sX + (sW / 2);\n                        const sYm = sY + (sH / 2);\n\n                        context.beginPath();\n                        context.moveTo(sX, sYm);\n                        context.bezierCurveTo(sX, sYm - sOy, sXm - sOx, sY, sXm, sY);\n                        context.bezierCurveTo(sXm + sOx, sY, sXe, sYm - sOy, sXe, sYm);\n                        context.bezierCurveTo(sXe, sYm + sOy, sXm + sOx, sYe, sXm, sYe);\n                        context.bezierCurveTo(sXm - sOx, sYe, sX, sYm + sOy, sX, sYm);\n                        context.closePath();\n                    }\n\n                    context.globalAlpha = lineStyle.alpha * worldAlpha;\n                    context.strokeStyle = contextStrokeStyle;\n                    context.stroke();\n                }\n\n                if (drawShapeOverStroke)\n                {\n                    this.paintEllipse(tempShape, fillStyle, lineStyle, contextFillStyle, worldAlpha, context);\n                }\n            }\n            else if (data.type === SHAPES.RREC)\n            {\n                const tempShape = shape as RoundedRectangle;\n                const drawShapeOverStroke = lineStyle.alignment === 1;\n\n                if (!drawShapeOverStroke)\n                {\n                    this.paintRoundedRectangle(tempShape, fillStyle, lineStyle, contextFillStyle, worldAlpha, context);\n                }\n\n                if (lineStyle.visible)\n                {\n                    if (lineStyle.alignment !== 0.5)\n                    {\n                        const width = tempShape.width;\n                        const height = tempShape.height;\n                        const alignmentOffset = lineStyle.width * (0.5 - (1 - lineStyle.alignment));\n                        const sRx = tempShape.x - alignmentOffset;\n                        const sRy = tempShape.y - alignmentOffset;\n                        const sWidth = tempShape.width + (2 * alignmentOffset);\n                        const sHeight = tempShape.height + (2 * alignmentOffset);\n                        const radiusOffset = alignmentOffset * (lineStyle.alignment >= 1\n                            ? Math.min(sWidth / width, sHeight / height) : Math.min(width / sWidth, height / sHeight));\n                        let sRadius = tempShape.radius + radiusOffset;\n                        const sMaxRadius = Math.min(sWidth, sHeight) / 2;\n\n                        sRadius = sRadius > sMaxRadius ? sMaxRadius : sRadius;\n\n                        context.beginPath();\n                        context.moveTo(sRx, sRy + sRadius);\n                        context.lineTo(sRx, sRy + sHeight - sRadius);\n                        context.quadraticCurveTo(sRx, sRy + sHeight, sRx + sRadius, sRy + sHeight);\n                        context.lineTo(sRx + sWidth - sRadius, sRy + sHeight);\n                        context.quadraticCurveTo(sRx + sWidth, sRy + sHeight, sRx + sWidth, sRy + sHeight - sRadius);\n                        context.lineTo(sRx + sWidth, sRy + sRadius);\n                        context.quadraticCurveTo(sRx + sWidth, sRy, sRx + sWidth - sRadius, sRy);\n                        context.lineTo(sRx + sRadius, sRy);\n                        context.quadraticCurveTo(sRx, sRy, sRx, sRy + sRadius);\n                        context.closePath();\n                    }\n\n                    context.globalAlpha = lineStyle.alpha * worldAlpha;\n                    context.strokeStyle = contextStrokeStyle;\n                    context.stroke();\n                }\n\n                if (drawShapeOverStroke)\n                {\n                    this.paintRoundedRectangle(tempShape, fillStyle, lineStyle, contextFillStyle, worldAlpha, context);\n                }\n            }\n        }\n    }\n\n    /**\n     * Paint stroke for polygon and holes\n     * @private\n     * @param shape - Shape to be drawn\n     * @param lineStyle - Line style for the shape\n     * @param contextStrokeStyle - The strokeStyle for the canvas context\n     * @param holes - Holes to be added to the shape\n     * @param holesDirection -\n     * @param worldAlpha - The multiplied alpha of the displayObject\n     * @param context - The canvas context\n     */\n    private paintPolygonStroke(\n        shape: Polygon, lineStyle: LineStyle, contextStrokeStyle: string | CanvasPattern,\n        holes: GraphicsData[], holesDirection: boolean[],\n        worldAlpha: number, context: CrossPlatformCanvasRenderingContext2D\n    ): void\n    {\n        if (lineStyle.alignment !== 0.5)\n        {\n            const alignmentOffset = lineStyle.width * (0.5 - (1 - lineStyle.alignment));\n            let offsetPoints = PolygonUtils.offsetPolygon(shape.points, alignmentOffset);\n            let points;\n\n            context.beginPath();\n            context.moveTo(offsetPoints[0], offsetPoints[1]);\n\n            for (let j = 2; j < offsetPoints.length; j += 2)\n            {\n                context.lineTo(offsetPoints[j], offsetPoints[j + 1]);\n            }\n\n            if (shape.closeStroke)\n            {\n                context.closePath();\n            }\n\n            for (let k = 0; k < holes.length; k++)\n            {\n                points = (holes[k].shape as Polygon).points;\n                offsetPoints = PolygonUtils.offsetPolygon(points, alignmentOffset);\n\n                if (holesDirection[k])\n                {\n                    context.moveTo(offsetPoints[0], offsetPoints[1]);\n\n                    for (let j = 2; j < offsetPoints.length; j += 2)\n                    {\n                        context.lineTo(offsetPoints[j], offsetPoints[j + 1]);\n                    }\n                }\n                else\n                {\n                    context.moveTo(offsetPoints[offsetPoints.length - 2], offsetPoints[offsetPoints.length - 1]);\n\n                    for (let j = offsetPoints.length - 4; j >= 0; j -= 2)\n                    {\n                        context.lineTo(offsetPoints[j], offsetPoints[j + 1]);\n                    }\n                }\n\n                if ((holes[k].shape as Polygon).closeStroke)\n                {\n                    context.closePath();\n                }\n            }\n        }\n\n        context.globalAlpha = lineStyle.alpha * worldAlpha;\n        context.strokeStyle = contextStrokeStyle;\n        context.stroke();\n    }\n\n    /**\n     * Paint Ellipse\n     * @private\n     * @param shape - Shape to be drawn\n     * @param fillStyle - Fill for the shape\n     * @param lineStyle - Line style for the shape\n     * @param contextFillStyle - The canvas context fill style\n     * @param worldAlpha - The multiplied alpha of the displayObject\n     * @param context - The canvas context\n     */\n    private paintEllipse(\n        shape: Ellipse, fillStyle: FillStyle, lineStyle: LineStyle,\n        contextFillStyle: string | CanvasPattern, worldAlpha: number,\n        context: CrossPlatformCanvasRenderingContext2D): void\n    {\n        // ellipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\n        const w = shape.width * 2;\n        const h = shape.height * 2;\n\n        const x = shape.x - (w / 2);\n        const y = shape.y - (h / 2);\n\n        const kappa = 0.5522848;\n        const ox = (w / 2) * kappa; // control point offset horizontal\n        const oy = (h / 2) * kappa; // control point offset vertical\n        const xe = x + w; // x-end\n        const ye = y + h; // y-end\n        const xm = x + (w / 2); // x-middle\n        const ym = y + (h / 2); // y-middle\n\n        if (lineStyle.alignment === 0)\n        {\n            context.save();\n        }\n\n        context.beginPath();\n        context.moveTo(x, ym);\n        context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n        context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n        context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n        context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n        context.closePath();\n\n        if (lineStyle.alignment === 0)\n        {\n            context.clip();\n        }\n\n        if (fillStyle.visible)\n        {\n            context.globalAlpha = fillStyle.alpha * worldAlpha;\n            context.fillStyle = contextFillStyle;\n            context.fill();\n        }\n\n        if (lineStyle.alignment === 0)\n        {\n            context.restore();\n        }\n    }\n\n    /**\n     * Paint Rounded Rectangle\n     * @private\n     * @param shape - Shape to be drawn\n     * @param fillStyle - Fill for the shape\n     * @param lineStyle - Line style for the shape\n     * @param contextFillStyle - The canvas context fill style\n     * @param worldAlpha - The multiplied alpha of the displayObject\n     * @param context - The canvas context\n     */\n    private paintRoundedRectangle(\n        shape: RoundedRectangle, fillStyle: FillStyle, lineStyle: LineStyle,\n        contextFillStyle: string | CanvasPattern, worldAlpha: number,\n        context: CrossPlatformCanvasRenderingContext2D\n    ): void\n    {\n        const rx = shape.x;\n        const ry = shape.y;\n        const width = shape.width;\n        const height = shape.height;\n        let radius = shape.radius;\n\n        const maxRadius = Math.min(width, height) / 2;\n\n        radius = radius > maxRadius ? maxRadius : radius;\n\n        if (lineStyle.alignment === 0)\n        {\n            context.save();\n        }\n\n        context.beginPath();\n        context.moveTo(rx, ry + radius);\n        context.lineTo(rx, ry + height - radius);\n        context.quadraticCurveTo(rx, ry + height, rx + radius, ry + height);\n        context.lineTo(rx + width - radius, ry + height);\n        context.quadraticCurveTo(rx + width, ry + height, rx + width, ry + height - radius);\n        context.lineTo(rx + width, ry + radius);\n        context.quadraticCurveTo(rx + width, ry, rx + width - radius, ry);\n        context.lineTo(rx + radius, ry);\n        context.quadraticCurveTo(rx, ry, rx, ry + radius);\n        context.closePath();\n\n        if (lineStyle.alignment === 0)\n        {\n            context.clip();\n        }\n\n        if (fillStyle.visible)\n        {\n            context.globalAlpha = fillStyle.alpha * worldAlpha;\n            context.fillStyle = contextFillStyle;\n            context.fill();\n        }\n\n        if (lineStyle.alignment === 0)\n        {\n            context.restore();\n        }\n    }\n\n    public setPatternTransform(pattern: CanvasPattern, matrix: Matrix): void\n    {\n        if (this._svgMatrix === false)\n        {\n            return;\n        }\n        if (!this._svgMatrix)\n        {\n            const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n            if (svg?.createSVGMatrix)\n            {\n                this._svgMatrix = svg.createSVGMatrix();\n            }\n            if (!this._svgMatrix || !pattern.setTransform)\n            {\n                this._svgMatrix = false;\n\n                return;\n            }\n        }\n\n        (this._svgMatrix as DOMMatrix).a = matrix.a;\n        (this._svgMatrix as DOMMatrix).b = matrix.b;\n        (this._svgMatrix as DOMMatrix).c = matrix.c;\n        (this._svgMatrix as DOMMatrix).d = matrix.d;\n        (this._svgMatrix as DOMMatrix).e = matrix.tx;\n        (this._svgMatrix as DOMMatrix).f = matrix.ty;\n        pattern.setTransform((this._svgMatrix as DOMMatrix).inverse());\n    }\n\n    /** destroy graphics object */\n    public destroy(): void\n    {\n        this.renderer = null;\n        this._svgMatrix = null;\n        this._tempMatrix = null;\n    }\n}\n\nextensions.add(CanvasGraphicsRenderer);\n"],"names":[],"mappings":"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"}