{"version":3,"file":"CircleBrush.mjs","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"],"names":["CircleBrush","BaseBrush","constructor","canvas","_defineProperty","points","drawDot","pointer","point","addPoint","ctx","contextTop","_saveAndTransform","dot","restore","fillStyle","fill","beginPath","arc","x","y","radius","Math","PI","closePath","onMouseDown","clearContext","_setShadow","_render","i","length","onMouseMove","limitedToCanvasSize","_isOutSideCanvas","needsFullRender","onMouseUp","originalRenderOnAddRemove","renderOnAddRemove","circles","circle","Circle","left","top","originX","CENTER","originY","shadow","Shadow","push","group","Group","fire","path","add","_resetShadow","requestRenderAll","_ref","pointerPoint","getRandomInt","max","width","Color","color","setAlpha","toRgba"],"mappings":"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"}