{"version":3,"file":"buildLine.mjs","sources":["../../src/utils/buildLine.ts"],"sourcesContent":["import { Point, SHAPES } from 'pixijs/core';\nimport { curves, LINE_CAP, LINE_JOIN } from '../const';\n\nimport type { Polygon } from 'pixijs/core';\nimport type { GraphicsData } from '../GraphicsData';\nimport type { GraphicsGeometry } from '../GraphicsGeometry';\n\n/**\n * Buffers vertices to draw a square cap.\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n * @param {number} x - X-coord of end point\n * @param {number} y - Y-coord of end point\n * @param {number} nx - X-coord of line normal pointing inside\n * @param {number} ny - Y-coord of line normal pointing inside\n * @param {number} innerWeight - Weight of inner points\n * @param {number} outerWeight - Weight of outer points\n * @param {boolean} clockwise - Whether the cap is drawn clockwise\n * @param {Array<number>} verts - vertex buffer\n * @returns {number} - no. of vertices pushed\n */\nfunction square(\n    x: number,\n    y: number,\n    nx: number,\n    ny: number,\n    innerWeight: number,\n    outerWeight: number,\n    clockwise: boolean, /* rotation for square (true at left end, false at right end) */\n    verts: Array<number>\n): number\n{\n    const ix = x - (nx * innerWeight);\n    const iy = y - (ny * innerWeight);\n    const ox = x + (nx * outerWeight);\n    const oy = y + (ny * outerWeight);\n\n    /* Rotate nx,ny for extension vector */\n    let exx; let\n        eyy;\n\n    if (clockwise)\n    {\n        exx = ny;\n        eyy = -nx;\n    }\n    else\n    {\n        exx = -ny;\n        eyy = nx;\n    }\n\n    /* [i|0]x,y extended at cap */\n    const eix = ix + exx;\n    const eiy = iy + eyy;\n    const eox = ox + exx;\n    const eoy = oy + eyy;\n\n    /* Square itself must be inserted clockwise*/\n    verts.push(\n        eix, eiy,\n        eox, eoy);\n\n    return 2;\n}\n\n/**\n * Buffers vertices to draw an arc at the line joint or cap.\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n * @param {number} cx - X-coord of center\n * @param {number} cy - Y-coord of center\n * @param {number} sx - X-coord of arc start\n * @param {number} sy - Y-coord of arc start\n * @param {number} ex - X-coord of arc end\n * @param {number} ey - Y-coord of arc end\n * @param {Array<number>} verts - buffer of vertices\n * @param {boolean} clockwise - orientation of vertices\n * @returns {number} - no. of vertices pushed\n */\nfunction round(\n    cx: number,\n    cy: number,\n    sx: number,\n    sy: number,\n    ex: number,\n    ey: number,\n    verts: Array<number>,\n    clockwise: boolean, /* if not cap, then clockwise is turn of joint, otherwise rotation from angle0 to angle1 */\n): number\n{\n    const cx2p0x = sx - cx;\n    const cy2p0y = sy - cy;\n\n    let angle0 = Math.atan2(cx2p0x, cy2p0y);\n    let angle1 = Math.atan2(ex - cx, ey - cy);\n\n    if (clockwise && angle0 < angle1)\n    {\n        angle0 += Math.PI * 2;\n    }\n    else if (!clockwise && angle0 > angle1)\n    {\n        angle1 += Math.PI * 2;\n    }\n\n    let startAngle = angle0;\n    const angleDiff = angle1 - angle0;\n    const absAngleDiff = Math.abs(angleDiff);\n\n    /* if (absAngleDiff >= PI_LBOUND && absAngleDiff <= PI_UBOUND)\n    {\n        const r1x = cx - nxtPx;\n        const r1y = cy - nxtPy;\n\n        if (r1x === 0)\n        {\n            if (r1y > 0)\n            {\n                angleDiff = -angleDiff;\n            }\n        }\n        else if (r1x >= -curves.epsilon)\n        {\n            angleDiff = -angleDiff;\n        }\n    }*/\n\n    const radius = Math.sqrt((cx2p0x * cx2p0x) + (cy2p0y * cy2p0y));\n    const segCount = ((15 * absAngleDiff * Math.sqrt(radius) / Math.PI) >> 0) + 1;\n    const angleInc = angleDiff / segCount;\n\n    startAngle += angleInc;\n\n    if (clockwise)\n    {\n        verts.push(\n            cx, cy,\n            sx, sy);\n\n        for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc)\n        {\n            verts.push(\n                cx, cy,\n                cx + ((Math.sin(angle) * radius)), cy + ((Math.cos(angle) * radius)));\n        }\n\n        verts.push(\n            cx, cy,\n            ex, ey);\n    }\n    else\n    {\n        verts.push(\n            sx, sy,\n            cx, cy);\n\n        for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc)\n        {\n            verts.push(\n                cx + ((Math.sin(angle) * radius)), cy + ((Math.cos(angle) * radius)),\n                cx, cy);\n        }\n\n        verts.push(\n            ex, ey,\n            cx, cy);\n    }\n\n    return segCount * 2;\n}\n\n/**\n * Builds a line to draw using the polygon method.\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n * @param {PIXI.GraphicsData} graphicsData - The graphics object containing all the necessary properties\n * @param {PIXI.GraphicsGeometry} graphicsGeometry - Geometry where to append output\n */\nfunction buildNonNativeLine(graphicsData: GraphicsData, graphicsGeometry: GraphicsGeometry): void\n{\n    const shape = graphicsData.shape as Polygon;\n    let points = graphicsData.points || shape.points.slice();\n    const eps = graphicsGeometry.closePointEps;\n\n    if (points.length === 0)\n    {\n        return;\n    }\n    // if the line width is an odd number add 0.5 to align to a whole pixel\n    // commenting this out fixes #711 and #1620\n    // if (graphicsData.lineWidth%2)\n    // {\n    //     for (i = 0; i < points.length; i++)\n    //     {\n    //         points[i] += 0.5;\n    //     }\n    // }\n\n    const style = graphicsData.lineStyle;\n\n    // get first and last point.. figure out the middle!\n    const firstPoint = new Point(points[0], points[1]);\n    const lastPoint = new Point(points[points.length - 2], points[points.length - 1]);\n    const closedShape = shape.type !== SHAPES.POLY || shape.closeStroke;\n    const closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps\n        && Math.abs(firstPoint.y - lastPoint.y) < eps;\n\n    // if the first point is the last point - gonna have issues :)\n    if (closedShape)\n    {\n        // need to clone as we are going to slightly modify the shape..\n        points = points.slice();\n\n        if (closedPath)\n        {\n            points.pop();\n            points.pop();\n            lastPoint.set(points[points.length - 2], points[points.length - 1]);\n        }\n\n        const midPointX = (firstPoint.x + lastPoint.x) * 0.5;\n        const midPointY = (lastPoint.y + firstPoint.y) * 0.5;\n\n        points.unshift(midPointX, midPointY);\n        points.push(midPointX, midPointY);\n    }\n\n    const verts = graphicsGeometry.points;\n    const length = points.length / 2;\n    let indexCount = points.length;\n    const indexStart = verts.length / 2;\n\n    // Max. inner and outer width\n    const width = style.width / 2;\n    const widthSquared = width * width;\n    const miterLimitSquared = style.miterLimit * style.miterLimit;\n\n    /* Line segments of interest where (x1,y1) forms the corner. */\n    let x0 = points[0];\n    let y0 = points[1];\n    let x1 = points[2];\n    let y1 = points[3];\n    let x2 = 0;\n    let y2 = 0;\n\n    /* perp[?](x|y) = the line normal with magnitude lineWidth. */\n    let perpx = -(y0 - y1);\n    let perpy = x0 - x1;\n    let perp1x = 0;\n    let perp1y = 0;\n\n    let dist = Math.sqrt((perpx * perpx) + (perpy * perpy));\n\n    perpx /= dist;\n    perpy /= dist;\n    perpx *= width;\n    perpy *= width;\n\n    const ratio = style.alignment;// 0.5;\n    const innerWeight = (1 - ratio) * 2;\n    const outerWeight = ratio * 2;\n\n    if (!closedShape)\n    {\n        if (style.cap === LINE_CAP.ROUND)\n        {\n            indexCount += round(\n                x0 - (perpx * (innerWeight - outerWeight) * 0.5),\n                y0 - (perpy * (innerWeight - outerWeight) * 0.5),\n                x0 - (perpx * innerWeight),\n                y0 - (perpy * innerWeight),\n                x0 + (perpx * outerWeight),\n                y0 + (perpy * outerWeight),\n                verts,\n                true,\n            ) + 2;\n        }\n        else if (style.cap === LINE_CAP.SQUARE)\n        {\n            indexCount += square(x0, y0, perpx, perpy, innerWeight, outerWeight, true, verts);\n        }\n    }\n\n    // Push first point (below & above vertices)\n    verts.push(\n        x0 - (perpx * innerWeight), y0 - (perpy * innerWeight),\n        x0 + (perpx * outerWeight), y0 + (perpy * outerWeight));\n\n    for (let i = 1; i < length - 1; ++i)\n    {\n        x0 = points[(i - 1) * 2];\n        y0 = points[((i - 1) * 2) + 1];\n\n        x1 = points[i * 2];\n        y1 = points[(i * 2) + 1];\n\n        x2 = points[(i + 1) * 2];\n        y2 = points[((i + 1) * 2) + 1];\n\n        perpx = -(y0 - y1);\n        perpy = x0 - x1;\n\n        dist = Math.sqrt((perpx * perpx) + (perpy * perpy));\n        perpx /= dist;\n        perpy /= dist;\n        perpx *= width;\n        perpy *= width;\n\n        perp1x = -(y1 - y2);\n        perp1y = x1 - x2;\n\n        dist = Math.sqrt((perp1x * perp1x) + (perp1y * perp1y));\n        perp1x /= dist;\n        perp1y /= dist;\n        perp1x *= width;\n        perp1y *= width;\n\n        /* d[x|y](0|1) = the component displacement between points p(0,1|1,2) */\n        const dx0 = x1 - x0;\n        const dy0 = y0 - y1;\n        const dx1 = x1 - x2;\n        const dy1 = y2 - y1;\n\n        /* +ve if internal angle < 90 degree, -ve if internal angle > 90 degree. */\n        const dot = (dx0 * dx1) + (dy0 * dy1);\n        /* +ve if internal angle counterclockwise, -ve if internal angle clockwise. */\n        const cross = (dy0 * dx1) - (dy1 * dx0);\n        const clockwise = (cross < 0);\n\n        /* Going nearly parallel? */\n        /* atan(0.001) ~= 0.001 rad ~= 0.057 degree */\n        if (Math.abs(cross) < 0.001 * Math.abs(dot))\n        {\n            verts.push(\n                x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n                x1 + (perpx * outerWeight), y1 + (perpy * outerWeight));\n\n            /* 180 degree corner? */\n            if (dot >= 0)\n            {\n                if (style.join === LINE_JOIN.ROUND)\n                {\n                    indexCount += round(\n                        x1, y1,\n                        x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n                        x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n                        verts, false) + 4;\n                }\n                else\n                {\n                    indexCount += 2;\n                }\n\n                verts.push(\n                    x1 - (perp1x * outerWeight), y1 - (perp1y * outerWeight),\n                    x1 + (perp1x * innerWeight), y1 + (perp1y * innerWeight));\n            }\n\n            continue;\n        }\n\n        /* p[x|y] is the miter point. pdist is the distance between miter point and p1. */\n        const c1 = ((-perpx + x0) * (-perpy + y1)) - ((-perpx + x1) * (-perpy + y0));\n        const c2 = ((-perp1x + x2) * (-perp1y + y1)) - ((-perp1x + x1) * (-perp1y + y2));\n        const px = ((dx0 * c2) - (dx1 * c1)) / cross;\n        const py = ((dy1 * c1) - (dy0 * c2)) / cross;\n        const pdist = ((px - x1) * (px - x1)) + ((py - y1) * (py - y1));\n\n        /* Inner miter point */\n        const imx = x1 + ((px - x1) * innerWeight);\n        const imy = y1 + ((py - y1) * innerWeight);\n        /* Outer miter point */\n        const omx = x1 - ((px - x1) * outerWeight);\n        const omy = y1 - ((py - y1) * outerWeight);\n\n        /* Is the inside miter point too far away, creating a spike? */\n        const smallerInsideSegmentSq = Math.min((dx0 * dx0) + (dy0 * dy0), (dx1 * dx1) + (dy1 * dy1));\n        const insideWeight = clockwise ? innerWeight : outerWeight;\n        const smallerInsideDiagonalSq = smallerInsideSegmentSq + (insideWeight * insideWeight * widthSquared);\n        const insideMiterOk = pdist <= smallerInsideDiagonalSq;\n\n        let join = style.join;\n\n        if (join === LINE_JOIN.MITER && pdist / widthSquared > miterLimitSquared)\n        {\n            join = LINE_JOIN.BEVEL;\n        }\n\n        if (insideMiterOk)\n        {\n            switch (join)\n            {\n                case LINE_JOIN.MITER:\n                {\n                    verts.push(\n                        imx, imy,\n                        omx, omy);\n                    break;\n                }\n                case LINE_JOIN.BEVEL:\n                {\n                    if (clockwise) /* rotating at inner angle */\n                    {\n                        verts.push(\n                            imx, imy, // inner miter point\n                            x1 + (perpx * outerWeight), y1 + (perpy * outerWeight), // first segment's outer vertex\n                            imx, imy, // inner miter point\n                            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight)); // second segment's outer vertex\n                    }\n                    else /* rotating at outer angle */\n                    {\n                        verts.push(\n                            x1 - (perpx * innerWeight), y1 - (perpy * innerWeight), // first segment's inner vertex\n                            omx, omy, // outer miter point\n                            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight), // second segment's outer vertex\n                            omx, omy); // outer miter point\n                    }\n\n                    indexCount += 2;\n                    break;\n                }\n                case LINE_JOIN.ROUND:\n                {\n                    if (clockwise) /* arc is outside */\n                    {\n                        verts.push(\n                            imx, imy,\n                            x1 + (perpx * outerWeight), y1 + (perpy * outerWeight));\n\n                        indexCount += round(\n                            x1, y1,\n                            x1 + (perpx * outerWeight), y1 + (perpy * outerWeight),\n                            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight),\n                            verts, true\n                        ) + 4;\n\n                        verts.push(\n                            imx, imy,\n                            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight));\n                    }\n                    else /* arc is inside */\n                    {\n                        verts.push(\n                            x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n                            omx, omy);\n\n                        indexCount += round(\n                            x1, y1,\n                            x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n                            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n                            verts, false\n                        ) + 4;\n\n                        verts.push(\n                            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n                            omx, omy);\n                    }\n                    break;\n                }\n            }\n        }\n        else // inside miter is NOT ok\n        {\n            verts.push(\n                x1 - (perpx * innerWeight), y1 - (perpy * innerWeight), // first segment's inner vertex\n                x1 + (perpx * outerWeight), y1 + (perpy * outerWeight)); // first segment's outer vertex\n            switch (join)\n            {\n                case LINE_JOIN.MITER:\n                {\n                    if (clockwise)\n                    {\n                        verts.push(\n                            omx, omy, // inner miter point\n                            omx, omy); // inner miter point\n                    }\n                    else\n                    {\n                        verts.push(\n                            imx, imy, // outer miter point\n                            imx, imy); // outer miter point\n                    }\n                    indexCount += 2;\n                    break;\n                }\n                case LINE_JOIN.ROUND:\n                {\n                    if (clockwise) /* arc is outside */\n                    {\n                        indexCount += round(\n                            x1, y1,\n                            x1 + (perpx * outerWeight), y1 + (perpy * outerWeight),\n                            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight),\n                            verts, true\n                        ) + 2;\n                    }\n                    else /* arc is inside */\n                    {\n                        indexCount += round(\n                            x1, y1,\n                            x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n                            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n                            verts, false\n                        ) + 2;\n                    }\n                    break;\n                }\n            }\n            verts.push(\n                x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight), // second segment's inner vertex\n                x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight)); // second segment's outer vertex\n            indexCount += 2;\n        }\n    }\n\n    x0 = points[(length - 2) * 2];\n    y0 = points[((length - 2) * 2) + 1];\n\n    x1 = points[(length - 1) * 2];\n    y1 = points[((length - 1) * 2) + 1];\n\n    perpx = -(y0 - y1);\n    perpy = x0 - x1;\n\n    dist = Math.sqrt((perpx * perpx) + (perpy * perpy));\n    perpx /= dist;\n    perpy /= dist;\n    perpx *= width;\n    perpy *= width;\n\n    verts.push(\n        x1 - (perpx * innerWeight), y1 - (perpy * innerWeight),\n        x1 + (perpx * outerWeight), y1 + (perpy * outerWeight));\n\n    if (!closedShape)\n    {\n        if (style.cap === LINE_CAP.ROUND)\n        {\n            indexCount += round(\n                x1 - (perpx * (innerWeight - outerWeight) * 0.5),\n                y1 - (perpy * (innerWeight - outerWeight) * 0.5),\n                x1 - (perpx * innerWeight),\n                y1 - (perpy * innerWeight),\n                x1 + (perpx * outerWeight),\n                y1 + (perpy * outerWeight),\n                verts,\n                false\n            ) + 2;\n        }\n        else if (style.cap === LINE_CAP.SQUARE)\n        {\n            indexCount += square(x1, y1, perpx, perpy, innerWeight, outerWeight, false, verts);\n        }\n    }\n\n    const indices = graphicsGeometry.indices;\n    const eps2 = curves.epsilon * curves.epsilon;\n\n    // indices.push(indexStart);\n    for (let i = indexStart; i < indexCount + indexStart - 2; ++i)\n    {\n        x0 = verts[(i * 2)];\n        y0 = verts[(i * 2) + 1];\n\n        x1 = verts[(i + 1) * 2];\n        y1 = verts[((i + 1) * 2) + 1];\n\n        x2 = verts[(i + 2) * 2];\n        y2 = verts[((i + 2) * 2) + 1];\n\n        /* Skip zero area triangles */\n        if (Math.abs((x0 * (y1 - y2)) + (x1 * (y2 - y0)) + (x2 * (y0 - y1))) < eps2)\n        {\n            continue;\n        }\n\n        indices.push(i, i + 1, i + 2);\n    }\n}\n\n/**\n * Builds a line to draw using the gl.drawArrays(gl.LINES) method\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n * @param {PIXI.GraphicsData} graphicsData - The graphics object containing all the necessary properties\n * @param {PIXI.GraphicsGeometry} graphicsGeometry - Geometry where to append output\n */\nfunction buildNativeLine(graphicsData: GraphicsData, graphicsGeometry: GraphicsGeometry): void\n{\n    let i = 0;\n\n    const shape = graphicsData.shape as Polygon;\n    const points = graphicsData.points || shape.points;\n    const closedShape = shape.type !== SHAPES.POLY || shape.closeStroke;\n\n    if (points.length === 0) return;\n\n    const verts = graphicsGeometry.points;\n    const indices = graphicsGeometry.indices;\n    const length = points.length / 2;\n\n    const startIndex = verts.length / 2;\n    let currentIndex = startIndex;\n\n    verts.push(points[0], points[1]);\n\n    for (i = 1; i < length; i++)\n    {\n        verts.push(points[i * 2], points[(i * 2) + 1]);\n        indices.push(currentIndex, currentIndex + 1);\n\n        currentIndex++;\n    }\n\n    if (closedShape)\n    {\n        indices.push(currentIndex, startIndex);\n    }\n}\n\n/**\n * Builds a line to draw\n *\n * Ignored from docs since it is not directly exposed.\n * @ignore\n * @private\n * @param {PIXI.GraphicsData} graphicsData - The graphics object containing all the necessary properties\n * @param {PIXI.GraphicsGeometry} graphicsGeometry - Geometry where to append output\n */\nexport function buildLine(graphicsData: GraphicsData, graphicsGeometry: GraphicsGeometry): void\n{\n    if (graphicsData.lineStyle.native)\n    {\n        buildNativeLine(graphicsData, graphicsGeometry);\n    }\n    else\n    {\n        buildNonNativeLine(graphicsData, graphicsGeometry);\n    }\n}\n"],"names":[],"mappings":"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"}