UNPKG

konva

Version:

<p align="center"> <img src="https://raw.githubusercontent.com/konvajs/konvajs.github.io/master/apple-touch-icon-180x180.png" alt="Konva logo" height="180" /> </p>

143 lines (142 loc) 5.39 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var Util_1 = require("../Util"); var Factory_1 = require("../Factory"); var Shape_1 = require("../Shape"); var Validators_1 = require("../Validators"); var Global_1 = require("../Global"); var Line = (function (_super) { __extends(Line, _super); function Line(config) { var _this = _super.call(this, config) || this; _this.on('pointsChange.konva tensionChange.konva closedChange.konva bezierChange.konva', function () { this._clearCache('tensionPoints'); }); return _this; } Line.prototype._sceneFunc = function (context) { var points = this.points(), length = points.length, tension = this.tension(), closed = this.closed(), bezier = this.bezier(), tp, len, n; if (!length) { return; } context.beginPath(); context.moveTo(points[0], points[1]); if (tension !== 0 && length > 4) { tp = this.getTensionPoints(); len = tp.length; n = closed ? 0 : 4; if (!closed) { context.quadraticCurveTo(tp[0], tp[1], tp[2], tp[3]); } while (n < len - 2) { context.bezierCurveTo(tp[n++], tp[n++], tp[n++], tp[n++], tp[n++], tp[n++]); } if (!closed) { context.quadraticCurveTo(tp[len - 2], tp[len - 1], points[length - 2], points[length - 1]); } } else if (bezier) { n = 2; while (n < length) { context.bezierCurveTo(points[n++], points[n++], points[n++], points[n++], points[n++], points[n++]); } } else { for (n = 2; n < length; n += 2) { context.lineTo(points[n], points[n + 1]); } } if (closed) { context.closePath(); context.fillStrokeShape(this); } else { context.strokeShape(this); } }; Line.prototype.getTensionPoints = function () { return this._getCache('tensionPoints', this._getTensionPoints); }; Line.prototype._getTensionPoints = function () { if (this.closed()) { return this._getTensionPointsClosed(); } else { return Util_1.Util._expandPoints(this.points(), this.tension()); } }; Line.prototype._getTensionPointsClosed = function () { var p = this.points(), len = p.length, tension = this.tension(), firstControlPoints = Util_1.Util._getControlPoints(p[len - 2], p[len - 1], p[0], p[1], p[2], p[3], tension), lastControlPoints = Util_1.Util._getControlPoints(p[len - 4], p[len - 3], p[len - 2], p[len - 1], p[0], p[1], tension), middle = Util_1.Util._expandPoints(p, tension), tp = [firstControlPoints[2], firstControlPoints[3]] .concat(middle) .concat([ lastControlPoints[0], lastControlPoints[1], p[len - 2], p[len - 1], lastControlPoints[2], lastControlPoints[3], firstControlPoints[0], firstControlPoints[1], p[0], p[1] ]); return tp; }; Line.prototype.getWidth = function () { return this.getSelfRect().width; }; Line.prototype.getHeight = function () { return this.getSelfRect().height; }; Line.prototype.getSelfRect = function () { var points; if (this.tension() !== 0) { points = this._getTensionPoints(); } else { points = this.points(); } var minX = points[0]; var maxX = points[0]; var minY = points[1]; var maxY = points[1]; var x, y; for (var i = 0; i < points.length / 2; i++) { x = points[i * 2]; y = points[i * 2 + 1]; minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); } return { x: Math.round(minX), y: Math.round(minY), width: Math.round(maxX - minX), height: Math.round(maxY - minY) }; }; return Line; }(Shape_1.Shape)); exports.Line = Line; Line.prototype.className = 'Line'; Line.prototype._attrsAffectingSize = ['points', 'bezier', 'tension']; Global_1._registerNode(Line); Factory_1.Factory.addGetterSetter(Line, 'closed', false); Factory_1.Factory.addGetterSetter(Line, 'bezier', false); Factory_1.Factory.addGetterSetter(Line, 'tension', 0, Validators_1.getNumberValidator()); Factory_1.Factory.addGetterSetter(Line, 'points', [], Validators_1.getNumberArrayValidator()); Util_1.Collection.mapMethods(Line);