{ "version": 3, "sources": ["../../../../../src/lib/shapes/geo/components/DrawStyleEllipse.tsx"], "sourcesContent": ["import {\n\tEASINGS,\n\tPI2,\n\tTAU,\n\tTLDefaultColorTheme,\n\tTLGeoShape,\n\tTLShapeId,\n\tVec2d,\n\tgetSvgPathFromPoints,\n\tperimeterOfEllipse,\n\trng,\n} from '@tldraw/editor'\n\nimport * as React from 'react'\nimport {\n\tShapeFill,\n\tgetShapeFillSvg,\n\tgetSvgWithShapeFill,\n\tuseDefaultColorTheme,\n} from '../../shared/ShapeFill'\nimport { getStrokeOutlinePoints } from '../../shared/freehand/getStrokeOutlinePoints'\nimport { getStrokePoints } from '../../shared/freehand/getStrokePoints'\nimport { setStrokePointRadii } from '../../shared/freehand/setStrokePointRadii'\nimport { getSvgPathFromStrokePoints } from '../../shared/freehand/svg'\n\nexport const DrawStyleEllipse = React.memo(function DrawStyleEllipse({\n\tid,\n\tw,\n\th,\n\tstrokeWidth: sw,\n\tfill,\n\tcolor,\n}: Pick & {\n\tstrokeWidth: number\n\tid: TLShapeId\n}) {\n\tconst theme = useDefaultColorTheme()\n\tconst innerPath = getEllipseIndicatorPath(id, w, h, sw)\n\tconst outerPath = getEllipsePath(id, w, h, sw)\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\n\t\t\n\t)\n})\n\nexport function DrawStyleEllipseSvg({\n\tid,\n\tw,\n\th,\n\tstrokeWidth: sw,\n\tfill,\n\tcolor,\n\ttheme,\n}: Pick & {\n\tstrokeWidth: number\n\tid: TLShapeId\n\ttheme: TLDefaultColorTheme\n}) {\n\tconst strokeElement = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\tstrokeElement.setAttribute('d', getEllipsePath(id, w, h, sw))\n\tstrokeElement.setAttribute('fill', theme[color].solid)\n\n\t// Get the fill element, if any\n\tconst fillElement = getShapeFillSvg({\n\t\td: getEllipseIndicatorPath(id, w, h, sw),\n\t\tfill,\n\t\tcolor,\n\t\ttheme,\n\t})\n\n\treturn getSvgWithShapeFill(strokeElement, fillElement)\n}\n\nexport function getEllipseStrokeOptions(strokeWidth: number) {\n\treturn {\n\t\tsize: 1 + strokeWidth,\n\t\tthinning: 0.25,\n\t\tend: { taper: strokeWidth },\n\t\tstart: { taper: strokeWidth },\n\t\tstreamline: 0,\n\t\tsmoothing: 1,\n\t\tsimulatePressure: false,\n\t}\n}\n\nexport function getEllipseStrokePoints(\n\tid: string,\n\twidth: number,\n\theight: number,\n\tstrokeWidth: number\n) {\n\tconst getRandom = rng(id)\n\n\tconst rx = width / 2\n\tconst ry = height / 2\n\tconst perimeter = perimeterOfEllipse(rx, ry)\n\n\tconst points: Vec2d[] = []\n\n\tconst start = PI2 * getRandom()\n\tconst length = PI2 + TAU / 2 + Math.abs(getRandom()) * TAU\n\tconst count = Math.max(16, perimeter / 10)\n\n\tfor (let i = 0; i < count; i++) {\n\t\tconst t = i / (count - 1)\n\t\tconst r = start + t * length\n\t\tconst c = Math.cos(r)\n\t\tconst s = Math.sin(r)\n\t\tpoints.push(\n\t\t\tnew Vec2d(\n\t\t\t\trx * c + width * 0.5 + 0.05 * getRandom(),\n\t\t\t\try * s + height / 2 + 0.05 * getRandom(),\n\t\t\t\tMath.min(\n\t\t\t\t\t1,\n\t\t\t\t\t0.5 +\n\t\t\t\t\t\tMath.abs(0.5 - (getRandom() > 0 ? EASINGS.easeInOutSine(t) : EASINGS.easeInExpo(t))) / 2\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t}\n\n\treturn getStrokePoints(points, getEllipseStrokeOptions(strokeWidth))\n}\n\nexport function getEllipsePath(id: string, width: number, height: number, strokeWidth: number) {\n\tconst options = getEllipseStrokeOptions(strokeWidth)\n\treturn getSvgPathFromPoints(\n\t\tgetStrokeOutlinePoints(\n\t\t\tsetStrokePointRadii(getEllipseStrokePoints(id, width, height, strokeWidth), options),\n\t\t\toptions\n\t\t)\n\t)\n}\n\nexport function getEllipseIndicatorPath(\n\tid: string,\n\twidth: number,\n\theight: number,\n\tstrokeWidth: number\n) {\n\treturn getSvgPathFromStrokePoints(getEllipseStrokePoints(id, width, height, strokeWidth))\n}\n"], "mappings": "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", "names": ["DrawStyleEllipse"] }