{
  "version": 3,
  "sources": ["../../../src/lib/overlays/ScribbleOverlayUtil.ts"],
  "sourcesContent": ["import {\n\tEASINGS,\n\tOverlayUtil,\n\tTLCanvasUiColor,\n\tTLOverlay,\n\tTLScribble,\n\tTLThemeColors,\n\tgetSvgPathFromPoints,\n} from '@tldraw/editor'\nimport { getStroke } from '../shapes/shared/freehand/getStroke'\n\n/** @public */\nexport interface TLScribbleOverlay extends TLOverlay {\n\tprops: {\n\t\tscribble: TLScribble\n\t}\n}\n\n// Cache Path2D results for scribbles when inputs have not changed.\n// Keyed by scribble id; invalidated when points length/last point/zoom/size/taper/state change.\ninterface ScribbleCacheEntry {\n\tlen: number\n\tlastX: number\n\tlastY: number\n\tzoom: number\n\tsize: number\n\ttaper: boolean\n\tstate: TLScribble['state']\n\tpath: Path2D\n}\n\n/**\n * Overlay util for scribble strokes (eraser, lasso selection, etc.).\n *\n * @public\n */\nexport class ScribbleOverlayUtil extends OverlayUtil<TLScribbleOverlay> {\n\tstatic override type = 'scribble'\n\toverride options = { zIndex: 600, streamline: 0.32, cacheSize: 500 }\n\n\t// Per-editor cache so multiple <Tldraw /> instances on one page don't\n\t// trample each other's entries. String-keyed (not a WeakMap) because the\n\t// cache key is a logical identity \u2014 `scribble.id` \u2014 not the scribble\n\t// object. Tldraw's store replaces record objects on every update, so a\n\t// WeakMap keyed on the `TLScribble` instance would cache-miss every frame.\n\t// Lifetime is bounded by the Util instance plus the `cacheSize` cap below.\n\tprivate _scribblePathCache = new Map<string, ScribbleCacheEntry>()\n\n\toverride isActive(): boolean {\n\t\treturn this.editor.getInstanceState().scribbles.length > 0\n\t}\n\n\toverride getOverlays(): TLScribbleOverlay[] {\n\t\treturn this.editor.getInstanceState().scribbles.map((scribble) => ({\n\t\t\tid: `scribble:${scribble.id}`,\n\t\t\ttype: 'scribble',\n\t\t\tprops: { scribble },\n\t\t}))\n\t}\n\n\toverride render(ctx: CanvasRenderingContext2D, overlays: TLScribbleOverlay[]): void {\n\t\tconst zoom = this.editor.getZoomLevel()\n\t\tconst colors = this.editor.getCurrentTheme().colors[this.editor.getColorMode()]\n\n\t\tfor (const overlay of overlays) {\n\t\t\tconst { scribble } = overlay.props\n\t\t\tconst ptsLen = scribble.points.length\n\t\t\tif (!ptsLen) continue\n\n\t\t\tconst last = scribble.points[ptsLen - 1]\n\t\t\tconst cached = this._scribblePathCache.get(scribble.id)\n\t\t\tlet path: Path2D\n\t\t\tif (\n\t\t\t\tcached &&\n\t\t\t\tcached.len === ptsLen &&\n\t\t\t\tcached.lastX === last.x &&\n\t\t\t\tcached.lastY === last.y &&\n\t\t\t\tcached.zoom === zoom &&\n\t\t\t\tcached.size === scribble.size &&\n\t\t\t\tcached.taper === scribble.taper &&\n\t\t\t\tcached.state === scribble.state\n\t\t\t) {\n\t\t\t\tpath = cached.path\n\t\t\t} else {\n\t\t\t\tconst stroke = getStroke(scribble.points, {\n\t\t\t\t\tsize: scribble.size / zoom,\n\t\t\t\t\tstart: { taper: scribble.taper, easing: EASINGS.linear },\n\t\t\t\t\tlast: scribble.state === 'complete' || scribble.state === 'stopping',\n\t\t\t\t\tsimulatePressure: false,\n\t\t\t\t\tstreamline: this.options.streamline,\n\t\t\t\t})\n\n\t\t\t\tlet d: string\n\t\t\t\tif (stroke.length < 4) {\n\t\t\t\t\tconst r = scribble.size / zoom / 2\n\t\t\t\t\tconst { x, y } = last\n\t\t\t\t\td = `M ${x - r},${y} a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 ${-r * 2},0`\n\t\t\t\t} else {\n\t\t\t\t\td = getSvgPathFromPoints(stroke)\n\t\t\t\t}\n\n\t\t\t\tpath = new Path2D(d)\n\t\t\t\tthis._scribblePathCache.set(scribble.id, {\n\t\t\t\t\tlen: ptsLen,\n\t\t\t\t\tlastX: last.x,\n\t\t\t\t\tlastY: last.y,\n\t\t\t\t\tzoom,\n\t\t\t\t\tsize: scribble.size,\n\t\t\t\t\ttaper: scribble.taper,\n\t\t\t\t\tstate: scribble.state,\n\t\t\t\t\tpath,\n\t\t\t\t})\n\t\t\t\tif (this._scribblePathCache.size > this.options.cacheSize) this._scribblePathCache.clear()\n\t\t\t}\n\n\t\t\tctx.fillStyle = resolveCanvasUiColor(colors, scribble.color)\n\t\t\tctx.globalAlpha = scribble.opacity\n\t\t\tctx.fill(path)\n\t\t\tctx.globalAlpha = 1\n\t\t}\n\t}\n}\n\n/** @internal */\nfunction resolveCanvasUiColor(colors: TLThemeColors, color: TLCanvasUiColor): string {\n\tswitch (color) {\n\t\tcase 'accent':\n\t\tcase 'selection-stroke':\n\t\t\treturn colors.selectionStroke\n\t\tcase 'selection-fill':\n\t\t\treturn colors.selectionFill\n\t\tcase 'white':\n\t\t\treturn colors.selectedContrast\n\t\tcase 'black':\n\t\t\treturn colors.text\n\t\tcase 'laser':\n\t\t\treturn colors.laser\n\t\tcase 'muted-1':\n\t\t\treturn colors.brushFill\n\t\tdefault:\n\t\t\treturn colors.text\n\t}\n}\n"],
  "mappings": "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",
  "names": []
}
