{"version":3,"file":"CircleBrush.min.mjs","names":[],"sources":["../../../src/brushes/CircleBrush.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport type { Point } from '../Point';\nimport { Shadow } from '../Shadow';\nimport { Circle } from '../shapes/Circle';\nimport { Group } from '../shapes/Group';\nimport { getRandomInt } from '../util/internals/getRandomInt';\nimport type { Canvas } from '../canvas/Canvas';\nimport { BaseBrush } from './BaseBrush';\nimport type { CircleBrushPoint } from './typedefs';\nimport { CENTER } from '../constants';\n\nexport class CircleBrush extends BaseBrush {\n  /**\n   * Width of a brush\n   * @type Number\n   */\n  width = 10;\n\n  declare points: CircleBrushPoint[];\n\n  constructor(canvas: Canvas) {\n    super(canvas);\n    this.points = [];\n  }\n\n  /**\n   * Invoked inside on mouse down and mouse move\n   * @param {Point} pointer\n   */\n  drawDot(pointer: Point) {\n    const point = this.addPoint(pointer),\n      ctx = this.canvas.contextTop;\n    this._saveAndTransform(ctx);\n    this.dot(ctx, point);\n    ctx.restore();\n  }\n\n  dot(ctx: CanvasRenderingContext2D, point: CircleBrushPoint) {\n    ctx.fillStyle = point.fill;\n    ctx.beginPath();\n    ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n    ctx.closePath();\n    ctx.fill();\n  }\n\n  /**\n   * Invoked on mouse down\n   */\n  onMouseDown(pointer: Point) {\n    this.points = [];\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._setShadow();\n    this.drawDot(pointer);\n  }\n\n  /**\n   * Render the full state of the brush\n   * @private\n   */\n  _render() {\n    const ctx = this.canvas.contextTop,\n      points = this.points;\n    this._saveAndTransform(ctx);\n    for (let i = 0; i < points.length; i++) {\n      this.dot(ctx, points[i]);\n    }\n    ctx.restore();\n  }\n\n  /**\n   * Invoked on mouse move\n   * @param {Point} pointer\n   */\n  onMouseMove(pointer: Point) {\n    if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n      return;\n    }\n    if (this.needsFullRender()) {\n      this.canvas.clearContext(this.canvas.contextTop);\n      this.addPoint(pointer);\n      this._render();\n    } else {\n      this.drawDot(pointer);\n    }\n  }\n\n  /**\n   * Invoked on mouse up\n   */\n  onMouseUp() {\n    const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n    this.canvas.renderOnAddRemove = false;\n\n    const circles: Circle[] = [];\n\n    for (let i = 0; i < this.points.length; i++) {\n      const point = this.points[i],\n        circle = new Circle({\n          radius: point.radius,\n          left: point.x,\n          top: point.y,\n          originX: CENTER,\n          originY: CENTER,\n          fill: point.fill,\n        });\n\n      this.shadow && (circle.shadow = new Shadow(this.shadow));\n\n      circles.push(circle);\n    }\n    const group = new Group(circles, { canvas: this.canvas });\n\n    this.canvas.fire('before:path:created', { path: group });\n    this.canvas.add(group);\n    this.canvas.fire('path:created', { path: group });\n\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._resetShadow();\n    this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n    this.canvas.requestRenderAll();\n  }\n\n  /**\n   * @param {Object} pointer\n   * @return {Point} Just added pointer point\n   */\n  addPoint({ x, y }: Point) {\n    const pointerPoint: CircleBrushPoint = {\n      x,\n      y,\n      radius: getRandomInt(Math.max(0, this.width - 20), this.width + 20) / 2,\n      fill: new Color(this.color).setAlpha(getRandomInt(0, 100) / 100).toRgba(),\n    };\n\n    this.points.push(pointerPoint);\n\n    return pointerPoint;\n  }\n}\n"],"mappings":"8cAWA,IAAa,EAAb,cAAiC,CAAA,CAS/B,YAAY,EAAA,CACV,MAAM,EAAA,CAAA,EAAA,KALR,QAAQ,GAAA,CAMN,KAAK,OAAS,EAAA,CAOhB,QAAQ,EAAA,CACN,IAAM,EAAQ,KAAK,SAAS,EAAA,CAC1B,EAAM,KAAK,OAAO,WACpB,KAAK,kBAAkB,EAAA,CACvB,KAAK,IAAI,EAAK,EAAA,CACd,EAAI,SAAA,CAGN,IAAI,EAA+B,EAAA,CACjC,EAAI,UAAY,EAAM,KACtB,EAAI,WAAA,CACJ,EAAI,IAAI,EAAM,EAAG,EAAM,EAAG,EAAM,OAAQ,EAAa,EAAV,KAAK,GAAA,CAAQ,EAAA,CACxD,EAAI,WAAA,CACJ,EAAI,MAAA,CAMN,YAAY,EAAA,CACV,KAAK,OAAS,EAAA,CACd,KAAK,OAAO,aAAa,KAAK,OAAO,WAAA,CACrC,KAAK,YAAA,CACL,KAAK,QAAQ,EAAA,CAOf,SAAA,CACE,IAAM,EAAM,KAAK,OAAO,WACtB,EAAS,KAAK,OAChB,KAAK,kBAAkB,EAAA,CACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,KAAK,IAAI,EAAK,EAAO,GAAA,CAEvB,EAAI,SAAA,CAON,YAAY,EAAA,CAAA,CACuB,IAA7B,KAAK,qBAAgC,KAAK,iBAAiB,EAAA,GAG3D,KAAK,iBAAA,EACP,KAAK,OAAO,aAAa,KAAK,OAAO,WAAA,CACrC,KAAK,SAAS,EAAA,CACd,KAAK,SAAA,EAEL,KAAK,QAAQ,EAAA,EAOjB,WAAA,CACE,IAAM,EAA4B,KAAK,OAAO,kBAC9C,KAAK,OAAO,kBAAA,CAAoB,EAEhC,IAAM,EAAoB,EAAA,CAE1B,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACxB,EAAS,IAAI,EAAO,CAClB,OAAQ,EAAM,OACd,KAAM,EAAM,EACZ,IAAK,EAAM,EACX,QAAS,EACT,QAAS,EACT,KAAM,EAAM,KAAA,CAAA,CAGhB,KAAK,SAAW,EAAO,OAAS,IAAI,EAAO,KAAK,OAAA,EAEhD,EAAQ,KAAK,EAAA,CAEf,IAAM,EAAQ,IAAI,EAAM,EAAS,CAAE,OAAQ,KAAK,OAAA,CAAA,CAEhD,KAAK,OAAO,KAAK,sBAAuB,CAAE,KAAM,EAAA,CAAA,CAChD,KAAK,OAAO,IAAI,EAAA,CAChB,KAAK,OAAO,KAAK,eAAgB,CAAE,KAAM,EAAA,CAAA,CAEzC,KAAK,OAAO,aAAa,KAAK,OAAO,WAAA,CACrC,KAAK,cAAA,CACL,KAAK,OAAO,kBAAoB,EAChC,KAAK,OAAO,kBAAA,CAOd,SAAA,CAAS,EAAE,EAAA,EAAG,GAAA,CACZ,IAAM,EAAiC,CACrC,EAAA,EACA,EAAA,EACA,OAAQ,EAAa,KAAK,IAAI,EAAG,KAAK,MAAQ,GAAA,CAAK,KAAK,MAAQ,GAAA,CAAM,EACtE,KAAM,IAAI,EAAM,KAAK,MAAA,CAAO,SAAS,EAAa,EAAG,IAAA,CAAO,IAAA,CAAK,QAAA,CAAA,CAKnE,OAFA,KAAK,OAAO,KAAK,EAAA,CAEV,IAAA,OAAA,KAAA"}