fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 5.49 kB
Source Map (JSON)
{"version":3,"file":"CircleBrush.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":";;;;;;;;;AAWA,IAAa,cAAb,cAAiC,UAAU;CASzC,YAAY,QAAgB;AAC1B,QAAM,OAAO;;;;;;;GALf;GAAQ;GAAG;AAMT,OAAK,SAAS,EAAE;;;;;;CAOlB,QAAQ,SAAgB;EACtB,MAAM,QAAQ,KAAK,SAAS,QAAQ,EAClC,MAAM,KAAK,OAAO;AACpB,OAAK,kBAAkB,IAAI;AAC3B,OAAK,IAAI,KAAK,MAAM;AACpB,MAAI,SAAS;;CAGf,IAAI,KAA+B,OAAyB;AAC1D,MAAI,YAAY,MAAM;AACtB,MAAI,WAAW;AACf,MAAI,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,KAAK,KAAK,GAAG,MAAM;AAC9D,MAAI,WAAW;AACf,MAAI,MAAM;;;;;CAMZ,YAAY,SAAgB;AAC1B,OAAK,SAAS,EAAE;AAChB,OAAK,OAAO,aAAa,KAAK,OAAO,WAAW;AAChD,OAAK,YAAY;AACjB,OAAK,QAAQ,QAAQ;;;;;;CAOvB,UAAU;EACR,MAAM,MAAM,KAAK,OAAO,YACtB,SAAS,KAAK;AAChB,OAAK,kBAAkB,IAAI;AAC3B,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IACjC,MAAK,IAAI,KAAK,OAAO,GAAG;AAE1B,MAAI,SAAS;;;;;;CAOf,YAAY,SAAgB;AAC1B,MAAI,KAAK,wBAAwB,QAAQ,KAAK,iBAAiB,QAAQ,CACrE;AAEF,MAAI,KAAK,iBAAiB,EAAE;AAC1B,QAAK,OAAO,aAAa,KAAK,OAAO,WAAW;AAChD,QAAK,SAAS,QAAQ;AACtB,QAAK,SAAS;QAEd,MAAK,QAAQ,QAAQ;;;;;CAOzB,YAAY;EACV,MAAM,4BAA4B,KAAK,OAAO;AAC9C,OAAK,OAAO,oBAAoB;EAEhC,MAAM,UAAoB,EAAE;AAE5B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,MAAM,QAAQ,KAAK,OAAO,IACxB,SAAS,IAAI,OAAO;IAClB,QAAQ,MAAM;IACd,MAAM,MAAM;IACZ,KAAK,MAAM;IACX,SAAS;IACT,SAAS;IACT,MAAM,MAAM;IACb,CAAC;AAEJ,QAAK,WAAW,OAAO,SAAS,IAAI,OAAO,KAAK,OAAO;AAEvD,WAAQ,KAAK,OAAO;;EAEtB,MAAM,QAAQ,IAAI,MAAM,SAAS,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEzD,OAAK,OAAO,KAAK,uBAAuB,EAAE,MAAM,OAAO,CAAC;AACxD,OAAK,OAAO,IAAI,MAAM;AACtB,OAAK,OAAO,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAK,OAAO,aAAa,KAAK,OAAO,WAAW;AAChD,OAAK,cAAc;AACnB,OAAK,OAAO,oBAAoB;AAChC,OAAK,OAAO,kBAAkB;;;;;;CAOhC,SAAS,EAAE,GAAG,KAAY;EACxB,MAAM,eAAiC;GACrC;GACA;GACA,QAAQ,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,GAAG,EAAE,KAAK,QAAQ,GAAG,GAAG;GACtE,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,SAAS,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ;GAC1E;AAED,OAAK,OAAO,KAAK,aAAa;AAE9B,SAAO"}