UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

71 lines (62 loc) 1.8 kB
import { Pattern } from '../Pattern'; import { createCanvasElement } from '../util/misc/dom'; import type { Canvas } from '../canvas/Canvas'; import { PencilBrush } from './PencilBrush'; import type { TSimplePathData } from '../util/path/typedefs'; export class PatternBrush extends PencilBrush { declare source?: CanvasImageSource; constructor(canvas: Canvas) { super(canvas); } getPatternSrc() { const dotWidth = 20, dotDistance = 5, patternCanvas = createCanvasElement(), patternCtx = patternCanvas.getContext('2d'); patternCanvas.width = patternCanvas.height = dotWidth + dotDistance; if (patternCtx) { patternCtx.fillStyle = this.color; patternCtx.beginPath(); patternCtx.arc( dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false, ); patternCtx.closePath(); patternCtx.fill(); } return patternCanvas; } /** * Creates "pattern" instance property * @param {CanvasRenderingContext2D} ctx */ getPattern(ctx: CanvasRenderingContext2D) { return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat'); } /** * Sets brush styles * @param {CanvasRenderingContext2D} ctx */ _setBrushStyles(ctx: CanvasRenderingContext2D) { super._setBrushStyles(ctx); const pattern = this.getPattern(ctx); pattern && (ctx.strokeStyle = pattern); } /** * Creates path */ createPath(pathData: TSimplePathData) { const path = super.createPath(pathData), topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2); path.stroke = new Pattern({ source: this.source || this.getPatternSrc(), offsetX: -topLeft.x, offsetY: -topLeft.y, }); return path; } }