UNPKG

painter-taro-3

Version:

一个小程序图片生成库,轻松通过 json 方式绘制一张可以发到朋友圈的图片 专为taro3提供

617 lines (536 loc) 11.4 kB
export default class WxCanvas { ctx; type; canvasId; canvasNode; stepList = []; canvasPrototype = {}; constructor(type, ctx, canvasId, isNew, canvasNode) { this.ctx = ctx; this.canvasId = canvasId; this.type = type; if (isNew) { this.canvasNode = canvasNode || {}; } } set width(w) { if (this.canvasNode) this.canvasNode.width = w; } get width() { if (this.canvasNode) return this.canvasNode.width; return 0; } set height(h) { if (this.canvasNode) this.canvasNode.height = h; } get height() { if (this.canvasNode) return this.canvasNode.height; return 0; } get canvas() { if (this.type === '2d') { return this.ctx.canvas; } } set lineWidth(args) { this.canvasPrototype.lineWidth = args; this.stepList.push({ action: 'lineWidth', args, actionType: 'set', }); } get lineWidth() { return this.canvasPrototype.lineWidth; } set lineCap(args) { this.canvasPrototype.lineCap = args; this.stepList.push({ action: 'lineCap', args, actionType: 'set', }); } get lineCap() { return this.canvasPrototype.lineCap; } set lineJoin(args) { this.canvasPrototype.lineJoin = args; this.stepList.push({ action: 'lineJoin', args, actionType: 'set', }); } get lineJoin() { return this.canvasPrototype.lineJoin; } set miterLimit(args) { this.canvasPrototype.miterLimit = args; this.stepList.push({ action: 'miterLimit', args, actionType: 'set', }); } get miterLimit() { return this.canvasPrototype.miterLimit; } set lineDashOffset(args) { this.canvasPrototype.lineDashOffset = args; this.stepList.push({ action: 'lineDashOffset', args, actionType: 'set', }); } get lineDashOffset() { return this.canvasPrototype.lineDashOffset; } set font(args) { this.canvasPrototype.font = args; this.ctx.font = args; this.stepList.push({ action: 'font', args, actionType: 'set', }); } get font() { return this.canvasPrototype.font; } set textAlign(args) { this.canvasPrototype.textAlign = args; this.stepList.push({ action: 'textAlign', args, actionType: 'set', }); } get textAlign() { return this.canvasPrototype.textAlign; } set textBaseline(args) { this.canvasPrototype.textBaseline = args; this.stepList.push({ action: 'textBaseline', args, actionType: 'set', }); } get textBaseline() { return this.canvasPrototype.textBaseline; } set fillStyle(args) { this.canvasPrototype.fillStyle = args; this.stepList.push({ action: 'fillStyle', args, actionType: 'set', }); } get fillStyle() { return this.canvasPrototype.fillStyle; } set strokeStyle(args) { this.canvasPrototype.strokeStyle = args; this.stepList.push({ action: 'strokeStyle', args, actionType: 'set', }); } get strokeStyle() { return this.canvasPrototype.strokeStyle; } set globalAlpha(args) { this.canvasPrototype.globalAlpha = args; this.stepList.push({ action: 'globalAlpha', args, actionType: 'set', }); } get globalAlpha() { return this.canvasPrototype.globalAlpha; } set globalCompositeOperation(args) { this.canvasPrototype.globalCompositeOperation = args; this.stepList.push({ action: 'globalCompositeOperation', args, actionType: 'set', }); } get globalCompositeOperation() { return this.canvasPrototype.globalCompositeOperation; } set shadowColor(args) { this.canvasPrototype.shadowColor = args; this.stepList.push({ action: 'shadowColor', args, actionType: 'set', }); } get shadowColor() { return this.canvasPrototype.shadowColor; } set shadowOffsetX(args) { this.canvasPrototype.shadowOffsetX = args; this.stepList.push({ action: 'shadowOffsetX', args, actionType: 'set', }); } get shadowOffsetX() { return this.canvasPrototype.shadowOffsetX; } set shadowOffsetY(args) { this.canvasPrototype.shadowOffsetY = args; this.stepList.push({ action: 'shadowOffsetY', args, actionType: 'set', }); } get shadowOffsetY() { return this.canvasPrototype.shadowOffsetY; } set shadowBlur(args) { this.canvasPrototype.shadowBlur = args; this.stepList.push({ action: 'shadowBlur', args, actionType: 'set', }); } get shadowBlur() { return this.canvasPrototype.shadowBlur; } save() { this.stepList.push({ action: 'save', args: null, actionType: 'func', }); } restore() { this.stepList.push({ action: 'restore', args: null, actionType: 'func', }); } setLineDash(...args) { this.canvasPrototype.lineDash = args; this.stepList.push({ action: 'setLineDash', args, actionType: 'func', }); } moveTo(...args) { this.stepList.push({ action: 'moveTo', args, actionType: 'func', }); } closePath() { this.stepList.push({ action: 'closePath', args: null, actionType: 'func', }); } lineTo(...args) { this.stepList.push({ action: 'lineTo', args, actionType: 'func', }); } quadraticCurveTo(...args) { this.stepList.push({ action: 'quadraticCurveTo', args, actionType: 'func', }); } bezierCurveTo(...args) { this.stepList.push({ action: 'bezierCurveTo', args, actionType: 'func', }); } arcTo(...args) { this.stepList.push({ action: 'arcTo', args, actionType: 'func', }); } arc(...args) { this.stepList.push({ action: 'arc', args, actionType: 'func', }); } rect(...args) { this.stepList.push({ action: 'rect', args, actionType: 'func', }); } scale(...args) { this.stepList.push({ action: 'scale', args, actionType: 'func', }); } rotate(...args) { this.stepList.push({ action: 'rotate', args, actionType: 'func', }); } translate(...args) { this.stepList.push({ action: 'translate', args, actionType: 'func', }); } transform(...args) { this.stepList.push({ action: 'transform', args, actionType: 'func', }); } setTransform(...args) { this.stepList.push({ action: 'setTransform', args, actionType: 'func', }); } clearRect(...args) { this.stepList.push({ action: 'clearRect', args, actionType: 'func', }); } fillRect(...args) { this.stepList.push({ action: 'fillRect', args, actionType: 'func', }); } strokeRect(...args) { this.stepList.push({ action: 'strokeRect', args, actionType: 'func', }); } fillText(...args) { this.stepList.push({ action: 'fillText', args, actionType: 'func', }); } strokeText(...args) { this.stepList.push({ action: 'strokeText', args, actionType: 'func', }); } beginPath() { this.stepList.push({ action: 'beginPath', args: null, actionType: 'func', }); } fill() { this.stepList.push({ action: 'fill', args: null, actionType: 'func', }); } stroke() { this.stepList.push({ action: 'stroke', args: null, actionType: 'func', }); } drawFocusIfNeeded(...args) { this.stepList.push({ action: 'drawFocusIfNeeded', args, actionType: 'func', }); } clip() { this.stepList.push({ action: 'clip', args: null, actionType: 'func', }); } isPointInPath(...args) { this.stepList.push({ action: 'isPointInPath', args, actionType: 'func', }); } drawImage(...args) { this.stepList.push({ action: 'drawImage', args, actionType: 'func', }); } addHitRegion(...args) { this.stepList.push({ action: 'addHitRegion', args, actionType: 'func', }); } removeHitRegion(...args) { this.stepList.push({ action: 'removeHitRegion', args, actionType: 'func', }); } clearHitRegions(...args) { this.stepList.push({ action: 'clearHitRegions', args, actionType: 'func', }); } putImageData(...args) { this.stepList.push({ action: 'putImageData', args, actionType: 'func', }); } getLineDash() { return this.canvasPrototype.lineDash; } createLinearGradient(...args) { return this.ctx.createLinearGradient(...args); } createRadialGradient(...args) { if (this.type === '2d') { return this.ctx.createRadialGradient(...args); } else { return this.ctx.createCircularGradient(...args.slice(3, 6)); } } createPattern(...args) { return this.ctx.createPattern(...args); } measureText(...args) { return this.ctx.measureText(...args); } createImageData(...args) { return this.ctx.createImageData(...args); } getImageData(...args) { return this.ctx.getImageData(...args); } async draw(reserve, func) { const realstepList = this.stepList.slice(); this.stepList.length = 0; if (this.type === 'mina') { if (realstepList.length > 0) { for (const step of realstepList) { this.implementMinaStep(step); } realstepList.length = 0; } this.ctx.draw(reserve, func); } else if (this.type === '2d') { if (!reserve) { this.ctx.clearRect(0, 0, this.canvasNode.width, this.canvasNode.height); } if (realstepList.length > 0) { for (const step of realstepList) { await this.implement2DStep(step); } realstepList.length = 0; } if (func) { func(); } } realstepList.length = 0; } implementMinaStep(step) { switch (step.action) { case 'textAlign': { this.ctx.setTextAlign(step.args); break; } case 'textBaseline': { this.ctx.setTextBaseline(step.args); break; } default: { if (step.actionType === 'set') { this.ctx[step.action] = step.args; } else if (step.actionType === 'func') { if (step.args) { this.ctx[step.action](...step.args); } else { this.ctx[step.action](); } } break; } } } implement2DStep(step) { return new Promise(resolve => { if (step.action === 'drawImage') { const img = this.canvasNode.createImage(); img.src = step.args[0]; img.onload = () => { this.ctx.drawImage(img, ...step.args.slice(1)); resolve(); }; } else { if (step.actionType === 'set') { this.ctx[step.action] = step.args; } else if (step.actionType === 'func') { if (step.args) { this.ctx[step.action](...step.args); } else { this.ctx[step.action](); } } resolve(); } }); } }