jmgraph 3.2.2 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/jmgraph.core.min.js +1 -1
- package/dist/jmgraph.core.min.js.map +1 -1
- package/dist/jmgraph.js +3064 -351
- package/dist/jmgraph.min.js +1 -1
- package/index.js +4 -0
- package/package.json +4 -4
- package/src/core/jmControl.js +97 -57
- package/src/core/jmGradient.js +29 -14
- package/src/core/jmGraph.js +70 -26
- package/src/core/jmObject.js +2 -3
- package/src/core/jmPath.js +19 -3
- package/src/core/jmProperty.js +29 -14
- package/src/core/jmUtils.js +218 -31
- package/src/lib/earcut.js +680 -0
- package/src/lib/earcut.md +73 -0
- package/src/lib/webgl/base.js +201 -0
- package/src/lib/webgl/core/buffer.js +48 -0
- package/src/lib/webgl/core/mapSize.js +40 -0
- package/src/lib/webgl/core/mapType.js +43 -0
- package/src/lib/webgl/core/program.js +139 -0
- package/src/lib/webgl/core/shader.js +14 -0
- package/src/lib/webgl/core/texture.js +61 -0
- package/src/lib/webgl/gradient.js +196 -0
- package/src/lib/webgl/index.js +11 -0
- package/src/lib/webgl/path.js +679 -0
- package/src/shapes/jmArc.js +15 -11
- package/src/shapes/jmArrow.js +10 -10
- package/src/shapes/jmBezier.js +2 -2
- package/src/shapes/jmCircle.js +8 -1
- package/src/shapes/jmHArc.js +17 -15
- package/src/shapes/jmImage.js +68 -38
- package/src/shapes/jmLabel.js +11 -10
- package/src/shapes/jmLine.js +20 -12
- package/src/shapes/jmPrismatic.js +4 -2
- package/src/shapes/jmRect.js +5 -4
- package/src/shapes/jmResize.js +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jmgraph.core.min.js","sources":["../src/core/jmList.js","../src/core/jmUtils.js","../src/core/jmObject.js","../src/core/jmProperty.js","../src/core/jmShadow.js","../src/core/jmGradient.js","../src/core/jmEvents.js","../src/core/jmControl.js","../src/core/jmPath.js","../src/core/jmGraph.js"],"sourcesContent":["/**\r\n * 自定义集合\r\n * \r\n * @class jmList\r\n * @for jmUtils\r\n * @param {array} [arr] 数组,可转为当前list元素\r\n */\r\nexport default class jmList extends Array { \r\n constructor(...arg) {\r\n let ps = [];\r\n if(arg && arg.length && Array.isArray(arg[0])) {\r\n for(let i=0; i< arg[0].length; i++) ps.push(arg[0][i]);\r\n super(...ps);\r\n }\r\n else {\r\n super();\r\n }\r\n this.option = {}; //选项\r\n this.type = 'jmList';\r\n }\r\n /**\r\n * 往集合中添加对象\r\n *\r\n * @method add\r\n * @for list\r\n * @param {any} obj 往集合中添加的对象\r\n */\r\n add(obj) { \r\n if(obj && Array.isArray(obj)) {\r\n for(let i=0; i < obj.length; i++) {\r\n if(!this.includes(obj[i])) this.push(obj[i]);\r\n } \r\n return obj; \r\n }\r\n if(typeof obj == 'object' && this.includes(obj)) return obj;\r\n this.push(obj);\r\n return obj;\r\n }\r\n\r\n /**\r\n * 从集合中移除指定对象\r\n * \r\n * @method remove\r\n * @for list\r\n * @param {any} obj 将移除的对象\r\n */\r\n remove(obj) {\r\n for(let i = this.length -1; i>=0; i--) { \r\n if(this[i] == obj) {\r\n this.removeAt(i);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 按索引移除对象\r\n * \r\n * @method removeAt\r\n * @for list\r\n * @param {integer} index 移除对象的索引\r\n */\r\n removeAt(index) {\r\n if(this.length > index) {\r\n let obj = this[index];\r\n this.splice(index,1);\r\n if(this.option.removeHandler) this.option.removeHandler.call(this, obj, index);\r\n }\r\n }\r\n\r\n /**\r\n * 判断是否包含某个对象\r\n * \r\n * @method contain\r\n * @for list\r\n * @param {any} obj 判断当前集合中是否包含此对象\r\n */\r\n contain(obj) {\r\n return this.includes(obj);\r\n }\r\n\r\n /**\r\n * 从集合中获取某个对象\r\n * \r\n * @method get\r\n * @for list\r\n * @param {integer/function} index 如果为整型则表示为获取此索引的对象,如果为function为则通过此委托获取对象\r\n * @return {any} 集合中的对象\r\n */\r\n get(index) {\r\n if(typeof index == 'function') {\r\n return this.find(index);\r\n }\r\n else {\r\n return this[index];\r\n } \r\n }\r\n\r\n /**\r\n * 遍历当前集合 \r\n *\r\n * @method each\r\n * @for list\r\n * @param {function} cb 遍历当前集合的委托\r\n * @param {boolean} inverse 是否按逆序遍历\r\n */\r\n each(cb, inverse) {\r\n if(cb && typeof cb == 'function') {\r\n //如果按倒序循环\r\n if(inverse) {\r\n for(let i = this.length - 1;i>=0; i--) {\r\n let r = cb.call(this, i, this[i]);\r\n if(r === false) break;\r\n }\r\n }\r\n else {\r\n let len = this.length;\r\n for(let i = 0; i < len;i++) {\r\n let r = cb.call(this, i, this[i]);\r\n if(r === false) break;\r\n } \r\n } \r\n } \r\n }\r\n\r\n /**\r\n * 获取当前集合对象个数\r\n *\r\n * @method count\r\n * @param {function} [handler] 检查对象是否符合计算的条件\r\n * @for list\r\n * @return {integer} 当前集合的个数\r\n */\r\n count(handler) {\r\n if(handler && typeof handler == 'function') {\r\n let count = 0;\r\n let len = this.length;\r\n for(let i = 0; i<len;i++) {\r\n if(handler(this[i])) {\r\n count ++;\r\n }\r\n } \r\n return count;\r\n }\r\n return this.length;\r\n }\r\n\r\n /**\r\n * 清空当前集合\r\n *\r\n * @method clear\r\n * @for list\r\n */\r\n clear() {\r\n this.splice(0, this.length);\r\n }\r\n}\r\n\r\nexport { jmList };","\r\nimport { jmList } from './jmList.js';\r\n\r\n/**\r\n * 画图基础对象\r\n * 当前库的工具类\r\n * \r\n * @class jmUtils\r\n * @static\r\n */\r\nexport default class jmUtils {\r\n /**\r\n * 复制一个对象\r\n * \r\n * @method clone\r\n * @static\r\n * @param {object} source 被复制的对象\r\n * @param {object} target 可选,如果指定就表示复制给这个对象,如果为boolean它就是deep参数\r\n * @param {boolean} deep 是否深度复制,如果为true,数组内的每个对象都会被复制\r\n * @param {function} copyHandler 复制对象回调,如果返回undefined,就走后面的逻辑,否则到这里中止\r\n * @return {object} 参数source的拷贝对象\r\n */\r\n static clone(source, target, deep = false, copyHandler = null, deepIndex = 0) {\r\n // 如果有指定回调,则用回调处理,否则走后面的复制逻辑\r\n if(typeof copyHandler === 'function') {\r\n const obj = copyHandler(source, deep, deepIndex);\r\n if(obj) return obj;\r\n }\r\n deepIndex++; // 每执行一次,需要判断最大拷贝深度 \r\n\r\n if(typeof target === 'boolean') {\r\n deep = target;\r\n target = undefined;\r\n }\r\n\r\n // 超过100拷贝深度,直接返回\r\n if(deepIndex > 100) {\r\n return target;\r\n }\r\n\r\n if(source && typeof source === 'object') {\r\n target = target || {};\r\n\r\n //如果为当前泛型,则直接new\r\n if(this.isType(source, jmList)) {\r\n return new jmList(source);\r\n }\r\n else if(Array.isArray(source)) {\r\n //如果是深度复,则拷贝每个对象\r\n if(deep) {\r\n let dest = [];\r\n for(let i=0; i<source.length; i++) {\r\n dest.push(this.clone(source[i], target[i], deep, copyHandler, deepIndex));\r\n }\r\n return dest;\r\n }\r\n return source.slice(0);\r\n }\r\n \r\n if(source.__proto__) target.__proto__ = source.__proto__;\r\n \r\n for(let k in source) {\r\n if(k === 'constructor') continue;\r\n const v = source[k];\r\n // 不复制页面元素和class对象\r\n if(v && (v.tagName || v.getContext)) continue;\r\n\r\n // 如果不是对象和空,则采用target的属性\r\n if(typeof target[k] === 'object' || typeof target[k] === 'undefined') { \r\n target[k] = this.clone(v, target[k], deep, copyHandler, deepIndex);\r\n }\r\n }\r\n return target;\r\n }\r\n else if(typeof target != 'undefined') {\r\n return target;\r\n }\r\n\r\n return source;\r\n }\r\n\r\n /**\r\n * 绑定事件到html对象\r\n * \r\n * @method bindEvent\r\n * @static\r\n * @param {element} html元素对象\r\n * @param {string} name 事件名称\r\n * @param {function} fun 事件委托\r\n * @returns {name, fun, target} 返回当前绑定\r\n */\r\n static bindEvent(target, name, fun, opt) {\r\n if(name && name.indexOf && name.indexOf(' ') != -1) {\r\n let ns = name.split(' ');\r\n for(let i=0;i<ns.length;i++) {\r\n this.bindEvent(target, ns[i], fun, opt);\r\n }\r\n }\r\n if(target.attachEvent) {\r\n target.attachEvent(\"on\"+name, fun, opt);\r\n } \r\n else if(target.addEventListener) {\r\n target.addEventListener(name, fun, opt);\r\n }\r\n return {\r\n name,\r\n target,\r\n fun\r\n };\r\n }\r\n\r\n /**\r\n * 从对象中移除事件到\r\n * \r\n * @method removeEvent\r\n * @static\r\n * @param {element} html元素对象\r\n * @param {string} name 事件名称\r\n * @param {function} fun 事件委托\r\n */\r\n static removeEvent(target, name, fun) {\r\n if(target.removeEventListener) {\r\n return target.removeEventListener(name, fun, false);\r\n } \r\n else if(target.detachEvent) {\r\n target.detachEvent('on' + name, fun);\r\n return true;\r\n }\r\n else {\r\n target['on' + name] = null;\r\n }\r\n }\r\n\r\n /**\r\n * 获取元素的绝对定位\r\n *\r\n * @method getElementPosition\r\n * @static\r\n * @param {element} el 目标元素对象\r\n * @return {position} 位置对象(top,left)\r\n */\r\n static getElementPosition(el) { \r\n let pos = {\"top\": 0, \"left\": 0};\r\n if(!el) return pos;\r\n\r\n if (el.offsetParent) {\r\n while (el.offsetParent) {\r\n pos.top += el.offsetTop;\r\n pos.left += el.offsetLeft;\r\n el = el.offsetParent;\r\n }\r\n }\r\n else if(el.x) {\r\n pos.left += el.x;\r\n }\r\n else if(el.x){\r\n pos.top += el.y;\r\n } \r\n return pos;\r\n }\r\n /**\r\n * 获取元素事件触发的位置\r\n *\r\n * @method getEventPosition\r\n * @static\r\n * @param {eventArg} evt 当前触发事件的参数\r\n * @param {point} [scale] 当前画布的缩放比例\r\n * @return {point} 事件触发的位置 \r\n */\r\n static getEventPosition (evt, scale) {\r\n evt = evt || event;\r\n \r\n let isTouch = false;\r\n let touches = evt.changedTouches || evt.targetTouches || evt.touches;\r\n let target = evt.target || evt.srcElement;\r\n if(touches && touches.length) {\r\n evt = touches[0];//兼容touch事件\r\n if(!evt.target) evt.target = target;\r\n isTouch = true;\r\n }\r\n let px = evt.pageX || evt.x;\r\n if(typeof px == 'undefined') px = evt.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft); \r\n let py = evt.pageY || evt.y;\r\n if(typeof py == 'undefined') py = evt.clientY + (document.documentElement.scrollTop || document.body.scrollTop);\r\n\r\n let ox = evt.offsetX;\r\n let oy = evt.offsetY;\r\n if(typeof ox === 'undefined' && typeof oy === 'undefined') {\r\n let p = this.getElementPosition(target);\r\n ox= px - p.left;\r\n oy = py - p.top;\r\n }\r\n if(scale) {\r\n if(scale.x) ox = ox / scale.x;\r\n if(scale.y) oy = oy / scale.y;\r\n }\r\n\r\n return {\r\n pageX: px,\r\n pageY: py,\r\n clientX: evt.clientX,\r\n clientY: evt.clientY,\r\n //相对于容器偏移量\r\n offsetX: ox,\r\n offsetY: oy,\r\n layerX: evt.layerX,\r\n layerY: evt.layerY,\r\n screenX: evt.screenX,\r\n screenY: evt.screenY,\r\n x: ox,\r\n y: oy,\r\n isTouch: isTouch,\r\n touches\r\n };\r\n }\r\n\r\n /**\r\n * 检 查对象是否为指定的类型,不包括继承\r\n * \r\n * @method isType\r\n * @static\r\n * @param {object} target 需要判断类型的对象\r\n * @param {class} type 对象类型\r\n * @return {boolean} 返回对象是否为指定类型 \r\n */\r\n static isType(target, type) {\r\n if(!target || typeof target !== 'object') return false;\r\n if(target.constructor === type) return true;\r\n /*if(target.__baseType) { \r\n return jmUtils.isType(target.__baseType.prototype,type);\r\n }*/\r\n\r\n //return target instanceof type;\r\n return false;\r\n }\r\n /**\r\n * 判断点是否在多边形内\r\n * 如果一个点在多边形内部,任意角度做射线肯定会与多边形要么有一个交点,要么有与多边形边界线重叠。\r\n * 如果一个点在多边形外部,任意角度做射线要么与多边形有一个交点,要么有两个交点,要么没有交点,要么有与多边形边界线重叠。\r\n * 利用上面的结论,我们只要判断这个点与多边形的交点个数,就可以判断出点与多边形的位置关系了。\r\n * \r\n * @method pointInPolygon\r\n * @static\r\n * @param {point} pt 坐标对象\r\n * @param {array} polygon 多边型角坐标对象数组\r\n * @param {number} offset 判断可偏移值\r\n * @return {integer} 0= 不在图形内和线上,1=在边上,2=在图形内部\r\n */\r\n static pointInPolygon(pt, polygon, offset) {\r\n offset = offset || 1;\r\n offset = offset / 2;\r\n let i, j, n = polygon.length;\r\n let inside = false, redo = true;\r\n\r\n if(!polygon || n == 0) return 0;\r\n if(n == 1) {\r\n return Math.abs(polygon[0].x - pt.x) <= offset && Math.abs(polygon[0].y - pt.y) <= offset;\r\n }\r\n \r\n //一条直线\r\n else if(n == 2) {\r\n //在最左边之外或在最右边之外\r\n if(Math.min(polygon[0].x,polygon[1].x) - pt.x > offset || \r\n pt.x - Math.max(polygon[0].x,polygon[1].x) > offset ) {\r\n return 0;\r\n }\r\n //在最顶部之外或在最底部之外\r\n if(Math.min(polygon[0].y,polygon[1].y) - pt.y > offset || \r\n pt.y - Math.max(polygon[0].y,polygon[1].y) > offset) {\r\n return 0;\r\n }\r\n\r\n //如果线为平行为纵坐标。\r\n if(polygon[0].x == polygon[1].x){\r\n return (Math.abs(polygon[0].x - pt.x) <= offset && (pt.y - polygon[0].y) * (pt.y - polygon[1].y) <= 0)? 1:0;\r\n }\r\n //如果线为平行为横坐标。\r\n if(polygon[0].y == polygon[1].y){\r\n return (Math.abs(polygon[0].y - pt.y) <= offset && (pt.x - polygon[0].x) * (pt.x - polygon[1].x) <= 0)? 1:0;\r\n }\r\n\r\n if(Math.abs(polygon[0].x - pt.x) < offset && Math.abs(polygon[0].y - pt.y) < offset) {\r\n return 1;\r\n }\r\n if(Math.abs(polygon[1].x - pt.x) < offset && Math.abs(polygon[1].y - pt.y) < offset) {\r\n return 1;\r\n }\r\n\r\n //点到直线的距离小于宽度的一半,表示在线上\r\n if(pt.y != polygon[0].y && pt.y != polygon[1].y) {\r\n\r\n let f = (polygon[1].x - polygon[0].x) / (polygon[1].y - polygon[0].y) * (pt.y - polygon[0].y);\r\n let ff = (pt.y - polygon[0].y) / Math.sqrt(f * f + (pt.y - polygon[0].y) * (pt.y - polygon[0].y));\r\n let l = ff * (pt.x - polygon[0].x - f );\r\n \r\n return Math.abs(l) <= offset ?1:0;\r\n }\r\n return 0;\r\n }\r\n\r\n for (i = 0;i < n;++i) {\r\n if (polygon[i].x == pt.x && // 是否在顶点上\r\n polygon[i].y == pt.y ) {\r\n return 1;\r\n }\r\n }\r\n\r\n //pt = this.clone(pt);\r\n while (redo) {\r\n redo = false;\r\n inside = false;\r\n for (i = 0,j = n - 1;i < n;j = i++) {\r\n if ( (polygon[i].y < pt.y && pt.y < polygon[j].y) || \r\n (polygon[j].y < pt.y && pt.y < polygon[i].y) ) {\r\n if (pt.x <= polygon[i].x || pt.x <= polygon[j].x) {\r\n var _x = (pt.y-polygon[i].y)*(polygon[j].x-polygon[i].x)/(polygon[j].y-polygon[i].y)+polygon[i].x;\r\n if (pt.x < _x) // 在线的左侧\r\n inside = !inside;\r\n else if (pt.x == _x) // 在线上\r\n {\r\n return 1;\r\n }\r\n }\r\n }\r\n else if ( pt.y == polygon[i].y) {\r\n if (pt.x < polygon[i].x) { // 交点在顶点上 \r\n if(polygon[i].y > polygon[j].y) {\r\n --pt.y\r\n }\r\n else {\r\n ++pt.y;\r\n }\r\n redo = true;\r\n break;\r\n }\r\n }\r\n else if ( polygon[i].y == polygon[j].y && // 在水平的边界线上\r\n pt.y == polygon[i].y &&\r\n ( (polygon[i].x < pt.x && pt.x < polygon[j].x) || \r\n (polygon[j].x < pt.x && pt.x < polygon[i].x) ) ) {\r\n inside = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inside ? 2:0;\r\n }\r\n\r\n /**\r\n * @method judge 判断点是否在多边形中\r\n * @param {point} dot {{x,y}} 需要判断的点\r\n * @param {array} coordinates {{x,y}} 多边形点坐标的数组,为保证图形能够闭合,起点和终点必须相等。\r\n * 比如三角形需要四个点表示,第一个点和最后一个点必须相同。 \r\n * @param {number} 是否为实心 1= 是\r\n * @returns {boolean} 结果 true=在形状内\r\n */\r\n /*static judge(dot,coordinates,noneZeroMode) {\r\n // 默认启动none zero mode\r\n noneZeroMode=noneZeroMode||1;\r\n var x = dot.x,y=dot.y;\r\n var crossNum = 0;\r\n // 点在线段的左侧数目\r\n var leftCount = 0;\r\n // 点在线段的右侧数目\r\n var rightCount = 0;\r\n for(var i=0;i<coordinates.length-1;i++){\r\n var start = coordinates[i];\r\n var end = coordinates[i+1];\r\n \r\n // 起点、终点斜率不存在的情况\r\n if(start.x===end.x) {\r\n // 因为射线向右水平,此处说明不相交\r\n if(x>start.x) continue;\r\n \r\n // 从左侧贯穿\r\n if((end.y>start.y&&y>=start.y && y<=end.y)){\r\n leftCount++;\r\n crossNum++;\r\n }\r\n // 从右侧贯穿\r\n if((end.y<start.y&&y>=end.y && y<=start.y)) {\r\n rightCount++;\r\n crossNum++;\r\n }\r\n continue;\r\n }\r\n // 斜率存在的情况,计算斜率\r\n var k=(end.y-start.y)/(end.x-start.x);\r\n // 交点的x坐标\r\n var x0 = (y-start.y)/k+start.x;\r\n // 因为射线向右水平,此处说明不相交\r\n if(x>x0) continue;\r\n \r\n if((end.x>start.x&&x0>=start.x && x0<=end.x)){\r\n crossNum++;\r\n if(k>=0) leftCount++;\r\n else rightCount++;\r\n }\r\n if((end.x<start.x&&x0>=end.x && x0<=start.x)) {\r\n crossNum++;\r\n if(k>=0) rightCount++;\r\n else leftCount++;\r\n }\r\n }\r\n \r\n return noneZeroMode===1?leftCount-rightCount!==0:crossNum%2===1;\r\n }*/\r\n\r\n /**\r\n * 检查边界,子对象是否超出父容器边界\r\n * 当对象偏移offset后是否出界\r\n * 返回(left:0,right:0,top:0,bottom:0)\r\n * 如果right>0表示右边出界right偏移量,left<0则表示左边出界left偏移量\r\n * 如果bottom>0表示下边出界bottom偏移量,top<0则表示上边出界ltop偏移量\r\n *\r\n * @method checkOutSide\r\n * @static\r\n * @param {bound} parentBounds 父对象的边界\r\n * @param {bound} targetBounds 对象的边界\r\n * @param {number} offset 判断是否越界可容偏差\r\n * @return {bound} 越界标识\r\n */\r\n static checkOutSide(parentBounds, targetBounds, offset) {\r\n let result = {left:0,right:0,top:0,bottom:0};\r\n if(offset.x < 0 ) {\r\n result.left = targetBounds.left + offset.x - parentBounds.left;\r\n }\r\n else if(offset.x > 0 ) {\r\n result.right = targetBounds.right + offset.x - parentBounds.right;\r\n }\r\n\r\n if(offset.y < 0 ) {\r\n result.top = targetBounds.top + offset.y - parentBounds.top;\r\n }\r\n else if(offset.y > 0) {\r\n result.bottom = targetBounds.bottom + offset.y - parentBounds.bottom;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 把一个或多个点绕某个点旋转一定角度\r\n * 先把坐标原点移到旋转中心点,计算后移回\r\n * @method rotatePoints\r\n * @static\r\n * @param {Array/object} p 一个或多个点\r\n * @param {*} rp 旋转中心点\r\n * @param {*} r 旋转角度\r\n */\r\n static rotatePoints(p, rp, r) {\r\n if(!r || !p) return p;\r\n let cos = Math.cos(r);\r\n let sin = Math.sin(r);\r\n if(p.length) {\r\n for(let i=0;i<p.length;i++) {\r\n if(!p[i]) continue;\r\n let x1 = p[i].x - rp.x;\r\n let y1 = p[i].y - rp.y;\r\n p[i].x = x1 * cos - y1 * sin + rp.x;\r\n p[i].y = x1 * sin + y1 * cos + rp.y;\r\n }\r\n }\r\n else {\r\n let x1 = p.x - rp.x;\r\n let y1 = p.y - rp.y;\r\n p.x = x1 * cos - y1 * sin + rp.x;\r\n p.y = x1 * sin + y1 * cos + rp.y;\r\n }\r\n return p;\r\n }\r\n\r\n /**\r\n * 去除字符串开始字符\r\n * \r\n * @method trimStart\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的前置字符\r\n * @return {string} 去除前置字符后的字符串\r\n */\r\n static trimStart(source, c) {\r\n c = c || ' ';\r\n if(source && source.length > 0) {\r\n let sc = source[0];\r\n if(sc === c || c.indexOf(sc) >= 0) {\r\n source = source.substring(1);\r\n return this.trimStart(source,c);\r\n } \r\n }\r\n return source;\r\n }\r\n\r\n /**\r\n * 去除字符串结束的字符c\r\n *\r\n * @method trimEnd\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的后置字符\r\n * @return {string} 去除后置字符后的字符串\r\n */\r\n static trimEnd(source, c) {\r\n c = c || ' ';\r\n if(source && source.length > 0) {\r\n let sc = source[source.length - 1];\r\n if(sc === c || c.indexOf(sc) >= 0) {\r\n source = source.substring(0,source.length - 1);\r\n return this.trimStart(source,c);\r\n } \r\n }\r\n return source;\r\n }\r\n\r\n /**\r\n * 去除字符串开始与结束的字符\r\n *\r\n * @method trim\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的字符\r\n * @return {string} 去除字符后的字符串\r\n */\r\n static trim(source,c) {\r\n return this.trimEnd(this.trimStart(source,c),c);\r\n }\r\n\r\n /**\r\n * 检查是否为百分比参数\r\n *\r\n * @method checkPercent\r\n * @static\r\n * @param {string} 字符串参数\r\n * @return {boolean} true=当前字符串为百分比参数,false=不是\r\n */\r\n static checkPercent(per) {\r\n if(typeof per === 'string') {\r\n per = this.trim(per);\r\n if(per[per.length - 1] == '%') {\r\n return per;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 转换百分数为数值类型\r\n *\r\n * @method percentToNumber\r\n * @static\r\n * @param {string} per 把百分比转为数值的参数\r\n * @return {number} 百分比对应的数值\r\n */\r\n static percentToNumber(per) {\r\n if(typeof per === 'string') {\r\n let tmp = this.checkPercent(per);\r\n if(tmp) {\r\n per = this.trim(tmp,'% ');\r\n per = per / 100;\r\n }\r\n }\r\n return per;\r\n }\r\n\r\n /**\r\n * 转换16进制为数值\r\n *\r\n * @method hexToNumber\r\n * @static\r\n * @param {string} h 16进制颜色表达\r\n * @return {number} 10进制表达\r\n */\r\n static hexToNumber(h) {\r\n if(typeof h !== 'string') return h;\r\n\r\n h = h.toLowerCase();\r\n let hex = '0123456789abcdef';\r\n let v = 0;\r\n let l = h.length;\r\n for(let i=0;i<l;i++) {\r\n let iv = hex.indexOf(h[i]);\r\n if(iv == 0) continue;\r\n \r\n for(let j=1;j<l - i;j++) {\r\n iv *= 16;\r\n }\r\n v += iv;\r\n }\r\n return v;\r\n }\r\n\r\n /**\r\n * 转换数值为16进制字符串表达\r\n *\r\n * @method hex\r\n * @static\r\n * @param {number} v 数值\r\n * @return {string} 16进制表达\r\n */\r\n static numberToHex(v) {\r\n let hex = '0123456789abcdef';\r\n \r\n let h = '';\r\n while(v > 0) {\r\n let t = v % 16;\r\n h = hex[t] + h;\r\n v = Math.floor(v / 16);\r\n }\r\n return h;\r\n }\r\n\r\n /**\r\n * 16进制颜色转为r g b a 对象 {r, g , b, a}\r\n * @param {string}} hex 16进度的颜色\r\n */\r\n static hexToRGBA(hex) {\r\n hex = this.trim(hex); \r\n\r\n //当为7位时,表示需要转为带透明度的rgba\r\n if(hex[0] == '#') {\r\n const color = {\r\n a: 1\r\n };\r\n if(hex.length >= 8) {\r\n color.a = hex.substr(1,2);\r\n color.g = hex.substr(5,2);\r\n color.b = hex.substr(7,2);\r\n color.r = hex.substr(3,2);\r\n //透明度\r\n color.a = (this.hexToNumber(color.a) / 255).toFixed(4);\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n return color; \r\n }\r\n // #cccccc || #ccc\r\n else if(hex.length === 7 || hex.length === 4) {\r\n // #ccc这种情况,把每个位复制一份\r\n if(hex.length === 4) {\r\n color.g = hex.substr(2, 1);\r\n color.g = color.g + color.g;\r\n color.b = hex.substr(3, 1);\r\n color.b = color.b + color.b;\r\n color.r = hex.substr(1, 1);\r\n color.r = color.r + color.r;\r\n }\r\n else {\r\n color.g = hex.substr(3, 2);//除#号外的第二位\r\n color.b = hex.substr(5, 2);\r\n color.r = hex.substr(1, 2);\r\n }\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n \r\n return color; \r\n }\r\n //如果是5位的话,# 则第2位表示A,后面依次是r,g,b\r\n else if(hex.length === 5) {\r\n color.a = hex.substr(1,1);\r\n color.g = hex.substr(3,1);//除#号外的第二位\r\n color.b = hex.substr(4,1);\r\n color.r = hex.substr(2,1);\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n //透明度\r\n color.a = (this.hexToNumber(color.a) / 255).toFixed(4);\r\n return color; \r\n }\r\n } \r\n return hex; \r\n }\r\n\r\n /**\r\n * 转换颜色格式,如果输入r,g,b则转为hex格式,如果为hex则转为r,g,b格式\r\n *\r\n * @method toColor\r\n * @static\r\n * @param {string} hex 16进制颜色表达\r\n * @return {string} 颜色字符串\r\n */\r\n static toColor(r, g, b, a) { \r\n if(typeof r === 'string' && r) {\r\n r = this.trim(r); \r\n // 正常的颜色表达,不需要转换\r\n if(r[0] === '#' && (r.length === 4 || r.length === 7)) return r;\r\n\r\n const color = this.hexToRGBA(r);\r\n if(typeof color === 'string') return color;\r\n \r\n r = color.r || r;\r\n g = color.g || g;\r\n b = color.b || b;\r\n a = color.a || a;\r\n }\r\n if(typeof r != 'undefined' && typeof g != 'undefined' && typeof b != 'undefined') {\r\n if(typeof a != 'undefined') { \r\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\r\n }\r\n else {\r\n return 'rgb(' + r + ',' + g + ',' + b + ')';\r\n }\r\n }\r\n return r;\r\n }\r\n // window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行\r\n static requestAnimationFrame(callback, win) {\r\n let fun = win && win.requestAnimationFrame? win.requestAnimationFrame: (typeof window !== 'undefined' && window.requestAnimationFrame? window.requestAnimationFrame: setTimeout); \r\n\t\treturn fun(callback, 20);\r\n }\r\n static cancelAnimationFrame(handler, win) {\r\n let fun = win && win.cancelAnimationFrame? win.cancelAnimationFrame: (typeof window !== 'undefined' && window.cancelAnimationFrame? window.cancelAnimationFrame: clearTimeout); \r\n\t\treturn fun(handler);\r\n }\t\r\n}\r\nexport { jmUtils };","\r\nimport {jmList} from \"./jmList.js\";\r\n\r\nconst ANICOUNTER = Symbol('jmchart#animate#counter');\r\n\r\n/**\r\n * 所有jm对象的基础对象\r\n * \r\n * @class jmObject\r\n * @for jmGraph\r\n */\r\nexport default class jmObject {\r\n\t//id;\r\n\tconstructor(g) {\r\n\t\tif(g && g.type == 'jmGraph') {\r\n\t\t\tthis.graph = g;\r\n\t\t}\r\n\t\t//this.id = Symbol(\"id\"); //生成一个唯一id\r\n\t}\r\n\t\r\n\t/**\r\n\t * 检 查对象是否为指定类型\r\n\t * \r\n\t * @method is\r\n\t * @param {class} type 判断的类型\r\n\t * @for jmObject\r\n\t * @return {boolean} true=表示当前对象为指定的类型type,false=表示不是\r\n\t */\r\n\tis(type) {\r\n\t\tif(typeof type == 'string') {\r\n\t\t\treturn this.type == type;\r\n\t\t}\r\n\t\treturn this instanceof type;\r\n\t}\r\n\r\n\t/**\r\n\t * 给控件添加动画处理,如果成功执行会导致画布刷新。\r\n\t *\r\n\t * @method animate\r\n\t * @for jmObject\r\n\t * @param {function} handle 动画委托\r\n\t * @param {integer} millisec 此委托执行间隔 (毫秒)\r\n\t */\r\n\tanimate(...args) {\t\r\n\t\tif(this.is('jmGraph')) {\r\n\t\t\tif(args.length > 1) {\t\t\t\r\n\t\t\t\tif(!this.animateHandles) this.animateHandles = new jmList();\r\n\t\t\t\t\r\n\t\t\t\tvar params = [];\r\n\t\t\t\tif(args.length > 2) {\r\n\t\t\t\t\tfor(var i=2;i<args.length;i++) {\r\n\t\t\t\t\t\tparams.push(args[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\t\t\r\n\t\t\t\tthis.animateHandles.add({\r\n\t\t\t\t\tmillisec: args[1] || 20, \r\n\t\t\t\t\thandle: args[0], \r\n\t\t\t\t\tparams:params\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif(this.animateHandles) {\r\n\t\t\t\tif(this.animateHandles.count() > 0) {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\t//延时处理动画事件\r\n\t\t\t\t\tthis.dispatcher = setTimeout(function(_this) {\r\n\t\t\t\t\t\t_this = _this || self;\r\n\t\t\t\t\t\t//var needredraw = false;\r\n\t\t\t\t\t\tvar overduehandles = [];\r\n\t\t\t\t\t\tvar curTimes = new Date().getTime();\r\n\t\t\t\t\t\t_this.animateHandles.each(function(i,ani) {\t\t\t\t\t\t\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tif(ani && ani.handle && (!ani.times || curTimes - ani.times >= ani.millisec)) {\r\n\t\t\t\t\t\t\t\t\tvar r = ani.handle.apply(_this, ani.params);\r\n\t\t\t\t\t\t\t\t\tif(r === false) {\r\n\t\t\t\t\t\t\t\t\t\toverduehandles.push(ani);//表示已完成的动画效果\r\n\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tani.times = curTimes;\r\n\t\t\t\t\t\t\t\t\t//needredraw = true;\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcatch(e) {\r\n\t\t\t\t\t\t\t\tif(window.console && window.console.info) {\r\n\t\t\t\t\t\t\t\t\twindow.console.info(e.toString());\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif(ani) overduehandles.push(ani);//异常的事件,不再执行\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tfor(var i in overduehandles) {\r\n\t\t\t\t\t\t\t_this.animateHandles.remove(overduehandles[i]);//移除完成的效果\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_this.animate();\r\n\t\t\t\t\t},10,this);//刷新\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\t\telse {\r\n\t\t\tvar graph = this.graph;\r\n\t\t\tif(graph) {\r\n\t\t\t\tgraph.animate(...args);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport { jmObject };","\r\nimport {jmUtils} from \"./jmUtils.js\";\r\nimport { jmObject } from \"./jmObject.js\";\r\n\r\nconst PROPERTY_KEY = Symbol(\"properties\");\r\n\r\n/**\r\n * 对象属性管理\r\n * \r\n * @class jmProperty\r\n * @extends jmObject\r\n * @require jmObject\r\n */\r\nexport default class jmProperty extends jmObject {\t\t\r\n\t\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\t\r\n\t\tthis[PROPERTY_KEY] = {};\r\n\t}\r\n\r\n\t/**\r\n\t * 基础属性读写接口\r\n\t * @method __pro\r\n\t * @param {string} name 属性名\r\n\t * @param {any} value 属性的值\r\n\t * @returns {any} 属性的值\r\n\t */\r\n\t__pro(...pars) {\r\n\t\tif(pars) {\r\n\t\t\tlet pros = this[PROPERTY_KEY];\r\n\t\t\tlet name = pars[0];\r\n\t\t\tif(pars.length > 1) {\r\n\t\t\t\tlet value = pars[1];\r\n\t\t\t\tlet args = {oldValue: pros[name], newValue: value};\r\n\t\t\t\tpros[name] = pars[1];\r\n\t\t\t\tif(this.emit) this.emit('propertyChange', name, args);\r\n\t\t\t\treturn pars[1];\r\n\t\t\t}\r\n\t\t\telse if(pars.length == 1) {\r\n\t\t\t\treturn pros[name];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 是否需要刷新画板,属性的改变会导致它变为true\r\n\t * @property needUpdate\r\n\t * @type {boolean}\r\n\t */\r\n\tget needUpdate() {\r\n\t\treturn this.__pro('needUpdate');\r\n\t}\r\n\tset needUpdate(v) {\r\n\t\tthis.__pro('needUpdate', v);\r\n\t\t//子控件属性改变,需要更新整个画板\r\n\t\tif(v && !this.is('jmGraph') && this.graph) {\r\n\t\t\tthis.graph.needUpdate = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 当前所在的画布对象 jmGraph\r\n\t * @property graph\r\n\t * @type {jmGraph}\r\n\t */\r\n\tget graph() {\r\n\t\tlet g = this.__pro('graph');\r\n\t\tg = g || (this.__pro('graph', this.findParent('jmGraph')));\r\n\t\treturn g;\r\n\t}\r\n\tset graph(v) {\r\n\t\treturn this.__pro('graph', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 在下次进行重绘时执行\r\n\t * @param {Function} handler \r\n\t */\r\n\trequestAnimationFrame(handler) {\r\n\t\treturn jmUtils.requestAnimationFrame(handler, this.graph? this.graph.canvas: null);\r\n\t}\r\n\t/**\r\n\t * 清除执行回调\r\n\t * @param {Function} handler \r\n\t * @returns \r\n\t */\r\n\tcancelAnimationFrame(handler) {\r\n\t\treturn jmUtils.cancelAnimationFrame(handler, this.graph? this.graph.canvas: null);\r\n\t}\r\n}\r\n\r\nexport { jmProperty };\r\n\r\n\r\n","import {jmUtils} from \"./jmUtils.js\";\r\n\r\n/**\r\n * 画图阴影对象表示法\r\n *\r\n * @class jmShadow\r\n * @param {number} x 横坐标偏移量\r\n * @param {number} y 纵坐标编移量\r\n * @param {number} blur 模糊值\r\n * @param {string} color 阴影的颜色\r\n */\r\n\r\nexport default class jmShadow {\r\n\tconstructor(x, y, blur, color) {\r\n\t\tif(typeof x == 'string' && !y && !blur && !color) {\r\n\t\t\tthis.fromString(x);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.color = color;\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 根据字符串格式转为阴影\r\n\t * @method fromString\r\n\t * @param {string} s 阴影字符串 x,y,blur,color\r\n\t */\r\n\tfromString(s) {\r\n\t\tif(!s) return;\r\n\t\tlet ms = s.match(/\\s*([^,]+)\\s*,\\s*([^,]+)\\s*(,[^,]+)?\\s*(,[\\s\\S]+)?\\s*/i);\r\n\t\tif(ms) {\r\n\t\t\tthis.x = ms[1]||0;\r\n\t\t\tthis.y = ms[2]||0;\r\n\t\t\tif(ms[3]) {\r\n\t\t\t\tms[3] = jmUtils.trim(ms[3],', ');\r\n\t\t\t\t//如果第三位是颜色格式,则表示为颜色\r\n\t\t\t\tif(ms[3].indexOf('#')===0 || /^rgb/i.test(ms[3])) {\r\n\t\t\t\t\tthis.color = ms[3];\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.blur = jmUtils.trim(ms[3],', ');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(ms[4]) {\r\n\t\t\t\tthis.color = jmUtils.trim(ms[4],', ');\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * 转为字符串格式 x,y,blur,color\r\n\t * @method toString\r\n\t * @returns {string} 阴影字符串\r\n\t */\r\n\ttoString() {\r\n\t\tlet s = this.x + ',' + this.y;\r\n\t\tif(this.blur) s += ',' + this.blur;\r\n\t\tif(this.color) s += ',' + this.color;\r\n\t\treturn s;\r\n\t}\r\n}\r\n\r\nexport { jmShadow };","import {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\n\r\n/**\r\n * 渐变类\r\n *\r\n * @class jmGradient\r\n * @param {object} op 渐变参数,type:[linear= 线性渐变,radial=放射性渐变] \r\n */\r\nexport default class jmGradient {\r\n\tconstructor(opt) {\r\n\t\tthis.stops = new jmList();\r\n\r\n\t\tif(opt && typeof opt == 'object') {\r\n\t\t\tfor(let k in opt) {\r\n\t\t\t\tthis[k] = opt[k];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//解析字符串格式\r\n\t\t//linear-gradient(direction, color-stop1, color-stop2, ...);\r\n\t\t//radial-gradient(center, shape size, start-color, ..., last-color);\r\n\t\telse if(typeof opt == 'string') {\r\n\t\t\tthis.fromString(opt);\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 添加渐变色\r\n\t * \r\n\t * @method addStop\r\n\t * @for jmGradient\r\n\t * @param {number} offset 放射渐变颜色偏移,可为百分比参数。\r\n\t * @param {string} color 当前偏移颜色值\r\n\t */\r\n\taddStop(offset, color) {\r\n\t\tthis.stops.add({\r\n\t\t\toffset: Number(offset),\r\n\t\t\tcolor: color\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 生成为canvas的渐变对象\r\n\t *\r\n\t * @method toGradient\r\n\t * @for jmGradient\r\n\t * @param {jmControl} control 当前渐变对应的控件\r\n\t * @return {gradient} canvas渐变对象\r\n\t */\r\n\ttoGradient(control) {\r\n\t\tlet gradient;\r\n\t\tlet context = control.context || control;\r\n\t\tlet bounds = control.absoluteBounds?control.absoluteBounds:control.getAbsoluteBounds();\r\n\t\tlet x1 = this.x1||0;\r\n\t\tlet y1 = this.y1||0;\r\n\t\tlet x2 = this.x2;\r\n\t\tlet y2 = this.y2;\r\n\r\n\t\tlet location = control.getLocation();\r\n\r\n\t\tlet d = 0;\r\n\t\tif(location.radius) {\r\n\t\t\td = location.radius * 2;\t\t\t\t\r\n\t\t}\r\n\t\tif(!d) {\r\n\t\t\td = Math.min(location.width,location.height);\t\t\t\t\r\n\t\t}\r\n\r\n\t\t//let offsetLine = 1;//渐变长度或半径\r\n\t\t//处理百分比参数\r\n\t\tif(jmUtils.checkPercent(x1)) {\r\n\t\t\tx1 = jmUtils.percentToNumber(x1) * (bounds.width || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(x2)) {\r\n\t\t\tx2 = jmUtils.percentToNumber(x2) * (bounds.width || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(y1)) {\r\n\t\t\ty1 = jmUtils.percentToNumber(y1) * (bounds.height || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(y2)) {\r\n\t\t\ty2 = jmUtils.percentToNumber(y2) * (bounds.height || d);\r\n\t\t}\t\r\n\r\n\t\tlet sx1 = Number(x1) + bounds.left;\r\n\t\tlet sy1 = Number(y1) + bounds.top;\r\n\t\tlet sx2 = Number(x2) + bounds.left;\r\n\t\tlet sy2 = Number(y2) + bounds.top;\r\n\t\tif(this.type === 'linear') {\t\t\r\n\t\t\tgradient = context.createLinearGradient(sx1, sy1, sx2, sy2);\r\n\t\t}\r\n\t\telse if(this.type === 'radial') {\r\n\t\t\tlet r1 = this.r1||0;\r\n\t\t\tlet r2 = this.r2;\r\n\t\t\tif(jmUtils.checkPercent(r1)) {\r\n\t\t\t\tr1 = jmUtils.percentToNumber(r1);\t\t\t\r\n\t\t\t\tr1 = d * r1;\r\n\t\t\t}\r\n\t\t\tif(jmUtils.checkPercent(r2)) {\r\n\t\t\t\tr2 = jmUtils.percentToNumber(r2);\r\n\t\t\t\tr2 = d * r2;\r\n\t\t\t}\t\r\n\t\t\t//offsetLine = Math.abs(r2 - r1);//二圆半径差\r\n\t\t\t//小程序的接口特殊\r\n\t\t\tif(context.createCircularGradient) { \r\n\t\t\t\tgradient = context.createCircularGradient(sx1, sy1, r2);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tgradient = context.createRadialGradient(sx1, sy1, r1, sx2, sy2, r2);\t\r\n\t\t\t}\t\r\n\t\t}\r\n\t\t//颜色渐变\r\n\t\tthis.stops.each(function(i,s) {\t\r\n\t\t\tlet c = jmUtils.toColor(s.color);\r\n\t\t\t//s.offset 0.0 ~ 1.0\r\n\t\t\tgradient.addColorStop(s.offset, c);\t\t\r\n\t\t});\r\n\t\t\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 变换为字条串格式\r\n\t * linear-gradient(x1 y1 x2 y2, color1 step, color2 step, ...);\t//radial-gradient(x1 y1 r1 x2 y2 r2, color1 step,color2 step, ...);\r\n\t * linear-gradient线性渐变,x1 y1表示起点,x2 y2表示结束点,color表颜色,step为当前颜色偏移\r\n\t * radial-gradient径向渐变,x1 y1 r1分别表示内圆中心和半径,x2 y2 r2为结束圆 中心和半径,颜色例似线性渐变 step为0-1之间\r\n\t *\r\n\t * @method fromString\r\n\t * @for jmGradient\r\n\t * @return {string} \r\n\t */\r\n\tfromString(s) {\r\n\t\tif(!s) return;\r\n\t\tlet ms = s.match(/(linear|radial)-gradient\\s*\\(\\s*([^,]+)\\s*,\\s*((.|\\s)+)\\)/i);\r\n\t\tif(!ms || ms.length < 3) return;\r\n\t\tthis.type = ms[1].toLowerCase();\t\t\r\n\t\t\r\n\t\tconst ps = jmUtils.trim(ms[2]).split(/\\s+/);\r\n\t\t//线性渐变\r\n\t\tif(this.type == 'linear') {\r\n\t\t\tif(ps.length <= 2) {\r\n\t\t\t\tthis.x2 = ps[0];\r\n\t\t\t\tthis.y2 = ps[1]||0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.x1 = ps[0];\r\n\t\t\t\tthis.y1 = ps[1];\r\n\t\t\t\tthis.x2 = ps[2];\r\n\t\t\t\tthis.y2 = ps[3];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//径向渐变\r\n\t\telse {\r\n\t\t\tif(ps.length <= 3) {\r\n\t\t\t\tthis.x2 = ps[0];\r\n\t\t\t\tthis.y2 = ps[1]||0;\r\n\t\t\t\tthis.r2 = ps[2]||0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.x1 = ps[0];\r\n\t\t\t\tthis.y1 = ps[1];\r\n\t\t\t\tthis.r1 = ps[2];\r\n\t\t\t\tthis.x2 = ps[3];\r\n\t\t\t\tthis.y2 = ps[3];\r\n\t\t\t\tthis.r2 = ps[3];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//解析颜色偏移\r\n\t\t//color step\r\n\t\tconst pars = ms[3].match(/((rgb(a)?\\s*\\([\\d,\\.\\s]+\\))|(#[a-zA-Z\\d]+))\\s+([\\d\\.]+)/ig);\r\n\t\tif(pars && pars.length) {\r\n\t\t\tfor(let i=0;i<pars.length;i++) {\r\n\t\t\t\tconst par = jmUtils.trim(pars[i]);\r\n\t\t\t\tconst spindex = par.lastIndexOf(' ');\r\n\t\t\t\tif(spindex > -1) {\t\t\t\r\n\t\t\t\t\tconst offset = Number(par.substr(spindex + 1));\t\t\r\n\t\t\t\t\tconst color = jmUtils.trim(par.substr(0, spindex));\r\n\t\t\t\t\tif(!isNaN(offset) && color) {\r\n\t\t\t\t\t\tthis.addStop(offset, color);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 转换为渐变的字符串表达\r\n\t *\r\n\t * @method toString\r\n\t * @for jmGradient\r\n\t * @return {string} linear-gradient(x1 y1 x2 y2, color1 step, color2 step, ...);\t//radial-gradient(x1 y1 r1 x2 y2 r2, color1 step,color2 step, ...);\r\n\t */\r\n\ttoString() {\r\n\t\tlet str = this.type + '-gradient(';\r\n\t\tif(this.type == 'linear') {\r\n\t\t\tstr += this.x1 + ' ' + this.y1 + ' ' + this.x2 + ' ' + this.y2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tstr += this.x1 + ' ' + this.y1 + ' ' + this.r1 + ' ' + this.x2 + ' ' + this.y2 + ' ' + this.r2;\r\n\t\t}\r\n\t\t//颜色渐变\r\n\t\tthis.stops.each(function(i,s) {\t\r\n\t\t\tstr += ',' + s.color + ' ' + s.offset;\r\n\t\t});\r\n\t\treturn str + ')';\r\n\t}\r\n}\r\n\r\nexport { jmGradient };\r\n\r\n\r\n\r\n","import {jmUtils} from \"./jmUtils.js\";\r\n/**\r\n * 事件模型\r\n *\r\n * @class jmEvents\r\n * @for jmGraph\r\n */\r\nexport default class jmEvents {\r\n\r\n\tconstructor(container, target) {\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\t\tthis.mouseHandler = new jmMouseEvent(this, container, target);\r\n\t\tthis.keyHandler = new jmKeyEvent(this, container, target);\r\n\t}\r\n\r\n\ttouchStart(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchstart';\r\n\t\tthis.container.raiseEvent('touchstart',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchMove(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchmove';\r\n\t\tthis.container.raiseEvent('touchmove',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchEnd(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchend';\r\n\t\t\r\n\t\tthis.container.raiseEvent('touchend',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchCancel(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchcancel';\r\n\t\t\r\n\t\tthis.container.raiseEvent('touchcancel',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\t// 销毁\r\n\tdestroy() {\r\n\t\tthis.mouseHandler.destroy();\r\n\t\tthis.keyHandler.destroy();\r\n\t}\r\n}\r\n\r\n/**\r\n * 鼠标事件处理对象,container 为事件主体,target为响应事件对象\r\n */\r\nclass jmMouseEvent {\r\n\tconstructor(instance, container, target) {\r\n\t\tthis.instance = instance;\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\r\n\t\tthis.eventEvents = {};// 所有绑定的事件\r\n\r\n\t\tthis.init(instance, container, target);\r\n\t}\r\n\t\r\n\tinit(instance, container, target) {\r\n\t\tlet canvas = this.target;\t\r\n\t\tlet doc = typeof typeof document != 'undefined'?document:null;\r\n\t\t//禁用鼠标右健系统菜单\r\n\t\t//canvas.oncontextmenu = function() {\r\n\t\t//\treturn false;\r\n\t\t//};\r\n\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mousedown',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'mousedown';\r\n\t\t\tlet r = container.raiseEvent('mousedown',evt);\r\n\t\t\t//if(r === false) {\r\n\t\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t//return false;\r\n\t\t\t//}\t\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mousemove',function(evt) {\t\r\n\t\t\tevt = evt || window.event;\t\t\r\n\t\t\tevt.eventName = 'mousemove';\r\n\t\t\tlet target = evt.target || evt.srcElement;\r\n\t\t\tif(target == canvas) {\r\n\t\t\t\tlet r = container.raiseEvent('mousemove',evt);\r\n\t\t\t\t//if(r === false) {\r\n\t\t\t\t\tif(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t//}\t\t\r\n\t\t\t}\t\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mouseover',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseover';\r\n\t\t\tcontainer.raiseEvent('mouseover',evt);\r\n\t\t});\r\n\t\tthis.eventEvents['mouseleave'] = jmUtils.bindEvent(this.target,'mouseleave',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseleave';\r\n\t\t\tcontainer.raiseEvent('mouseleave',evt);\r\n\t\t});\t\t\t\r\n\t\tthis.eventEvents['mouseout'] = jmUtils.bindEvent(this.target,'mouseout',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseout';\r\n\t\t\tcontainer.raiseEvent('mouseout',evt);\r\n\t\t});\r\n\t\tdoc && (this.eventEvents['mouseup'] = jmUtils.bindEvent(doc,'mouseup',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseup';\r\n\t\t\t//let target = evt.target || evt.srcElement;\r\n\t\t\t//if(target == canvas) {\t\t\t\t\t\t\r\n\t\t\t\tlet r = container.raiseEvent('mouseup',evt);\r\n\t\t\t\tif(r === false) {\r\n\t\t\t\t\tif(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\t\t\t\t\r\n\t\t\t//}\r\n\t\t}));\r\n\t\t\r\n\t\tthis.eventEvents['dblclick'] = jmUtils.bindEvent(this.target,'dblclick',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'dblclick';\r\n\t\t\tcontainer.raiseEvent('dblclick',evt);\r\n\t\t});\r\n\t\tthis.eventEvents['click'] = jmUtils.bindEvent(this.target,'click',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'click';\r\n\t\t\tcontainer.raiseEvent('click',evt);\r\n\t\t});\r\n\r\n\t\tdoc && (this.eventEvents['resize'] = jmUtils.bindEvent(doc,'resize',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'resize';\r\n\t\t\treturn container.raiseEvent('resize',evt);\r\n\t\t}));\r\n\r\n\t\t// passive: false 为了让浏览器不告警并且preventDefault有效\r\n\t\t// 另一种处理:touch-action: none; 这样任何触摸事件都不会产生默认行为,但是 touch 事件照样触发。\r\n\t\tthis.eventEvents['touchstart'] = jmUtils.bindEvent(this.target,'touchstart', function(evt) {\r\n\t\t\tevt.eventName = 'touchstart';\r\n\t\t\treturn instance.touchStart(evt);\r\n\t\t},{ passive: false });\r\n\r\n\t\tthis.eventEvents['touchmove'] = jmUtils.bindEvent(this.target,'touchmove', function(evt) {\r\n\t\t\tevt.eventName = 'touchmove';\r\n\t\t\treturn instance.touchMove(evt);\r\n\t\t},{ passive: false });\r\n\r\n\t\tdoc && (this.eventEvents['touchend'] = jmUtils.bindEvent(doc,'touchend', function(evt) {\r\n\t\t\tevt.eventName = 'touchend';\r\n\t\t\treturn instance.touchEnd(evt);\r\n\t\t},{ passive: false }));\r\n\r\n\t\tdoc && (this.eventEvents['touchcancel'] = jmUtils.bindEvent(doc,'touchcancel', function(evt) {\r\n\t\t\tevt.eventName = 'touchcancel';\r\n\t\t\treturn instance.touchCancel(evt);\r\n\t\t},{ passive: false }));\r\n\t}\r\n\r\n\t// 销毁所有事件\r\n\tdestroy() {\r\n\t\tfor(let name in this.eventEvents) {\r\n\t\t\tconst event = this.eventEvents[name];\r\n\t\t\tif(!event || !event.fun) continue;\r\n\t\t\tjmUtils.removeEvent(event.target, name, event.fun);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * 健盘事件处理对象,container 为事件主体,target为响应事件对象\r\n */\r\nclass jmKeyEvent {\r\n\tconstructor(instance, container,target) {\r\n\t\tthis.instance = instance;\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\r\n\t\tthis.eventEvents = {};// 所有绑定的事件\r\n\r\n\t\tthis.init(container, target);\r\n\t}\r\n\r\n\t/**\r\n\t * 初始化健盘事件\r\n\t */\r\n\tinit(container, target) {\r\n\t\tlet doc = typeof typeof document != 'undefined'?document:null;\r\n\t\t/**\r\n\t\t * 检查是否触发健盘事件至画布\r\n\t\t * 如果触发对象为输入框等对象则不响应事件\r\n\t\t * \r\n\t\t */\r\n\t\tlet checkKeyEvent = (evt) => {\r\n\t\t\tlet target = evt.srcElement || evt.target;\r\n\t\t\tif(target && (target.tagName == 'INPUT' \r\n\t\t\t\t|| target.tagName == 'TEXTAREA'\r\n\t\t\t\t|| target.tagName == 'ANCHOR' \r\n\t\t\t\t|| target.tagName == 'FORM' \r\n\t\t\t\t|| target.tagName == 'FILE'\r\n\t\t\t\t|| target.tagName == 'IMG'\r\n\t\t\t\t|| target.tagName == 'HIDDEN'\r\n\t\t\t\t|| target.tagName == 'RADIO'\r\n\t\t\t\t|| target.tagName == 'TEXT'\t)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tdoc && (this.eventEvents['keypress'] = jmUtils.bindEvent(doc,'keypress',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keypress',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\r\n\t\tdoc && (this.eventEvents['keydown'] = jmUtils.bindEvent(doc,'keydown',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keydown',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\r\n\t\tdoc && (this.eventEvents['keyup'] = jmUtils.bindEvent(doc,'keyup',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keyup',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\t\t\t\r\n\t}\r\n\r\n\t// 销毁所有事件\r\n\tdestroy() {\r\n\t\tfor(let name in this.eventEvents) {\r\n\t\t\tconst event = this.eventEvents[name];\r\n\t\t\tif(!event || !event.fun) continue;\r\n\t\t\tjmUtils.removeEvent(event.target, name, event.fun);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport { jmEvents };\r\n","\r\nimport {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\nimport {jmGradient} from \"./jmGradient.js\";\r\nimport {jmShadow} from \"./jmShadow.js\";\r\nimport {jmProperty} from \"./jmProperty.js\";\r\n\r\n//样式名称,也当做白名单使用\t\t\r\nconst jmStyleMap = {\r\n\t'fill':'fillStyle',\r\n\t'stroke':'strokeStyle',\r\n\t'shadow.blur':'shadowBlur',\r\n\t'shadow.x':'shadowOffsetX',\r\n\t'shadow.y':'shadowOffsetY',\r\n\t'shadow.color':'shadowColor',\r\n\t'lineWidth' : 'lineWidth',\r\n\t'miterLimit': 'miterLimit',\r\n\t'fillStyle' : 'fillStyle',\r\n\t'strokeStyle' : 'strokeStyle',\r\n\t'font' : 'font',\r\n\t'opacity' : 'globalAlpha',\r\n\t'textAlign' : 'textAlign',\r\n\t'textBaseline' : 'textBaseline',\r\n\t'shadowBlur' : 'shadowBlur',\r\n\t'shadowOffsetX' : 'shadowOffsetX',\r\n\t'shadowOffsetY' : 'shadowOffsetY',\r\n\t'shadowColor' : 'shadowColor',\r\n\t'lineJoin': 'lineJoin',//线交汇处的形状,miter(默认,尖角),bevel(斜角),round(圆角)\r\n\t'lineCap':'lineCap' //线条终端点,butt(默认,平),round(圆),square(方)\r\n};\r\n\r\n/**\r\n * 控件基础对象\r\n * 控件的基础属性和方法\r\n *\r\n * @class jmControl\r\n * @extends jmProperty\r\n */\t\r\nexport default class jmControl extends jmProperty {\t\r\n\r\n\tconstructor(params, t) {\r\n\t\tparams = params||{};\r\n\t\tsuper();\r\n\t\tthis.__pro('type', t || new.target.name);\r\n\t\tthis.style = params && params.style ? params.style : {};\r\n\t\t//this.position = params.position || {x:0,y:0};\r\n\t\tthis.width = params.width || 0;\r\n\t\tthis.height = params.height || 0;\r\n\r\n\t\tif(params.position) {\r\n\t\t\tthis.position = params.position;\r\n\t\t}\r\n\r\n\t\tthis.graph = params.graph || null;\r\n\t\tthis.zIndex = params.zIndex || 0;\r\n\t\tthis.interactive = typeof params.interactive == 'undefined'? true : params.interactive;\r\n\r\n\t\tthis.initializing();\t\r\n\t\t\r\n\t\tthis.on = this.bind;\r\n\t\t\r\n\t\tthis.option = params;\r\n\t}\r\n\r\n\t//# region 定义属性\r\n\t/**\r\n\t * 当前对象类型名jmRect\r\n\t *\r\n\t * @property type\r\n\t * @type string\r\n\t */\r\n\tget type() {\r\n\t\treturn this.__pro('type');\r\n\t}\r\n\r\n\t/**\r\n\t * 当前canvas的context\r\n\t * @property context\r\n\t * @type {object}\r\n\t */\r\n\tget context() {\r\n\t\tlet s = this.__pro('context');\r\n\t\tif(s) return s;\r\n\t\telse if(this.is('jmGraph') && this.canvas && this.canvas.getContext) {\r\n\t\t\treturn this.context = this.canvas.getContext('2d');\r\n\t\t}\r\n\t\tlet g = this.graph;\r\n\t\tif(g) return g.context;\r\n\t\treturn g.canvas.getContext('2d');\r\n\t}\r\n\tset context(v) {\r\n\t\treturn this.__pro('context', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 样式\r\n\t * @property style\r\n\t * @type {object}\r\n\t */\r\n\tget style() {\r\n\t\tlet s = this.__pro('style');\r\n\t\tif(!s) s = this.__pro('style', {});\r\n\t\treturn s;\r\n\t}\r\n\tset style(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('style', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 当前控件是否可见\r\n\t * @property visible\r\n\t * @default true\r\n\t * @type {boolean}\r\n\t */\r\n\tget visible() {\r\n\t\tlet s = this.__pro('visible');\r\n\t\tif(typeof s == 'undefined') s = this.__pro('visible', true);\r\n\t\treturn s;\r\n\t}\r\n\tset visible(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('visible', v);\r\n\t}\t\r\n\r\n\t/**\r\n\t * 当前控件是否是交互式的,如果是则会响应鼠标或touch事件。\r\n\t * 如果false则不会主动响应,但冒泡的事件依然会得到回调\r\n\t * @property interactive\r\n\t * @default false\r\n\t * @type {boolean}\r\n\t */\r\n\tget interactive() {\r\n\t\tlet s = this.__pro('interactive');\r\n\t\treturn s;\r\n\t}\r\n\tset interactive(v) {\r\n\t\treturn this.__pro('interactive', v);\r\n\t}\r\n\t\t\r\n\t/**\r\n\t * 当前控件的子控件集合\r\n\t * @property children\r\n\t * @type {list}\r\n\t */\r\n\tget children() {\r\n\t\tlet s = this.__pro('children');\r\n\t\tif(!s) s = this.__pro('children', new jmList());\r\n\t\treturn s;\r\n\t}\r\n\tset children(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('children', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 宽度\r\n\t * @property width\r\n\t * @type {number}\r\n\t */\r\n\tget width() {\r\n\t\tlet s = this.__pro('width');\r\n\t\tif(typeof s == 'undefined') s = this.__pro('width', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset width(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('width', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 高度\r\n\t * @property height\r\n\t * @type {number}\r\n\t */\r\n\tget height() {\r\n\t\tlet s = this.__pro('height');\r\n\t\tif(typeof s == 'undefined') s = this.__pro('height', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset height(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('height', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 控件层级关系,发生改变时,需要重新调整排序\r\n\t * @property zIndex\r\n\t * @type {number}\r\n\t */\r\n\tget zIndex() {\r\n\t\tlet s = this.__pro('zIndex');\r\n\t\tif(!s) s = this.__pro('zIndex', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset zIndex(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tthis.__pro('zIndex', v);\r\n\t\tthis.children.sort();//层级发生改变,需要重新排序\r\n\t\tthis.needUpdate = true;\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 设置鼠标指针\r\n\t * css鼠标指针标识,例如:pointer,move等\r\n\t * \r\n\t * @property cursor\r\n\t * @type {string}\r\n\t */\r\n\tset cursor(cur) {\t\r\n\t\tvar graph = this.graph ;\r\n\t\tif(graph) {\t\t\r\n\t\t\tgraph.css('cursor',cur);\t\t\r\n\t\t}\r\n\t}\r\n\tget cursor() {\r\n\t\tvar graph = this.graph ;\r\n\t\tif(graph) {\t\t\r\n\t\t\treturn graph.css('cursor');\t\t\r\n\t\t}\r\n\t}\r\n\r\n\t//# end region\r\n\r\n\t/**\r\n\t * 初始化对象,设定样式,初始化子控件对象\r\n\t * 此方法为所有控件需调用的方法\r\n\t *\r\n\t * @method initializing\r\n\t * @for jmControl\r\n\t */\r\n\tinitializing() {\r\n\r\n\t\tconst self = this;\r\n\t\t//定义子元素集合\r\n\t\tthis.children = this.children || new jmList();\r\n\t\tconst oadd = this.children.add;\r\n\t\t//当把对象添加到当前控件中时,设定其父节点\r\n\t\tthis.children.add = function(obj) {\r\n\t\t\tif(typeof obj === 'object') {\r\n\t\t\t\tif(obj.parent && obj.parent != self && obj.parent.children) {\r\n\t\t\t\t\tobj.parent.children.remove(obj);//如果有父节点则从其父节点中移除\r\n\t\t\t\t}\r\n\t\t\t\tobj.parent = self;\r\n\t\t\t\t//如果存在先移除\r\n\t\t\t\tif(this.contain(obj)) {\r\n\t\t\t\t\tthis.oremove(obj);\r\n\t\t\t\t}\r\n\t\t\t\toadd.call(this, obj);\r\n\t\t\t\tobj.emit('add', obj);\r\n\r\n\t\t\t\tself.needUpdate = true;\r\n\t\t\t\tif(self.graph) obj.graph = self.graph;\r\n\t\t\t\tthis.sort();//先排序\r\n\t\t\t\t//self.emit('addChild', obj);\r\n\t\t\t\treturn obj;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.children.oremove= this.children.remove;\r\n\t\t//当把对象从此控件中移除时,把其父节点置为空\r\n\t\tthis.children.remove = function(obj) {\r\n\t\t\tif(typeof obj === 'object') {\t\t\t\t\r\n\t\t\t\tobj.parent = null;\r\n\t\t\t\tobj.graph = null;\r\n\t\t\t\tobj.remove(true);\r\n\t\t\t\tthis.oremove(obj);\r\n\t\t\t\tself.needUpdate = true;\r\n\t\t\t\t//self.emit('removeChild', obj, index);\r\n\t\t\t}\r\n\t\t};\r\n\t\t/**\r\n\t\t * 根据控件zIndex排序,越大的越高\r\n\t\t */\r\n\t\t//const osort = this.children.sort;\r\n\t\tthis.children.sort = function() {\r\n\t\t\tconst levelItems = {};\r\n\t\t\t//提取zindex大于0的元素\r\n\t\t\t//为了保证0的层级不改变,只能把大于0的提出来。\r\n\t\t\tthis.each(function(i, obj) {\r\n\t\t\t\tif(!obj) return;\r\n\t\t\t\tlet zindex = obj.zIndex;\r\n\t\t\t\tif(!zindex && obj.style && obj.style.zIndex) {\r\n\t\t\t\t\tzindex = Number(obj.style.zIndex);\r\n\t\t\t\t\tif(isNaN(zindex)) zindex=obj.style.zIndex||0;\r\n\t\t\t\t}\r\n\t\t\t\tlet items = levelItems[zindex] || (levelItems[zindex] = []);\r\n\t\t\t\titems.push(obj);\r\n\t\t\t});\r\n\r\n\t\t\tthis.splice(0, this.length);\r\n\t\t\t\r\n\t\t\tfor(let index in levelItems) {\r\n\t\t\t\toadd.call(this, levelItems[index]);\r\n\t\t\t}\r\n\t\t\t/*\r\n\t\t\tosort.call(this, (c1, c2) => {\r\n\t\t\t\tlet zindex1 = c1.zIndex || c1.style.zIndex || 0;\r\n\t\t\t\tlet zindex2 = c2.zIndex || c2.style.zIndex || 0;\r\n\t\t\t\treturn zindex1 - zindex2;\r\n\t\t\t});*/\r\n\t\t}\r\n\t\tthis.children.clear = function() {\r\n\t\t\tthis.each(function(i,obj) {\r\n\t\t\t\tthis.remove(obj);\r\n\t\t\t},true);\r\n\t\t}\r\n\t\tthis.needUpdate = true;\r\n\t} \r\n\r\n\t/**\r\n\t * 设定样式到context\r\n\t * 处理样式映射,转换渐变和阴影对象为标准canvas属性\r\n\t * 样式一览\r\n\t\t| 简化名称 | 原生名称 | 说明\r\n\t\t| :- | :- | :- | \r\n\t\t| fill | fillStyle | 用于填充绘画的颜色、渐变或模式\r\n\t\t| stroke | strokeStyle | 用于笔触的颜色、渐变或模式\r\n\t\t| shadow | 没有对应的 | 最终会解析成以下几个属性,格式:'0,0,10,#fff'或g.createShadow(0,0,20,'#000');\r\n\t\t| shadow.blur | shadowBlur | 用于阴影的模糊级别\r\n\t\t| shadow.x | shadowOffsetX | 阴影距形状的水平距离\r\n\t\t| shadow.y | shadowOffsetY | 阴影距形状的垂直距离\r\n\t\t| shadow.color | shadowColor | 阴影颜色,格式:'#000'、'#46BF86'、'rgb(255,255,255)'或'rgba(39,72,188,0.5)'\r\n\t\t| lineWidth | lineWidth | 当前的线条宽度\r\n\t\t| miterLimit | miterLimit | 最大斜接长度\r\n\t\t| font | font | 请使用下面的 fontSize 和 fontFamily\r\n\t\t| fontSize | font | 字体大小\r\n\t\t| fontFamily | font | 字体\r\n\t\t| opacity | globalAlpha | 绘图的当前 alpha 或透明值\r\n\t\t| textAlign | textAlign | 文本内容的当前对齐方式\r\n\t\t| textBaseline | textBaseline | 在绘制文本时使用的当前文本基线\r\n\t\t| lineJoin | lineJoin | 两条线相交时,所创建的拐角类型:miter(默认,尖角),bevel(斜角),round(圆角)\r\n\t\t| lineCap | lineCap | 线条的结束端点样式:butt(默认,平),round(圆),square(方)\r\n\t * \r\n\t * @method setStyle\r\n\t * @for jmControl\r\n\t * @private\r\n\t * @param {style} style 样式对象,如:{fill:'black',stroke:'red'}\r\n\t */\r\n\tsetStyle(style) {\r\n\t\tstyle = style || jmUtils.clone(this.style, true);\r\n\t\tif(!style) return;\r\n\r\n\t\t/**\r\n\t\t * 样式设定\r\n\t\t * \r\n\t\t * @method __setStyle\r\n\t\t * @private\r\n\t\t * @param {jmControl} control 当前样式对应的控件对象\r\n\t\t * @param {style} style 样式\r\n\t\t * @param {string} name 样式名称\r\n\t\t * @param {string} mpkey 样式名称在映射中的key(例如:shadow.blur为模糊值)\r\n\t\t */\r\n\t\tlet __setStyle = (style, name, mpkey) => {\r\n\t\t\t\r\n\t\t\tif(style) {\t\t\r\n\t\t\t\tlet styleValue = style;\t\t\r\n\t\t\t\tif(typeof styleValue === 'function') {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tstyleValue = styleValue.call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch(e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlet t = typeof styleValue;\t\r\n\t\t\t\tlet mpname = jmStyleMap[mpkey || name];\r\n\r\n\t\t\t\t//如果为渐变对象\r\n\t\t\t\tif((styleValue instanceof jmGradient) || (t == 'string' && styleValue.indexOf('-gradient') > -1)) {\r\n\t\t\t\t\t//如果是渐变,则需要转换\r\n\t\t\t\t\tif(t == 'string' && styleValue.indexOf('-gradient') > -1) {\r\n\t\t\t\t\t\tstyleValue = new jmGradient(styleValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t__setStyle(styleValue.toGradient(this), mpname||name);\t\r\n\t\t\t\t}\r\n\t\t\t\telse if(mpname) {\r\n\t\t\t\t\t//只有存在白名单中才处理\r\n\t\t\t\t\t//颜色转换\r\n\t\t\t\t\tif(t == 'string' && ['fillStyle', 'strokeStyle', 'shadowColor'].indexOf(mpname) > -1) {\r\n\t\t\t\t\t\tstyleValue = jmUtils.toColor(styleValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.context[mpname] = styleValue;\r\n\t\t\t\t}\t\r\n\t\t\t\telse {\r\n\t\t\t\t\tswitch(name) {\r\n\t\t\t\t\t\t//阴影样式\r\n\t\t\t\t\t\tcase 'shadow' : {\r\n\t\t\t\t\t\t\tif(t == 'string') {\r\n\t\t\t\t\t\t\t\t__setStyle(new jmShadow(styleValue), name);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tfor(let k in styleValue) {\r\n\t\t\t\t\t\t\t\t__setStyle(styleValue[k], k, name + '.' + k);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//平移\r\n\t\t\t\t\t\tcase 'translate' : {\r\n\t\t\t\t\t\t\tthis.context.translate(styleValue.x, styleValue.y);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//旋转\r\n\t\t\t\t\t\tcase 'rotation' : {\t\r\n\t\t\t\t\t\t\tif(!styleValue.angle) break;\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t//旋 转先移位偏移量\r\n\t\t\t\t\t\t\tlet tranX = 0;\r\n\t\t\t\t\t\t\tlet tranY = 0;\r\n\t\t\t\t\t\t\t//旋转,则移位,如果有中心位则按中心旋转,否则按左上角旋转\r\n\t\t\t\t\t\t\t//这里只有style中的旋转才能生效,不然会导至子控件多次旋转\r\n\t\t\t\t\t\t\tif(styleValue.point) {\r\n\t\t\t\t\t\t\t\tlet bounds = this.absoluteBounds?this.absoluteBounds:this.getAbsoluteBounds();\r\n\t\t\t\t\t\t\t\tstyleValue = this.getRotation(styleValue);\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\ttranX = styleValue.rotateX + bounds.left;\r\n\t\t\t\t\t\t\t\ttranY = styleValue.rotateY + bounds.top;\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif(tranX!=0 || tranY != 0) this.context.translate(tranX,tranY);\r\n\t\t\t\t\t\t\tthis.context.rotate(styleValue.angle);\r\n\t\t\t\t\t\t\tif(tranX!=0 || tranY != 0) this.context.translate(-tranX,-tranY);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcase 'transform' : {\r\n\t\t\t\t\t\t\tif(Array.isArray(styleValue)) {\r\n\t\t\t\t\t\t\t\tthis.context.transform.apply(this.context, styleValue);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if(typeof styleValue == 'object') {\r\n\t\t\t\t\t\t\t\tthis.context.transform(styleValue.scaleX,//水平缩放\r\n\t\t\t\t\t\t\t\tstyleValue.skewX,//水平倾斜\r\n\t\t\t\t\t\t\t\tstyleValue.skewY,//垂直倾斜\r\n\t\t\t\t\t\t\t\tstyleValue.scaleY,//垂直缩放\r\n\t\t\t\t\t\t\t\tstyleValue.offsetX,//水平位移\r\n\t\t\t\t\t\t\t\tstyleValue.offsetY);//垂直位移\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//鼠标指针\r\n\t\t\t\t\t\tcase 'cursor' : {\r\n\t\t\t\t\t\t\tthis.cursor = styleValue;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\t\t\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\r\n\t\t//一些特殊属性要先设置,否则会导致顺序不对出现错误的效果\r\n\t\tif(this.translate) {\r\n\t\t\t__setStyle(this.translate, 'translate');\r\n\t\t}\r\n\t\tif(this.transform) {\r\n\t\t\t__setStyle(this.transform, 'transform');\r\n\t\t}\r\n\t\t//设置样式\r\n\t\tfor(let k in style) {\r\n\t\t\tif(k === 'constructor') continue;\r\n\t\t\tlet t = typeof style[k];\r\n\t\t\t//先处理部分样式,以免每次都需要初始化解析\r\n\t\t\tif(t == 'string' && style[k].indexOf('-gradient') > -1) {\r\n\t\t\t\tstyle[k] = new jmGradient(style[k]);\r\n\t\t\t}\r\n\t\t\telse if(t == 'string' && k == 'shadow') {\r\n\t\t\t\tstyle[k] = new jmShadow(style[k]);\r\n\t\t\t}\r\n\t\t\t__setStyle(style[k], k);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控件的边界\r\n\t * 通过分析控件的描点或位置加宽高得到为方形的边界\r\n\t *\r\n\t * @method getBounds\r\n\t * @for jmControl\r\n\t * @param {boolean} [isReset=false] 是否强制重新计算\r\n\t * @return {object} 控件的边界描述对象(left,top,right,bottom,width,height)\r\n\t */\r\n\tgetBounds(isReset) {\r\n\t\t//如果当次计算过,则不重复计算\r\n\t\tif(this.bounds && !isReset) return this.bounds;\r\n\r\n\t\tlet rect = {}; // left top\r\n\t\t//jmGraph,特殊处理\r\n\t\tif(this.type == 'jmGraph' && this.canvas) {\r\n\t\t\tif(typeof this.canvas.width === 'function') {\r\n\t\t\t\trect.right = this.canvas.width(); \r\n\t\t\t}\r\n\t\t\telse if(this.width) {\r\n\t\t\t\trect.right = this.width;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(typeof this.canvas.height === 'function') {\r\n\t\t\t\trect.bottom = this.canvas.height(); \r\n\t\t\t}\r\n\t\t\telse if(this.height) {\r\n\t\t\t\trect.bottom = this.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(this.points && this.points.length > 0) {\t\t\r\n\t\t\tfor(let i in this.points) {\r\n\t\t\t\tlet p = this.points[i];\r\n\t\t\t\tif(typeof rect.left === 'undefined' || rect.left > p.x) {\r\n\t\t\t\t\trect.left = p.x;\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof rect.top === 'undefined' || rect.top > p.y) {\r\n\t\t\t\t\trect.top = p.y;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(typeof rect.right === 'undefined' || rect.right < p.x) {\r\n\t\t\t\t\trect.right = p.x;\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof rect.bottom === 'undefined' || rect.bottom < p.y) {\r\n\t\t\t\t\trect.bottom = p.y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(this.getLocation) {\r\n\t\t\tlet p = this.getLocation();\r\n\t\t\tif(p) {\r\n\t\t\t\trect.left = p.left;\r\n\t\t\t\trect.top = p.top;\r\n\t\t\t\trect.right = p.left + p.width;\r\n\t\t\t\trect.bottom = p.top + p.height;\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\tif(!rect.left) rect.left = 0; \r\n\t\tif(!rect.top) rect.top = 0; \r\n\t\tif(!rect.right) rect.right = 0; \r\n\t\tif(!rect.bottom) rect.bottom = 0; \r\n\t\trect.width = rect.right - rect.left;\r\n\t\trect.height = rect.bottom - rect.top;\r\n\t\treturn this.bounds=rect;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控件的位置相关参数\r\n\t * 解析百分比和margin参数\r\n\t *\r\n\t * @method getLocation\r\n\t * @return {object} 当前控件位置参数,包括中心点坐标,右上角坐标,宽高\r\n\t */\r\n\tgetLocation(clone=true) {\r\n\t\t//如果已经计算过则直接返回\r\n\t\t//在开画之前会清空此对象\r\n\t\t//if(reset !== true && this.location) return this.location;\r\n\r\n\t\tlet local = this.location = {left: 0,top: 0,width: 0,height: 0};\r\n\t\tlocal.position = typeof this.position == 'function'? this.position(): jmUtils.clone(this.position);\t\r\n\t\tlocal.center = this.center && typeof this.center === 'function'?this.center(): jmUtils.clone(this.center);//中心\r\n\t\tlocal.start = this.start && typeof this.start === 'function'?this.start(): jmUtils.clone(this.start);//起点\r\n\t\tlocal.end = this.end && typeof this.end === 'function'?this.end(): jmUtils.clone(this.end);//起点\r\n\t\tlocal.radius = this.radius;//半径\r\n\t\tlocal.width = this.width;\r\n\t\tlocal.height = this.height;\r\n\r\n\t\tlet margin = jmUtils.clone(this.style.margin, {});\r\n\t\tmargin.left = (margin.left || 0);\r\n\t\tmargin.top = (margin.top || 0);\r\n\t\tmargin.right = (margin.right || 0);\r\n\t\tmargin.bottom = (margin.bottom || 0);\r\n\t\t\r\n\t\t//如果没有指定位置,但指定了margin。则位置取margin偏移量\r\n\t\tif(local.position) {\r\n\t\t\tlocal.left = local.position.x;\r\n\t\t\tlocal.top = local.position.y;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlocal.left = margin.left;\r\n\t\t\tlocal.top = margin.top;\r\n\t\t}\r\n\r\n\t\tif(!this.parent) return local;//没有父节点则直接返回\r\n\t\tlet parentBounds = this.parent.getBounds();\t\r\n\r\n\t\t//处理百分比参数\r\n\t\tif(jmUtils.checkPercent(local.left)) {\r\n\t\t\tlocal.left = jmUtils.percentToNumber(local.left) * parentBounds.width;\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(local.top)) {\r\n\t\t\tlocal.top = jmUtils.percentToNumber(local.top) * parentBounds.height;\r\n\t\t}\r\n\t\t\r\n\t\t//如果没有指定宽度或高度,则按百分之百计算其父宽度或高度\r\n\t\tif(jmUtils.checkPercent(local.width)) {\r\n\t\t\tlocal.width = jmUtils.percentToNumber(local.width) * parentBounds.width;\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(local.height)) {\r\n\t\t\tlocal.height = jmUtils.percentToNumber(local.height) * parentBounds.height;\r\n\t\t}\r\n\t\t//处理中心点\r\n\t\tif(local.center) {\r\n\t\t\t//处理百分比参数\r\n\t\t\tif(jmUtils.checkPercent(local.center.x)) {\r\n\t\t\t\tlocal.center.x = jmUtils.percentToNumber(local.center.x) * parentBounds.width;\r\n\t\t\t}\r\n\t\t\tif(jmUtils.checkPercent(local.center.y)) {\r\n\t\t\t\tlocal.center.y = jmUtils.percentToNumber(local.center.y) * parentBounds.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(local.radius) {\r\n\t\t\t//处理百分比参数\r\n\t\t\tif(jmUtils.checkPercent(local.radius)) {\r\n\t\t\t\tlocal.radius = jmUtils.percentToNumber(local.radius) * Math.min(parentBounds.width, parentBounds.height);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn local;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控制的旋转信息\r\n\t * @returns {object} 旋转中心和角度\r\n\t */\r\n\tgetRotation(rotation) {\r\n\t\trotation = rotation || this.style.rotation;\r\n\t\tif(!rotation) {\r\n\t\t\t//如果本身没有,则可以继承父级的\r\n\t\t\trotation = this.parent && this.parent.getRotation?this.parent.getRotation():null;\r\n\t\t\t//如果父级有旋转,则把坐标转换为当前控件区域\r\n\t\t\tif(rotation) {\r\n\t\t\t\tlet bounds = this.getBounds();\r\n\t\t\t\trotation.rotateX -= bounds.left;\r\n\t\t\t\trotation.rotateY -= bounds.top;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet bounds = this.getBounds();\r\n\t\t\trotation.rotateX = rotation.point.x;\r\n\t\t\tif(jmUtils.checkPercent(rotation.rotateX)) {\r\n\t\t\t\trotation.rotateX = jmUtils.percentToNumber(rotation.rotateX) * bounds.width;\r\n\t\t\t}\r\n\r\n\t\t\trotation.rotateY = rotation.point.y;\r\n\t\t\tif(jmUtils.checkPercent(rotation.rotateY)) {\r\n\t\t\t\trotation.rotateY = jmUtils.percentToNumber(rotation.rotateY) * bounds.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rotation;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * 移除当前控件\r\n\t * 如果是VML元素,则调用其删除元素\r\n\t *\r\n\t * @method remove \r\n\t */\r\n\tremove() {\t\r\n\t\tif(this.parent) {\r\n\t\t\tthis.parent.children.remove(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 对控件进行平移\r\n\t * 遍历控件所有描点或位置,设置其偏移量。\r\n\t *\r\n\t * @method offset\r\n\t * @param {number} x x轴偏移量\r\n\t * @param {number} y y轴偏移量\r\n\t * @param {boolean} [trans] 是否传递,监听者可以通过此属性是否决定是否响应移动事件,默认=true\r\n\t * @param {object} [evt] 如果是事件触发,则传递move事件参数\r\n\t */\r\n\toffset(x, y, trans, evt) {\r\n\t\ttrans = trans === false?false:true;\t\r\n\t\tlet local = this.getLocation(true);\t\t\r\n\t\tlet offseted = false;\r\n\t\t\r\n\t\tif(local.position) {\r\n\t\t\tlocal.left += x;\r\n\t\t\tlocal.top += y;\r\n\t\t\t// 由于local是clone出来的对象,为了保留位移,则要修改原属性\r\n\t\t\tthis.position.x = local.left;\r\n\t\t\tthis.position.y = local.top;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.center) {\t\t\r\n\t\t\tthis.center.x = local.center.x + x;\r\n\t\t\tthis.center.y = local.center.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.start && typeof local.start == 'object') {\t\r\n\t\t\tthis.start.x = local.start.x + x;\r\n\t\t\tthis.start.y = local.start.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.end && typeof local.end == 'object') {\t\t\r\n\t\t\tthis.end.x = local.end.x + x;\r\n\t\t\tthis.end.y = local.end.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\r\n\t\tif(offseted == false && this.cpoints) {\r\n\t\t\tlet p = typeof this.cpoints == 'function'?this.cpoints:this.cpoints;\r\n\t\t\tif(p) {\t\t\t\r\n\t\t\t\tlet len = p.length;\r\n\t\t\t\tfor(let i=0; i < len;i++) {\r\n\t\t\t\t\tp[i].x += x;\r\n\t\t\t\t\tp[i].y += y;\r\n\t\t\t\t}\t\t\r\n\t\t\t\toffseted = true;\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tif(offseted == false && this.points) {\r\n\t\t\tlet len = this.points.length;\r\n\t\t\tfor(let i=0; i < len;i++) {\r\n\t\t\t\tthis.points[i].x += x;\r\n\t\t\t\tthis.points[i].y += y;\r\n\t\t\t}\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\t\t\r\n\t\t//触发控件移动事件\t\r\n\t\tthis.emit('move',{\r\n\t\t\toffsetX: x,\r\n\t\t\toffsetY: y,\r\n\t\t\ttrans: trans,\r\n\t\t\tevt: evt\r\n\t\t});\r\n\r\n\t\tthis.needUpdate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * 把图形旋转一个角度\r\n\t * @param {number} angle 旋转角度\r\n\t * @param {object} point 旋转坐标,可以是百分比,例如:{x: '50%',y: '50%'}\r\n\t */\r\n\trotate(angle, point) {\t\r\n\t\t/*this.children.each(function(i,c){\r\n\t\t\tc.rotate(angle);\r\n\t\t});*/\r\n\t\tthis.style.rotation = {\r\n\t\t\tangle: angle,\r\n\t\t\tpoint: point\r\n\t\t};\r\n\r\n\t\tthis.needUpdate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取控件相对于画布的绝对边界,\r\n\t * 与getBounds不同的是:getBounds获取的是相对于父容器的边界.\r\n\t *\r\n\t * @method getAbsoluteBounds\r\n\t * @return {object} 边界对象(left,top,right,bottom,width,height)\r\n\t */\r\n\tgetAbsoluteBounds() {\r\n\t\t//当前控件的边界,\r\n\t\tlet rec = this.getBounds();\r\n\t\tif(this.parent && this.parent.absoluteBounds) {\r\n\t\t\t//父容器的绝对边界\r\n\t\t\tlet prec = this.parent.absoluteBounds || this.parent.getAbsoluteBounds();\r\n\t\t\t\r\n\t\t\treturn {\r\n\t\t\t\tleft : prec.left + rec.left,\r\n\t\t\t\ttop : prec.top + rec.top,\r\n\t\t\t\tright : prec.left + rec.right,\r\n\t\t\t\tbottom : prec.top + rec.bottom,\r\n\t\t\t\twidth : rec.width,\r\n\t\t\t\theight : rec.height\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn rec;\r\n\t}\r\n\r\n\t/**\r\n\t * 画控件前初始化\r\n\t * 执行beginPath开始控件的绘制\r\n\t * \r\n\t * @method beginDraw\r\n\t */\r\n\tbeginDraw() {\t\r\n\t\tthis.getLocation(true);//重置位置信息\r\n\t\tthis.context.beginPath();\t\t\t\r\n\t}\r\n\r\n\t/**\r\n\t * 结束控件绘制\r\n\t *\r\n\t * @method endDraw\r\n\t */\r\n\tendDraw() {\r\n\t\t//如果当前为封闭路径\r\n\t\tif(this.style.close) {\r\n\t\t\tthis.context.closePath();\r\n\t\t}\r\n\t\t\r\n\t\tif(this.style['fill']) {\r\n\t\t\tthis.context.fill();\r\n\t\t}\r\n\t\tif(this.style['stroke'] || !this.style['fill']) {\r\n\t\t\tthis.context.stroke();\r\n\t\t}\r\n\r\n\t\tthis.needUpdate = false;\r\n\t}\r\n\r\n\t/**\r\n\t * 绘制控件\r\n\t * 在画布上描点\r\n\t * \r\n\t * @method draw\r\n\t */\r\n\tdraw() {\t\r\n\t\tif(this.points && this.points.length > 0) {\r\n\t\t\t//获取当前控件的绝对位置\r\n\t\t\tlet bounds = this.parent && this.parent.absoluteBounds?this.parent.absoluteBounds:this.absoluteBounds;\r\n\t\t\t\r\n\t\t\tthis.context.moveTo(this.points[0].x + bounds.left,this.points[0].y + bounds.top);\r\n\t\t\tlet len = this.points.length;\t\t\t\r\n\t\t\tfor(let i=1; i < len;i++) {\r\n\t\t\t\tlet p = this.points[i];\r\n\t\t\t\t//移至当前坐标\r\n\t\t\t\tif(p.m) {\r\n\t\t\t\t\tthis.context.moveTo(p.x + bounds.left,p.y + bounds.top);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.context.lineTo(p.x+ bounds.left,p.y + bounds.top);\r\n\t\t\t\t}\t\t\t\r\n\t\t\t}\t\t\r\n\t\t}\t\r\n\t}\r\n\r\n\t/**\r\n\t * 绘制当前控件\r\n\t * 协调控件的绘制,先从其子控件开始绘制,再往上冒。\r\n\t *\r\n\t * @method paint\r\n\t */\r\n\tpaint(v) {\r\n\t\tif(v !== false && this.visible !== false) {\t\t\r\n\t\t\tif(this.initPoints) this.initPoints();\r\n\t\t\t//计算当前边界\r\n\t\t\tthis.bounds = null;\r\n\t\t\tthis.absoluteBounds = this.getAbsoluteBounds();\r\n\t\t\tlet needDraw = true;//是否需要绘制\r\n\t\t\tif(!this.is('jmGraph') && this.graph) {\r\n\t\t\t\tif(this.absoluteBounds.left >= this.graph.width) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.top >= this.graph.height) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.right <= 0) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.bottom <= 0) needDraw = false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.context.save();\r\n\r\n\t\t\tthis.emit('beginDraw', this);\r\n\t\t\t\r\n\t\t\tthis.setStyle();//设定样式\r\n\r\n\t\t\tif(needDraw && this.beginDraw) this.beginDraw();\r\n\t\t\tif(needDraw && this.draw) this.draw();\t\r\n\t\t\tif(needDraw && this.endDraw) this.endDraw();\r\n\r\n\t\t\tif(this.children) {\r\n\t\t\t\tthis.children.each(function(i,item) {\r\n\t\t\t\t\tif(item && item.paint) item.paint();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.emit('endDraw',this);\t\r\n\t\t\tthis.context.restore();\r\n\t\t\t\r\n\t\t\tthis.needUpdate = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 获取指定事件的集合\r\n\t * 比如mousedown,mouseup等\r\n\t *\r\n\t * @method getEvent\r\n\t * @param {string} name 事件名称\r\n\t * @return {list} 事件委托的集合\r\n\t */\r\n\tgetEvent(name) {\t\t\r\n\t\treturn this.__events?this.__events[name]:null;\r\n\t}\r\n\r\n\t/**\r\n\t * 绑定控件的事件\r\n\t *\r\n\t * @method bind\r\n\t * @param {string} name 事件名称\r\n\t * @param {function} handle 事件委托\r\n\t */\r\n\tbind(name, handle) {\t\r\n\t\tif(name && name.indexOf(' ') > -1) {\r\n\t\t\tname = name.split(' ');\r\n\t\t\tfor(let n of name) {\r\n\t\t\t\tn && this.bind(n, handle);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\t\r\n\t\t/**\r\n\t\t * 添加事件的集合\r\n\t\t *\r\n\t\t * @method _setEvent\r\n\t\t * @private\r\n\t\t */\r\n\t\tfunction _setEvent(name, events) {\r\n\t\t\tif(!this.__events) this.__events = {};\r\n\t\t\treturn this.__events[name] = events;\r\n\t\t}\r\n\t\tlet eventCollection = this.getEvent(name) || _setEvent.call(this, name, new jmList());\r\n\t\tif(!eventCollection.contain(handle)) {\r\n\t\t\teventCollection.add(handle);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 移除控件的事件\r\n\t *\r\n\t * @method unbind \r\n\t * @param {string} name 事件名称\r\n\t * @param {function} handle 从控件中移除事件的委托\r\n\t */\r\n\tunbind(name, handle) {\t\r\n\t\tif(name && name.indexOf(' ') > -1) {\r\n\t\t\tname = name.split(' ');\r\n\t\t\tfor(let n of name) {\r\n\t\t\t\tn && this.unbind(n, handle);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\t\r\n\t\tlet eventCollection = this.getEvent(name) ;\t\t\r\n\t\tif(eventCollection) {\r\n\t\t\tif(handle) eventCollection.remove(handle);\r\n\t\t\telse eventCollection.clear();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 执行监听回调\r\n\t * \r\n\t * @method emit\r\n\t * @for jmControl\r\n\t * @param {string} name 触发事件的名称\r\n\t * @param {array} args 事件参数数组\r\n\t */\r\n\temit(...args) {\t\t\t\r\n\t\tthis.runEventHandle(args[0], args.slice(1));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * 独立执行事件委托\r\n\t *\r\n\t * @method runEventHandle\r\n\t * @param {string} 将执行的事件名称\r\n\t * @param {object} 事件执行的参数,包括触发事件的对象和位置\r\n\t */\r\n\trunEventHandle(name, args) {\r\n\t\tlet events = this.getEvent(name);\t\t\r\n\t\tif(events) {\r\n\t\t\tvar self = this;\r\n\t\t\tif(!Array.isArray(args)) args = [args];\t\r\n\t\t\tevents.each(function(i, handle) {\r\n\t\t\t\t//只要有一个事件被阻止,则不再处理同级事件,并设置冒泡被阻断\r\n\t\t\t\tif(false === handle.apply(self, args)) {\r\n\t\t\t\t\targs.cancel = true;\r\n\t\t\t\t}\r\n\t\t\t});\t\t\r\n\t\t}\t\r\n\t\treturn args.cancel;\r\n\t}\r\n\r\n\t/**\r\n\t * 检 查坐标是否落在当前控件区域中..true=在区域内\r\n\t *\r\n\t * @method checkPoint\r\n\t * @param {point} p 位置参数\r\n\t * @param {number} [pad] 可选参数,表示线条多远内都算在线上\r\n\t * @return {boolean} 当前位置如果在区域内则为true,否则为false。\r\n\t */\r\n\tcheckPoint(p, pad) {\r\n\t\t//jmGraph 需要判断dom位置\r\n\t\tif(this.type == 'jmGraph') {\r\n\t\t\t//获取dom位置\r\n\t\t\tlet position = this.getPosition();\r\n\t\t\t// 由于高清屏会有放大坐标,所以这里用pagex就只能用真实的canvas大小\r\n\t\t\tconst right = position.left + this.width;\r\n\t\t\tconst bottom = position.top + this.height;\r\n\t\t\tif(p.pageX > right || p.pageX < position.left) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(p.pageY > bottom || p.pageY < position.top) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\tlet bounds = this.getBounds();\t\r\n\t\tlet rotation = this.getRotation();//获取当前旋转参数\r\n\t\tlet ps = this.points;\r\n\t\t//如果不是路径组成,则采用边界做为顶点\r\n\t\tif(!ps || !ps.length) {\r\n\t\t\tps = [];\r\n\t\t\tps.push({x: bounds.left, y: bounds.top}); //左上角\r\n\t\t\tps.push({x: bounds.right, y: bounds.top});//右上角\r\n\t\t\tps.push({x: bounds.right, y: bounds.bottom});//右下角\r\n\t\t\tps.push({x: bounds.left, y: bounds.bottom}); //左下\r\n\t\t\tps.push({x: bounds.left, y: bounds.top}); //左上角 //闭合\r\n\t\t}\r\n\t\t//如果有指定padding 表示接受区域加宽,命中更易\r\n\t\tpad = Number(pad || this.style['touchPadding'] || this.style['lineWidth'] || 1);\r\n\t\tif(ps && ps.length) {\r\n\t\t\t\r\n\t\t\t//如果有旋转参数,则需要转换坐标再处理\r\n\t\t\tif(rotation && rotation.angle != 0) {\r\n\t\t\t\tps = jmUtils.clone(ps, true);//拷贝一份数据\r\n\t\t\t\t//rotateX ,rotateY 是相对当前控件的位置\r\n\t\t\t\tps = jmUtils.rotatePoints(ps, {\r\n\t\t\t\t\tx: rotation.rotateX + bounds.left,\r\n\t\t\t\t\ty: rotation.rotateY + bounds.top\r\n\t\t\t\t}, rotation.angle);\r\n\t\t\t}\r\n\t\t\t//如果当前路径不是实心的\r\n\t\t\t//就只用判断点是否在边上即可\t\r\n\t\t\tif(ps.length > 2 && (!this.style['fill'] || this.style['stroke'])) {\r\n\t\t\t\tlet i = 0;\r\n\t\t\t\tlet count = ps.length;\r\n\t\t\t\tfor(let j = i+1; j <= count; j = (++i + 1)) {\r\n\t\t\t\t\t//如果j超出最后一个\r\n\t\t\t\t\t//则当为封闭图形时跟第一点连线处理.否则直接返回false\r\n\t\t\t\t\tif(j == count) {\r\n\t\t\t\t\t\tif(this.style.close) {\r\n\t\t\t\t\t\t\tlet r = jmUtils.pointInPolygon(p,[ps[i],ps[0]], pad);\r\n\t\t\t\t\t\t\tif(r) return true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} \r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t//判断是否在点i,j连成的线上\r\n\t\t\t\t\t\tlet s = jmUtils.pointInPolygon(p,[ps[i],ps[j]], pad);\r\n\t\t\t\t\t\tif(s) return true;\r\n\t\t\t\t\t}\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t//不是封闭的图形,则直接返回\r\n\t\t\t\tif(!this.style['fill']) return false;\r\n\t\t\t}\r\n\r\n\t\t\tlet r = jmUtils.pointInPolygon(p,ps, pad);\t\t\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tif(p.x > bounds.right || p.x < bounds.left) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(p.y > bounds.bottom || p.y < bounds.top) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 触发控件事件,组合参数并按控件层级关系执行事件冒泡。\r\n\t *\r\n\t * @method raiseEvent\r\n\t * @param {string} name 事件名称\r\n\t * @param {object} args 事件执行参数\r\n\t * @return {boolean} 如果事件被组止冒泡则返回false,否则返回true\r\n\t */\r\n\traiseEvent(name, args) {\r\n\t\tif(this.visible === false) return ;//如果不显示则不响应事件\t\r\n\t\tif(!args.position) {\t\t\r\n\t\t\tconst graph = this.graph;\r\n\r\n\t\t\tconst srcElement = args.srcElement || args.target;\t\t\t\r\n\t\t\t\r\n\t\t\tconst position = jmUtils.getEventPosition(args, graph.scaleSize);//初始化事件位置\r\n\t\t\r\n\t\t\targs = {\r\n\t\t\t\tposition: position,\r\n\t\t\t\tbutton: args.button == 0 || position.isTouch? 1: args.button,\r\n\t\t\t\tkeyCode: args.keyCode || args.charCode || args.which,\r\n\t\t\t\tctrlKey: args.ctrlKey,\r\n\t\t\t\tcancel : false,\r\n\t\t\t\tevent: args, // 原生事件\r\n\t\t\t\tsrcElement : srcElement\r\n\t\t\t};\t\t\r\n\t\t}\r\n\t\targs.path = args.path||[]; //事件冒泡路径\r\n\r\n\t\t//先执行子元素事件,如果事件没有被阻断,则向上冒泡\r\n\t\tlet stoped = false;\r\n\t\tif(this.children) {\r\n\t\t\tthis.children.each(function(j, el) {\r\n\t\t\t\t//未被阻止才执行\t\t\t\r\n\t\t\t\tif(args.cancel !== true) {\r\n\t\t\t\t\t//如果被阻止冒泡,\r\n\t\t\t\t\tstoped = el.raiseEvent(name, args) === false? true: stoped;\r\n\t\t\t\t\t// 不再响应其它元素\r\n\t\t\t\t\tif(stoped) return false;\r\n\t\t\t\t}\r\n\t\t\t}, true);//按逆序处理\r\n\t\t}\r\n\t\t// 如果已被阻止,不再响应上级事件\r\n\t\tif(stoped) return false;\r\n\t\t\r\n\t\t//获取当前对象的父元素绝对位置\r\n\t\t//生成当前坐标对应的父级元素的相对位置\r\n\t\tlet abounds = this.parent && this.parent.absoluteBounds?this.parent.absoluteBounds : this.absoluteBounds;\r\n\t\tif(!abounds) return false;\t\r\n\t\t//args = jmUtils.clone(args);//参数副本\r\n\t\targs.position.x = args.position.offsetX - abounds.left;\r\n\t\targs.position.y = args.position.offsetY - abounds.top;\r\n\r\n\t\t// 是否在当前控件内操作\r\n\t\tconst inpos = this.interactive !== false && this.checkPoint(args.position);\r\n\t\t\r\n\t\t//事件发生在边界内或健盘事件发生在画布中才触发\r\n\t\tif(inpos) {\r\n\t\t\t//如果没有指定触发对象,则认为当前为第一触发对象\r\n\t\t\tif(!args.target) {\r\n\t\t\t\targs.target = this;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.runEventAndPopEvent(name, args);\r\n\r\n\t\t\tif(!this.focused && (name === 'mousemove' || name === 'touchmove')) {\r\n\t\t\t\tthis.focused = true;//表明当前焦点在此控件中\r\n\t\t\t\tthis.raiseEvent(name === 'mousemove'? 'mouseover': 'touchover', args);\r\n\t\t\t}\t\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//如果焦点不在,且原焦点在,则触发mouseleave事件\r\n\t\t\tif(this.interactive !== false && !inpos &&\r\n\t\t\t\tthis.focused && \r\n\t\t\t\t(name === 'mousemove' || name === 'touchmove')) {\r\n\r\n\t\t\t\tthis.focused = false;//表明当前焦点离开\r\n\t\t\t\tthis.runEventHandle(name === 'mousemove'? 'mouseleave' : 'touchleave', args);//执行事件\t\r\n\t\t\t}\t\r\n\t\t}\r\n\t\t\t\r\n\t\treturn args.cancel === false;//如果被阻止则返回false,否则返回true\r\n\t}\r\n\r\n\t/**\r\n\t * 执行事件,并进行冒泡\r\n\t * @param {string} name 事件名称 \r\n\t * @param {object} args 事件参数\r\n\t */\r\n\trunEventAndPopEvent(name, args) {\t\r\n\r\n\t\tif(args.cancel !== true) {\r\n\t\t\t// 添加到触发路径\r\n\t\t\targs.path.push(this);\r\n\r\n\t\t\t//如果返回true则阻断冒泡\r\n\t\t\tthis.runEventHandle(name, args);//执行事件\r\n\r\n\t\t\t// // 向父节点冒泡事件\t\t\r\n\t\t\t// if(args.cancel !== true && this.parent && this.parent.runEventAndPopEvent) {\r\n\t\t\t// \t// 相对位置需要改为父节点的\r\n\t\t\t// \tif(args.position) {\r\n\t\t\t// \t\tlet bounds = this.parent.getBounds();\r\n\t\t\t// \t\targs.position.x += bounds.left;\r\n\t\t\t// \t\targs.position.y += bounds.top;\r\n\t\t\t// \t}\r\n\t\t\t// \tthis.parent.runEventAndPopEvent(name, args);\r\n\t\t\t// }\t\t\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 清空控件指定事件\r\n\t *\r\n\t * @method clearEvents\r\n\t * @param {string} name 需要清除的事件名称\r\n\t */\r\n\tclearEvents(name) {\r\n\t\tvar eventCollection = this.getEvent(name) ;\t\t\r\n\t\tif(eventCollection) {\r\n\t\t\teventCollection.clear;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 查找其父级类型为type的元素,直到找到指定的对象或到最顶级控件后返回空。\r\n\t *\r\n\t * @method findParent \r\n\t * @param {object} 类型名称或类型对象\r\n\t * @return {object} 指定类型的实例\r\n\t */\r\n\tfindParent(type) {\r\n\t\t//如果为类型名称,则返回名称相同的类型对象\r\n\t\tif(typeof type === 'string') {\r\n\t\t\tif(this.type == type)\r\n\t\t\t\treturn this;\r\n\t\t}\r\n\t\telse if(this.is(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif(this.parent) {\r\n\t\t\treturn this.parent.findParent(type);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * 设定是否可以移动\r\n\t * 此方法需指定jmgraph或在控件添加到jmgraph后再调用才能生效。\r\n\t *\r\n\t * @method canMove\r\n\t * @param {boolean} m true=可以移动,false=不可移动或清除移动。\r\n\t * @param {jmGraph} [graph] 当前画布,如果为空的话必需是已加入画布的控件,否则得指定画布。\r\n\t */\r\n\tcanMove(m, graph) {\r\n\t\tif(!this.__mvMonitor) {\r\n\t\t\t/**\r\n\t\t\t * 控制控件移动对象\r\n\t\t\t * \r\n\t\t\t * @property __mvMonitor\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor = {};\r\n\t\t\tthis.__mvMonitor.mouseDown = false;\r\n\t\t\tthis.__mvMonitor.curposition={x:0,y:0};\r\n\t\t\tvar self = this;\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标事件\r\n\t\t\t *\r\n\t\t\t * @method mv\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.mv = function(evt) {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\t//如果鼠标经过当前可移动控件,则显示可移动指针\r\n\t\t\t\t//if(evt.path && evt.path.indexOf(_this)>-1) {\r\n\t\t\t\t//\t_this.cursor('move');\t\r\n\t\t\t\t//}\r\n\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.parent.bounds = null;\r\n\t\t\t\t\tlet parentbounds = _this.parent.getAbsoluteBounds();\t\t\r\n\t\t\t\t\tlet offsetx = evt.position.offsetX - _this.__mvMonitor.curposition.x;\r\n\t\t\t\t\tlet offsety = evt.position.offsetY - _this.__mvMonitor.curposition.y;\t\t\t\t\r\n\t\t\t\t\t//console.log(offsetx + ',' + offsety);\r\n\t\t\t\t\t//如果锁定边界\r\n\t\t\t\t\tif(_this.lockSide) {\r\n\t\t\t\t\t\tlet thisbounds = _this.bounds || _this.getAbsoluteBounds();\t\t\t\t\t\r\n\t\t\t\t\t\t//检查边界出界\r\n\t\t\t\t\t\tlet outside = jmUtils.checkOutSide(parentbounds,thisbounds,{x:offsetx,y:offsety});\r\n\t\t\t\t\t\tif(outside.left < 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.left) offsetx -= outside.left;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(outside.right > 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.right) offsetx -= outside.right;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(outside.top < 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.top) offsety -= outside.top;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(outside.bottom > 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.bottom) offsety -= outside.bottom;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(offsetx || offsety) {\r\n\t\t\t\t\t\t_this.offset(offsetx, offsety, true, evt);\r\n\t\t\t\t\t\t_this.__mvMonitor.curposition.x = evt.position.offsetX;\r\n\t\t\t\t\t\t_this.__mvMonitor.curposition.y = evt.position.offsetY;\t\r\n\t\t\t\t\t\t//console.log(offsetx + '.' + offsety);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标松开事件\r\n\t\t\t *\r\n\t\t\t * @method mu\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.mu = function(evt) {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.__mvMonitor.mouseDown = false;\r\n\t\t\t\t\t//_this.cursor('default');\r\n\t\t\t\t\t_this.emit('moveend',{position:_this.__mvMonitor.curposition});\t\r\n\t\t\t\t\t//return false;\r\n\t\t\t\t}\t\t\t\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标离开事件\r\n\t\t\t *\r\n\t\t\t * @method ml\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.ml = function() {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.__mvMonitor.mouseDown = false;\r\n\t\t\t\t\t//_this.cursor('default');\t\r\n\t\t\t\t\t_this.emit('moveend',{position:_this.__mvMonitor.curposition});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标按下事件\r\n\t\t\t *\r\n\t\t\t * @method md\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.md = function(evt) {\r\n\t\t\t\t\r\n\t\t\t\tif(this.__mvMonitor.mouseDown) return;\r\n\t\t\t\tif(evt.button == 0 || evt.button == 1) {\r\n\t\t\t\t\tthis.__mvMonitor.mouseDown = true;\r\n\t\t\t\t\t//this.cursor('move');\r\n\t\t\t\t\t//var parentbounds = this.parent.absoluteBounds || this.parent.getAbsoluteBounds();\t\r\n\t\t\t\t\tthis.__mvMonitor.curposition.x = evt.position.offsetX;//evt.position.x + parentbounds.left;\r\n\t\t\t\t\tthis.__mvMonitor.curposition.y = evt.position.offsetY;//evt.position.y + parentbounds.top;\r\n\t\t\t\t\t//触发控件移动事件\r\n\t\t\t\t\tthis.emit('movestart',{position:this.__mvMonitor.curposition});\r\n\t\t\t\t\t\r\n\t\t\t\t\tevt.cancel = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\tgraph = graph || this.graph ;//获取最顶级元素画布\r\n\t\t\r\n\t\tif(m !== false) {\t\t\t\r\n\t\t\tgraph.bind('mousemove',this.__mvMonitor.mv);\r\n\t\t\tgraph.bind('mouseup',this.__mvMonitor.mu);\r\n\t\t\tgraph.bind('mouseleave',this.__mvMonitor.ml);\r\n\t\t\tthis.bind('mousedown',this.__mvMonitor.md);\r\n\t\t\tgraph.bind('touchmove',this.__mvMonitor.mv);\r\n\t\t\tgraph.bind('touchend',this.__mvMonitor.mu);\r\n\t\t\tthis.bind('touchstart',this.__mvMonitor.md);\r\n\t\t}\r\n\t\telse {\t\t\t\r\n\t\t\tgraph.unbind('mousemove',this.__mvMonitor.mv);\r\n\t\t\tgraph.unbind('mouseup',this.__mvMonitor.mu);\r\n\t\t\tgraph.unbind('mouseleave',this.__mvMonitor.ml);\r\n\t\t\tthis.unbind('mousedown',this.__mvMonitor.md);\r\n\t\t\tgraph.unbind('touchmove',this.__mvMonitor.mv);\r\n\t\t\tgraph.unbind('touchend',this.__mvMonitor.mu);\r\n\t\t\tthis.unbind('touchstart',this.__mvMonitor.md);\t\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n};\r\n\r\nexport { jmControl };","import {jmControl} from \"./jmControl.js\";\r\n/**\r\n * 基础路径,大部分图型的基类\r\n * 指定一系列点,画出图形\r\n *\r\n * @class jmPath\r\n * @extends jmControl\r\n * @param {object} params 路径参数 points=所有描点\r\n */\r\n\r\nexport default class jmPath extends jmControl {\t\r\n\r\n\tconstructor(params, t='jmPath') {\r\n\t\tsuper(params, t);\t\t\r\n\t\tthis.points = params && params.points ? params.points : [];\t\r\n\t\t\r\n\t}\r\n\t\r\n\t/**\r\n\t * 描点集合\r\n\t * point格式:{x:0,y:0,m:true}\r\n\t * @property points\r\n\t * @type {array}\r\n\t */\r\n\tget points() {\r\n\t\tlet s = this.__pro('points');\r\n\t\treturn s;\r\n\t}\r\n\tset points(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.__pro('points', v);\r\n\t}\r\n}\r\n\r\nexport { jmPath };\r\n","import {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\nimport {jmProperty} from './jmProperty.js';\r\nimport {jmShadow} from \"./jmShadow.js\";\r\nimport {jmGradient} from \"./jmGradient.js\";\r\nimport {jmEvents} from \"./jmEvents.js\";\r\nimport {jmControl} from \"./jmControl.js\";\r\nimport {jmPath} from \"./jmPath.js\";\r\n\r\n/**\r\n * jmGraph画图类库\r\n * 对canvas画图api进行二次封装,使其更易调用,省去很多重复的工作。\r\n *\r\n * @module jmGraph\r\n * @class jmGraph\r\n * @extends jmControl\r\n * @param {element} canvas 标签canvas\r\n * @param {object} option 参数:{width:宽,height:高}\r\n * @param {function} callback 初始化后的回调\r\n */\r\nexport default class jmGraph extends jmControl {\r\n\r\n\tconstructor(canvas, option, callback) {\r\n\t\tif(typeof option == 'function') {\r\n\t\t\tcallback = option;\r\n\t\t\toption = {};\r\n\t\t}\r\n\t\r\n\t\toption = option || {};\r\n\t\toption.mode = option.mode || '2d'; // webgl | 2d\r\n\t\toption.interactive = true;\r\n\t\t\r\n\t\tsuper(option, 'jmGraph');\r\n\r\n\t\tthis.option = option || {};\r\n\t\t\r\n\t\tthis.devicePixelRatio = 1; // 根据屏幕的缩放倍数\r\n\r\n\t\t/**\r\n\t\t * 工具类\r\n\t\t * @property utils/util\r\n\t\t * @type {jmUtils}\r\n\t\t */\r\n\t\tthis.util = this.utils = jmUtils;\t\t\r\n\r\n\t\t//如果是小程序\r\n\t\tif(typeof wx != 'undefined' && wx.canIUse && wx.canIUse('canvas')) {\t\t\t\r\n\t\t\tif(typeof canvas === 'string') canvas = wx.createSelectorQuery().select('#' + canvas);\r\n\t\t\tthis.isWXMiniApp = true;// 微信小程序平台\r\n\t\t\tthis.container = canvas;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif(typeof canvas === 'string' && typeof document != 'undefined') {\r\n\t\t\t\tcanvas = document.getElementById(canvas);\r\n\t\t\t}\r\n\t\t\telse if(canvas.length) {\r\n\t\t\t\tcanvas = canvas[0];\r\n\t\t\t}\r\n\r\n\t\t\tif(canvas.tagName != 'CANVAS') {\r\n\t\t\t\tthis.container = canvas;\r\n\t\t\t\tlet cn = document.createElement('canvas');\r\n\t\t\t\tcanvas.appendChild(cn);\r\n\t\t\t\tcn.width = canvas.offsetWidth||canvas.clientWidth;\r\n\t\t\t\tcn.height = canvas.offsetHeight||canvas.clientHeight;\r\n\t\t\t\tcanvas = cn;\r\n\t\t\t}\t\r\n\t\t\telse {\r\n\t\t\t\tthis.container = canvas.parentElement;\r\n\t\t\t}\r\n\t\t}\t\r\n\t\tthis.canvas = canvas;\t\r\n\t\tthis.context = canvas.getContext('2d');\r\n\t\tthis.__init(callback);\r\n\t}\r\n\r\n\t/**\r\n\t * 初始化画布\r\n\t * @method init\r\n\t */\r\n\t__init(callback) {\r\n\t\t/**\r\n\t\t * 当前所有图形类型\r\n\t\t * @property shapes\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.shapes = Object.assign({\r\n\t\t\t\"path\": jmPath,\r\n\t\t}, this.option.shapes);\r\n\t\t\r\n\t\t/**\r\n\t\t * 画控件前初始化\r\n\t\t * 为了解决一像素线条问题\r\n\t\t */\r\n\t\tthis.on('beginDraw', function() {\t\r\n\t\t\tthis.context.translate(0.5, 0.5);\r\n\t\t});\r\n\t\t/**\r\n\t\t * 结束控件绘制 为了解决一像素线条问题\r\n\t\t */\r\n\t\tthis.on('endDraw', function() {\t\r\n\t\t\tthis.context.translate(-0.5, -0.5);\t\t\r\n\t\t});\r\n\r\n\t\t// devicePixelRatio初始化\r\n\t\tlet dpr = typeof window != 'undefined' && window.devicePixelRatio > 1? window.devicePixelRatio : 1;\r\n\t\tif(this.isWXMiniApp) {\r\n\t\t\tdpr = wx.getSystemInfoSync().pixelRatio || 1;\r\n\t\t}\t\t\r\n\t\tthis.devicePixelRatio = dpr;\r\n\t\t// 为了解决锯齿问题,先放大canvas再缩放\r\n\t\tthis.dprScaleSize = this.devicePixelRatio > 1? this.devicePixelRatio : 2;\r\n\r\n\t\tif(this.option.width > 0) this.width = this.option.width;\r\n\t\tif(this.option.height > 0) this.height = this.option.height;\t\r\n\t\tthis.resize();\t\t\r\n\r\n\t\t//绑定事件\r\n\t\tthis.eventHandler = new jmEvents(this, this.canvas.canvas || this.canvas);\t\r\n\r\n\t\t//如果指定了自动刷新\r\n\t\tif(this.option.autoRefresh) {\r\n\t\t\tthis.autoRefresh();\r\n\t\t}\r\n\r\n\t\tif(callback) callback(this);\t\t\r\n\t}\r\n\r\n\t// 重置canvas大小,并判断高清屏,画图先放大二倍\r\n\tresize(w, h) {\r\n\t\tif(!this.canvas) return;\r\n\r\n\t\tthis.__normalSize = this.__normalSize || { width: 0, height: 0};\r\n\t\tw = w || this.__normalSize.width || this.width, h = h || this.__normalSize.height || this.height;\r\n\r\n\t\tif(w) this.__normalSize.width = w;\r\n\t\tif(h) this.__normalSize.height = h;\r\n\t\r\n\t\tthis.css('width', w + \"px\");\r\n\t\tthis.css('height', h + \"px\");\r\n\t\tthis.canvas.height = h * this.dprScaleSize;\r\n\t\tthis.canvas.width = w * this.dprScaleSize;\r\n\t\tthis.context.scale(this.dprScaleSize, this.dprScaleSize);\t\r\n\t}\r\n\r\n\t/**\r\n\t * 内部坐标转为页面坐标,这里主要是有devicePixelRatio倍数问题\r\n\t * @param {x, y} point 内部坐标\r\n\t */\r\n\tpointToPixes(point) {\r\n\t\tif(this.dprScaleSize && this.dprScaleSize !== 1) {\r\n\t\t\tpoint = Object.assign({}, point, {\r\n\t\t\t\tx: point.x / this.dprScaleSize,\r\n\t\t\t\ty: point.y / this.dprScaleSize\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn point;\r\n\t}\r\n\r\n\t/**\r\n\t * 宽度\r\n\t * @property width\r\n\t * @type {number}\r\n\t */\r\n\tget width() {\r\n\t\tif(this.__normalSize && this.__normalSize.width) return this.__normalSize.width;\r\n\t\tif(this.canvas) return this.canvas.width;\r\n\t\treturn 0;\r\n\t}\r\n\tset width(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tif(this.canvas) {\r\n\t\t\tthis.resize(v);\r\n\t\t}\t\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 高度\r\n\t * @property height\r\n\t * @type {number}\r\n\t */\r\n\tget height() {\r\n\t\tif(this.__normalSize && this.__normalSize.height) return this.__normalSize.height;\r\n\t\tif(this.canvas) return this.canvas.height;\r\n\t\treturn 0;\r\n\t}\r\n\tset height(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tif(this.canvas) {\r\n\t\t\tthis.resize(0, v);\r\n\t\t}\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 创建jmGraph的静态对象\r\n\t *\r\n\t * @method create\r\n\t * @return {jmGraph} jmGraph实例对象\r\n\t */\r\n\tstatic create(...args) {\r\n\t\treturn new jmGraph(...args);\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前画布在浏览器中的绝对定位\r\n\t *\r\n\t * @method getPosition\r\n\t * @return {postion} 返回定位坐标\r\n\t */\r\n\tgetPosition() {\r\n\t\tlet p = jmUtils.getElementPosition(this.canvas.canvas || this.canvas);\r\n\t\tp.width = this.width;\r\n\t\tp.height = this.height;\r\n\t\tp.right = p.left + p.width;\r\n\t\tp.bottom = p.top + p.height;\r\n\t\treturn p;\r\n\t}\r\n\r\n\t/**\r\n\t * 注册图形类型,图形类型必需有统一的构造函数。参数为画布句柄和参数对象。\r\n\t *\r\n\t * @method registerShape \r\n\t * @param {string} name 控件图形名称\r\n\t * @param {class} shape 图形控件类型\r\n\t */\r\n\tregisterShape(name, shape) {\r\n\t\tthis.shapes[name] = shape;\r\n\t}\r\n\r\n\t/**\r\n\t * 从已注册的图形类创建图形\r\n\t * 简单直观创建对象\r\n\t *\r\n\t * @method createShape \r\n\t * @param {string} shape 注册控件的名称 也可以直接是控件类型\r\n\t * @param {object} args 实例化控件的参数\r\n\t * @return {object} 已实例化控件的对象\r\n\t */\r\n\tcreateShape(shape, args) {\r\n\t\tif(typeof shape === 'string') {\r\n\t\t\tshape = this.shapes[shape];\r\n\t\t}\r\n\t\tif(shape) {\r\n\t\t\tif(!args) args = {};\r\n\t\t\targs.graph = this;\r\n\t\t\tlet obj = new shape(args);\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 生成阴影对象\r\n\t *\r\n\t * @method createShadow\r\n\t * @param {number} x x偏移量\r\n\t * @param {number} y y偏移量\r\n\t * @param {number} blur 模糊值\r\n\t * @param {string} color 颜色\r\n\t * @return {jmShadow} 阴影对象\r\n\t */\r\n\tcreateShadow(x, y, blur, color) {\r\n\t\tlet sh = new jmShadow(x, y, blur, color);\r\n\t\treturn sh;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成线性渐变对象\r\n\t *\r\n\t * @method createLinearGradient\r\n\t * @param {number} x1 线性渐变起始点X坐标\r\n\t * @param {number} y1 线性渐变起始点Y坐标\r\n\t * @param {number} x2 线性渐变结束点X坐标\r\n\t * @param {number} y2 线性渐变结束点Y坐标\r\n\t * @return {jmGradient} 线性渐变对象\r\n\t */\r\n\tcreateLinearGradient(x1, y1, x2, y2) {\r\n\t\tlet gradient = new jmGradient({\r\n\t\t\ttype:'linear',\r\n\t\t\tx1: x1,\r\n\t\t\ty1: y1,\r\n\t\t\tx2: x2,\r\n\t\t\ty2: y2\r\n\t\t});\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成放射渐变对象\r\n\t *\r\n\t * @method createRadialGradient\r\n\t * @param {number} x1 放射渐变小圆中心X坐标\r\n\t * @param {number} y1 放射渐变小圆中心Y坐标\r\n\t * @param {number} r1 放射渐变小圆半径\r\n\t * @param {number} x2 放射渐变大圆中心X坐标\r\n\t * @param {number} y2 放射渐变大圆中心Y坐标\r\n\t * @param {number} r2 放射渐变大圆半径\r\n\t * @return {jmGradient} 放射渐变对象\r\n\t */\r\n\tcreateRadialGradient(x1, y1, r1, x2, y2, r2) {\t\r\n\t\tlet gradient = new jmGradient({\r\n\t\t\ttype:'radial',\r\n\t\t\tx1: x1,\r\n\t\t\ty1: y1,\r\n\t\t\tr1: r1,\r\n\t\t\tx2: x2,\r\n\t\t\ty2: y2,\r\n\t\t\tr2: r2\r\n\t\t});\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 重新刷新整个画板\r\n\t * 以加入动画事件触发延时10毫秒刷新,保存最尽的调用只刷新一次,加强性能的效果。\r\n\t *\r\n\t * @method refresh\r\n\t */\r\n\trefresh() {\t\r\n\t\t//加入动画,触发redraw,会导致多次refresh只redraw一次\r\n\t\t/*this.animate(function() {\r\n\t\t\treturn false;\r\n\t\t},100,'jmgraph_refresh');*/\r\n\t\tthis.redraw();\r\n\t}\r\n\r\n\t/**\r\n\t * 重新刷新整个画板\r\n\t * 此方法直接重画,与refresh效果类似\r\n\t *\r\n\t * @method redraw\r\n\t * @param {number} [w] 清除画布的宽度\r\n\t * @param {number} [h] 清除画布的高度\r\n\t */\r\n\tredraw(w, h) {\t\r\n\t\tthis.clear(w||this.width, h||this.height);\r\n\t\tthis.paint();\r\n\t}\r\n\r\n\t/**\r\n\t * 清除画布\r\n\t * \r\n\t * @method clear\r\n\t * @param {number} [w] 清除画布的宽度\r\n\t * @param {number} [h] 清除画布的高度\r\n\t */\r\n\tclear(w, h) {\r\n\t\tif(!w || !h) {\r\n\t\t\tw = this.width;\r\n\t\t\th = this.height;\r\n\t\t\t/*if(this.scaleSize) {\r\n\t\t\t\tw = w / this.scaleSize.x;\r\n\t\t\t\th = h / this.scaleSize.y;\r\n\t\t\t}*/\r\n\t\t}\r\n\t\t//如果有指定背景,则等到draw再全屏绘制一次,也同样达到清除画布的功能\r\n\t\tif(this.style && this.style.fill) {\r\n\t\t\tthis.points = [\r\n\t\t\t\t{x:0,y:0},\r\n\t\t\t\t{x:w,y:0},\r\n\t\t\t\t{x:w,y:h},\r\n\t\t\t\t{x:0,y:h}\r\n\t\t\t];\r\n\t\t}\r\n\t\telse if(this.context.clearRect) this.context.clearRect(0,0,w,h);\r\n\t}\r\n\r\n\t/**\r\n\t* 设置画布样式,此处只是设置其css样式\r\n\t*\r\n\t* @method css\r\n\t* @param {string} name 样式名\r\n\t* @param {string} value 样式值\r\n\t*/\r\n\tcss(name, value) {\r\n\t\tif(this.canvas && this.canvas.style) {\r\n\t\t\tif(typeof value != 'undefined') this.canvas.style[name] = value;\r\n\t\t\treturn this.canvas.style[name];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 生成路径对象\r\n\t *\r\n\t * @method createPath\r\n\t * @param {array} points 路径中的描点集合\r\n\t * @param {style} style 当前路径的样式\r\n\t * @return {jmPath} 路径对象jmPath\r\n\t */\r\n\tcreatePath(points, style) {\r\n\t\tlet path = this.createShape('path',{\r\n\t\t\tpoints: points,\r\n\t\t\tstyle: style\r\n\t\t});\r\n\t\treturn path;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成直线\r\n\t * \r\n\t * @method createLine\r\n\t * @param {point} start 直线的起点\r\n\t * @param {point} end 直线的终点\r\n\t * @param {style} 直线的样式\r\n\t * @return {jmLine} 直线对象\r\n\t */\r\n\tcreateLine(start, end, style) {\r\n\t\tlet line = this.createShape('line', {\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\t\t\tstyle: style\r\n\t\t});\r\n\t\treturn line;\r\n\t}\r\n\r\n\t/**\r\n\t * 缩小整个画布按比例0.9\r\n\t * \r\n\t * @method zoomOut\r\n\t */\r\n\tzoomOut() {\r\n\t\tthis.scale(0.9 ,0.9);\r\n\t}\r\n\r\n\t/**\r\n\t * 放大 每次增大0.1的比例\r\n\t * \r\n\t * @method zoomIn\r\n\t */\r\n\tzoomIn() {\t\t\r\n\t\tthis.scale(1.1 ,1.1);\r\n\t}\r\n\r\n\t/**\r\n\t * 大小复原\r\n\t * \r\n\t * @method zoomActual\r\n\t */\r\n\tzoomActual() {\r\n\t\tif(this.scaleSize) {\r\n\t\t\tthis.scale(1 / this.scaleSize.x ,1 / this.scaleSize.y);\t\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.scale(1 ,1);\t\r\n\t\t}\t\r\n\t}\r\n\r\n\t/**\r\n\t * 放大缩小画布\r\n\t * \r\n\t * @method scale\r\n\t * @param {number} dx 缩放X轴比例\r\n\t * @param {number} dy 缩放Y轴比例\r\n\t */\r\n\tscale(dx, dy) {\r\n\t\tif(!this.normalSize) {\r\n\t\t\tthis.normalSize = {\r\n\t\t\t\twidth: this.canvas.width,\r\n\t\t\t\theight: this.canvas.height\r\n\t\t\t};\t\t\r\n\t\t}\r\n\t\t\r\n\t\tthis.context.scale(dx,dy);\r\n\t\tif(!this.scaleSize) {\r\n\t\t\tthis.scaleSize = {x:dx,y:dy};\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.scaleSize = {x:dx * this.scaleSize.x, y:dy * this.scaleSize.y};\r\n\t\t}\r\n\t\tthis.refresh();\r\n\t}\r\n\r\n\t/**\r\n\t * 保存为base64图形数据\r\n\t * \r\n\t * @method toDataURL\r\n\t * @return {string} 当前画布图的base64字符串\r\n\t */\r\n\ttoDataURL() {\r\n\t\tlet data = this.canvas.toDataURL?this.canvas.toDataURL():'';\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/** \r\n\t * 自动刷新画版\r\n\t * @param {function} callback 执行回调\r\n\t */\r\n\tautoRefresh(callback) {\r\n\t\tif(this.___isAutoRefreshing) return;\r\n\t\tconst self = this;\r\n\t\tthis.___isAutoRefreshing = true;\r\n\t\t\r\n\t\tfunction update() {\r\n\t\t\tif(self.destroyed) {\r\n\t\t\t\tself.___isAutoRefreshing = false;\r\n\t\t\t\treturn;// 已销毁\r\n\t\t\t}\r\n\t\t\tif(self.needUpdate) self.redraw();\r\n\t\t\t// 触发刷新事件\r\n\t\t\tself.emit('update');\r\n\r\n\t\t\tself.__requestAnimationFrameFunHandler && self.cancelAnimationFrame(self.__requestAnimationFrameFunHandler);\r\n\t\t\tself.__requestAnimationFrameFunHandler = self.requestAnimationFrame(update);\r\n\t\t\tif(callback) callback();\r\n\t\t}\r\n\t\tself.__requestAnimationFrameFunHandler && this.cancelAnimationFrame(self.__requestAnimationFrameFunHandler);\r\n\t\tself.__requestAnimationFrameFunHandler = this.requestAnimationFrame(update);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 销毁当前对象\r\n\tdestroy() {\r\n\t\tthis.eventHandler.destroy();\r\n\t\tthis.destroyed = true;// 标记已销毁\r\n\t}\r\n}\r\n\r\nexport { \r\n\tjmGraph, \r\n\tjmUtils,\r\n\tjmList,\r\n\tjmProperty,\r\n\tjmShadow,\r\n\tjmGradient,\r\n\tjmEvents,\r\n\tjmControl,\r\n\tjmPath,\r\n };\r\n"],"names":["jmList","Array","ps","arg","length","isArray","i","push","option","type","obj","this","includes","_typeof","removeAt","index","splice","removeHandler","call","find","cb","inverse","len","handler","count","jmUtils","source","target","v","deep","copyHandler","deepIndex","undefined","isType","dest","clone","slice","k","__proto__","tagName","getContext","name","fun","opt","indexOf","ns","split","bindEvent","attachEvent","addEventListener","removeEventListener","detachEvent","el","pos","offsetParent","top","offsetTop","left","offsetLeft","x","y","evt","scale","isTouch","touches","event","changedTouches","targetTouches","srcElement","px","pageX","clientX","document","documentElement","scrollLeft","body","py","pageY","clientY","scrollTop","ox","offsetX","oy","offsetY","p","getElementPosition","layerX","layerY","screenX","screenY","constructor","pt","polygon","offset","j","n","inside","redo","Math","abs","min","max","f","l","sqrt","_x","parentBounds","targetBounds","result","right","bottom","rp","r","cos","sin","x1","y1","c","sc","substring","trimStart","trimEnd","per","trim","tmp","checkPercent","h","toLowerCase","iv","floor","hex","color","a","substr","g","b","hexToNumber","toFixed","hexToRGBA","callback","win","requestAnimationFrame","window","setTimeout","cancelAnimationFrame","clearTimeout","jmObject","graph","is","arguments","animateHandles","params","add","millisec","handle","self","dispatcher","_this","overduehandles","curTimes","Date","getTime","each","ani","times","apply","e","console","info","toString","remove","animate","PROPERTY_KEY","Symbol","jmProperty","pars","pros","value","args","oldValue","newValue","emit","__pro","needUpdate","findParent","canvas","jmShadow","blur","fromString","s","ms","match","test","jmGradient","stops","Number","control","gradient","context","bounds","absoluteBounds","getAbsoluteBounds","x2","y2","location","getLocation","d","radius","width","height","percentToNumber","sx1","sy1","sx2","sy2","createLinearGradient","r1","r2","createCircularGradient","createRadialGradient","toColor","addColorStop","par","spindex","lastIndexOf","isNaN","addStop","str","jmEvents","container","mouseHandler","jmMouseEvent","keyHandler","jmKeyEvent","eventName","raiseEvent","destroy","instance","eventEvents","init","doc","preventDefault","touchStart","passive","touchMove","touchEnd","touchCancel","removeEvent","checkKeyEvent","jmStyleMap","jmControl","t","style","position","zIndex","interactive","initializing","on","_this2","bind","children","sort","css","cur","oadd","parent","contain","oremove","levelItems","zindex","clear","__setStyle","mpkey","styleValue","_this3","warn","mpname","toGradient","translate","angle","tranX","tranY","point","getRotation","rotateX","rotateY","rotate","transform","scaleX","skewX","skewY","scaleY","cursor","isReset","rect","points","local","center","start","end","margin","getBounds","rotation","trans","offseted","cpoints","rec","prec","beginPath","close","closePath","fill","stroke","moveTo","m","lineTo","visible","initPoints","needDraw","save","setStyle","beginDraw","draw","endDraw","item","paint","restore","__events","eventCollection","getEvent","events","unbind","runEventHandle","cancel","pad","getPosition","rotatePoints","pointInPolygon","getEventPosition","scaleSize","button","keyCode","charCode","which","ctrlKey","path","stoped","abounds","inpos","checkPoint","runEventAndPopEvent","focused","__mvMonitor","mouseDown","curposition","mv","outside","parentbounds","offsetx","offsety","lockSide","thisbounds","checkOutSide","mu","ml","md","jmPath","jmGraph","mode","devicePixelRatio","util","utils","wx","canIUse","createSelectorQuery","select","isWXMiniApp","getElementById","cn","createElement","appendChild","offsetWidth","clientWidth","offsetHeight","clientHeight","parentElement","__init","shapes","Object","assign","dpr","getSystemInfoSync","pixelRatio","dprScaleSize","resize","eventHandler","autoRefresh","w","__normalSize","shape","redraw","clearRect","createShape","dx","dy","normalSize","refresh","toDataURL","___isAutoRefreshing","__requestAnimationFrameFunHandler","update","destroyed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jmgraph.core.min.js","sources":["../src/core/jmList.js","../src/core/jmUtils.js","../src/core/jmObject.js","../src/core/jmProperty.js","../src/core/jmShadow.js","../src/core/jmGradient.js","../src/core/jmEvents.js","../src/lib/earcut.js","../src/lib/webgl/gradient.js","../src/lib/webgl/core/shader.js","../src/lib/webgl/core/mapSize.js","../src/lib/webgl/core/mapType.js","../src/lib/webgl/core/program.js","../src/lib/webgl/core/buffer.js","../src/lib/webgl/core/texture.js","../src/lib/webgl/base.js","../src/lib/webgl/path.js","../src/core/jmControl.js","../src/core/jmPath.js","../src/core/jmGraph.js"],"sourcesContent":["/**\r\n * 自定义集合\r\n * \r\n * @class jmList\r\n * @for jmUtils\r\n * @param {array} [arr] 数组,可转为当前list元素\r\n */\r\nexport default class jmList extends Array { \r\n constructor(...arg) {\r\n let ps = [];\r\n if(arg && arg.length && Array.isArray(arg[0])) {\r\n for(let i=0; i< arg[0].length; i++) ps.push(arg[0][i]);\r\n super(...ps);\r\n }\r\n else {\r\n super();\r\n }\r\n this.option = {}; //选项\r\n this.type = 'jmList';\r\n }\r\n /**\r\n * 往集合中添加对象\r\n *\r\n * @method add\r\n * @for list\r\n * @param {any} obj 往集合中添加的对象\r\n */\r\n add(obj) { \r\n if(obj && Array.isArray(obj)) {\r\n for(let i=0; i < obj.length; i++) {\r\n if(!this.includes(obj[i])) this.push(obj[i]);\r\n } \r\n return obj; \r\n }\r\n if(typeof obj == 'object' && this.includes(obj)) return obj;\r\n this.push(obj);\r\n return obj;\r\n }\r\n\r\n /**\r\n * 从集合中移除指定对象\r\n * \r\n * @method remove\r\n * @for list\r\n * @param {any} obj 将移除的对象\r\n */\r\n remove(obj) {\r\n for(let i = this.length -1; i>=0; i--) { \r\n if(this[i] == obj) {\r\n this.removeAt(i);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 按索引移除对象\r\n * \r\n * @method removeAt\r\n * @for list\r\n * @param {integer} index 移除对象的索引\r\n */\r\n removeAt(index) {\r\n if(this.length > index) {\r\n let obj = this[index];\r\n this.splice(index,1);\r\n if(this.option.removeHandler) this.option.removeHandler.call(this, obj, index);\r\n }\r\n }\r\n\r\n /**\r\n * 判断是否包含某个对象\r\n * \r\n * @method contain\r\n * @for list\r\n * @param {any} obj 判断当前集合中是否包含此对象\r\n */\r\n contain(obj) {\r\n return this.includes(obj);\r\n }\r\n\r\n /**\r\n * 从集合中获取某个对象\r\n * \r\n * @method get\r\n * @for list\r\n * @param {integer/function} index 如果为整型则表示为获取此索引的对象,如果为function为则通过此委托获取对象\r\n * @return {any} 集合中的对象\r\n */\r\n get(index) {\r\n if(typeof index == 'function') {\r\n return this.find(index);\r\n }\r\n else {\r\n return this[index];\r\n } \r\n }\r\n\r\n /**\r\n * 遍历当前集合 \r\n *\r\n * @method each\r\n * @for list\r\n * @param {function} cb 遍历当前集合的委托\r\n * @param {boolean} inverse 是否按逆序遍历\r\n */\r\n each(cb, inverse) {\r\n if(cb && typeof cb == 'function') {\r\n //如果按倒序循环\r\n if(inverse) {\r\n for(let i = this.length - 1;i>=0; i--) {\r\n let r = cb.call(this, i, this[i]);\r\n if(r === false) break;\r\n }\r\n }\r\n else {\r\n let len = this.length;\r\n for(let i = 0; i < len;i++) {\r\n let r = cb.call(this, i, this[i]);\r\n if(r === false) break;\r\n } \r\n } \r\n } \r\n }\r\n\r\n /**\r\n * 获取当前集合对象个数\r\n *\r\n * @method count\r\n * @param {function} [handler] 检查对象是否符合计算的条件\r\n * @for list\r\n * @return {integer} 当前集合的个数\r\n */\r\n count(handler) {\r\n if(handler && typeof handler == 'function') {\r\n let count = 0;\r\n let len = this.length;\r\n for(let i = 0; i<len;i++) {\r\n if(handler(this[i])) {\r\n count ++;\r\n }\r\n } \r\n return count;\r\n }\r\n return this.length;\r\n }\r\n\r\n /**\r\n * 清空当前集合\r\n *\r\n * @method clear\r\n * @for list\r\n */\r\n clear() {\r\n this.splice(0, this.length);\r\n }\r\n}\r\n\r\nexport { jmList };","\r\nimport { jmList } from './jmList.js';\r\n\r\nconst colorKeywords = {\r\n aliceblue: \"#f0f8ff\",\r\n antiquewhite: \"#faebd7\",\r\n aqua: \"#00ffff\",\r\n aquamarine: \"#7fffd4\",\r\n azure: \"#f0ffff\",\r\n beige: \"#f5f5dc\",\r\n bisque: \"#ffe4c4\",\r\n black: \"#000000\",\r\n blanchedalmond: \"#ffebcd\",\r\n blue: \"#0000ff\",\r\n blueviolet: \"#8a2be2\",\r\n brown: \"#a52a2a\",\r\n burlywood: \"#deb887\",\r\n cadetblue: \"#5f9ea0\",\r\n chartreuse: \"#7fff00\",\r\n chocolate: \"#d2691e\",\r\n coral: \"#ff7f50\",\r\n cornflowerblue: \"#6495ed\",\r\n cornsilk: \"#fff8dc\",\r\n crimson: \"#dc143c\",\r\n cyan: \"#00ffff\",\r\n darkblue: \"#00008b\",\r\n darkcyan: \"#008b8b\",\r\n darkgoldenrod: \"#b8860b\",\r\n darkgray: \"#a9a9a9\",\r\n darkgreen: \"#006400\",\r\n darkkhaki: \"#bdb76b\",\r\n darkmagenta: \"#8b008b\",\r\n darkolivegreen: \"#556b2f\",\r\n darkorange: \"#ff8c00\",\r\n darkorchid: \"#9932cc\",\r\n darkred: \"#8b0000\",\r\n darksalmon: \"#e9967a\",\r\n darkseagreen: \"#8fbc8f\",\r\n darkslateblue: \"#483d8b\",\r\n darkslategray: \"#2f4f4f\",\r\n darkturquoise: \"#00ced1\",\r\n darkviolet: \"#9400d3\",\r\n deeppink: \"#ff1493\",\r\n deepskyblue: \"#00bfff\",\r\n dimgray: \"#696969\",\r\n dodgerblue: \"#1e90ff\",\r\n firebrick: \"#b22222\",\r\n floralwhite: \"#fffaf0\",\r\n forestgreen: \"#228b22\",\r\n fuchsia: \"#ff00ff\",\r\n gainsboro: \"#dcdcdc\",\r\n ghostwhite: \"#f8f8ff\",\r\n gold: \"#ffd700\",\r\n goldenrod: \"#daa520\",\r\n gray: \"#808080\",\r\n green: \"#008000\",\r\n greenyellow: \"#adff2f\",\r\n grey: \"#808080\",\r\n honeydew: \"#f0fff0\",\r\n hotpink: \"#ff69b4\",\r\n indianred: \"#cd5c5c\",\r\n indigo: \"#4b0082\",\r\n ivory: \"#fffff0\",\r\n khaki: \"#f0e68c\",\r\n lavender: \"#e6e6fa\",\r\n lavenderblush: \"#fff0f5\",\r\n lawngreen: \"#7cfc00\",\r\n lemonchiffon: \"#fffacd\",\r\n lightblue: \"#add8e6\",\r\n lightcoral: \"#f08080\",\r\n lightcyan: \"#e0ffff\",\r\n lightgoldenrodyellow: \"#fafad2\",\r\n lightgrey: \"#d3d3d3\",\r\n lightgreen: \"#90ee90\",\r\n lightpink: \"#ffb6c1\",\r\n lightsalmon: \"#ffa07a\",\r\n lightseagreen: \"#20b2aa\",\r\n lightskyblue: \"#87cefa\",\r\n lightslategray: \"#778899\",\r\n lightsteelblue: \"#b0c4de\",\r\n lightyellow: \"#ffffe0\",\r\n lime: \"#00ff00\",\r\n limegreen: \"#32cd32\",\r\n linen: \"#faf0e6\",\r\n magenta: \"#ff00ff\",\r\n maroon: \"#800000\",\r\n mediumaquamarine: \"#66cdaa\",\r\n mediumblue: \"#0000cd\",\r\n mediumorchid: \"#ba55d3\",\r\n mediumpurple: \"#9370d8\",\r\n mediumseagreen: \"#3cb371\",\r\n mediumslateblue: \"#7b68ee\",\r\n mediumspringgreen: \"#00fa9a\",\r\n mediumturquoise: \"#48d1cc\",\r\n mediumvioletred: \"#c71585\",\r\n midnightblue: \"#191970\",\r\n mintcream: \"#f5fffa\",\r\n mistyrose: \"#ffe4e1\",\r\n moccasin: \"#ffe4b5\",\r\n navajowhite: \"#ffdead\",\r\n navy: \"#000080\",\r\n oldlace: \"#fdf5e6\",\r\n olive: \"#808000\",\r\n olivedrab: \"#6b8e23\",\r\n orange: \"#ffa500\",\r\n orangered: \"#ff4500\",\r\n orchid: \"#da70d6\",\r\n palegoldenrod: \"#eee8aa\",\r\n palegreen: \"#98fb98\",\r\n paleturquoise: \"#afeeee\",\r\n palevioletred: \"#d87093\",\r\n papayawhip: \"#ffefd5\",\r\n peachpuff: \"#ffdab9\",\r\n peru: \"#cd853f\",\r\n pink: \"#ffc0cb\",\r\n plum: \"#dda0dd\",\r\n powderblue: \"#b0e0e6\",\r\n purple: \"#800080\",\r\n red: \"#ff0000\",\r\n rosybrown: \"#bc8f8f\",\r\n royalblue: \"#4169e1\",\r\n saddlebrown: \"#8b4513\",\r\n salmon: \"#fa8072\",\r\n sandybrown: \"#f4a460\",\r\n seagreen: \"#2e8b57\",\r\n seashell: \"#fff5ee\",\r\n sienna: \"#a0522d\",\r\n silver: \"#c0c0c0\",\r\n skyblue: \"#87ceeb\",\r\n slateblue: \"#6a5acd\",\r\n slategray: \"#708090\",\r\n snow: \"#fffafa\",\r\n springgreen: \"#00ff7f\",\r\n steelblue: \"#4682b4\",\r\n tan: \"#d2b48c\",\r\n teal: \"#008080\",\r\n thistle: \"#d8bfd8\",\r\n tomato: \"#ff6347\",\r\n turquoise: \"#40e0d0\",\r\n violet: \"#ee82ee\",\r\n wheat: \"#f5deb3\",\r\n white: \"#ffffff\",\r\n whitesmoke: \"#f5f5f5\",\r\n yellow: \"#ffff00\",\r\n yellowgreen: \"#9acd32\",\r\n transparent: \"rgba(0,0,0,0)\"\r\n };\r\n\r\n/**\r\n * 画图基础对象\r\n * 当前库的工具类\r\n * \r\n * @class jmUtils\r\n * @static\r\n */\r\nexport default class jmUtils {\r\n /**\r\n * 复制一个对象\r\n * \r\n * @method clone\r\n * @static\r\n * @param {object} source 被复制的对象\r\n * @param {object} target 可选,如果指定就表示复制给这个对象,如果为boolean它就是deep参数\r\n * @param {boolean} deep 是否深度复制,如果为true,数组内的每个对象都会被复制\r\n * @param {function} copyHandler 复制对象回调,如果返回undefined,就走后面的逻辑,否则到这里中止\r\n * @return {object} 参数source的拷贝对象\r\n */\r\n static clone(source, target, deep = false, copyHandler = null, deepIndex = 0) {\r\n // 如果有指定回调,则用回调处理,否则走后面的复制逻辑\r\n if(typeof copyHandler === 'function') {\r\n const obj = copyHandler(source, deep, deepIndex);\r\n if(obj) return obj;\r\n }\r\n deepIndex++; // 每执行一次,需要判断最大拷贝深度 \r\n\r\n if(typeof target === 'boolean') {\r\n deep = target;\r\n target = undefined;\r\n }\r\n\r\n // 超过100拷贝深度,直接返回\r\n if(deepIndex > 100) {\r\n return target;\r\n }\r\n\r\n if(source && typeof source === 'object') {\r\n target = target || {};\r\n\r\n //如果为当前泛型,则直接new\r\n if(this.isType(source, jmList)) {\r\n return new jmList(source);\r\n }\r\n else if(Array.isArray(source)) {\r\n //如果是深度复,则拷贝每个对象\r\n if(deep) {\r\n let dest = [];\r\n for(let i=0; i<source.length; i++) {\r\n dest.push(this.clone(source[i], target[i], deep, copyHandler, deepIndex));\r\n }\r\n return dest;\r\n }\r\n return source.slice(0);\r\n }\r\n \r\n if(source.__proto__) target.__proto__ = source.__proto__;\r\n \r\n for(let k in source) {\r\n if(k === 'constructor') continue;\r\n const v = source[k];\r\n // 不复制页面元素和class对象\r\n if(v && (v.tagName || v.getContext)) {\r\n target[k] = v;\r\n continue;\r\n }\r\n\r\n // 如果不是对象和空,则采用target的属性\r\n if(typeof target[k] === 'object' || typeof target[k] === 'undefined') { \r\n target[k] = this.clone(v, target[k], deep, copyHandler, deepIndex);\r\n }\r\n }\r\n return target;\r\n }\r\n else if(typeof target != 'undefined') {\r\n return target;\r\n }\r\n\r\n return source;\r\n }\r\n\r\n /**\r\n * 绑定事件到html对象\r\n * \r\n * @method bindEvent\r\n * @static\r\n * @param {element} html元素对象\r\n * @param {string} name 事件名称\r\n * @param {function} fun 事件委托\r\n * @returns {name, fun, target} 返回当前绑定\r\n */\r\n static bindEvent(target, name, fun, opt) {\r\n if(name && name.indexOf && name.indexOf(' ') != -1) {\r\n let ns = name.split(' ');\r\n for(let i=0;i<ns.length;i++) {\r\n this.bindEvent(target, ns[i], fun, opt);\r\n }\r\n }\r\n if(target.attachEvent) {\r\n target.attachEvent(\"on\"+name, fun, opt);\r\n } \r\n else if(target.addEventListener) {\r\n target.addEventListener(name, fun, opt);\r\n }\r\n return {\r\n name,\r\n target,\r\n fun\r\n };\r\n }\r\n\r\n /**\r\n * 从对象中移除事件到\r\n * \r\n * @method removeEvent\r\n * @static\r\n * @param {element} html元素对象\r\n * @param {string} name 事件名称\r\n * @param {function} fun 事件委托\r\n */\r\n static removeEvent(target, name, fun) {\r\n if(target.removeEventListener) {\r\n return target.removeEventListener(name, fun, false);\r\n } \r\n else if(target.detachEvent) {\r\n target.detachEvent('on' + name, fun);\r\n return true;\r\n }\r\n else {\r\n target['on' + name] = null;\r\n }\r\n }\r\n\r\n /**\r\n * 获取元素的绝对定位\r\n *\r\n * @method getElementPosition\r\n * @static\r\n * @param {element} el 目标元素对象\r\n * @return {position} 位置对象(top,left)\r\n */\r\n static getElementPosition(el) { \r\n let pos = {\"top\": 0, \"left\": 0};\r\n if(!el) return pos;\r\n\r\n if (el.offsetParent) {\r\n while (el.offsetParent) {\r\n pos.top += el.offsetTop;\r\n pos.left += el.offsetLeft;\r\n el = el.offsetParent;\r\n }\r\n }\r\n else if(el.x) {\r\n pos.left += el.x;\r\n }\r\n else if(el.x){\r\n pos.top += el.y;\r\n } \r\n return pos;\r\n }\r\n /**\r\n * 获取元素事件触发的位置\r\n *\r\n * @method getEventPosition\r\n * @static\r\n * @param {eventArg} evt 当前触发事件的参数\r\n * @param {point} [scale] 当前画布的缩放比例\r\n * @return {point} 事件触发的位置 \r\n */\r\n static getEventPosition (evt, scale) {\r\n evt = evt || event;\r\n \r\n let isTouch = false;\r\n let touches = evt.changedTouches || evt.targetTouches || evt.touches;\r\n let target = evt.target || evt.srcElement;\r\n if(touches && touches.length) {\r\n evt = touches[0];//兼容touch事件\r\n if(!evt.target) evt.target = target;\r\n isTouch = true;\r\n }\r\n let px = evt.pageX || evt.x;\r\n if(typeof px == 'undefined') px = evt.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft); \r\n let py = evt.pageY || evt.y;\r\n if(typeof py == 'undefined') py = evt.clientY + (document.documentElement.scrollTop || document.body.scrollTop);\r\n\r\n let ox = evt.offsetX;\r\n let oy = evt.offsetY;\r\n if(typeof ox === 'undefined' && typeof oy === 'undefined') {\r\n let p = this.getElementPosition(target);\r\n ox= px - p.left;\r\n oy = py - p.top;\r\n }\r\n if(scale) {\r\n if(scale.x) ox = ox / scale.x;\r\n if(scale.y) oy = oy / scale.y;\r\n }\r\n\r\n return {\r\n pageX: px,\r\n pageY: py,\r\n clientX: evt.clientX,\r\n clientY: evt.clientY,\r\n //相对于容器偏移量\r\n offsetX: ox,\r\n offsetY: oy,\r\n layerX: evt.layerX,\r\n layerY: evt.layerY,\r\n screenX: evt.screenX,\r\n screenY: evt.screenY,\r\n x: ox,\r\n y: oy,\r\n isTouch: isTouch,\r\n touches\r\n };\r\n }\r\n\r\n /**\r\n * 检 查对象是否为指定的类型,不包括继承\r\n * \r\n * @method isType\r\n * @static\r\n * @param {object} target 需要判断类型的对象\r\n * @param {class} type 对象类型\r\n * @return {boolean} 返回对象是否为指定类型 \r\n */\r\n static isType(target, type) {\r\n if(!target || typeof target !== 'object') return false;\r\n if(target.constructor === type) return true;\r\n /*if(target.__baseType) { \r\n return jmUtils.isType(target.__baseType.prototype,type);\r\n }*/\r\n\r\n //return target instanceof type;\r\n return false;\r\n }\r\n /**\r\n * 判断点是否在多边形内\r\n * 如果一个点在多边形内部,任意角度做射线肯定会与多边形要么有一个交点,要么有与多边形边界线重叠。\r\n * 如果一个点在多边形外部,任意角度做射线要么与多边形有一个交点,要么有两个交点,要么没有交点,要么有与多边形边界线重叠。\r\n * 利用上面的结论,我们只要判断这个点与多边形的交点个数,就可以判断出点与多边形的位置关系了。\r\n * \r\n * @method pointInPolygon\r\n * @static\r\n * @param {point} pt 坐标对象\r\n * @param {array} polygon 多边型角坐标对象数组\r\n * @param {number} offset 判断可偏移值\r\n * @return {integer} 0= 不在图形内和线上,1=在边上,2=在图形内部\r\n */\r\n static pointInPolygon(pt, polygon, offset) {\r\n offset = offset || 1;\r\n offset = offset / 2;\r\n let i, j, n = polygon.length;\r\n let inside = false, redo = true;\r\n\r\n if(!polygon || n == 0) return 0;\r\n if(n == 1) {\r\n return Math.abs(polygon[0].x - pt.x) <= offset && Math.abs(polygon[0].y - pt.y) <= offset;\r\n }\r\n \r\n //一条直线\r\n else if(n == 2) {\r\n //在最左边之外或在最右边之外\r\n if(Math.min(polygon[0].x,polygon[1].x) - pt.x > offset || \r\n pt.x - Math.max(polygon[0].x,polygon[1].x) > offset ) {\r\n return 0;\r\n }\r\n //在最顶部之外或在最底部之外\r\n if(Math.min(polygon[0].y,polygon[1].y) - pt.y > offset || \r\n pt.y - Math.max(polygon[0].y,polygon[1].y) > offset) {\r\n return 0;\r\n }\r\n\r\n //如果线为平行为纵坐标。\r\n if(polygon[0].x == polygon[1].x){\r\n return (Math.abs(polygon[0].x - pt.x) <= offset && (pt.y - polygon[0].y) * (pt.y - polygon[1].y) <= 0)? 1:0;\r\n }\r\n //如果线为平行为横坐标。\r\n if(polygon[0].y == polygon[1].y){\r\n return (Math.abs(polygon[0].y - pt.y) <= offset && (pt.x - polygon[0].x) * (pt.x - polygon[1].x) <= 0)? 1:0;\r\n }\r\n\r\n if(Math.abs(polygon[0].x - pt.x) < offset && Math.abs(polygon[0].y - pt.y) < offset) {\r\n return 1;\r\n }\r\n if(Math.abs(polygon[1].x - pt.x) < offset && Math.abs(polygon[1].y - pt.y) < offset) {\r\n return 1;\r\n }\r\n\r\n //点到直线的距离小于宽度的一半,表示在线上\r\n if(pt.y != polygon[0].y && pt.y != polygon[1].y) {\r\n\r\n let f = (polygon[1].x - polygon[0].x) / (polygon[1].y - polygon[0].y) * (pt.y - polygon[0].y);\r\n let ff = (pt.y - polygon[0].y) / Math.sqrt(f * f + (pt.y - polygon[0].y) * (pt.y - polygon[0].y));\r\n let l = ff * (pt.x - polygon[0].x - f );\r\n \r\n return Math.abs(l) <= offset ?1:0;\r\n }\r\n return 0;\r\n }\r\n\r\n for (i = 0;i < n;++i) {\r\n if (polygon[i].x == pt.x && // 是否在顶点上\r\n polygon[i].y == pt.y ) {\r\n return 1;\r\n }\r\n }\r\n\r\n //pt = this.clone(pt);\r\n while (redo) {\r\n redo = false;\r\n inside = false;\r\n for (i = 0,j = n - 1;i < n;j = i++) {\r\n if ( (polygon[i].y < pt.y && pt.y < polygon[j].y) || \r\n (polygon[j].y < pt.y && pt.y < polygon[i].y) ) {\r\n if (pt.x <= polygon[i].x || pt.x <= polygon[j].x) {\r\n var _x = (pt.y-polygon[i].y)*(polygon[j].x-polygon[i].x)/(polygon[j].y-polygon[i].y)+polygon[i].x;\r\n if (pt.x < _x) // 在线的左侧\r\n inside = !inside;\r\n else if (pt.x == _x) // 在线上\r\n {\r\n return 1;\r\n }\r\n }\r\n }\r\n else if ( pt.y == polygon[i].y) {\r\n if (pt.x < polygon[i].x) { // 交点在顶点上 \r\n if(polygon[i].y > polygon[j].y) {\r\n --pt.y\r\n }\r\n else {\r\n ++pt.y;\r\n }\r\n redo = true;\r\n break;\r\n }\r\n }\r\n else if ( polygon[i].y == polygon[j].y && // 在水平的边界线上\r\n pt.y == polygon[i].y &&\r\n ( (polygon[i].x < pt.x && pt.x < polygon[j].x) || \r\n (polygon[j].x < pt.x && pt.x < polygon[i].x) ) ) {\r\n inside = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inside ? 2:0;\r\n }\r\n\r\n /**\r\n * @method judge 判断点是否在多边形中\r\n * @param {point} dot {{x,y}} 需要判断的点\r\n * @param {array} coordinates {{x,y}} 多边形点坐标的数组,为保证图形能够闭合,起点和终点必须相等。\r\n * 比如三角形需要四个点表示,第一个点和最后一个点必须相同。 \r\n * @param {number} 是否为实心 1= 是\r\n * @returns {boolean} 结果 true=在形状内\r\n */\r\n /*static judge(dot,coordinates,noneZeroMode) {\r\n // 默认启动none zero mode\r\n noneZeroMode=noneZeroMode||1;\r\n var x = dot.x,y=dot.y;\r\n var crossNum = 0;\r\n // 点在线段的左侧数目\r\n var leftCount = 0;\r\n // 点在线段的右侧数目\r\n var rightCount = 0;\r\n for(var i=0;i<coordinates.length-1;i++){\r\n var start = coordinates[i];\r\n var end = coordinates[i+1];\r\n \r\n // 起点、终点斜率不存在的情况\r\n if(start.x===end.x) {\r\n // 因为射线向右水平,此处说明不相交\r\n if(x>start.x) continue;\r\n \r\n // 从左侧贯穿\r\n if((end.y>start.y&&y>=start.y && y<=end.y)){\r\n leftCount++;\r\n crossNum++;\r\n }\r\n // 从右侧贯穿\r\n if((end.y<start.y&&y>=end.y && y<=start.y)) {\r\n rightCount++;\r\n crossNum++;\r\n }\r\n continue;\r\n }\r\n // 斜率存在的情况,计算斜率\r\n var k=(end.y-start.y)/(end.x-start.x);\r\n // 交点的x坐标\r\n var x0 = (y-start.y)/k+start.x;\r\n // 因为射线向右水平,此处说明不相交\r\n if(x>x0) continue;\r\n \r\n if((end.x>start.x&&x0>=start.x && x0<=end.x)){\r\n crossNum++;\r\n if(k>=0) leftCount++;\r\n else rightCount++;\r\n }\r\n if((end.x<start.x&&x0>=end.x && x0<=start.x)) {\r\n crossNum++;\r\n if(k>=0) rightCount++;\r\n else leftCount++;\r\n }\r\n }\r\n \r\n return noneZeroMode===1?leftCount-rightCount!==0:crossNum%2===1;\r\n }*/\r\n\r\n /**\r\n * 检查边界,子对象是否超出父容器边界\r\n * 当对象偏移offset后是否出界\r\n * 返回(left:0,right:0,top:0,bottom:0)\r\n * 如果right>0表示右边出界right偏移量,left<0则表示左边出界left偏移量\r\n * 如果bottom>0表示下边出界bottom偏移量,top<0则表示上边出界ltop偏移量\r\n *\r\n * @method checkOutSide\r\n * @static\r\n * @param {bound} parentBounds 父对象的边界\r\n * @param {bound} targetBounds 对象的边界\r\n * @param {number} offset 判断是否越界可容偏差\r\n * @return {bound} 越界标识\r\n */\r\n static checkOutSide(parentBounds, targetBounds, offset) {\r\n let result = {left:0,right:0,top:0,bottom:0};\r\n if(offset.x < 0 ) {\r\n result.left = targetBounds.left + offset.x - parentBounds.left;\r\n }\r\n else if(offset.x > 0 ) {\r\n result.right = targetBounds.right + offset.x - parentBounds.right;\r\n }\r\n\r\n if(offset.y < 0 ) {\r\n result.top = targetBounds.top + offset.y - parentBounds.top;\r\n }\r\n else if(offset.y > 0) {\r\n result.bottom = targetBounds.bottom + offset.y - parentBounds.bottom;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 把一个或多个点绕某个点旋转一定角度\r\n * 先把坐标原点移到旋转中心点,计算后移回\r\n * @method rotatePoints\r\n * @static\r\n * @param {Array/object} p 一个或多个点\r\n * @param {*} rp 旋转中心点\r\n * @param {*} r 旋转角度\r\n */\r\n static rotatePoints(p, rp, r) {\r\n if(!r || !p) return p;\r\n let cos = Math.cos(r);\r\n let sin = Math.sin(r);\r\n if(p.length) {\r\n for(let i=0;i<p.length;i++) {\r\n if(!p[i]) continue;\r\n let x1 = p[i].x - rp.x;\r\n let y1 = p[i].y - rp.y;\r\n p[i].x = x1 * cos - y1 * sin + rp.x;\r\n p[i].y = x1 * sin + y1 * cos + rp.y;\r\n }\r\n }\r\n else {\r\n let x1 = p.x - rp.x;\r\n let y1 = p.y - rp.y;\r\n p.x = x1 * cos - y1 * sin + rp.x;\r\n p.y = x1 * sin + y1 * cos + rp.y;\r\n }\r\n return p;\r\n }\r\n\r\n /**\r\n * 去除字符串开始字符\r\n * \r\n * @method trimStart\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的前置字符\r\n * @return {string} 去除前置字符后的字符串\r\n */\r\n static trimStart(source, c) {\r\n c = c || ' ';\r\n if(source && source.length > 0) {\r\n let sc = source[0];\r\n if(sc === c || c.indexOf(sc) >= 0) {\r\n source = source.substring(1);\r\n return this.trimStart(source,c);\r\n } \r\n }\r\n return source;\r\n }\r\n\r\n /**\r\n * 去除字符串结束的字符c\r\n *\r\n * @method trimEnd\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的后置字符\r\n * @return {string} 去除后置字符后的字符串\r\n */\r\n static trimEnd(source, c) {\r\n c = c || ' ';\r\n if(source && source.length > 0) {\r\n let sc = source[source.length - 1];\r\n if(sc === c || c.indexOf(sc) >= 0) {\r\n source = source.substring(0,source.length - 1);\r\n return this.trimStart(source,c);\r\n } \r\n }\r\n return source;\r\n }\r\n\r\n /**\r\n * 去除字符串开始与结束的字符\r\n *\r\n * @method trim\r\n * @static\r\n * @param {string} source 需要处理的字符串\r\n * @param {char} [c] 要去除字符串的字符\r\n * @return {string} 去除字符后的字符串\r\n */\r\n static trim(source,c) {\r\n return this.trimEnd(this.trimStart(source,c),c);\r\n }\r\n\r\n /**\r\n * 检查是否为百分比参数\r\n *\r\n * @method checkPercent\r\n * @static\r\n * @param {string} 字符串参数\r\n * @return {boolean} true=当前字符串为百分比参数,false=不是\r\n */\r\n static checkPercent(per) {\r\n if(typeof per === 'string') {\r\n per = this.trim(per);\r\n if(per[per.length - 1] == '%') {\r\n return per;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 转换百分数为数值类型\r\n *\r\n * @method percentToNumber\r\n * @static\r\n * @param {string} per 把百分比转为数值的参数\r\n * @return {number} 百分比对应的数值\r\n */\r\n static percentToNumber(per) {\r\n if(typeof per === 'string') {\r\n let tmp = this.checkPercent(per);\r\n if(tmp) {\r\n per = this.trim(tmp,'% ');\r\n per = per / 100;\r\n }\r\n }\r\n return per;\r\n }\r\n\r\n /**\r\n * 转换16进制为数值\r\n *\r\n * @method hexToNumber\r\n * @static\r\n * @param {string} h 16进制颜色表达\r\n * @return {number} 10进制表达\r\n */\r\n static hexToNumber(h) {\r\n if(typeof h !== 'string') return h;\r\n\r\n h = h.toLowerCase();\r\n let hex = '0123456789abcdef';\r\n let v = 0;\r\n let l = h.length;\r\n for(let i=0;i<l;i++) {\r\n let iv = hex.indexOf(h[i]);\r\n if(iv == 0) continue;\r\n \r\n for(let j=1;j<l - i;j++) {\r\n iv *= 16;\r\n }\r\n v += iv;\r\n }\r\n return v;\r\n }\r\n\r\n /**\r\n * 转换数值为16进制字符串表达\r\n *\r\n * @method hex\r\n * @static\r\n * @param {number} v 数值\r\n * @return {string} 16进制表达\r\n */\r\n static numberToHex(v) {\r\n let hex = '0123456789abcdef';\r\n \r\n let h = '';\r\n while(v > 0) {\r\n let t = v % 16;\r\n h = hex[t] + h;\r\n v = Math.floor(v / 16);\r\n }\r\n return h;\r\n }\r\n\r\n /**\r\n * 16进制颜色转为r g b a 对象 {r, g , b, a}\r\n * @param {string}} hex 16进度的颜色\r\n */\r\n static hexToRGBA(hex) {\r\n if(typeof hex === 'string') hex = this.trim(hex); \r\n else return hex;\r\n\r\n // 如果缓存存在,则直接返回\r\n this.__hexToRGBA_Cache = this.__hexToRGBA_Cache || {};\r\n if(this.__hexToRGBA_Cache[hex]) return this.__hexToRGBA_Cache[hex];\r\n\r\n let res = hex;\r\n\r\n // 系统颜色\r\n if(colorKeywords[res]) res = colorKeywords[res];\r\n\r\n //当为7位时,表示需要转为带透明度的rgba\r\n if(res[0] == '#') {\r\n const color = {\r\n a: 1\r\n };\r\n if(res.length >= 8) {\r\n color.a = res.substr(1,2);\r\n color.g = res.substr(5,2);\r\n color.b = res.substr(7,2);\r\n color.r = res.substr(3,2);\r\n //透明度\r\n color.a = Number((this.hexToNumber(color.a) / 255).toFixed(4));\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n res = color; \r\n }\r\n // #cccccc || #ccc\r\n else if(res.length === 7 || res.length === 4) {\r\n // #ccc这种情况,把每个位复制一份\r\n if(res.length === 4) {\r\n color.g = res.substr(2, 1);\r\n color.g = color.g + color.g;\r\n color.b = res.substr(3, 1);\r\n color.b = color.b + color.b;\r\n color.r = res.substr(1, 1);\r\n color.r = color.r + color.r;\r\n }\r\n else {\r\n color.g = res.substr(3, 2);//除#号外的第二位\r\n color.b = res.substr(5, 2);\r\n color.r = res.substr(1, 2);\r\n }\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n \r\n res = color; \r\n }\r\n //如果是5位的话,# 则第2位表示A,后面依次是r,g,b\r\n else if(res.length === 5) {\r\n color.a = res.substr(1,1);\r\n color.g = res.substr(3,1);//除#号外的第二位\r\n color.b = res.substr(4,1);\r\n color.r = res.substr(2,1);\r\n\r\n color.r = this.hexToNumber(color.r||0);\r\n color.g = this.hexToNumber(color.g||0);\r\n color.b = this.hexToNumber(color.b||0);\r\n //透明度\r\n color.a = Number((this.hexToNumber(color.a) / 255).toFixed(4));\r\n res = color; \r\n }\r\n } \r\n if(typeof res === 'string') {\r\n const m = res.match(/rgb(a)?\\s*\\(\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)\\s*(,\\s*[\\d\\.]+)?\\s*\\)/i); \r\n if(m && m.length === 6) {\r\n const color = {\r\n r: Number(m[2]),\r\n g: Number(m[3]),\r\n b: Number(m[4]),\r\n a: Number(this.trimStart(m[5]||'1', ','))\r\n };\r\n res = color;\r\n }\r\n }\r\n return this.__hexToRGBA_Cache[hex] = res; \r\n }\r\n\r\n /**\r\n * 把255的rgb值转为0-1的值\r\n * @param {rgba} color 颜色\r\n */\r\n static rgbToDecimal(color) {\r\n color = this.clone(color);\r\n color.r = this.byteToDecimal(color.r);\r\n color.g = this.byteToDecimal(color.g);\r\n color.b = this.byteToDecimal(color.b);\r\n return color;\r\n }\r\n\r\n //255值转为0-1的小数\r\n static byteToDecimal(b) {\r\n return b / 255;\r\n }\r\n\r\n /**\r\n * 转换颜色格式,如果输入r,g,b则转为hex格式,如果为hex则转为r,g,b格式\r\n *\r\n * @method toColor\r\n * @static\r\n * @param {string} hex 16进制颜色表达\r\n * @return {string} 颜色字符串\r\n */\r\n static toColor(r, g, b, a) { \r\n if(typeof r === 'string' && r) {\r\n r = this.trim(r); \r\n // 正常的颜色表达,不需要转换\r\n if(r[0] === '#' && (r.length === 4 || r.length === 7)) return r;\r\n\r\n const color = this.hexToRGBA(r);\r\n if(typeof color === 'string') return color;\r\n \r\n r = typeof color.r !== 'undefined'? color.r: r;\r\n g = typeof color.g !== 'undefined'? color.g: g;\r\n b = typeof color.b !== 'undefined'? color.b: b;\r\n a = typeof color.a !== 'undefined'? color.a: a;\r\n }\r\n if(typeof r != 'undefined' && typeof g != 'undefined' && typeof b != 'undefined') {\r\n if(typeof a != 'undefined') { \r\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\r\n }\r\n else {\r\n return 'rgb(' + r + ',' + g + ',' + b + ')';\r\n }\r\n }\r\n return r;\r\n }\r\n // window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行\r\n static requestAnimationFrame(callback, win) {\r\n let fun = win && win.requestAnimationFrame? win.requestAnimationFrame: (typeof window !== 'undefined' && window.requestAnimationFrame? window.requestAnimationFrame: setTimeout); \r\n\t\treturn fun(callback, 20);\r\n }\r\n static cancelAnimationFrame(handler, win) {\r\n let fun = win && win.cancelAnimationFrame? win.cancelAnimationFrame: (typeof window !== 'undefined' && window.cancelAnimationFrame? window.cancelAnimationFrame: clearTimeout); \r\n\t\treturn fun(handler);\r\n }\t\r\n}\r\nexport { jmUtils };","\r\nimport {jmList} from \"./jmList.js\";\r\n\r\nvar control_id_counter = 0;\r\n/**\r\n * 所有jm对象的基础对象\r\n * \r\n * @class jmObject\r\n * @for jmGraph\r\n */\r\nexport default class jmObject {\r\n\t//id;\r\n\tconstructor(g) {\r\n\t\tif(g && g.type == 'jmGraph') {\r\n\t\t\tthis.graph = g;\r\n\t\t}\r\n\t\tthis.id = ++control_id_counter; //生成一个唯一id\r\n\t}\r\n\t\r\n\t/**\r\n\t * 检 查对象是否为指定类型\r\n\t * \r\n\t * @method is\r\n\t * @param {class} type 判断的类型\r\n\t * @for jmObject\r\n\t * @return {boolean} true=表示当前对象为指定的类型type,false=表示不是\r\n\t */\r\n\tis(type) {\r\n\t\tif(typeof type == 'string') {\r\n\t\t\treturn this.type == type;\r\n\t\t}\r\n\t\treturn this instanceof type;\r\n\t}\r\n\r\n\t/**\r\n\t * 给控件添加动画处理,如果成功执行会导致画布刷新。\r\n\t *\r\n\t * @method animate\r\n\t * @for jmObject\r\n\t * @param {function} handle 动画委托\r\n\t * @param {integer} millisec 此委托执行间隔 (毫秒)\r\n\t */\r\n\tanimate(...args) {\t\r\n\t\tif(this.is('jmGraph')) {\r\n\t\t\tif(args.length > 1) {\t\t\t\r\n\t\t\t\tif(!this.animateHandles) this.animateHandles = new jmList();\r\n\t\t\t\t\r\n\t\t\t\tvar params = [];\r\n\t\t\t\tif(args.length > 2) {\r\n\t\t\t\t\tfor(var i=2;i<args.length;i++) {\r\n\t\t\t\t\t\tparams.push(args[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\t\t\r\n\t\t\t\tthis.animateHandles.add({\r\n\t\t\t\t\tmillisec: args[1] || 20, \r\n\t\t\t\t\thandle: args[0], \r\n\t\t\t\t\tparams:params\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif(this.animateHandles) {\r\n\t\t\t\tif(this.animateHandles.count() > 0) {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\t//延时处理动画事件\r\n\t\t\t\t\tthis.dispatcher = setTimeout(function(_this) {\r\n\t\t\t\t\t\t_this = _this || self;\r\n\t\t\t\t\t\t//var needredraw = false;\r\n\t\t\t\t\t\tvar overduehandles = [];\r\n\t\t\t\t\t\tvar curTimes = new Date().getTime();\r\n\t\t\t\t\t\t_this.animateHandles.each(function(i,ani) {\t\t\t\t\t\t\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tif(ani && ani.handle && (!ani.times || curTimes - ani.times >= ani.millisec)) {\r\n\t\t\t\t\t\t\t\t\tvar r = ani.handle.apply(_this, ani.params);\r\n\t\t\t\t\t\t\t\t\tif(r === false) {\r\n\t\t\t\t\t\t\t\t\t\toverduehandles.push(ani);//表示已完成的动画效果\r\n\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tani.times = curTimes;\r\n\t\t\t\t\t\t\t\t\t//needredraw = true;\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcatch(e) {\r\n\t\t\t\t\t\t\t\tif(window.console && window.console.info) {\r\n\t\t\t\t\t\t\t\t\twindow.console.info(e.toString());\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif(ani) overduehandles.push(ani);//异常的事件,不再执行\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tfor(var i in overduehandles) {\r\n\t\t\t\t\t\t\t_this.animateHandles.remove(overduehandles[i]);//移除完成的效果\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t_this.animate();\r\n\t\t\t\t\t},10,this);//刷新\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\t\telse {\r\n\t\t\tvar graph = this.graph;\r\n\t\t\tif(graph) {\r\n\t\t\t\tgraph.animate(...args);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport { jmObject };","\r\nimport {jmUtils} from \"./jmUtils.js\";\r\nimport { jmObject } from \"./jmObject.js\";\r\n\r\nconst PROPERTY_KEY = Symbol(\"properties\");\r\n\r\n/**\r\n * 对象属性管理\r\n * \r\n * @class jmProperty\r\n * @extends jmObject\r\n * @require jmObject\r\n */\r\nexport default class jmProperty extends jmObject {\t\t\r\n\t\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis[PROPERTY_KEY] = {};\r\n\t\tif(params && params.mode) this.mode = params.mode;\r\n\t}\r\n\r\n\t/**\r\n\t * 基础属性读写接口\r\n\t * @method property\r\n\t * @param {string} name 属性名\r\n\t * @param {any} value 属性的值\r\n\t * @returns {any} 属性的值\r\n\t */\r\n\t property(...pars) {\r\n\t\tif(pars) {\r\n\t\t\tconst pros = this[PROPERTY_KEY];\r\n\t\t\tconst name = pars[0];\r\n\t\t\tif(pars.length > 1) {\r\n\t\t\t\tconst value = pars[1];\r\n\t\t\t\tconst args = {oldValue: pros[name], newValue: value};\r\n\t\t\t\tpros[name] = pars[1];\r\n\t\t\t\tif(this.emit) this.emit('propertyChange', name, args);\r\n\t\t\t\treturn pars[1];\r\n\t\t\t}\r\n\t\t\telse if(name) {\r\n\t\t\t\treturn pros[name];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 是否需要刷新画板,属性的改变会导致它变为true\r\n\t * @property needUpdate\r\n\t * @type {boolean}\r\n\t */\r\n\tget needUpdate() {\r\n\t\treturn this.property('needUpdate');\r\n\t}\r\n\tset needUpdate(v) {\r\n\t\tthis.property('needUpdate', v);\r\n\t\t//子控件属性改变,需要更新整个画板\r\n\t\tif(v && !this.is('jmGraph') && this.graph) {\r\n\t\t\tthis.graph.needUpdate = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 当前所在的画布对象 jmGraph\r\n\t * @property graph\r\n\t * @type {jmGraph}\r\n\t */\r\n\tget graph() {\r\n\t\tlet g = this.property('graph');\r\n\t\tg = g || (this.property('graph', this.findParent('jmGraph')));\r\n\t\treturn g;\r\n\t}\r\n\tset graph(v) {\r\n\t\treturn this.property('graph', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 绘制模式 2d/webgl\r\n\t * @property mode\r\n\t * @type {string}\r\n\t */\r\n\tget mode() {\r\n\t\tlet m = this.property('mode');\r\n\t\tif(m) return m;\r\n\t\telse if(this.is('jmGraph')) return this.property('mode');\t\t\r\n\t\treturn this.graph.mode;\r\n\t}\r\n\tset mode(v) {\r\n\t\treturn this.property('mode', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 在下次进行重绘时执行\r\n\t * @param {Function} handler \r\n\t */\r\n\trequestAnimationFrame(handler) {\r\n\t\treturn jmUtils.requestAnimationFrame(handler, this.graph? this.graph.canvas: null);\r\n\t}\r\n\t/**\r\n\t * 清除执行回调\r\n\t * @param {Function} handler \r\n\t * @returns \r\n\t */\r\n\tcancelAnimationFrame(handler) {\r\n\t\treturn jmUtils.cancelAnimationFrame(handler, this.graph? this.graph.canvas: null);\r\n\t}\r\n}\r\n\r\nexport { jmProperty };\r\n\r\n\r\n","import {jmUtils} from \"./jmUtils.js\";\r\n\r\n/**\r\n * 画图阴影对象表示法\r\n *\r\n * @class jmShadow\r\n * @param {number} x 横坐标偏移量\r\n * @param {number} y 纵坐标编移量\r\n * @param {number} blur 模糊值\r\n * @param {string} color 阴影的颜色\r\n */\r\n\r\nexport default class jmShadow {\r\n\tconstructor(x, y, blur, color) {\r\n\t\tif(typeof x == 'string' && !y && !blur && !color) {\r\n\t\t\tthis.fromString(x);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.blur = blur;\r\n\t\t\tthis.color = color;\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 根据字符串格式转为阴影\r\n\t * @method fromString\r\n\t * @param {string} s 阴影字符串 x,y,blur,color\r\n\t */\r\n\tfromString(s) {\r\n\t\tif(!s) return;\r\n\t\tlet ms = s.match(/\\s*([^,]+)\\s*,\\s*([^,]+)\\s*(,[^,]+)?\\s*(,[\\s\\S]+)?\\s*/i);\r\n\t\tif(ms) {\r\n\t\t\tthis.x = ms[1]||0;\r\n\t\t\tthis.y = ms[2]||0;\r\n\t\t\tif(ms[3]) {\r\n\t\t\t\tms[3] = jmUtils.trim(ms[3],', ');\r\n\t\t\t\t//如果第三位是颜色格式,则表示为颜色\r\n\t\t\t\tif(ms[3].indexOf('#')===0 || /^rgb/i.test(ms[3])) {\r\n\t\t\t\t\tthis.color = ms[3];\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.blur = jmUtils.trim(ms[3],', ');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(ms[4]) {\r\n\t\t\t\tthis.color = jmUtils.trim(ms[4],', ');\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * 转为字符串格式 x,y,blur,color\r\n\t * @method toString\r\n\t * @returns {string} 阴影字符串\r\n\t */\r\n\ttoString() {\r\n\t\tlet s = this.x + ',' + this.y;\r\n\t\tif(this.blur) s += ',' + this.blur;\r\n\t\tif(this.color) s += ',' + this.color;\r\n\t\treturn s;\r\n\t}\r\n}\r\n\r\nexport { jmShadow };","import {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\n\r\n/**\r\n * 渐变类\r\n *\r\n * @class jmGradient\r\n * @param {object} op 渐变参数,type:[linear= 线性渐变,radial=放射性渐变] \r\n */\r\nexport default class jmGradient {\r\n\tconstructor(opt) {\r\n\t\tthis.stops = new jmList();\r\n\r\n\t\tif(opt && typeof opt == 'object') {\r\n\t\t\tfor(let k in opt) {\r\n\t\t\t\tthis[k] = opt[k];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//解析字符串格式\r\n\t\t//linear-gradient(direction, color-stop1, color-stop2, ...);\r\n\t\t//radial-gradient(center, shape size, start-color, ..., last-color);\r\n\t\telse if(typeof opt == 'string') {\r\n\t\t\tthis.fromString(opt);\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 添加渐变色\r\n\t * \r\n\t * @method addStop\r\n\t * @for jmGradient\r\n\t * @param {number} offset 放射渐变颜色偏移,可为百分比参数。\r\n\t * @param {string} color 当前偏移颜色值\r\n\t */\r\n\taddStop(offset, color) {\r\n\t\tthis.stops.add({\r\n\t\t\toffset: Number(offset),\r\n\t\t\tcolor: color\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 生成为canvas的渐变对象\r\n\t *\r\n\t * @method toGradient\r\n\t * @for jmGradient\r\n\t * @param {jmControl} control 当前渐变对应的控件\r\n\t * @return {gradient} canvas渐变对象\r\n\t */\r\n\ttoGradient(control) {\r\n\t\tlet gradient;\r\n\t\tlet context = control.context || control;\r\n\t\tlet bounds = control.absoluteBounds?control.absoluteBounds:control.getAbsoluteBounds();\r\n\t\tlet x1 = this.x1||0;\r\n\t\tlet y1 = this.y1||0;\r\n\t\tlet x2 = this.x2;\r\n\t\tlet y2 = this.y2;\r\n\r\n\t\tlet location = control.getLocation();\r\n\r\n\t\tlet d = 0;\r\n\t\tif(location.radius) {\r\n\t\t\td = location.radius * 2;\t\t\t\t\r\n\t\t}\r\n\t\tif(!d) {\r\n\t\t\td = Math.min(location.width,location.height);\t\t\t\t\r\n\t\t}\r\n\r\n\t\t//let offsetLine = 1;//渐变长度或半径\r\n\t\t//处理百分比参数\r\n\t\tif(jmUtils.checkPercent(x1)) {\r\n\t\t\tx1 = jmUtils.percentToNumber(x1) * (bounds.width || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(x2)) {\r\n\t\t\tx2 = jmUtils.percentToNumber(x2) * (bounds.width || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(y1)) {\r\n\t\t\ty1 = jmUtils.percentToNumber(y1) * (bounds.height || d);\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(y2)) {\r\n\t\t\ty2 = jmUtils.percentToNumber(y2) * (bounds.height || d);\r\n\t\t}\t\r\n\r\n\t\tlet sx1 = Number(x1) + bounds.left;\r\n\t\tlet sy1 = Number(y1) + bounds.top;\r\n\t\tlet sx2 = Number(x2) + bounds.left;\r\n\t\tlet sy2 = Number(y2) + bounds.top;\r\n\t\tif(this.type === 'linear') {\r\n\t\t\tif(control.mode === 'webgl' && control.webglControl) {\r\n\t\t\t\tgradient = control.webglControl.createLinearGradient(x1, y1, x2, y2, bounds);\r\n\t\t\t}\t\r\n\t\t\telse {\t\t\r\n\t\t\t\tcontext.createLinearGradient && (gradient = context.createLinearGradient(sx1, sy1, sx2, sy2));\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(this.type === 'radial') {\r\n\t\t\tlet r1 = this.r1||0;\r\n\t\t\tlet r2 = this.r2;\r\n\t\t\tif(jmUtils.checkPercent(r1)) {\r\n\t\t\t\tr1 = jmUtils.percentToNumber(r1);\t\t\t\r\n\t\t\t\tr1 = d * r1;\r\n\t\t\t}\r\n\t\t\tif(jmUtils.checkPercent(r2)) {\r\n\t\t\t\tr2 = jmUtils.percentToNumber(r2);\r\n\t\t\t\tr2 = d * r2;\r\n\t\t\t}\r\n\t\t\tif(control.mode === 'webgl' && control.webglControl) {\r\n\t\t\t\tgradient = control.webglControl.createRadialGradient(x1, y1, r1, x2, y2, r2, bounds);\r\n\t\t\t}\t\r\n\t\t\t//offsetLine = Math.abs(r2 - r1);//二圆半径差\r\n\t\t\telse if(context.createRadialGradient) {\r\n\t\t\t\tgradient = context.createRadialGradient(sx1, sy1, r1, sx2, sy2, r2);\t\r\n\t\t\t}\r\n\t\t\t//小程序的接口特殊\r\n\t\t\telse if(context.createCircularGradient) { \r\n\t\t\t\tgradient = context.createCircularGradient(sx1, sy1, r2);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t//颜色渐变\r\n\t\tif(gradient) {\r\n\t\t\tthis.stops.each(function(i,s) {\t\r\n\t\t\t\tlet c = jmUtils.toColor(s.color);\r\n\t\t\t\t//s.offset 0.0 ~ 1.0\r\n\t\t\t\tgradient && gradient.addColorStop(s.offset, c);\t\t\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst s = this.stops.get(0);\r\n\t\t\treturn (s && s.color) || '#000';\r\n\t\t}\r\n\t\t\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 变换为字条串格式\r\n\t * linear-gradient(x1 y1 x2 y2, color1 step, color2 step, ...);\t//radial-gradient(x1 y1 r1 x2 y2 r2, color1 step,color2 step, ...);\r\n\t * linear-gradient线性渐变,x1 y1表示起点,x2 y2表示结束点,color表颜色,step为当前颜色偏移\r\n\t * radial-gradient径向渐变,x1 y1 r1分别表示内圆中心和半径,x2 y2 r2为结束圆 中心和半径,颜色例似线性渐变 step为0-1之间\r\n\t *\r\n\t * @method fromString\r\n\t * @for jmGradient\r\n\t * @return {string} \r\n\t */\r\n\tfromString(s) {\r\n\t\tif(!s) return;\r\n\t\tlet ms = s.match(/(linear|radial)-gradient\\s*\\(\\s*([^,]+)\\s*,\\s*((.|\\s)+)\\)/i);\r\n\t\tif(!ms || ms.length < 3) return;\r\n\t\tthis.type = ms[1].toLowerCase();\t\t\r\n\t\t\r\n\t\tconst ps = jmUtils.trim(ms[2]).split(/\\s+/);\r\n\t\t//线性渐变\r\n\t\tif(this.type == 'linear') {\r\n\t\t\tif(ps.length <= 2) {\r\n\t\t\t\tthis.x2 = ps[0];\r\n\t\t\t\tthis.y2 = ps[1]||0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.x1 = ps[0];\r\n\t\t\t\tthis.y1 = ps[1];\r\n\t\t\t\tthis.x2 = ps[2];\r\n\t\t\t\tthis.y2 = ps[3];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//径向渐变\r\n\t\telse {\r\n\t\t\tif(ps.length <= 3) {\r\n\t\t\t\tthis.x2 = ps[0];\r\n\t\t\t\tthis.y2 = ps[1]||0;\r\n\t\t\t\tthis.r2 = ps[2]||0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.x1 = ps[0];\r\n\t\t\t\tthis.y1 = ps[1];\r\n\t\t\t\tthis.r1 = ps[2];\r\n\t\t\t\tthis.x2 = ps[3];\r\n\t\t\t\tthis.y2 = ps[3];\r\n\t\t\t\tthis.r2 = ps[3];\r\n\t\t\t}\r\n\t\t}\r\n\t\t//解析颜色偏移\r\n\t\t//color step\r\n\t\tconst pars = ms[3].match(/((rgb(a)?\\s*\\([\\d,\\.\\s]+\\))|(#[a-zA-Z\\d]+))\\s+([\\d\\.]+)/ig);\r\n\t\tif(pars && pars.length) {\r\n\t\t\tfor(let i=0;i<pars.length;i++) {\r\n\t\t\t\tconst par = jmUtils.trim(pars[i]);\r\n\t\t\t\tconst spindex = par.lastIndexOf(' ');\r\n\t\t\t\tif(spindex > -1) {\t\t\t\r\n\t\t\t\t\tconst offset = Number(par.substr(spindex + 1));\t\t\r\n\t\t\t\t\tconst color = jmUtils.trim(par.substr(0, spindex));\r\n\t\t\t\t\tif(!isNaN(offset) && color) {\r\n\t\t\t\t\t\tthis.addStop(offset, color);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 转换为渐变的字符串表达\r\n\t *\r\n\t * @method toString\r\n\t * @for jmGradient\r\n\t * @return {string} linear-gradient(x1 y1 x2 y2, color1 step, color2 step, ...);\t//radial-gradient(x1 y1 r1 x2 y2 r2, color1 step,color2 step, ...);\r\n\t */\r\n\ttoString() {\r\n\t\tlet str = this.type + '-gradient(';\r\n\t\tif(this.type == 'linear') {\r\n\t\t\tstr += this.x1.toFixed(2) + ' ' + this.y1.toFixed(2) + ' ' + this.x2.toFixed(2) + ' ' + this.y2.toFixed(2);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tstr += this.x1.toFixed(2) + ' ' + this.y1.toFixed(2) + ' ' + this.r1.toFixed(2) + ' ' + this.x2.toFixed(2) + ' ' + this.y2.toFixed(2) + ' ' + this.r2.toFixed(2);\r\n\t\t}\r\n\t\t//颜色渐变\r\n\t\tthis.stops.each(function(i,s) {\t\r\n\t\t\tstr += ',' + s.color + ' ' + s.offset.toFixed(2);\r\n\t\t});\r\n\t\treturn str + ')';\r\n\t}\r\n}\r\n\r\nexport { jmGradient };\r\n\r\n\r\n\r\n","import {jmUtils} from \"./jmUtils.js\";\r\n/**\r\n * 事件模型\r\n *\r\n * @class jmEvents\r\n * @for jmGraph\r\n */\r\nexport default class jmEvents {\r\n\r\n\tconstructor(container, target) {\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\t\tthis.mouseHandler = new jmMouseEvent(this, container, target);\r\n\t\tthis.keyHandler = new jmKeyEvent(this, container, target);\r\n\t}\r\n\r\n\ttouchStart(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchstart';\r\n\t\tthis.container.raiseEvent('touchstart',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchMove(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchmove';\r\n\t\tthis.container.raiseEvent('touchmove',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchEnd(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchend';\r\n\t\t\r\n\t\tthis.container.raiseEvent('touchend',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\ttouchCancel(evt) {\r\n\t\tevt = evt || window.event;\r\n\t\tevt.eventName = 'touchcancel';\r\n\t\t\r\n\t\tthis.container.raiseEvent('touchcancel',evt);\r\n\t\tlet t = evt.target || evt.srcElement;\r\n\t\tif(t == this.target) {\r\n\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\t// 销毁\r\n\tdestroy() {\r\n\t\tthis.mouseHandler.destroy();\r\n\t\tthis.keyHandler.destroy();\r\n\t}\r\n}\r\n\r\n/**\r\n * 鼠标事件处理对象,container 为事件主体,target为响应事件对象\r\n */\r\nclass jmMouseEvent {\r\n\tconstructor(instance, container, target) {\r\n\t\tthis.instance = instance;\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\r\n\t\tthis.eventEvents = {};// 所有绑定的事件\r\n\r\n\t\tthis.init(instance, container, target);\r\n\t}\r\n\t\r\n\tinit(instance, container, target) {\r\n\t\tlet canvas = this.target;\t\r\n\t\tlet doc = typeof typeof document != 'undefined'?document:null;\r\n\t\t//禁用鼠标右健系统菜单\r\n\t\t//canvas.oncontextmenu = function() {\r\n\t\t//\treturn false;\r\n\t\t//};\r\n\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mousedown',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'mousedown';\r\n\t\t\tlet r = container.raiseEvent('mousedown',evt);\r\n\t\t\t//if(r === false) {\r\n\t\t\t\t//if(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t//return false;\r\n\t\t\t//}\t\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mousemove',function(evt) {\t\r\n\t\t\tevt = evt || window.event;\t\t\r\n\t\t\tevt.eventName = 'mousemove';\r\n\t\t\tlet target = evt.target || evt.srcElement;\r\n\t\t\tif(target == canvas) {\r\n\t\t\t\tlet r = container.raiseEvent('mousemove',evt);\r\n\t\t\t\t//if(r === false) {\r\n\t\t\t\t\tif(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t//}\t\t\r\n\t\t\t}\t\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tthis.eventEvents['mousedown'] = jmUtils.bindEvent(this.target,'mouseover',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseover';\r\n\t\t\tcontainer.raiseEvent('mouseover',evt);\r\n\t\t});\r\n\t\tthis.eventEvents['mouseleave'] = jmUtils.bindEvent(this.target,'mouseleave',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseleave';\r\n\t\t\tcontainer.raiseEvent('mouseleave',evt);\r\n\t\t});\t\t\t\r\n\t\tthis.eventEvents['mouseout'] = jmUtils.bindEvent(this.target,'mouseout',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseout';\r\n\t\t\tcontainer.raiseEvent('mouseout',evt);\r\n\t\t});\r\n\t\tdoc && (this.eventEvents['mouseup'] = jmUtils.bindEvent(doc,'mouseup',function(evt) {\r\n\t\t\tevt = evt || window.event;\t\r\n\t\t\tevt.eventName = 'mouseup';\r\n\t\t\t//let target = evt.target || evt.srcElement;\r\n\t\t\t//if(target == canvas) {\t\t\t\t\t\t\r\n\t\t\t\tlet r = container.raiseEvent('mouseup',evt);\r\n\t\t\t\tif(r === false) {\r\n\t\t\t\t\tif(evt.preventDefault) evt.preventDefault();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\t\t\t\t\r\n\t\t\t//}\r\n\t\t}));\r\n\t\t\r\n\t\tthis.eventEvents['dblclick'] = jmUtils.bindEvent(this.target,'dblclick',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'dblclick';\r\n\t\t\tcontainer.raiseEvent('dblclick',evt);\r\n\t\t});\r\n\t\tthis.eventEvents['click'] = jmUtils.bindEvent(this.target,'click',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'click';\r\n\t\t\tcontainer.raiseEvent('click',evt);\r\n\t\t});\r\n\r\n\t\tdoc && (this.eventEvents['resize'] = jmUtils.bindEvent(doc,'resize',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tevt.eventName = 'resize';\r\n\t\t\treturn container.raiseEvent('resize',evt);\r\n\t\t}));\r\n\r\n\t\t// passive: false 为了让浏览器不告警并且preventDefault有效\r\n\t\t// 另一种处理:touch-action: none; 这样任何触摸事件都不会产生默认行为,但是 touch 事件照样触发。\r\n\t\tthis.eventEvents['touchstart'] = jmUtils.bindEvent(this.target,'touchstart', function(evt) {\r\n\t\t\tevt.eventName = 'touchstart';\r\n\t\t\treturn instance.touchStart(evt);\r\n\t\t},{ passive: false });\r\n\r\n\t\tthis.eventEvents['touchmove'] = jmUtils.bindEvent(this.target,'touchmove', function(evt) {\r\n\t\t\tevt.eventName = 'touchmove';\r\n\t\t\treturn instance.touchMove(evt);\r\n\t\t},{ passive: false });\r\n\r\n\t\tdoc && (this.eventEvents['touchend'] = jmUtils.bindEvent(doc,'touchend', function(evt) {\r\n\t\t\tevt.eventName = 'touchend';\r\n\t\t\treturn instance.touchEnd(evt);\r\n\t\t},{ passive: false }));\r\n\r\n\t\tdoc && (this.eventEvents['touchcancel'] = jmUtils.bindEvent(doc,'touchcancel', function(evt) {\r\n\t\t\tevt.eventName = 'touchcancel';\r\n\t\t\treturn instance.touchCancel(evt);\r\n\t\t},{ passive: false }));\r\n\t}\r\n\r\n\t// 销毁所有事件\r\n\tdestroy() {\r\n\t\tfor(let name in this.eventEvents) {\r\n\t\t\tconst event = this.eventEvents[name];\r\n\t\t\tif(!event || !event.fun) continue;\r\n\t\t\tjmUtils.removeEvent(event.target, name, event.fun);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * 健盘事件处理对象,container 为事件主体,target为响应事件对象\r\n */\r\nclass jmKeyEvent {\r\n\tconstructor(instance, container,target) {\r\n\t\tthis.instance = instance;\r\n\t\tthis.container = container;\r\n\t\tthis.target = target || container;\r\n\r\n\t\tthis.eventEvents = {};// 所有绑定的事件\r\n\r\n\t\tthis.init(container, target);\r\n\t}\r\n\r\n\t/**\r\n\t * 初始化健盘事件\r\n\t */\r\n\tinit(container, target) {\r\n\t\tlet doc = typeof typeof document != 'undefined'?document:null;\r\n\t\t/**\r\n\t\t * 检查是否触发健盘事件至画布\r\n\t\t * 如果触发对象为输入框等对象则不响应事件\r\n\t\t * \r\n\t\t */\r\n\t\tlet checkKeyEvent = (evt) => {\r\n\t\t\tlet target = evt.srcElement || evt.target;\r\n\t\t\tif(target && (target.tagName == 'INPUT' \r\n\t\t\t\t|| target.tagName == 'TEXTAREA'\r\n\t\t\t\t|| target.tagName == 'ANCHOR' \r\n\t\t\t\t|| target.tagName == 'FORM' \r\n\t\t\t\t|| target.tagName == 'FILE'\r\n\t\t\t\t|| target.tagName == 'IMG'\r\n\t\t\t\t|| target.tagName == 'HIDDEN'\r\n\t\t\t\t|| target.tagName == 'RADIO'\r\n\t\t\t\t|| target.tagName == 'TEXT'\t)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tdoc && (this.eventEvents['keypress'] = jmUtils.bindEvent(doc,'keypress',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keypress',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\r\n\t\tdoc && (this.eventEvents['keydown'] = jmUtils.bindEvent(doc,'keydown',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keydown',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\r\n\t\tdoc && (this.eventEvents['keyup'] = jmUtils.bindEvent(doc,'keyup',function(evt) {\r\n\t\t\tevt = evt || window.event;\r\n\t\t\tif(!checkKeyEvent(evt)) return;//如果事件为其它输入框,则不响应\r\n\t\t\tlet r = container.raiseEvent('keyup',evt);\r\n\t\t\tif(r === false && evt.preventDefault) \r\n\t\t\t\tevt.preventDefault();\r\n\t\t\treturn r;\r\n\t\t}));\t\t\t\r\n\t}\r\n\r\n\t// 销毁所有事件\r\n\tdestroy() {\r\n\t\tfor(let name in this.eventEvents) {\r\n\t\t\tconst event = this.eventEvents[name];\r\n\t\t\tif(!event || !event.fun) continue;\r\n\t\t\tjmUtils.removeEvent(event.target, name, event.fun);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport { jmEvents };\r\n","'use strict';\r\n\r\nexport default earcut;\r\n\r\nfunction earcut(data, holeIndices, dim) {\r\n\r\n dim = dim || 2;\r\n\r\n var hasHoles = holeIndices && holeIndices.length,\r\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\r\n outerNode = linkedList(data, 0, outerLen, dim, true),\r\n triangles = [];\r\n\r\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\r\n\r\n var minX, minY, maxX, maxY, x, y, invSize;\r\n\r\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\r\n\r\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\r\n if (data.length > 80 * dim) {\r\n minX = maxX = data[0];\r\n minY = maxY = data[1];\r\n\r\n for (var i = dim; i < outerLen; i += dim) {\r\n x = data[i];\r\n y = data[i + 1];\r\n if (x < minX) minX = x;\r\n if (y < minY) minY = y;\r\n if (x > maxX) maxX = x;\r\n if (y > maxY) maxY = y;\r\n }\r\n\r\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\r\n invSize = Math.max(maxX - minX, maxY - minY);\r\n invSize = invSize !== 0 ? 32767 / invSize : 0;\r\n }\r\n\r\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\r\n\r\n return triangles;\r\n}\r\n\r\n// create a circular doubly linked list from polygon points in the specified winding order\r\nfunction linkedList(data, start, end, dim, clockwise) {\r\n var i, last;\r\n\r\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\r\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\r\n } else {\r\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\r\n }\r\n\r\n if (last && equals(last, last.next)) {\r\n removeNode(last);\r\n last = last.next;\r\n }\r\n\r\n return last;\r\n}\r\n\r\n// eliminate colinear or duplicate points\r\nfunction filterPoints(start, end) {\r\n if (!start) return start;\r\n if (!end) end = start;\r\n\r\n var p = start,\r\n again;\r\n do {\r\n again = false;\r\n\r\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\r\n removeNode(p);\r\n p = end = p.prev;\r\n if (p === p.next) break;\r\n again = true;\r\n\r\n } else {\r\n p = p.next;\r\n }\r\n } while (again || p !== end);\r\n\r\n return end;\r\n}\r\n\r\n// main ear slicing loop which triangulates a polygon (given as a linked list)\r\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\r\n if (!ear) return;\r\n\r\n // interlink polygon nodes in z-order\r\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\r\n\r\n var stop = ear,\r\n prev, next;\r\n\r\n // iterate through ears, slicing them one by one\r\n while (ear.prev !== ear.next) {\r\n prev = ear.prev;\r\n next = ear.next;\r\n\r\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\r\n // cut off the triangle\r\n triangles.push(prev.i / dim | 0);\r\n triangles.push(ear.i / dim | 0);\r\n triangles.push(next.i / dim | 0);\r\n\r\n removeNode(ear);\r\n\r\n // skipping the next vertex leads to less sliver triangles\r\n ear = next.next;\r\n stop = next.next;\r\n\r\n continue;\r\n }\r\n\r\n ear = next;\r\n\r\n // if we looped through the whole remaining polygon and can't find any more ears\r\n if (ear === stop) {\r\n // try filtering points and slicing again\r\n if (!pass) {\r\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\r\n\r\n // if this didn't work, try curing all small self-intersections locally\r\n } else if (pass === 1) {\r\n ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\r\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\r\n\r\n // as a last resort, try splitting the remaining polygon into two\r\n } else if (pass === 2) {\r\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// check whether a polygon node forms a valid ear with adjacent nodes\r\nfunction isEar(ear) {\r\n var a = ear.prev,\r\n b = ear,\r\n c = ear.next;\r\n\r\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\r\n\r\n // now make sure we don't have other points inside the potential ear\r\n var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\r\n\r\n // triangle bbox; min & max are calculated like this for speed\r\n var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\r\n y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\r\n x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\r\n y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\r\n\r\n var p = c.next;\r\n while (p !== a) {\r\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\r\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\r\n area(p.prev, p, p.next) >= 0) return false;\r\n p = p.next;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction isEarHashed(ear, minX, minY, invSize) {\r\n var a = ear.prev,\r\n b = ear,\r\n c = ear.next;\r\n\r\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\r\n\r\n var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\r\n\r\n // triangle bbox; min & max are calculated like this for speed\r\n var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\r\n y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\r\n x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\r\n y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\r\n\r\n // z-order range for the current triangle bbox;\r\n var minZ = zOrder(x0, y0, minX, minY, invSize),\r\n maxZ = zOrder(x1, y1, minX, minY, invSize);\r\n\r\n var p = ear.prevZ,\r\n n = ear.nextZ;\r\n\r\n // look for points inside the triangle in both directions\r\n while (p && p.z >= minZ && n && n.z <= maxZ) {\r\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\r\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\r\n p = p.prevZ;\r\n\r\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\r\n pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\r\n n = n.nextZ;\r\n }\r\n\r\n // look for remaining points in decreasing z-order\r\n while (p && p.z >= minZ) {\r\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\r\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\r\n p = p.prevZ;\r\n }\r\n\r\n // look for remaining points in increasing z-order\r\n while (n && n.z <= maxZ) {\r\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\r\n pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\r\n n = n.nextZ;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// go through all polygon nodes and cure small local self-intersections\r\nfunction cureLocalIntersections(start, triangles, dim) {\r\n var p = start;\r\n do {\r\n var a = p.prev,\r\n b = p.next.next;\r\n\r\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\r\n\r\n triangles.push(a.i / dim | 0);\r\n triangles.push(p.i / dim | 0);\r\n triangles.push(b.i / dim | 0);\r\n\r\n // remove two nodes involved\r\n removeNode(p);\r\n removeNode(p.next);\r\n\r\n p = start = b;\r\n }\r\n p = p.next;\r\n } while (p !== start);\r\n\r\n return filterPoints(p);\r\n}\r\n\r\n// try splitting polygon into two and triangulate them independently\r\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\r\n // look for a valid diagonal that divides the polygon into two\r\n var a = start;\r\n do {\r\n var b = a.next.next;\r\n while (b !== a.prev) {\r\n if (a.i !== b.i && isValidDiagonal(a, b)) {\r\n // split the polygon in two by the diagonal\r\n var c = splitPolygon(a, b);\r\n\r\n // filter colinear points around the cuts\r\n a = filterPoints(a, a.next);\r\n c = filterPoints(c, c.next);\r\n\r\n // run earcut on each half\r\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\r\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\r\n return;\r\n }\r\n b = b.next;\r\n }\r\n a = a.next;\r\n } while (a !== start);\r\n}\r\n\r\n// link every hole into the outer loop, producing a single-ring polygon without holes\r\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\r\n var queue = [],\r\n i, len, start, end, list;\r\n\r\n for (i = 0, len = holeIndices.length; i < len; i++) {\r\n start = holeIndices[i] * dim;\r\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\r\n list = linkedList(data, start, end, dim, false);\r\n if (list === list.next) list.steiner = true;\r\n queue.push(getLeftmost(list));\r\n }\r\n\r\n queue.sort(compareX);\r\n\r\n // process holes from left to right\r\n for (i = 0; i < queue.length; i++) {\r\n outerNode = eliminateHole(queue[i], outerNode);\r\n }\r\n\r\n return outerNode;\r\n}\r\n\r\nfunction compareX(a, b) {\r\n return a.x - b.x;\r\n}\r\n\r\n// find a bridge between vertices that connects hole with an outer ring and and link it\r\nfunction eliminateHole(hole, outerNode) {\r\n var bridge = findHoleBridge(hole, outerNode);\r\n if (!bridge) {\r\n return outerNode;\r\n }\r\n\r\n var bridgeReverse = splitPolygon(bridge, hole);\r\n\r\n // filter collinear points around the cuts\r\n filterPoints(bridgeReverse, bridgeReverse.next);\r\n return filterPoints(bridge, bridge.next);\r\n}\r\n\r\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\r\nfunction findHoleBridge(hole, outerNode) {\r\n var p = outerNode,\r\n hx = hole.x,\r\n hy = hole.y,\r\n qx = -Infinity,\r\n m;\r\n\r\n // find a segment intersected by a ray from the hole's leftmost point to the left;\r\n // segment's endpoint with lesser x will be potential connection point\r\n do {\r\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\r\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\r\n if (x <= hx && x > qx) {\r\n qx = x;\r\n m = p.x < p.next.x ? p : p.next;\r\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\r\n }\r\n }\r\n p = p.next;\r\n } while (p !== outerNode);\r\n\r\n if (!m) return null;\r\n\r\n // look for points inside the triangle of hole point, segment intersection and endpoint;\r\n // if there are no points found, we have a valid connection;\r\n // otherwise choose the point of the minimum angle with the ray as connection point\r\n\r\n var stop = m,\r\n mx = m.x,\r\n my = m.y,\r\n tanMin = Infinity,\r\n tan;\r\n\r\n p = m;\r\n\r\n do {\r\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\r\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\r\n\r\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\r\n\r\n if (locallyInside(p, hole) &&\r\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\r\n m = p;\r\n tanMin = tan;\r\n }\r\n }\r\n\r\n p = p.next;\r\n } while (p !== stop);\r\n\r\n return m;\r\n}\r\n\r\n// whether sector in vertex m contains sector in vertex p in the same coordinates\r\nfunction sectorContainsSector(m, p) {\r\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\r\n}\r\n\r\n// interlink polygon nodes in z-order\r\nfunction indexCurve(start, minX, minY, invSize) {\r\n var p = start;\r\n do {\r\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\r\n p.prevZ = p.prev;\r\n p.nextZ = p.next;\r\n p = p.next;\r\n } while (p !== start);\r\n\r\n p.prevZ.nextZ = null;\r\n p.prevZ = null;\r\n\r\n sortLinked(p);\r\n}\r\n\r\n// Simon Tatham's linked list merge sort algorithm\r\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\r\nfunction sortLinked(list) {\r\n var i, p, q, e, tail, numMerges, pSize, qSize,\r\n inSize = 1;\r\n\r\n do {\r\n p = list;\r\n list = null;\r\n tail = null;\r\n numMerges = 0;\r\n\r\n while (p) {\r\n numMerges++;\r\n q = p;\r\n pSize = 0;\r\n for (i = 0; i < inSize; i++) {\r\n pSize++;\r\n q = q.nextZ;\r\n if (!q) break;\r\n }\r\n qSize = inSize;\r\n\r\n while (pSize > 0 || (qSize > 0 && q)) {\r\n\r\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\r\n e = p;\r\n p = p.nextZ;\r\n pSize--;\r\n } else {\r\n e = q;\r\n q = q.nextZ;\r\n qSize--;\r\n }\r\n\r\n if (tail) tail.nextZ = e;\r\n else list = e;\r\n\r\n e.prevZ = tail;\r\n tail = e;\r\n }\r\n\r\n p = q;\r\n }\r\n\r\n tail.nextZ = null;\r\n inSize *= 2;\r\n\r\n } while (numMerges > 1);\r\n\r\n return list;\r\n}\r\n\r\n// z-order of a point given coords and inverse of the longer side of data bbox\r\nfunction zOrder(x, y, minX, minY, invSize) {\r\n // coords are transformed into non-negative 15-bit integer range\r\n x = (x - minX) * invSize | 0;\r\n y = (y - minY) * invSize | 0;\r\n\r\n x = (x | (x << 8)) & 0x00FF00FF;\r\n x = (x | (x << 4)) & 0x0F0F0F0F;\r\n x = (x | (x << 2)) & 0x33333333;\r\n x = (x | (x << 1)) & 0x55555555;\r\n\r\n y = (y | (y << 8)) & 0x00FF00FF;\r\n y = (y | (y << 4)) & 0x0F0F0F0F;\r\n y = (y | (y << 2)) & 0x33333333;\r\n y = (y | (y << 1)) & 0x55555555;\r\n\r\n return x | (y << 1);\r\n}\r\n\r\n// find the leftmost node of a polygon ring\r\nfunction getLeftmost(start) {\r\n var p = start,\r\n leftmost = start;\r\n do {\r\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\r\n p = p.next;\r\n } while (p !== start);\r\n\r\n return leftmost;\r\n}\r\n\r\n// check if a point lies within a convex triangle\r\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\r\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\r\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\r\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\r\n}\r\n\r\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\r\nfunction isValidDiagonal(a, b) {\r\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\r\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\r\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\r\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\r\n}\r\n\r\n// signed area of a triangle\r\nfunction area(p, q, r) {\r\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\r\n}\r\n\r\n// check if two points are equal\r\nfunction equals(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n// check if two segments intersect\r\nfunction intersects(p1, q1, p2, q2) {\r\n var o1 = sign(area(p1, q1, p2));\r\n var o2 = sign(area(p1, q1, q2));\r\n var o3 = sign(area(p2, q2, p1));\r\n var o4 = sign(area(p2, q2, q1));\r\n\r\n if (o1 !== o2 && o3 !== o4) return true; // general case\r\n\r\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\r\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\r\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\r\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\r\n\r\n return false;\r\n}\r\n\r\n// for collinear points p, q, r, check if point q lies on segment pr\r\nfunction onSegment(p, q, r) {\r\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\r\n}\r\n\r\nfunction sign(num) {\r\n return num > 0 ? 1 : num < 0 ? -1 : 0;\r\n}\r\n\r\n// check if a polygon diagonal intersects any polygon segments\r\nfunction intersectsPolygon(a, b) {\r\n var p = a;\r\n do {\r\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\r\n intersects(p, p.next, a, b)) return true;\r\n p = p.next;\r\n } while (p !== a);\r\n\r\n return false;\r\n}\r\n\r\n// check if a polygon diagonal is locally inside the polygon\r\nfunction locallyInside(a, b) {\r\n return area(a.prev, a, a.next) < 0 ?\r\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\r\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\r\n}\r\n\r\n// check if the middle point of a polygon diagonal is inside the polygon\r\nfunction middleInside(a, b) {\r\n var p = a,\r\n inside = false,\r\n px = (a.x + b.x) / 2,\r\n py = (a.y + b.y) / 2;\r\n do {\r\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\r\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\r\n inside = !inside;\r\n p = p.next;\r\n } while (p !== a);\r\n\r\n return inside;\r\n}\r\n\r\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\r\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\r\nfunction splitPolygon(a, b) {\r\n var a2 = new Node(a.i, a.x, a.y),\r\n b2 = new Node(b.i, b.x, b.y),\r\n an = a.next,\r\n bp = b.prev;\r\n\r\n a.next = b;\r\n b.prev = a;\r\n\r\n a2.next = an;\r\n an.prev = a2;\r\n\r\n b2.next = a2;\r\n a2.prev = b2;\r\n\r\n bp.next = b2;\r\n b2.prev = bp;\r\n\r\n return b2;\r\n}\r\n\r\n// create a node and optionally link it with previous one (in a circular doubly linked list)\r\nfunction insertNode(i, x, y, last) {\r\n var p = new Node(i, x, y);\r\n\r\n if (!last) {\r\n p.prev = p;\r\n p.next = p;\r\n\r\n } else {\r\n p.next = last.next;\r\n p.prev = last;\r\n last.next.prev = p;\r\n last.next = p;\r\n }\r\n return p;\r\n}\r\n\r\nfunction removeNode(p) {\r\n p.next.prev = p.prev;\r\n p.prev.next = p.next;\r\n\r\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\r\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\r\n}\r\n\r\nfunction Node(i, x, y) {\r\n // vertex index in coordinates array\r\n this.i = i;\r\n\r\n // vertex coordinates\r\n this.x = x;\r\n this.y = y;\r\n\r\n // previous and next vertex nodes in a polygon ring\r\n this.prev = null;\r\n this.next = null;\r\n\r\n // z-order curve value\r\n this.z = 0;\r\n\r\n // previous and next nodes in z-order\r\n this.prevZ = null;\r\n this.nextZ = null;\r\n\r\n // indicates whether this is a steiner point\r\n this.steiner = false;\r\n}\r\n\r\n// return a percentage difference between the polygon area and its triangulation area;\r\n// used to verify correctness of triangulation\r\nearcut.deviation = function (data, holeIndices, dim, triangles) {\r\n var hasHoles = holeIndices && holeIndices.length;\r\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\r\n\r\n var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\r\n if (hasHoles) {\r\n for (var i = 0, len = holeIndices.length; i < len; i++) {\r\n var start = holeIndices[i] * dim;\r\n var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\r\n polygonArea -= Math.abs(signedArea(data, start, end, dim));\r\n }\r\n }\r\n\r\n var trianglesArea = 0;\r\n for (i = 0; i < triangles.length; i += 3) {\r\n var a = triangles[i] * dim;\r\n var b = triangles[i + 1] * dim;\r\n var c = triangles[i + 2] * dim;\r\n trianglesArea += Math.abs(\r\n (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\r\n (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\r\n }\r\n\r\n return polygonArea === 0 && trianglesArea === 0 ? 0 :\r\n Math.abs((trianglesArea - polygonArea) / polygonArea);\r\n};\r\n\r\nfunction signedArea(data, start, end, dim) {\r\n var sum = 0;\r\n for (var i = start, j = end - dim; i < end; i += dim) {\r\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\r\n j = i;\r\n }\r\n return sum;\r\n}\r\n\r\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\r\nearcut.flatten = function (data) {\r\n var dim = data[0][0].length,\r\n result = {vertices: [], holes: [], dimensions: dim},\r\n holeIndex = 0;\r\n\r\n for (var i = 0; i < data.length; i++) {\r\n for (var j = 0; j < data[i].length; j++) {\r\n for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\r\n }\r\n if (i > 0) {\r\n holeIndex += data[i - 1].length;\r\n result.holes.push(holeIndex);\r\n }\r\n }\r\n return result;\r\n};\r\n","const WebglGradientTextureCache = {};\r\n// 渐变\r\nclass WeblGradient {\r\n // type:[linear= 线性渐变,radial=放射性渐变] \r\n constructor(type='linear', params={}) {\r\n this.type = type || 'linear';\r\n\r\n this.x1 = params.x1 || 0;\r\n this.y1 = params.y1 || 0;\r\n this.r1 = params.r1 || 0;\r\n this.x2 = params.x2 || 0;\r\n this.y2 = params.y2 || 0;\r\n this.r2 = params.r2 || 0;\r\n\r\n this.bounds = params.bounds || {\r\n left: 0,\r\n top: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n\r\n this.control = params.control;\r\n\r\n this.stops = [];\r\n this.init();\r\n }\r\n\r\n init() {\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n\r\n if(this.type === 'radial') {\r\n this.length = this.r2 - this.r1;\r\n }\r\n else if(dx === 0 && dy === 0) {\r\n this.length = 0;\r\n }\r\n else {\r\n // 渐变中心的距离\r\n this.length = Math.sqrt(Math.pow(dx, 2), Math.pow(dy, 2));\r\n this.sin = dy / this.length;\r\n this.cos = dx / this.length;\r\n }\r\n }\r\n\r\n // 渐变颜色\r\n addColorStop(offset, color) {\r\n this.stops.push({\r\n offset,\r\n color\r\n });\r\n }\r\n\r\n // 转为渐变为纹理\r\n toImageData(control, bounds) {\r\n const key = this.toString() + `-${bounds.width.toFixed(4)}x${bounds.height.toFixed(4)}`;\r\n if(WebglGradientTextureCache[key]) return WebglGradientTextureCache[key];\r\n\r\n let canvas = control.graph.textureCanvas;\r\n if(!canvas) {\r\n canvas = control.graph.textureCanvas = document.createElement('canvas');\r\n }\r\n canvas.width = bounds.width;\r\n canvas.height = bounds.height;\r\n\r\n if(!canvas.width || !canvas.height) {\r\n return null;\r\n }\r\n\r\n const ctx = canvas.getContext('2d', {\r\n willReadFrequently: true\r\n });\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n let gradient = null;\r\n if(this.type === 'linear') {\r\n gradient = ctx.createLinearGradient(this.x1, this.y1, this.x2, this.y2);\r\n }\r\n else {\r\n gradient = ctx.createRadialGradient(this.x1, this.y1, this.r1, this.x2, this.y2, this.r2);\r\n }\r\n this.stops.forEach(function(s, i) {\t\r\n const c = control.graph.utils.toColor(s.color);\r\n gradient && gradient.addColorStop(s.offset, c);\t\t\r\n });\r\n ctx.fillStyle = gradient;\r\n\r\n ctx.beginPath();\r\n\r\n ctx.moveTo(0, 0);\r\n ctx.lineTo(bounds.width, 0);\r\n ctx.lineTo(bounds.width, bounds.height);\r\n ctx.lineTo(0, bounds.height);\r\n ctx.lineTo(0, 0);\r\n\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n const data = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n WebglGradientTextureCache[key] = data;\r\n\r\n return data;\r\n }\r\n\r\n // 根据绘制图形的坐标计算出对应点的颜色\r\n /*\r\n toPointColors(points) {\r\n const stops = this.getStops();\r\n const colors = [];\r\n for(let i=0; i<points.length; i+=2) {\r\n const p = {\r\n x: points[i],\r\n y: points[i+1]\r\n }\r\n if(this.type === 'radial') {\r\n const dx = p.x - this.x1;\r\n const dy = p.y - this.y1;\r\n const len = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\r\n const rang = this.getStopRange(len, stops);\r\n if(!rang.start && rang.end) {\r\n colors.push(rang.end.color);\r\n }\r\n else if(!rang.end && rang.start) {\r\n colors.push(rang.start.color);\r\n }\r\n else {\r\n const rangLength = rang.end.length - rang.start.length;\r\n const offlen = len - rang.start.length;\r\n const per = offlen / rangLength;\r\n const color = {\r\n r: rang.start.color.r + (rang.end.color.r - rang.start.color.r) * per,\r\n g: rang.start.color.g + (rang.end.color.g - rang.start.color.g) * per,\r\n b: rang.start.color.b + (rang.end.color.b - rang.start.color.b) * per,\r\n a: rang.start.color.a + (rang.end.color.a - rang.start.color.a) * per,\r\n };\r\n colors.push(color);\r\n }\r\n }\r\n }\r\n return colors;\r\n }\r\n*/\r\n // 根据起点距离获取边界stop\r\n /*\r\n getStopRange(len, stops) {\r\n const res = {};\r\n for(const s of stops) {\r\n if(s.length <= len) {\r\n res.start = s;\r\n }\r\n else {\r\n res.end = s;\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n // 根据stop计算offset长度\r\n getStops() {\r\n const stops = this.stops.sort((p1, p2) => p1.offset - p2.offset); // 渐变色排序从小于大\r\n for(const s of stops) {\r\n \r\n const color = typeof s.color === 'string'? this.control.graph.utils.hexToRGBA(s.color) : s.color;\r\n console.log(s, color);\r\n s.color = this.control.graph.utils.rgbToDecimal(color);\r\n s.length = s.offset * this.length;\r\n }\r\n return stops;\r\n }\r\n*/\r\n /**\r\n\t * 转换为渐变的字符串表达\r\n\t *\r\n\t * @method toString\r\n\t * @for jmGradient\r\n\t * @return {string} linear-gradient(x1 y1 x2 y2, color1 step, color2 step, ...);\t//radial-gradient(x1 y1 r1 x2 y2 r2, color1 step,color2 step, ...);\r\n\t */\r\n\ttoString() {\r\n\t\tlet str = this.type + '-gradient(';\r\n\t\tif(this.type == 'linear') {\r\n\t\t\tstr += this.x1 + ' ' + this.y1 + ' ' + this.x2 + ' ' + this.y2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tstr += this.x1 + ' ' + this.y1 + ' ' + this.r1 + ' ' + this.x2 + ' ' + this.y2 + ' ' + this.r2;\r\n\t\t}\r\n\t\t//颜色渐变\r\n\t\tthis.stops.forEach(function(s) {\t\r\n\t\t\tstr += ',' + s.color + ' ' + s.offset;\r\n\t\t});\r\n\t\treturn str + ')';\r\n\t}\r\n}\r\n\r\nexport default WeblGradient;","// 生成着色器\r\n// type: gl.VERTEX_SHADER 顶点着色器 , gl.FRAGMENT_SHADER 片段着色器\r\n// src: 着色器代码\r\nfunction createShader(gl, type, src) {\r\n const shader = gl.createShader(type) // 创建一个顶点着色器\r\n gl.shaderSource(shader, src); // 编写顶点着色器代码\r\n gl.compileShader(shader); // 编译着色器\r\n\r\n return shader;\r\n}\r\n\r\nexport {\r\n createShader\r\n}","\r\nconst GLSL_TO_SIZE = {\r\n 'float': 1,\r\n 'vec2': 2,\r\n 'vec3': 3,\r\n 'vec4': 4,\r\n\r\n 'int': 1,\r\n 'ivec2': 2,\r\n 'ivec3': 3,\r\n 'ivec4': 4,\r\n\r\n 'bool': 1,\r\n 'bvec2': 2,\r\n 'bvec3': 3,\r\n 'bvec4': 4,\r\n\r\n 'mat2': 4,\r\n 'mat3': 9,\r\n 'mat4': 16,\r\n\r\n 'sampler2D': 1\r\n};\r\n\r\n/**\r\n * @class\r\n * @memberof PIXI.glCore.shader\r\n * @param type {String}\r\n * @return {Number}\r\n */\r\nconst mapSize = function(type) { \r\n return GLSL_TO_SIZE[type];\r\n};\r\n\r\n\r\n\r\n\r\nexport {\r\n mapSize\r\n}\r\n","\r\nvar GL_TABLE = null;\r\n\r\nconst GL_TO_GLSL_TYPES = {\r\n 'FLOAT': 'float',\r\n 'FLOAT_VEC2': 'vec2',\r\n 'FLOAT_VEC3': 'vec3',\r\n 'FLOAT_VEC4': 'vec4',\r\n\r\n 'INT': 'int',\r\n 'INT_VEC2': 'ivec2',\r\n 'INT_VEC3': 'ivec3',\r\n 'INT_VEC4': 'ivec4',\r\n \r\n 'BOOL': 'bool',\r\n 'BOOL_VEC2': 'bvec2',\r\n 'BOOL_VEC3': 'bvec3',\r\n 'BOOL_VEC4': 'bvec4',\r\n \r\n 'FLOAT_MAT2': 'mat2',\r\n 'FLOAT_MAT3': 'mat3',\r\n 'FLOAT_MAT4': 'mat4',\r\n \r\n 'SAMPLER_2D': 'sampler2D' \r\n};\r\n\r\nconst mapType = function(gl, type) {\r\n if(!GL_TABLE) {\r\n const typeNames = Object.keys(GL_TO_GLSL_TYPES);\r\n GL_TABLE = {};\r\n for(let i = 0; i < typeNames.length; ++i) {\r\n const tn = typeNames[i];\r\n GL_TABLE[ gl[tn] ] = GL_TO_GLSL_TYPES[tn];\r\n }\r\n }\r\n\r\n return GL_TABLE[type];\r\n};\r\n\r\n\r\nexport {\r\n mapType\r\n}\r\n","import {\r\n createShader\r\n} from './shader.js';\r\nimport {\r\n mapSize\r\n} from './mapSize.js';\r\nimport {\r\n mapType\r\n} from './mapType.js';\r\n\r\n// 创建程序\r\nfunction createProgram(gl, vertexSrc, fragmentSrc) {\r\n // 创建顶点着色器\r\n const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSrc);\r\n // 创建片段着色器\r\n const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSrc);\r\n\r\n const program = gl.createProgram() // 创建一个程序\r\n gl.attachShader(program, vertexShader) // 添加顶点着色器\r\n gl.attachShader(program, fragmentShader) // 添加片元着色器\r\n gl.linkProgram(program) // 连接 program 中的着色器\r\n\r\n // 检查程序链接状态\r\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\r\n console.error('PError: Could not initialize shader.');\r\n console.error('gl.VALIDATE_STATUS', gl.getProgramParameter(program, gl.VALIDATE_STATUS));\r\n console.error('gl.getError()', gl.getError());\r\n\r\n // if there is a program info log, log it\r\n if (gl.getProgramInfoLog(program) !== '') {\r\n console.warn('Warning: gl.getProgramInfoLog()', gl.getProgramInfoLog(program));\r\n }\r\n\r\n gl.deleteProgram(program);\r\n }\r\n\r\n useProgram(gl, program);\r\n\r\n // clean up some shaders\r\n gl.deleteShader(vertexShader);\r\n gl.deleteShader(fragmentShader);\r\n\r\n const attrs = extractAttributes(gl, program);\r\n const uniforms = extractUniforms(gl, program);\r\n \r\n return {\r\n program,\r\n attrs,\r\n uniforms\r\n };\r\n}\r\n\r\n// 采用program\r\nfunction useProgram(gl, program) {\r\n return gl.useProgram(program); // 告诉 webgl 用这个 program 进行渲染\r\n}\r\n\r\nfunction extractAttributes(gl, program) {\r\n const attributes = {};\r\n\r\n const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\r\n\r\n for (let i = 0; i < count; i++){\r\n const attribData = gl.getActiveAttrib(program, i);\r\n const type = mapType(gl, attribData.type);\r\n attributes[attribData.name] = {\r\n attribData,\r\n size: mapSize(type),\r\n type,\r\n location: gl.getAttribLocation(program, attribData.name), \r\n };\r\n }\r\n\r\n return attributes;\r\n}\r\n\r\nfunction extractUniforms(gl, program) {\r\n\tconst uniforms = {};\r\n\r\n const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\r\n\r\n for (let i = 0; i < count; i++) {\r\n \tconst uniformData = gl.getActiveUniform(program, i);\r\n \tconst name = uniformData.name.replace(/\\[.*?\\]/, \"\");\r\n const type = mapType(gl, uniformData.type );\r\n\r\n \tuniforms[name] = {\r\n uniformData,\r\n \t\ttype: type,\r\n \t\tsize: uniformData.size,\r\n \t\tlocation: gl.getUniformLocation(program, name),\r\n \t};\r\n }\r\n\r\n\treturn uniforms;\r\n};\r\n\r\n\r\n// 把缓冲区的值写入变量\r\n// size: 组成数量,必须是1,2,3或4. 每个单元由多少个数组成\r\n// strip: 步长 数组中一行长度,0 表示数据是紧密的没有空隙,让OpenGL决定具体步长\r\n// offset: 字节偏移量,必须是类型的字节长度的倍数。\r\n// dataType: 每个元素的数据类型\r\nfunction writeVertexAttrib(gl, buffer, attr, size=2,strip=0,offset=0,dataType=gl.FLOAT) {\r\n gl.bindBuffer(buffer.type, buffer.buffer);\r\n gl.vertexAttribPointer( // 告诉 OpenGL 如何从 Buffer 中获取数据\r\n attr.location, // 顶点属性的索引\r\n size, // 组成数量,必须是1,2,3或4。我们只提供了 x 和 y\r\n dataType,\r\n false, // 是否归一化到特定的范围,对 FLOAT 类型数据设置无效\r\n strip * buffer.unitSize,\r\n offset\r\n )\r\n gl.enableVertexAttribArray(attr.location);\r\n return buffer;\r\n}\r\n\r\nfunction disableVertexAttribArray(gl, attr) {\r\n return gl.disableVertexAttribArray(attr.location);\r\n}\r\n\r\nfunction getAttribLocation(gl, program, name) {\r\n return gl.getAttribLocation(program, name);\r\n}\r\n\r\nfunction getUniformLocation(gl, program, name) {\r\n return gl.getUniformLocation(program, name);\r\n}\r\n\r\nexport {\r\n createProgram,\r\n useProgram,\r\n getAttribLocation,\r\n getUniformLocation,\r\n extractAttributes,\r\n extractUniforms,\r\n writeVertexAttrib,\r\n disableVertexAttribArray\r\n}","\r\n// 创建缓冲区\r\nfunction createBuffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {\r\n //先创建一个缓存对象\r\n const buffer = gl.createBuffer();\r\n if(!buffer) {\r\n throw Error('创建缓冲区对象失败');\r\n }\r\n //说明缓存对象保存的类型\r\n gl.bindBuffer(type, buffer);\r\n //写入坐标数据\r\n // 因为会将数据发送到 GPU,为了省去数据解析,这里使用 Float32Array 直接传送数据\r\n gl.bufferData(type, data, drawType); // 表示缓冲区的内容不会经常更改\r\n return {\r\n type,\r\n drawType,\r\n buffer,\r\n // 获取到数组中单个元素的字节数\r\n unitSize: data.BYTES_PER_ELEMENT\r\n };\r\n}\r\n\r\n// 创建float32的buffer\r\nfunction createFloat32Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {\r\n const vertices = new Float32Array(data);\r\n const buffer = createBuffer(gl, vertices, type, drawType);\r\n return buffer;\r\n}\r\n\r\n// 创建uint16的bugger\r\nfunction createUint16Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {\r\n const vertices = new Uint16Array(data);\r\n const buffer = createBuffer(gl, vertices, type, drawType);\r\n return buffer;\r\n}\r\n\r\n// 释放\r\nfunction deleteBuffer(gl, buffer) {\r\n gl.deleteBuffer(buffer.buffer || buffer);\r\n}\r\n\r\n\r\nexport {\r\n createBuffer,\r\n createUint16Buffer,\r\n createFloat32Buffer,\r\n deleteBuffer,\r\n}","\r\n// 生成纹理\r\nfunction create2DTexture(gl) {\r\n const texture = gl.createTexture();\r\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1) // 图像反转Y轴\r\n gl.activeTexture(gl.TEXTURE0) // 激活纹理单元\r\n gl.bindTexture(gl.TEXTURE_2D, texture) // 绑定纹理对象\r\n \r\n \r\n gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // 放大处理方式\r\n gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) // 缩小处理方式\r\n gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) // 水平平铺方式\r\n gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) // 竖直平铺方式\r\n\r\n \r\n return texture;\r\n}\r\n\r\n// 创建图片纹理\r\nfunction createImgTexture(gl, img) {\r\n const texture = create2DTexture(gl);\r\n\r\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img) // 配置纹理图像\r\n return {\r\n texture\r\n };\r\n}\r\n\r\n// 用像素值来绘制纹理\r\nfunction createDataTexture(gl, pixels) {\r\n const data = new Uint8Array(pixels.data || pixels);\r\n\r\n const texture = create2DTexture(gl);\r\n\r\n gl.texImage2D(\r\n gl.TEXTURE_2D, // 纹理目标\r\n 0, // 细节级别,指定详细级别。0 级是基本图像等级,n 级是第 n 个金字塔简化级。\r\n gl.RGBA, // 纹理内部格式\r\n pixels.width || 1, // 指定纹理的宽度\r\n pixels.height || 1, // 指定纹理的高度\r\n 0, // 指定纹理的边框宽度。必须为 0。\r\n gl.RGBA, // 源图像数据格式\r\n gl.UNSIGNED_BYTE, // 纹理数据类型\r\n data // 数据\r\n );\r\n return {\r\n texture\r\n };\r\n}\r\n\r\n// 删除纹理\r\nfunction deleteTexture(gl, texture) {\r\n return gl.deleteTexture(texture);\r\n}\r\n\r\nexport {\r\n create2DTexture,\r\n createImgTexture,\r\n createDataTexture,\r\n deleteTexture\r\n}","\r\nimport earcut from '../earcut.js';\r\nimport webglGradient from './gradient.js';\r\nimport {\r\n createProgram,\r\n useProgram,\r\n writeVertexAttrib,\r\n disableVertexAttribArray\r\n} from './core/program.js';\r\n\r\nimport {\r\n createFloat32Buffer,\r\n createUint16Buffer,\r\n deleteBuffer,\r\n} from './core/buffer.js';\r\n\r\nimport {\r\n create2DTexture,\r\n createImgTexture,\r\n createDataTexture,\r\n deleteTexture\r\n} from './core/texture.js';\r\n\r\nclass WeblBase {\r\n constructor(graph, option) {\r\n this.graph = graph;\r\n this.option = option || {};\r\n this.style = {\r\n globalAlpha: 1\r\n };\r\n }\r\n\r\n get context() {\r\n if(this.graph) return this.graph.context;\r\n }\r\n\r\n // 创建程序\r\n createProgram(vertexSrc, fragmentSrc) {\r\n return createProgram(this.context, vertexSrc, fragmentSrc);\r\n }\r\n\r\n // 指定使用某个程序\r\n useProgram(program=this.program) {\r\n program = program.program || program;\r\n if(this.context.__curent_program === program) return program;\r\n useProgram(this.context, program.program || program);\r\n this.context.__curent_program = program;\r\n return program;\r\n }\r\n\r\n getAttribLocation(name) {\r\n return this.context.getAttribLocation(this.program.program, name);\r\n }\r\n \r\n getUniformLocation(name) {\r\n return this.context.getUniformLocation(this.program.program, name);\r\n }\r\n\r\n // 把缓冲区的值写入变量\r\n // buffer: 缓冲区\r\n // size: 组成数量,必须是1,2,3或4. 每个单元由多少个数组成\r\n // strip: 步长 数组中一行长度,0 表示数据是紧密的没有空隙,让OpenGL决定具体步长\r\n // offset: 字节偏移量,必须是类型的字节长度的倍数。\r\n // dataType: 每个元素的数据类型\r\n writeVertexAttrib(buffer, attr, size=2, strip=0, offset=0, dataType=this.context.FLOAT) {\r\n buffer.attr = attr;\r\n return writeVertexAttrib(this.context, buffer, attr, size, strip, offset, dataType);\r\n }\r\n\r\n // 禁用attri\r\n disableVertexAttribArray(attr) {\r\n try{\r\n if(!attr) return attr;\r\n return disableVertexAttribArray(this.context, attr);\r\n }\r\n catch(e) {\r\n console.error(e);\r\n }\r\n return attr;\r\n }\r\n\r\n // 创建float32的buffer\r\n createFloat32Buffer(data, type=this.context.ARRAY_BUFFER, drawType=this.context.STATIC_DRAW) {\r\n const buffer = createFloat32Buffer(this.context, data, type, drawType);\r\n return {\r\n data,\r\n ...buffer\r\n };\r\n }\r\n\r\n createUint16Buffer(data, type=this.context.ARRAY_BUFFER, drawType=this.context.STATIC_DRAW) {\r\n const buffer = createUint16Buffer(this.context, data, type, drawType);\r\n return {\r\n data,\r\n ...buffer\r\n };\r\n }\r\n\r\n // 释放\r\n deleteBuffer(buffer) {\r\n try {\r\n if(!buffer) return;\r\n const bufferHandler = buffer.buffer || buffer;\r\n if(bufferHandler) return deleteBuffer(this.context, bufferHandler);\r\n }\r\n catch(e) {\r\n console.log(buffer);\r\n console.error(e);\r\n }\r\n return buffer;\r\n }\r\n\r\n // 生成纹理\r\n create2DTexture() { \r\n return create2DTexture(this.context);\r\n }\r\n\r\n // 创建图片纹理\r\n createImgTexture(img) {\r\n return createImgTexture(this.context, img);\r\n }\r\n\r\n // 根根像素值生成纹理\r\n createDataTexture(data) {\r\n return createDataTexture(this.context, data);\r\n }\r\n\r\n // 删除纹理\r\n deleteTexture(texture) {\r\n try {\r\n return deleteTexture(this.context, texture.texture || texture);\r\n }\r\n catch(e) {\r\n console.error(e);\r\n }\r\n return texture;\r\n }\r\n\r\n // 多边切割, 得到三角形顶点索引数组\r\n // polygonIndices 顶点索引,\r\n earCutPoints(points) {\r\n const arr = this.pointsToArray(points);\r\n const ps = earcut(arr);// 切割得到3角色顶点索引,\r\n return ps;\r\n }\r\n\r\n // 多边切割, 得到三角形顶点\r\n // polygonIndices 顶点索引,\r\n earCutPointsToTriangles(points) {\r\n const ps = this.earCutPoints(points);// 切割得到3角色顶点索引,\r\n const triangles = [];\r\n // 用顶点索引再组合成坐标数组\r\n for(let i=0;i<ps.length; i+=3) {\r\n const p1 = points[ps[i]];\r\n const p2 = points[ps[i+1]];\r\n const p3 = points[ps[i+2]];\r\n\r\n triangles.push([p1, p2, p3]);// 每三个顶点构成一个三角\r\n }\r\n return triangles;\r\n }\r\n\r\n // 点坐标数组转为一维数组\r\n pointsToArray(points) {\r\n return [].concat(...points.map(p=>[p.x,p.y]));// 把x,y转为数组元素\r\n }\r\n // 每2位表示坐标x,y转为坐标点对象\r\n arrayToPoints(arr) {\r\n const points = [];\r\n for(let i=0;i<arr.length; i+=2) {\r\n points.push({\r\n x: arr[i],\r\n y: arr[i+1]\r\n });\r\n }\r\n return points;\r\n }\r\n\r\n // 创建线性渐变\r\n createLinearGradient(x1, y1, x2, y2, bounds) {\r\n return new webglGradient('linear', {\r\n x1, y1, x2, y2, bounds,\r\n control: this\r\n });\r\n }\r\n // 创建放射性渐变\r\n createRadialGradient(x1, y1, r1, x2, y2, r2, bounds) {\r\n return new webglGradient('radial', {\r\n x1, y1, r1,\r\n x2, y2, r2,\r\n bounds,\r\n control: this\r\n });\r\n }\r\n // 判断是否是一个渐变对象\r\n isGradient(obj) {\r\n return obj && obj instanceof webglGradient;\r\n }\r\n}\r\n\r\nexport default WeblBase;","import WebglBase from './base.js';\r\n\r\n// 把canvas坐标转为webgl坐标系\r\nconst convertPointSource = `\r\n vec4 translatePosition(vec4 point, float x, float y) {\r\n point.x = (point.x-x)/x;\r\n point.y = (y-point.y)/y;\r\n return point;\r\n }`;\r\n// 把纹理的canvas坐标转为纹理的坐标系\r\nconst convertTexturePosition = `\r\n vec2 translateTexturePosition(in vec2 point, vec4 bounds) {\r\n point.x = (point.x-bounds.x)/bounds.z; // 离左上角位置的X长比上纹理宽 0-1\r\n point.y = 1.0-(point.y-bounds.y)/bounds.w; // 离左上角位置的Y长比上高,因为纹理坐标是左下角起,所以要用1-\r\n return point;\r\n }`;\r\n\r\n// path顶点着色器源码\r\nconst pathVertexSource = `\r\n attribute vec4 a_position;\r\n attribute vec4 a_color;\r\n attribute vec2 a_text_coord;\r\n uniform vec2 a_center_point; // 当前canvas的中心位置\r\n uniform float a_point_size; // 点的大小\r\n uniform int a_type;\r\n varying vec4 v_color;\r\n varying vec2 v_text_coord;\r\n varying float v_type;\r\n\r\n ${convertPointSource}\r\n\r\n void main() {\r\n gl_PointSize = a_point_size == 0.0? 1.0 : a_point_size;\r\n v_type = float(a_type);\r\n vec4 pos = translatePosition(a_position, a_center_point.x, a_center_point.y);\r\n gl_Position = pos;\r\n v_color = a_color;\r\n if(a_type == 2) {\r\n v_text_coord = a_text_coord;\r\n }\r\n }\r\n`;\r\n// path 片段着色器源码\r\nconst pathFragmentSource = `\r\n precision highp float;\r\n uniform sampler2D u_sample;\r\n uniform vec4 v_texture_bounds; // 纹理的左上坐标和大小 x,y,z,w\r\n uniform vec4 v_single_color;\r\n varying float v_type;\r\n varying vec4 v_color;\r\n varying vec2 v_text_coord;\r\n\r\n ${convertTexturePosition}\r\n\r\n void main() {\r\n // 如果是fill,则直接填充颜色\r\n if(v_type == 1.0) {\r\n gl_FragColor = v_single_color;\r\n }\r\n // 渐变色\r\n else if(v_type == 3.0) {\r\n gl_FragColor = v_color;\r\n }\r\n else if(v_type == 2.0) {\r\n vec2 pos = translateTexturePosition(v_text_coord, v_texture_bounds);\r\n gl_FragColor = texture2D(u_sample, pos);\r\n }\r\n else {\r\n float r = distance(gl_PointCoord, vec2(0.5, 0.5));\r\n //根据距离设置片元\r\n if(r <= 0.5){\r\n // 方形区域片元距离几何中心半径小于0.5,像素颜色设置红色\r\n gl_FragColor = v_single_color;\r\n }else {\r\n // 方形区域距离几何中心半径不小于0.5的片元剪裁舍弃掉:\r\n discard;\r\n }\r\n }\r\n }\r\n`;\r\n\r\n// path 绘制类\r\nclass WebglPath extends WebglBase {\r\n constructor(graph, option) {\r\n super(graph, option);\r\n // 是否是规则的,不规则的处理方式更为复杂和耗性能\r\n this.isRegular = option.isRegular || false;\r\n this.needCut = option.needCut || false;\r\n\r\n this.points = [];\r\n }\r\n\r\n // i当前程序\r\n get program() {\r\n // 默认所有path用同一个编译好的program\r\n return this.graph.context.pathProgram || (this.graph.context.pathProgram=this.createProgram(pathVertexSource, pathFragmentSource));\r\n }\r\n\r\n // 设置样式\r\n setStyle(style = this.style, value = '') {\r\n this.useProgram();\r\n\r\n if(typeof style === 'string') {\r\n const obj = {};\r\n obj[style] = value;\r\n style = obj;\r\n }\r\n \r\n // 设置线条颜色或填充色\r\n if(style.strokeStyle) {\r\n let color = style.strokeStyle;\r\n if(typeof color === 'string') color = this.graph.utils.hexToRGBA(color);\r\n this.style.strokeStyle = this.graph.utils.rgbToDecimal(color);\r\n delete style.strokeStyle;\r\n }\r\n else if(style.fillStyle) {\r\n let color = style.fillStyle;\r\n if(this.isGradient(color)) {\r\n this.style.fillStyle = color;\r\n }\r\n else {\r\n if(typeof color === 'string') color = this.graph.utils.hexToRGBA(color);\r\n this.style.fillStyle = this.graph.utils.rgbToDecimal(color);\r\n }\r\n delete style.fillStyle;\r\n } \r\n\r\n this.style = {\r\n ...this.style,\r\n ...style\r\n }\r\n }\r\n\r\n setParentBounds(parentBounds = this.parentAbsoluteBounds) {\r\n\r\n //this.useProgram();\r\n\r\n if(parentBounds) this.parentAbsoluteBounds = parentBounds;\r\n // 写入当前canvas大小\r\n this.context.uniform2f(this.program.uniforms.a_center_point.location, this.graph.width / 2, this.graph.height / 2);\r\n }\r\n\r\n setFragColor(color) {\r\n \r\n if(!Array.isArray(color)) {\r\n if(typeof color === 'string') color = this.graph.utils.hexToRGBA(color);\r\n if(typeof color.a === 'undefined') color.a = 1;\r\n this.context.uniform4f(this.program.uniforms.v_single_color.location, color.r, color.g, color.b, color.a * this.style.globalAlpha);\r\n return null;\r\n }\r\n\r\n const colorData = [];\r\n for(let c of color) {\r\n if(typeof c === 'string') c = this.graph.utils.hexToRGBA(c);\r\n if(typeof c.a === 'undefined') c.a = 1;\r\n colorData.push(c.r, c.g, c.b, c.a * this.style.globalAlpha);\r\n }\r\n \r\n const colorBuffer = this.createFloat32Buffer(colorData); \r\n this.writeVertexAttrib(colorBuffer, this.program.attrs.a_color, 4, 0, 0);\r\n colorBuffer.attr = this.program.attrs.a_color;\r\n return colorBuffer;\r\n }\r\n\r\n beginDraw() {\r\n this.useProgram();\r\n }\r\n\r\n // 开始绘制\r\n draw(points, parentBounds = this.parentAbsoluteBounds) {\r\n //this.useProgram();\r\n\r\n this.setParentBounds(parentBounds);\r\n \r\n this.points = points;\r\n }\r\n\r\n endDraw() {\r\n if(this.points) delete this.points;\r\n if(this.pathPoints) delete this.pathPoints;\r\n }\r\n\r\n // 图形封闭\r\n closePath() {\r\n if(this.points && this.points.length > 2 && this.points[0] !== this.points[this.points.length-1]) {\r\n const start = this.points[0];\r\n const end = this.points[this.points.length-1];\r\n if(start != end && !(start.x === end.x && start.y === end.y)) this.points.push(start);\r\n }\r\n }\r\n\r\n // 绘制点数组\r\n writePoints(points, attr = this.program.attrs.a_position) {\r\n \r\n const fixedPoints = [];\r\n for(const p of points) {\r\n fixedPoints.push(\r\n p.x + this.parentAbsoluteBounds.left,\r\n p.y + this.parentAbsoluteBounds.top\r\n );\r\n }\r\n const vertexBuffer = this.createFloat32Buffer(fixedPoints); \r\n this.writeVertexAttrib(vertexBuffer, attr, 2, 0, 0);\r\n vertexBuffer.attr = attr;\r\n return vertexBuffer;\r\n }\r\n\r\n // 连接二个点\r\n genLinePoints(start, end) {\r\n const points = [start];\r\n const dx = end.x - start.x;\r\n const dy = end.y - start.y;\r\n if(dx !== 0 || dy !== 0) {\r\n const len = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));\r\n const cos = dx / len;\r\n const sin = dy / len;\r\n const step = 0.5;\r\n for(let l=step; l<len; l+=step) {\r\n const x = start.x + cos * l;\r\n const y = start.y + sin * l;\r\n points.push({\r\n x: Number(x.toFixed(2)), \r\n y: Number(y.toFixed(2))\r\n });\r\n }\r\n }\r\n points.push(end);\r\n return points;\r\n }\r\n\r\n // 把path坐标集合分解成一个个点,并且处理moveTo线段能力\r\n pathToPoints(points=this.points) {\r\n let start = null;\r\n const res = [];\r\n for(let i=0; i<points.length; i++) {\r\n const p = points[i];\r\n if(start && !p.m) {\r\n const linePoints = this.genLinePoints(start, p);\r\n res.push(...linePoints);\r\n }\r\n else if(start && !res.includes(start)) {\r\n res.push(start);\r\n }\r\n start = p;\r\n }\r\n if(!res.includes(start)) res.push(start);\r\n return res;\r\n }\r\n // 二点是否重合\r\n equalPoint(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n }\r\n // 把path坐标集合转为线段集\r\n pathToLines(points) {\r\n let start = null;\r\n const res = [];\r\n for(let i=0; i<points.length; i++) {\r\n const p = points[i];\r\n // 不重合的二个点,组成线段\r\n if(start && !p.m && !(start.x == p.x && start.y == p.y)) {\r\n const line = {\r\n start,\r\n end: p,\r\n };\r\n res.push(line);\r\n }\r\n start = p;\r\n }\r\n return res;\r\n }\r\n\r\n // 裁剪线段,如果二段线段有交点,则分割成四段, 端头相交的线段不用分割\r\n cutLines(lines, index1=0, index2=0) {\r\n if(lines && lines.length < 3) return lines;\r\n \r\n index2 = Math.max(index1 + 1, index2); //如果指定了比下一个更大的索引,则用更大的,说明前面的已经处理过了,不需要重复\r\n\r\n // 找出线段相交的点,并切割线段\r\n while(index1 < lines.length) {\r\n const line1 = lines[index1];\r\n\r\n while(index2 < lines.length) {\r\n const line2 = lines[index2];\r\n // 如果二条线顶点有重合,则不用处理\r\n if(this.equalPoint(line1.start, line2.start) || this.equalPoint(line1.end, line2.end) || \r\n this.equalPoint(line1.start, line2.end) || this.equalPoint(line1.end, line2.start)) {\r\n index2++;\r\n continue;\r\n }\r\n let cuted = false;\r\n const intersection = this.getIntersection(line1, line2);// 计算交点\r\n if(intersection) {\r\n // 如果交点不是线段的端点,则分割成二条线段\r\n if(!this.equalPoint(line1.start, intersection) && !this.equalPoint(line1.end, intersection)) {\r\n const sub1 = {\r\n start: line1.start,\r\n end: intersection\r\n };\r\n const sub2 = {\r\n start: intersection,\r\n end: line1.end\r\n };\r\n // 从原数组中删除当前线段,替换成新的线段\r\n lines.splice(index1, 1, sub1, sub2);\r\n // 当前线段被重新替换,需要重新从它开始处理\r\n cuted = true;\r\n index2 ++;// 因为多加入了一个线段,则对比线索引需要加1\r\n }\r\n // 如果交点不是线段的端点,则分割成二条线段\r\n if(!this.equalPoint(line2.start, intersection) && !this.equalPoint(line2.end, intersection)) {\r\n const sub1 = {\r\n start: line2.start,\r\n end: intersection\r\n };\r\n const sub2 = {\r\n start: intersection,\r\n end: line2.end\r\n };\r\n // 从原数组中删除当前线段,替换成新的线段\r\n lines.splice(index2, 1, sub1, sub2);\r\n index2 ++; // 线段2也切成了二段,对比索引要继续加1\r\n }\r\n }\r\n index2++;\r\n // 如果已经分割了起始线段,则第一个子线段开始,重新对比后面还未对比完的。直接所有对比完成返回\r\n if(cuted) return this.cutLines(lines, index1, index2);\r\n }\r\n index1++;\r\n index2 = index1 + 1;\r\n }\r\n return lines;\r\n }\r\n\r\n // 计算二个线段的交点\r\n getIntersection(line1, line2) {\r\n // 如果首尾相接,也认为是有交点\r\n if(this.equalPoint(line1.start, line2.start) || this.equalPoint(line1.start, line2.end)) return line1.start;\r\n if(this.equalPoint(line1.end, line2.start) || this.equalPoint(line1.end, line2.end)) return line1.end;\r\n\r\n // 三角形abc 面积的2倍\r\n const area_abc = (line1.start.x - line2.start.x) * (line1.end.y - line2.start.y) - (line1.start.y - line2.start.y) * (line1.end.x - line2.start.x);\r\n \r\n // 三角形abd 面积的2倍\r\n const area_abd = (line1.start.x - line2.end.x) * (line1.end.y - line2.end.y) - (line1.start.y - line2.end.y) * (line1.end.x - line2.end.x);\r\n \r\n // 面积符号相同则两点在线段同侧,不相交 (=0表示在线段顶点上);\r\n if (area_abc * area_abd > 0) {\r\n return null;\r\n }\r\n \r\n // 三角形cda 面积的2倍\r\n const area_cda = (line2.start.x - line1.start.x) * (line2.end.y - line1.start.y) - (line2.start.y - line1.start.y) * (line2.end.x - line1.start.x);\r\n // 三角形cdb 面积的2倍\r\n // 注意: 这里有一个小优化.不需要再用公式计算面积,而是通过已知的三个面积加减得出.\r\n const area_cdb = area_cda + area_abc - area_abd ;\r\n if(area_cda * area_cdb > 0) {\r\n return null ;\r\n }\r\n if(area_abd === area_abc) return null;\r\n\r\n //计算交点坐标\r\n const t = area_cda / (area_abd - area_abc);\r\n const dx= t * (line1.end.x - line1.start.x);\r\n const dy= t * (line1.end.y - line1.start.y);\r\n\r\n return { \r\n x: Number((line1.start.x + dx).toFixed(2)), \r\n y: Number((line1.start.y + dy).toFixed(2))\r\n };\r\n }\r\n\r\n // 找出跟当前线段尾部相交的所有线段\r\n getIntersectionLines(line, lines, index, point=line.end, points=[], root=null) {\r\n const res = {\r\n line,\r\n polygons: []\r\n };\r\n \r\n points.push(point);\r\n \r\n if(root && this.equalPoint(root.line.start, point)) {\r\n points.unshift(root.line.start); // 把起始地址加入进去\r\n root.polygons.push(points);\r\n return res;\r\n }\r\n\r\n for(;index<lines.length; index++) {\r\n const l = lines[index];\r\n if(this.equalPoint(point, l.start)) { \r\n if(points.includes(l.end)) continue; \r\n this.getIntersectionLines(l, lines, index+1, l.end, [...points], root||res);\r\n }\r\n else if(this.equalPoint(point, l.end)) {\r\n if(points.includes(l.start)) continue; \r\n this.getIntersectionLines(l, lines, index+1, l.start, [...points], root||res);\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n // 根据路径点坐标,切割出封闭的多边形\r\n getPolygon(points) {\r\n let polygons = [];\r\n let lines = this.pathToLines(points); // 分解得到线段\r\n if(lines && lines.length > 2) {\r\n lines = this.cutLines(lines); // 把所有相交点切割线段找出来\r\n for(let i=0; i<lines.length-1; i++) {\r\n const line1 = lines[i];\r\n let polygon = [];// 当前图形\r\n\r\n const treeLine = this.getIntersectionLines(line1, lines, i+1);\r\n \r\n if(treeLine.polygons.length) polygons.push(...treeLine.polygons);\r\n continue;\r\n let lastLine = line1; // 下一个还在连接状态的线\r\n for(let j=i+1; j<lines.length; j++) {\r\n const line2 = lines[j];\r\n // 如果跟下一条线相接,则表示还在形成图形中\r\n if(this.equalPoint(lastLine.end, line2.start)) {\r\n polygon.push(lastLine.end);\r\n lastLine = line2;\r\n if(i === j+1) continue; //下一条相连 则不需要处理相交情况\r\n }\r\n else {\r\n polygon = [];\r\n } \r\n // 因为前面进行了分割线段,则里只有处理端点相连的情况\r\n const intersection = this.equalPoint(line1.start, line2.end)? line1.start: null;//this.getIntersection(line1, line2);// 计算交点\r\n if(intersection) {\r\n polygon.push(intersection);// 交叉点为图形顶点\r\n // 如果上一个连接线不是当前交叉线,则表示重新开始闭合\r\n // 如果上一个连接线是当前交叉线,形成了封闭的图形\r\n if(lastLine === line2 && polygon.length > 1) {\r\n polygons.push(polygon);\r\n \r\n // 封闭后,下一个起始线条就是从交点开始计算起\r\n /*lastLine = {\r\n start: intersection,\r\n end: line2.end\r\n };*/\r\n polygon = [];// 重新开始新一轮找图形\r\n\r\n /*\r\n // 如果交点是上一条线的终点,则新图形为空\r\n if(this.equalPoint(line2.end, intersection)) {\r\n polygon = [];// 重新开始新一轮找图形\r\n }\r\n else {\r\n // 同时交点也要加到上一个图形中第一个点,形成封闭\r\n polygon.unshift(intersection);\r\n\r\n polygon = [ intersection ];// 重新开始新一轮找图形\r\n }*/\r\n }\r\n else {\r\n lastLine = line2;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // 当有多个封闭图形时,再弟归一下,里面是不是有封闭图形内还有子封闭图形\r\n /*if(polygons.length > 1) {\r\n const newPolygons = [];\r\n for(const polygon of polygons) {\r\n // 只有大于4才有可能有子封闭图形\r\n if(polygon.length > 4) {\r\n const childPolygons = this.getPolygon(polygon);\r\n // 当有多个子图形时,表示它不是最终封闭图形,跳过,\r\n // 因为它的子图形之前有加入的,不需要重复加入\r\n if(childPolygons.length > 1) {\r\n //newPolygons.push(...childPolygons);\r\n continue;\r\n }\r\n }\r\n newPolygons.push(polygon);\r\n }\r\n polygons = newPolygons;\r\n }*/\r\n return polygons;\r\n }\r\n\r\n // 画线条\r\n stroke(points = this.points, color = this.style.strokeStyle, lineWidth = this.style.lineWidth) {\r\n if(!points || !points.length) return;\r\n // this.useProgram();\r\n\r\n let colorBuffer = null;\r\n if(color) {\r\n colorBuffer = this.setFragColor(color);\r\n }\r\n // 线宽\r\n if(lineWidth) {\r\n this.context.uniform1f(this.program.uniforms.a_point_size.location, lineWidth);// * this.graph.devicePixelRatio\r\n }\r\n // 标注为stroke\r\n if(this.program.uniforms.a_type) {\r\n // 4表示单画一个圆点,1表示方块形成的线条\r\n this.context.uniform1i(this.program.uniforms.a_type.location, points.length === 1? 4 :1);\r\n }\r\n if(points && points.length) {\r\n const regular = this.isRegular && (lineWidth == 1);\r\n points = regular? points : this.pathToPoints(points);\r\n //this.context.lineWidth(10);\r\n const buffer = this.writePoints(points);\r\n this.context.drawArrays(regular? this.context.LINES: this.context.POINTS, 0, points.length);\r\n this.deleteBuffer(buffer);\r\n }\r\n colorBuffer && this.deleteBuffer(colorBuffer);\r\n colorBuffer && this.disableVertexAttribArray(colorBuffer.attr);\r\n }\r\n\r\n // 填充图形\r\n fill(bounds = {left: 0, top: 0, width: 0, height: 0}, type = 1) {\r\n //this.useProgram();\r\n \r\n if(this.points && this.points.length) {\r\n \r\n // 如果是颜色rgba\r\n if(this.style.fillStyle) {\r\n \r\n let filled = false;// 是否成功填充\r\n // 3个以上的点,且非规则图形才需要切割\r\n if(this.points.length > 3) { \r\n if(this.isRegular && this.needCut) {\r\n // 需要分割三角形,不然填充会有问题\r\n const triangles = this.earCutPointsToTriangles(this.points);// 切割得到三角形顶点二维数组\r\n\r\n if(triangles && triangles.length) {\r\n for(const triangle of triangles) {\r\n this.fillColor(triangle, this.style.fillStyle, bounds, type); // 单独为每个分割的图形填充\r\n\r\n // 如果指定的是img,则采用填充图片的方式\r\n if(this.style.fillImage) {\r\n this.fillImage(this.style.fillImage, triangle, bounds);\r\n }\r\n }\r\n filled = true;// 表示已填充过了\r\n }\r\n } \r\n else if(!this.isRegular) {\r\n const polygons = this.getPolygon(this.points);\r\n if(polygons.length) {\r\n for(const polygon of polygons) {\r\n // 需要分割三角形,不然填充会有问题\r\n const triangles = this.earCutPointsToTriangles(polygon);// 切割得到三角形顶点二维数组\r\n\r\n if(triangles && triangles.length) {\r\n for(const triangle of triangles) {\r\n this.fillColor(triangle, this.style.fillStyle, bounds, type); // 单独为每个分割的图形填充\r\n\r\n // 如果指定的是img,则采用填充图片的方式\r\n if(this.style.fillImage) {\r\n this.fillImage(this.style.fillImage, triangle, bounds);\r\n }\r\n }\r\n filled = true;// 表示已填充过了\r\n }\r\n }\r\n }\r\n }\r\n } \r\n // 如果前面的条件没有填充成功,则直接按正常填充 \r\n if(!filled) {\r\n this.fillColor(this.points, this.style.fillStyle, bounds, type);// 如果指定的是img,则采用填充图片的方式\r\n if(this.style.fillImage) {\r\n this.fillImage(this.style.fillImage, this.points, bounds);\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n\r\n fillColor(points, color, bounds, type=1) {\r\n \r\n // 如果是渐变色,则需要计算偏移量的颜色\r\n if(this.isGradient(color)) {\r\n const imgData = color.toImageData(this, bounds);\r\n return this.fillImage(imgData, points, bounds);\r\n }\r\n \r\n // 标注为fill\r\n this.context.uniform1i(this.program.uniforms.a_type.location, type);\r\n const colorBuffer = this.setFragColor(color);\r\n \r\n const buffer = this.writePoints(points);\r\n this.context.drawArrays(this.context.TRIANGLE_FAN, 0, points.length);\r\n if(buffer) {\r\n this.deleteBuffer(buffer);\r\n this.disableVertexAttribArray(buffer.attr);\r\n }\r\n colorBuffer && this.deleteBuffer(colorBuffer);\r\n colorBuffer && this.disableVertexAttribArray(colorBuffer.attr);\r\n\r\n // 为线段顶点绘制\r\n /*for(const p of points) {\r\n this.stroke([p], 'red', 10);\r\n }*/\r\n }\r\n\r\n // 区域填充图片\r\n // points绘制的图形顶点\r\n // 图片整体绘制区域\r\n fillImage(img, points, bounds) {\r\n if(!img) return;\r\n\r\n // 设置纹理\r\n const texture = img instanceof ImageData? this.createDataTexture(img) : this.createImgTexture(img);\r\n this.context.uniform1i(this.program.uniforms.u_sample.location, 0); // 纹理单元传递给着色器\r\n\r\n // 指定纹理区域尺寸\r\n this.context.uniform4f(this.program.uniforms.v_texture_bounds.location, \r\n bounds.left + this.parentAbsoluteBounds.left,\r\n bounds.top + this.parentAbsoluteBounds.top,\r\n bounds.width,\r\n bounds.height,\r\n ); // 纹理单元传递给着色器\r\n\r\n // 标注为纹理对象\r\n this.context.uniform1i(this.program.uniforms.a_type.location, 2);\r\n\r\n let filled = false;// 是否成功填充\r\n // 3个以上的点,且非规则图形才需要切割\r\n if(points.length > 3 && !this.isRegular) { \r\n const polygons = this.getPolygon(points);\r\n if(polygons.length) {\r\n for(const polygon of polygons) {\r\n // 需要分割三角形,不然填充会有问题\r\n const triangles = this.earCutPointsToTriangles(polygon);// 切割得到三角形顶点二维数组\r\n\r\n if(triangles && triangles.length) {\r\n for(const triangle of triangles) {\r\n this.fillTexture(triangle); // 单独为每个分割的图形填充\r\n }\r\n filled = true;// 表示已填充过了\r\n }\r\n }\r\n }\r\n } \r\n // 如果前面的条件没有填充成功,则直接按正常填充 \r\n if(!filled) {\r\n this.fillTexture(points);\r\n }\r\n this.deleteTexture(texture);\r\n }\r\n\r\n // 填充图形\r\n drawImage(img, left=0, top=0, width=img.width, height=img.height) {\r\n width = width || img.width;\r\n height = height || img.height;\r\n\r\n //this.useProgram();\r\n\r\n this.fillImage(img, this.points, {\r\n left,\r\n top,\r\n width, \r\n height\r\n });\r\n }\r\n\r\n fillTexture(points) {\r\n // 纹理坐标\r\n const coordBuffer = this.writePoints(points, this.program.attrs.a_text_coord);\r\n \r\n if(points && points.length) {\r\n const buffer = this.writePoints(points);\r\n this.context.drawArrays(this.context.TRIANGLE_FAN, 0, points.length);\r\n this.deleteBuffer(buffer);\r\n this.disableVertexAttribArray(buffer.attr);\r\n }\r\n this.disableVertexAttribArray(coordBuffer.attr);\r\n this.deleteBuffer(coordBuffer); \r\n }\r\n}\r\n\r\nexport default WebglPath;","\r\nimport {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\nimport {jmGradient} from \"./jmGradient.js\";\r\nimport {jmShadow} from \"./jmShadow.js\";\r\nimport {jmProperty} from \"./jmProperty.js\";\r\nimport WebglPath from \"../lib/webgl/path.js\";\r\n\r\n//样式名称,也当做白名单使用\t\t\r\nconst jmStyleMap = {\r\n\t'fill':'fillStyle',\r\n\t'fillImage':'fillImage',\r\n\t'stroke':'strokeStyle',\r\n\t'shadow.blur':'shadowBlur',\r\n\t'shadow.x':'shadowOffsetX',\r\n\t'shadow.y':'shadowOffsetY',\r\n\t'shadow.color':'shadowColor',\r\n\t'lineWidth' : 'lineWidth',\r\n\t'miterLimit': 'miterLimit',\r\n\t'fillStyle' : 'fillStyle',\r\n\t'strokeStyle' : 'strokeStyle',\r\n\t'font' : 'font',\r\n\t'opacity' : 'globalAlpha',\r\n\t'textAlign' : 'textAlign',\r\n\t'textBaseline' : 'textBaseline',\r\n\t'shadowBlur' : 'shadowBlur',\r\n\t'shadowOffsetX' : 'shadowOffsetX',\r\n\t'shadowOffsetY' : 'shadowOffsetY',\r\n\t'shadowColor' : 'shadowColor',\r\n\t'lineJoin': 'lineJoin',//线交汇处的形状,miter(默认,尖角),bevel(斜角),round(圆角)\r\n\t'lineCap':'lineCap' //线条终端点,butt(默认,平),round(圆),square(方)\r\n};\r\n\r\n/**\r\n * 控件基础对象\r\n * 控件的基础属性和方法\r\n *\r\n * @class jmControl\r\n * @extends jmProperty\r\n */\t\r\nexport default class jmControl extends jmProperty {\t\r\n\r\n\tconstructor(params, t) {\r\n\t\tparams = params||{};\r\n\t\tsuper(params);\r\n\t\tthis.property('type', t || new.target.name);\r\n\t\tthis.style = params && params.style ? params.style : {};\r\n\t\t//this.position = params.position || {x:0,y:0};\r\n\t\tthis.width = params.width || 0;\r\n\t\tthis.height = params.height || 0;\r\n\r\n\t\tif(params.position) {\r\n\t\t\tthis.position = params.position;\r\n\t\t}\r\n\r\n\t\tthis.graph = params.graph || null;\r\n\t\tthis.zIndex = params.zIndex || 0;\r\n\t\tthis.interactive = typeof params.interactive == 'undefined'? true : params.interactive;\r\n\r\n\t\t// webgl模式\r\n\t\tif(this.mode === 'webgl') {\r\n\t\t\tthis.webglControl = new WebglPath(this.graph, {\r\n\t\t\t\tstyle: this.style,\r\n\t\t\t\tisRegular: params.isRegular,\r\n\t\t\t\tneedCut: params.needCut\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.initializing();\t\r\n\t\t\r\n\t\tthis.on = this.bind;\r\n\t\t\r\n\t\tthis.option = params;\r\n\t}\r\n\r\n\t//# region 定义属性\r\n\t/**\r\n\t * 当前对象类型名jmRect\r\n\t *\r\n\t * @property type\r\n\t * @type string\r\n\t */\r\n\tget type() {\r\n\t\treturn this.property('type');\r\n\t}\r\n\r\n\t/**\r\n\t * 当前canvas的context\r\n\t * @property context\r\n\t * @type {object}\r\n\t */\r\n\tget context() {\r\n\t\tlet s = this.property('context');\r\n\t\tif(s) return s;\r\n\t\telse if(this.is('jmGraph') && this.canvas && this.canvas.getContext) {\r\n\t\t\treturn this.context = this.canvas.getContext(this.mode || '2d');\r\n\t\t}\r\n\t\tconst g = this.graph;\r\n\t\tif(g) return g.context;\r\n\t\treturn g.canvas.getContext(this.mode || '2d');\r\n\t}\r\n\tset context(v) {\r\n\t\treturn this.property('context', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 样式\r\n\t * @property style\r\n\t * @type {object}\r\n\t */\r\n\tget style() {\r\n\t\tlet s = this.property('style');\r\n\t\tif(!s) s = this.property('style', {});\r\n\t\treturn s;\r\n\t}\r\n\tset style(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('style', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 当前控件是否可见\r\n\t * @property visible\r\n\t * @default true\r\n\t * @type {boolean}\r\n\t */\r\n\tget visible() {\r\n\t\tlet s = this.property('visible');\r\n\t\tif(typeof s == 'undefined') s = this.property('visible', true);\r\n\t\treturn s;\r\n\t}\r\n\tset visible(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('visible', v);\r\n\t}\t\r\n\r\n\t/**\r\n\t * 当前控件是否是交互式的,如果是则会响应鼠标或touch事件。\r\n\t * 如果false则不会主动响应,但冒泡的事件依然会得到回调\r\n\t * @property interactive\r\n\t * @default false\r\n\t * @type {boolean}\r\n\t */\r\n\tget interactive() {\r\n\t\tlet s = this.property('interactive');\r\n\t\treturn s;\r\n\t}\r\n\tset interactive(v) {\r\n\t\treturn this.property('interactive', v);\r\n\t}\r\n\t\t\r\n\t/**\r\n\t * 当前控件的子控件集合\r\n\t * @property children\r\n\t * @type {list}\r\n\t */\r\n\tget children() {\r\n\t\tlet s = this.property('children');\r\n\t\tif(!s) s = this.property('children', new jmList());\r\n\t\treturn s;\r\n\t}\r\n\tset children(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('children', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 宽度\r\n\t * @property width\r\n\t * @type {number}\r\n\t */\r\n\tget width() {\r\n\t\tlet s = this.property('width');\r\n\t\tif(typeof s == 'undefined') s = this.property('width', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset width(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('width', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 高度\r\n\t * @property height\r\n\t * @type {number}\r\n\t */\r\n\tget height() {\r\n\t\tlet s = this.property('height');\r\n\t\tif(typeof s == 'undefined') s = this.property('height', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset height(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('height', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 控件层级关系,发生改变时,需要重新调整排序\r\n\t * @property zIndex\r\n\t * @type {number}\r\n\t */\r\n\tget zIndex() {\r\n\t\tlet s = this.property('zIndex');\r\n\t\tif(!s) s = this.property('zIndex', 0);\r\n\t\treturn s;\r\n\t}\r\n\tset zIndex(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tthis.property('zIndex', v);\r\n\t\tthis.children.sort();//层级发生改变,需要重新排序\r\n\t\tthis.needUpdate = true;\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 设置鼠标指针\r\n\t * css鼠标指针标识,例如:pointer,move等\r\n\t * \r\n\t * @property cursor\r\n\t * @type {string}\r\n\t */\r\n\tset cursor(cur) {\t\r\n\t\tvar graph = this.graph ;\r\n\t\tif(graph) {\t\t\r\n\t\t\tgraph.css('cursor',cur);\t\t\r\n\t\t}\r\n\t}\r\n\tget cursor() {\r\n\t\tvar graph = this.graph ;\r\n\t\tif(graph) {\t\t\r\n\t\t\treturn graph.css('cursor');\t\t\r\n\t\t}\r\n\t}\r\n\r\n\t//# end region\r\n\r\n\t/**\r\n\t * 初始化对象,设定样式,初始化子控件对象\r\n\t * 此方法为所有控件需调用的方法\r\n\t *\r\n\t * @method initializing\r\n\t * @for jmControl\r\n\t */\r\n\tinitializing() {\r\n\r\n\t\tconst self = this;\r\n\t\t//定义子元素集合\r\n\t\tthis.children = this.children || new jmList();\r\n\t\tconst oadd = this.children.add;\r\n\t\t//当把对象添加到当前控件中时,设定其父节点\r\n\t\tthis.children.add = function(obj) {\r\n\t\t\tif(typeof obj === 'object') {\r\n\t\t\t\tif(obj.parent && obj.parent != self && obj.parent.children) {\r\n\t\t\t\t\tobj.parent.children.remove(obj);//如果有父节点则从其父节点中移除\r\n\t\t\t\t}\r\n\t\t\t\tobj.parent = self;\r\n\t\t\t\t//如果存在先移除\r\n\t\t\t\tif(this.contain(obj)) {\r\n\t\t\t\t\tthis.oremove(obj);\r\n\t\t\t\t}\r\n\t\t\t\toadd.call(this, obj);\r\n\t\t\t\tobj.emit('add', obj);\r\n\r\n\t\t\t\tself.needUpdate = true;\r\n\t\t\t\tif(self.graph) obj.graph = self.graph;\r\n\t\t\t\tthis.sort();//先排序\r\n\t\t\t\t//self.emit('addChild', obj);\r\n\t\t\t\treturn obj;\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.children.oremove= this.children.remove;\r\n\t\t//当把对象从此控件中移除时,把其父节点置为空\r\n\t\tthis.children.remove = function(obj) {\r\n\t\t\tif(typeof obj === 'object') {\t\t\t\t\r\n\t\t\t\tobj.parent = null;\r\n\t\t\t\tobj.graph = null;\r\n\t\t\t\tobj.remove(true);\r\n\t\t\t\tthis.oremove(obj);\r\n\t\t\t\tself.needUpdate = true;\r\n\t\t\t\t//self.emit('removeChild', obj, index);\r\n\t\t\t}\r\n\t\t};\r\n\t\t/**\r\n\t\t * 根据控件zIndex排序,越大的越高\r\n\t\t */\r\n\t\t//const osort = this.children.sort;\r\n\t\tthis.children.sort = function() {\r\n\t\t\tconst levelItems = {};\r\n\t\t\t//提取zindex大于0的元素\r\n\t\t\t//为了保证0的层级不改变,只能把大于0的提出来。\r\n\t\t\tthis.each(function(i, obj) {\r\n\t\t\t\tif(!obj) return;\r\n\t\t\t\tlet zindex = obj.zIndex;\r\n\t\t\t\tif(!zindex && obj.style && obj.style.zIndex) {\r\n\t\t\t\t\tzindex = Number(obj.style.zIndex);\r\n\t\t\t\t\tif(isNaN(zindex)) zindex=obj.style.zIndex||0;\r\n\t\t\t\t}\r\n\t\t\t\tlet items = levelItems[zindex] || (levelItems[zindex] = []);\r\n\t\t\t\titems.push(obj);\r\n\t\t\t});\r\n\r\n\t\t\tthis.splice(0, this.length);\r\n\t\t\t\r\n\t\t\tfor(let index in levelItems) {\r\n\t\t\t\toadd.call(this, levelItems[index]);\r\n\t\t\t}\r\n\t\t\t/*\r\n\t\t\tosort.call(this, (c1, c2) => {\r\n\t\t\t\tlet zindex1 = c1.zIndex || c1.style.zIndex || 0;\r\n\t\t\t\tlet zindex2 = c2.zIndex || c2.style.zIndex || 0;\r\n\t\t\t\treturn zindex1 - zindex2;\r\n\t\t\t});*/\r\n\t\t}\r\n\t\tthis.children.clear = function() {\r\n\t\t\tthis.each(function(i,obj) {\r\n\t\t\t\tthis.remove(obj);\r\n\t\t\t},true);\r\n\t\t}\r\n\t\tthis.needUpdate = true;\r\n\t} \r\n\r\n\t/**\r\n\t * 设定样式到context\r\n\t * 处理样式映射,转换渐变和阴影对象为标准canvas属性\r\n\t * 样式一览\r\n\t\t| 简化名称 | 原生名称 | 说明\r\n\t\t| :- | :- | :- | \r\n\t\t| fill | fillStyle | 用于填充绘画的颜色、渐变或模式\r\n\t\t| stroke | strokeStyle | 用于笔触的颜色、渐变或模式\r\n\t\t| shadow | 没有对应的 | 最终会解析成以下几个属性,格式:'0,0,10,#fff'或g.createShadow(0,0,20,'#000');\r\n\t\t| shadow.blur | shadowBlur | 用于阴影的模糊级别\r\n\t\t| shadow.x | shadowOffsetX | 阴影距形状的水平距离\r\n\t\t| shadow.y | shadowOffsetY | 阴影距形状的垂直距离\r\n\t\t| shadow.color | shadowColor | 阴影颜色,格式:'#000'、'#46BF86'、'rgb(255,255,255)'或'rgba(39,72,188,0.5)'\r\n\t\t| lineWidth | lineWidth | 当前的线条宽度\r\n\t\t| miterLimit | miterLimit | 最大斜接长度\r\n\t\t| font | font | 请使用下面的 fontSize 和 fontFamily\r\n\t\t| fontSize | font | 字体大小\r\n\t\t| fontFamily | font | 字体\r\n\t\t| opacity | globalAlpha | 绘图的当前 alpha 或透明值\r\n\t\t| textAlign | textAlign | 文本内容的当前对齐方式\r\n\t\t| textBaseline | textBaseline | 在绘制文本时使用的当前文本基线\r\n\t\t| lineJoin | lineJoin | 两条线相交时,所创建的拐角类型:miter(默认,尖角),bevel(斜角),round(圆角)\r\n\t\t| lineCap | lineCap | 线条的结束端点样式:butt(默认,平),round(圆),square(方)\r\n\t * \r\n\t * @method setStyle\r\n\t * @for jmControl\r\n\t * @private\r\n\t * @param {style} style 样式对象,如:{fill:'black',stroke:'red'}\r\n\t */\r\n\tsetStyle(style) {\r\n\t\tstyle = style || jmUtils.clone(this.style, true);\r\n\t\tif(!style) return;\r\n\r\n\t\t/**\r\n\t\t * 样式设定\r\n\t\t * \r\n\t\t * @method __setStyle\r\n\t\t * @private\r\n\t\t * @param {jmControl} control 当前样式对应的控件对象\r\n\t\t * @param {style} style 样式\r\n\t\t * @param {string} name 样式名称\r\n\t\t * @param {string} mpkey 样式名称在映射中的key(例如:shadow.blur为模糊值)\r\n\t\t */\r\n\t\tlet __setStyle = (style, name, mpkey) => {\r\n\t\t\t\r\n\t\t\tif(style) {\t\t\r\n\t\t\t\tlet styleValue = style;\t\t\r\n\t\t\t\tif(typeof styleValue === 'function') {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tstyleValue = styleValue.call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch(e) {\r\n\t\t\t\t\t\tconsole.warn(e);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlet t = typeof styleValue;\t\r\n\t\t\t\tlet mpname = jmStyleMap[mpkey || name];\r\n\r\n\t\t\t\t//如果为渐变对象\r\n\t\t\t\tif((styleValue instanceof jmGradient) || (t == 'string' && styleValue.indexOf('-gradient') > -1)) {\r\n\t\t\t\t\t//如果是渐变,则需要转换\r\n\t\t\t\t\tif(t == 'string' && styleValue.indexOf('-gradient') > -1) {\r\n\t\t\t\t\t\tstyleValue = new jmGradient(styleValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t__setStyle(styleValue.toGradient(this), mpname||name);\t\r\n\t\t\t\t}\r\n\t\t\t\telse if(mpname) {\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(this.webglControl) {\r\n\t\t\t\t\t\t//只有存在白名单中才处理\r\n\t\t\t\t\t\t//颜色转换\r\n\t\t\t\t\t\tif(t == 'string' && ['fillStyle', 'strokeStyle', 'shadowColor'].indexOf(mpname) > -1) {\r\n\t\t\t\t\t\t\tstyleValue = jmUtils.hexToRGBA(styleValue);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.webglControl.setStyle(mpname, styleValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t//只有存在白名单中才处理\r\n\t\t\t\t\t\t//颜色转换\r\n\t\t\t\t\t\tif(t == 'string' && ['fillStyle', 'strokeStyle', 'shadowColor'].indexOf(mpname) > -1) {\r\n\t\t\t\t\t\t\tstyleValue = jmUtils.toColor(styleValue);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.context[mpname] = styleValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\t\r\n\t\t\t\telse {\r\n\t\t\t\t\tswitch(name) {\r\n\t\t\t\t\t\t//阴影样式\r\n\t\t\t\t\t\tcase 'shadow' : {\r\n\t\t\t\t\t\t\tif(t == 'string') {\r\n\t\t\t\t\t\t\t\t__setStyle(new jmShadow(styleValue), name);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tfor(let k in styleValue) {\r\n\t\t\t\t\t\t\t\t__setStyle(styleValue[k], k, name + '.' + k);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//平移\r\n\t\t\t\t\t\tcase 'translate' : {\r\n\t\t\t\t\t\t\tthis.context.translate && this.context.translate(styleValue.x, styleValue.y);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//旋转\r\n\t\t\t\t\t\tcase 'rotation' : {\t\r\n\t\t\t\t\t\t\tif(!styleValue.angle) break;\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t//旋 转先移位偏移量\r\n\t\t\t\t\t\t\tlet tranX = 0;\r\n\t\t\t\t\t\t\tlet tranY = 0;\r\n\t\t\t\t\t\t\t//旋转,则移位,如果有中心位则按中心旋转,否则按左上角旋转\r\n\t\t\t\t\t\t\t//这里只有style中的旋转才能生效,不然会导至子控件多次旋转\r\n\t\t\t\t\t\t\tif(styleValue.point) {\r\n\t\t\t\t\t\t\t\tlet bounds = this.absoluteBounds?this.absoluteBounds:this.getAbsoluteBounds();\r\n\t\t\t\t\t\t\t\tstyleValue = this.getRotation(styleValue);\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\ttranX = styleValue.rotateX + bounds.left;\r\n\t\t\t\t\t\t\t\ttranY = styleValue.rotateY + bounds.top;\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif(tranX!=0 || tranY != 0) this.context.translate && this.context.translate(tranX,tranY);\r\n\t\t\t\t\t\t\tthis.context.rotate(styleValue.angle);\r\n\t\t\t\t\t\t\tif(tranX!=0 || tranY != 0) this.context.translate && this.context.translate(-tranX,-tranY);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcase 'transform' : {\r\n\t\t\t\t\t\t\tif(Array.isArray(styleValue)) {\r\n\t\t\t\t\t\t\t\tthis.context.transform.apply(this.context, styleValue);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if(typeof styleValue == 'object') {\r\n\t\t\t\t\t\t\t\tthis.context.transform(styleValue.scaleX,//水平缩放\r\n\t\t\t\t\t\t\t\tstyleValue.skewX,//水平倾斜\r\n\t\t\t\t\t\t\t\tstyleValue.skewY,//垂直倾斜\r\n\t\t\t\t\t\t\t\tstyleValue.scaleY,//垂直缩放\r\n\t\t\t\t\t\t\t\tstyleValue.offsetX,//水平位移\r\n\t\t\t\t\t\t\t\tstyleValue.offsetY);//垂直位移\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//鼠标指针\r\n\t\t\t\t\t\tcase 'cursor' : {\r\n\t\t\t\t\t\t\tthis.cursor = styleValue;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\t\t\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\r\n\r\n\t\t//一些特殊属性要先设置,否则会导致顺序不对出现错误的效果\r\n\t\tif(this.translate) {\r\n\t\t\t__setStyle(this.translate, 'translate');\r\n\t\t}\r\n\t\tif(this.transform) {\r\n\t\t\t__setStyle(this.transform, 'transform');\r\n\t\t}\r\n\t\t//设置样式\r\n\t\tfor(let k in style) {\r\n\t\t\tif(k === 'constructor') continue;\r\n\t\t\tlet t = typeof style[k];\r\n\t\t\t//先处理部分样式,以免每次都需要初始化解析\r\n\t\t\tif(t == 'string' && style[k].indexOf('-gradient') > -1) {\r\n\t\t\t\tstyle[k] = new jmGradient(style[k]);\r\n\t\t\t}\r\n\t\t\telse if(t == 'string' && k == 'shadow') {\r\n\t\t\t\tstyle[k] = new jmShadow(style[k]);\r\n\t\t\t}\r\n\t\t\t__setStyle(style[k], k);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控件的边界\r\n\t * 通过分析控件的描点或位置加宽高得到为方形的边界\r\n\t *\r\n\t * @method getBounds\r\n\t * @for jmControl\r\n\t * @param {boolean} [isReset=false] 是否强制重新计算\r\n\t * @return {object} 控件的边界描述对象(left,top,right,bottom,width,height)\r\n\t */\r\n\tgetBounds(isReset) {\r\n\t\t//如果当次计算过,则不重复计算\r\n\t\tif(this.bounds && !isReset) return this.bounds;\r\n\r\n\t\tlet rect = {}; // left top\r\n\t\t//jmGraph,特殊处理\r\n\t\tif(this.type == 'jmGraph' && this.canvas) {\r\n\t\t\tif(typeof this.canvas.width === 'function') {\r\n\t\t\t\trect.right = this.canvas.width(); \r\n\t\t\t}\r\n\t\t\telse if(this.width) {\r\n\t\t\t\trect.right = this.width;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(typeof this.canvas.height === 'function') {\r\n\t\t\t\trect.bottom = this.canvas.height(); \r\n\t\t\t}\r\n\t\t\telse if(this.height) {\r\n\t\t\t\trect.bottom = this.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(this.points && this.points.length > 0) {\t\t\r\n\t\t\tfor(let i in this.points) {\r\n\t\t\t\tlet p = this.points[i];\r\n\t\t\t\tif(typeof rect.left === 'undefined' || rect.left > p.x) {\r\n\t\t\t\t\trect.left = p.x;\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof rect.top === 'undefined' || rect.top > p.y) {\r\n\t\t\t\t\trect.top = p.y;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(typeof rect.right === 'undefined' || rect.right < p.x) {\r\n\t\t\t\t\trect.right = p.x;\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof rect.bottom === 'undefined' || rect.bottom < p.y) {\r\n\t\t\t\t\trect.bottom = p.y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(this.getLocation) {\r\n\t\t\tlet p = this.getLocation();\r\n\t\t\tif(p) {\r\n\t\t\t\trect.left = p.left;\r\n\t\t\t\trect.top = p.top;\r\n\t\t\t\trect.right = p.left + p.width;\r\n\t\t\t\trect.bottom = p.top + p.height;\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\tif(!rect.left) rect.left = 0; \r\n\t\tif(!rect.top) rect.top = 0; \r\n\t\tif(!rect.right) rect.right = 0; \r\n\t\tif(!rect.bottom) rect.bottom = 0; \r\n\t\trect.width = rect.right - rect.left;\r\n\t\trect.height = rect.bottom - rect.top;\r\n\t\treturn this.bounds=rect;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控件的位置相关参数\r\n\t * 解析百分比和margin参数\r\n\t *\r\n\t * @method getLocation\r\n\t * @return {object} 当前控件位置参数,包括中心点坐标,右上角坐标,宽高\r\n\t */\r\n\tgetLocation(clone=true) {\r\n\t\t//如果已经计算过则直接返回\r\n\t\t//在开画之前会清空此对象\r\n\t\t//if(reset !== true && this.location) return this.location;\r\n\r\n\t\tlet local = this.location = {left: 0,top: 0,width: 0,height: 0};\r\n\t\tlocal.position = typeof this.position == 'function'? this.position(): jmUtils.clone(this.position);\t\r\n\t\tlocal.center = this.center && typeof this.center === 'function'?this.center(): jmUtils.clone(this.center);//中心\r\n\t\tlocal.start = this.start && typeof this.start === 'function'?this.start(): jmUtils.clone(this.start);//起点\r\n\t\tlocal.end = this.end && typeof this.end === 'function'?this.end(): jmUtils.clone(this.end);//起点\r\n\t\tlocal.radius = this.radius;//半径\r\n\t\tlocal.width = this.width;\r\n\t\tlocal.height = this.height;\r\n\r\n\t\tlet margin = jmUtils.clone(this.style.margin, {});\r\n\t\tmargin.left = (margin.left || 0);\r\n\t\tmargin.top = (margin.top || 0);\r\n\t\tmargin.right = (margin.right || 0);\r\n\t\tmargin.bottom = (margin.bottom || 0);\r\n\t\t\r\n\t\t//如果没有指定位置,但指定了margin。则位置取margin偏移量\r\n\t\tif(local.position) {\r\n\t\t\tlocal.left = local.position.x;\r\n\t\t\tlocal.top = local.position.y;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlocal.left = margin.left;\r\n\t\t\tlocal.top = margin.top;\r\n\t\t}\r\n\r\n\t\tif(!this.parent) return local;//没有父节点则直接返回\r\n\t\tlet parentBounds = this.parent.getBounds();\t\r\n\r\n\t\t//处理百分比参数\r\n\t\tif(jmUtils.checkPercent(local.left)) {\r\n\t\t\tlocal.left = jmUtils.percentToNumber(local.left) * parentBounds.width;\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(local.top)) {\r\n\t\t\tlocal.top = jmUtils.percentToNumber(local.top) * parentBounds.height;\r\n\t\t}\r\n\t\t\r\n\t\t//如果没有指定宽度或高度,则按百分之百计算其父宽度或高度\r\n\t\tif(jmUtils.checkPercent(local.width)) {\r\n\t\t\tlocal.width = jmUtils.percentToNumber(local.width) * parentBounds.width;\r\n\t\t}\r\n\t\tif(jmUtils.checkPercent(local.height)) {\r\n\t\t\tlocal.height = jmUtils.percentToNumber(local.height) * parentBounds.height;\r\n\t\t}\r\n\t\t//处理中心点\r\n\t\tif(local.center) {\r\n\t\t\t//处理百分比参数\r\n\t\t\tif(jmUtils.checkPercent(local.center.x)) {\r\n\t\t\t\tlocal.center.x = jmUtils.percentToNumber(local.center.x) * parentBounds.width;\r\n\t\t\t}\r\n\t\t\tif(jmUtils.checkPercent(local.center.y)) {\r\n\t\t\t\tlocal.center.y = jmUtils.percentToNumber(local.center.y) * parentBounds.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(local.radius) {\r\n\t\t\t//处理百分比参数\r\n\t\t\tif(jmUtils.checkPercent(local.radius)) {\r\n\t\t\t\tlocal.radius = jmUtils.percentToNumber(local.radius) * Math.min(parentBounds.width, parentBounds.height);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn local;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前控制的旋转信息\r\n\t * @returns {object} 旋转中心和角度\r\n\t */\r\n\tgetRotation(rotation) {\r\n\t\trotation = rotation || this.style.rotation;\r\n\t\tif(!rotation) {\r\n\t\t\t//如果本身没有,则可以继承父级的\r\n\t\t\trotation = this.parent && this.parent.getRotation?this.parent.getRotation():null;\r\n\t\t\t//如果父级有旋转,则把坐标转换为当前控件区域\r\n\t\t\tif(rotation) {\r\n\t\t\t\tlet bounds = this.getBounds();\r\n\t\t\t\trotation.rotateX -= bounds.left;\r\n\t\t\t\trotation.rotateY -= bounds.top;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet bounds = this.getBounds();\r\n\t\t\trotation.rotateX = rotation.point.x;\r\n\t\t\tif(jmUtils.checkPercent(rotation.rotateX)) {\r\n\t\t\t\trotation.rotateX = jmUtils.percentToNumber(rotation.rotateX) * bounds.width;\r\n\t\t\t}\r\n\r\n\t\t\trotation.rotateY = rotation.point.y;\r\n\t\t\tif(jmUtils.checkPercent(rotation.rotateY)) {\r\n\t\t\t\trotation.rotateY = jmUtils.percentToNumber(rotation.rotateY) * bounds.height;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn rotation;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * 移除当前控件\r\n\t * 如果是VML元素,则调用其删除元素\r\n\t *\r\n\t * @method remove \r\n\t */\r\n\tremove() {\t\r\n\t\tif(this.parent) {\r\n\t\t\tthis.parent.children.remove(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 对控件进行平移\r\n\t * 遍历控件所有描点或位置,设置其偏移量。\r\n\t *\r\n\t * @method offset\r\n\t * @param {number} x x轴偏移量\r\n\t * @param {number} y y轴偏移量\r\n\t * @param {boolean} [trans] 是否传递,监听者可以通过此属性是否决定是否响应移动事件,默认=true\r\n\t * @param {object} [evt] 如果是事件触发,则传递move事件参数\r\n\t */\r\n\toffset(x, y, trans, evt) {\r\n\t\ttrans = trans === false?false:true;\t\r\n\t\tlet local = this.getLocation(true);\t\t\r\n\t\tlet offseted = false;\r\n\t\t\r\n\t\tif(local.position) {\r\n\t\t\tlocal.left += x;\r\n\t\t\tlocal.top += y;\r\n\t\t\t// 由于local是clone出来的对象,为了保留位移,则要修改原属性\r\n\t\t\tthis.position.x = local.left;\r\n\t\t\tthis.position.y = local.top;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.center) {\t\t\r\n\t\t\tthis.center.x = local.center.x + x;\r\n\t\t\tthis.center.y = local.center.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.start && typeof local.start == 'object') {\t\r\n\t\t\tthis.start.x = local.start.x + x;\r\n\t\t\tthis.start.y = local.start.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\t\tif(local.end && typeof local.end == 'object') {\t\t\r\n\t\t\tthis.end.x = local.end.x + x;\r\n\t\t\tthis.end.y = local.end.y + y;\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\r\n\r\n\t\tif(offseted == false && this.cpoints) {\r\n\t\t\tlet p = typeof this.cpoints == 'function'?this.cpoints:this.cpoints;\r\n\t\t\tif(p) {\t\t\t\r\n\t\t\t\tlet len = p.length;\r\n\t\t\t\tfor(let i=0; i < len;i++) {\r\n\t\t\t\t\tp[i].x += x;\r\n\t\t\t\t\tp[i].y += y;\r\n\t\t\t\t}\t\t\r\n\t\t\t\toffseted = true;\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tif(offseted == false && this.points) {\r\n\t\t\tlet len = this.points.length;\r\n\t\t\tfor(let i=0; i < len;i++) {\r\n\t\t\t\tthis.points[i].x += x;\r\n\t\t\t\tthis.points[i].y += y;\r\n\t\t\t}\r\n\t\t\toffseted = true;\r\n\t\t}\r\n\t\t\r\n\t\t//触发控件移动事件\t\r\n\t\tthis.emit('move',{\r\n\t\t\toffsetX: x,\r\n\t\t\toffsetY: y,\r\n\t\t\ttrans: trans,\r\n\t\t\tevt: evt\r\n\t\t});\r\n\r\n\t\tthis.needUpdate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * 把图形旋转一个角度\r\n\t * @param {number} angle 旋转角度\r\n\t * @param {object} point 旋转坐标,可以是百分比,例如:{x: '50%',y: '50%'}\r\n\t */\r\n\trotate(angle, point) {\t\r\n\t\t/*this.children.each(function(i,c){\r\n\t\t\tc.rotate(angle);\r\n\t\t});*/\r\n\t\tthis.style.rotation = {\r\n\t\t\tangle: angle,\r\n\t\t\tpoint: point\r\n\t\t};\r\n\r\n\t\tthis.needUpdate = true;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取控件相对于画布的绝对边界,\r\n\t * 与getBounds不同的是:getBounds获取的是相对于父容器的边界.\r\n\t *\r\n\t * @method getAbsoluteBounds\r\n\t * @return {object} 边界对象(left,top,right,bottom,width,height)\r\n\t */\r\n\tgetAbsoluteBounds() {\r\n\t\t//当前控件的边界,\r\n\t\tlet rec = this.getBounds();\r\n\t\tif(this.parent && this.parent.absoluteBounds) {\r\n\t\t\t//父容器的绝对边界\r\n\t\t\tlet prec = this.parent.absoluteBounds || this.parent.getAbsoluteBounds();\r\n\t\t\t\r\n\t\t\treturn {\r\n\t\t\t\tleft : prec.left + rec.left,\r\n\t\t\t\ttop : prec.top + rec.top,\r\n\t\t\t\tright : prec.left + rec.right,\r\n\t\t\t\tbottom : prec.top + rec.bottom,\r\n\t\t\t\twidth : rec.width,\r\n\t\t\t\theight : rec.height\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn rec;\r\n\t}\r\n\r\n\t/**\r\n\t * 画控件前初始化\r\n\t * 执行beginPath开始控件的绘制\r\n\t * \r\n\t * @method beginDraw\r\n\t */\r\n\tbeginDraw() {\t\r\n\t\tthis.getLocation(true);//重置位置信息\r\n\t\tthis.context.beginPath && this.context.beginPath();\t\t\r\n\t\tif(this.webglControl && this.webglControl.beginDraw) this.webglControl.beginDraw();\r\n\t}\r\n\r\n\t/**\r\n\t * 结束控件绘制\r\n\t *\r\n\t * @method endDraw\r\n\t */\r\n\tendDraw() {\r\n\t\t//如果当前为封闭路径\r\n\t\tif(this.style.close) {\r\n\t\t\tif(this.webglControl) this.webglControl.closePath();\r\n\t\t\telse this.context.closePath && this.context.closePath();\r\n\t\t}\r\n\t\t\r\n\t\tif(this.style['fill']) {\r\n\t\t\tif(this.webglControl) {\r\n\t\t\t\tconst bounds = this.getBounds();\r\n\t\t\t\tthis.webglControl.fill(bounds);\r\n\t\t\t}\r\n\t\t\telse this.context.fill && this.context.fill();\r\n\t\t}\r\n\t\tif(this.style['stroke'] || (!this.style['fill'] && !this.is('jmGraph'))) {\r\n\t\t\tif(this.webglControl) this.webglControl.stroke();\r\n\t\t\telse this.context.stroke && this.context.stroke();\r\n\t\t}\r\n\r\n\t\tif(this.webglControl && this.webglControl.endDraw) this.webglControl.endDraw();\r\n\r\n\t\tthis.needUpdate = false;\r\n\t}\r\n\r\n\t/**\r\n\t * 绘制控件\r\n\t * 在画布上描点\r\n\t * \r\n\t * @method draw\r\n\t */\r\n\tdraw() {\t\r\n\t\tif(this.points && this.points.length > 0) {\r\n\t\t\t//获取当前控件的绝对位置\r\n\t\t\tconst bounds = this.parent && this.parent.absoluteBounds?this.parent.absoluteBounds:this.absoluteBounds;\r\n\t\t\tif(this.webglControl) {\r\n\t\t\t\tthis.webglControl.setParentBounds(bounds);\r\n\t\t\t\tthis.webglControl.draw([\r\n\t\t\t\t\t...this.points\r\n\t\t\t\t]);\r\n\t\t\t}\r\n\t\t\telse if(this.context && this.context.moveTo) {\r\n\t\t\t\tthis.context.moveTo(this.points[0].x + bounds.left,this.points[0].y + bounds.top);\r\n\t\t\t\tlet len = this.points.length;\t\t\t\r\n\t\t\t\tfor(let i=1; i < len;i++) {\r\n\t\t\t\t\tlet p = this.points[i];\r\n\t\t\t\t\t//移至当前坐标\r\n\t\t\t\t\tif(p.m) {\r\n\t\t\t\t\t\tthis.context.moveTo(p.x + bounds.left,p.y + bounds.top);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.context.lineTo(p.x+ bounds.left,p.y + bounds.top);\r\n\t\t\t\t\t}\t\t\t\r\n\t\t\t\t}\t\r\n\t\t\t}\t\r\n\t\t}\t\r\n\t}\r\n\r\n\t/**\r\n\t * 绘制当前控件\r\n\t * 协调控件的绘制,先从其子控件开始绘制,再往上冒。\r\n\t *\r\n\t * @method paint\r\n\t */\r\n\tpaint(v) {\r\n\t\tif(v !== false && this.visible !== false) {\t\t\r\n\t\t\tif(this.initPoints) this.initPoints();\r\n\t\t\t//计算当前边界\r\n\t\t\tthis.bounds = null;\r\n\t\t\tthis.absoluteBounds = this.getAbsoluteBounds();\r\n\t\t\tlet needDraw = true;//是否需要绘制\r\n\t\t\tif(!this.is('jmGraph') && this.graph) {\r\n\t\t\t\tif(this.absoluteBounds.left >= this.graph.width) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.top >= this.graph.height) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.right <= 0) needDraw = false;\r\n\t\t\t\telse if(this.absoluteBounds.bottom <= 0) needDraw = false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.context.save && this.context.save();\r\n\r\n\t\t\tthis.emit('beginDraw', this);\r\n\t\t\t\r\n\t\t\tthis.setStyle();//设定样式\r\n\r\n\t\t\tif(needDraw && this.beginDraw) this.beginDraw();\r\n\t\t\tif(needDraw && this.draw) this.draw();\t\r\n\t\t\tif(needDraw && this.endDraw) this.endDraw();\r\n\r\n\t\t\tif(this.children) {\r\n\t\t\t\tthis.children.each(function(i,item) {\r\n\t\t\t\t\tif(item && item.paint) item.paint();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.emit('endDraw',this);\t\r\n\t\t\tthis.context.restore && this.context.restore();\r\n\t\t\t\r\n\t\t\tthis.needUpdate = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 获取指定事件的集合\r\n\t * 比如mousedown,mouseup等\r\n\t *\r\n\t * @method getEvent\r\n\t * @param {string} name 事件名称\r\n\t * @return {list} 事件委托的集合\r\n\t */\r\n\tgetEvent(name) {\t\t\r\n\t\treturn this.__events?this.__events[name]:null;\r\n\t}\r\n\r\n\t/**\r\n\t * 绑定控件的事件\r\n\t *\r\n\t * @method bind\r\n\t * @param {string} name 事件名称\r\n\t * @param {function} handle 事件委托\r\n\t */\r\n\tbind(name, handle) {\t\r\n\t\tif(name && name.indexOf(' ') > -1) {\r\n\t\t\tname = name.split(' ');\r\n\t\t\tfor(let n of name) {\r\n\t\t\t\tn && this.bind(n, handle);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\t\r\n\t\t/**\r\n\t\t * 添加事件的集合\r\n\t\t *\r\n\t\t * @method _setEvent\r\n\t\t * @private\r\n\t\t */\r\n\t\tfunction _setEvent(name, events) {\r\n\t\t\tif(!this.__events) this.__events = {};\r\n\t\t\treturn this.__events[name] = events;\r\n\t\t}\r\n\t\tlet eventCollection = this.getEvent(name) || _setEvent.call(this, name, new jmList());\r\n\t\tif(!eventCollection.contain(handle)) {\r\n\t\t\teventCollection.add(handle);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 移除控件的事件\r\n\t *\r\n\t * @method unbind \r\n\t * @param {string} name 事件名称\r\n\t * @param {function} handle 从控件中移除事件的委托\r\n\t */\r\n\tunbind(name, handle) {\t\r\n\t\tif(name && name.indexOf(' ') > -1) {\r\n\t\t\tname = name.split(' ');\r\n\t\t\tfor(let n of name) {\r\n\t\t\t\tn && this.unbind(n, handle);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\t\r\n\t\tlet eventCollection = this.getEvent(name) ;\t\t\r\n\t\tif(eventCollection) {\r\n\t\t\tif(handle) eventCollection.remove(handle);\r\n\t\t\telse eventCollection.clear();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 执行监听回调\r\n\t * \r\n\t * @method emit\r\n\t * @for jmControl\r\n\t * @param {string} name 触发事件的名称\r\n\t * @param {array} args 事件参数数组\r\n\t */\r\n\temit(...args) {\t\t\t\r\n\t\tthis.runEventHandle(args[0], args.slice(1));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * 独立执行事件委托\r\n\t *\r\n\t * @method runEventHandle\r\n\t * @param {string} 将执行的事件名称\r\n\t * @param {object} 事件执行的参数,包括触发事件的对象和位置\r\n\t */\r\n\trunEventHandle(name, args) {\r\n\t\tlet events = this.getEvent(name);\t\t\r\n\t\tif(events) {\r\n\t\t\tvar self = this;\r\n\t\t\tif(!Array.isArray(args)) args = [args];\t\r\n\t\t\tevents.each(function(i, handle) {\r\n\t\t\t\t//只要有一个事件被阻止,则不再处理同级事件,并设置冒泡被阻断\r\n\t\t\t\tif(false === handle.apply(self, args)) {\r\n\t\t\t\t\targs.cancel = true;\r\n\t\t\t\t}\r\n\t\t\t});\t\t\r\n\t\t}\t\r\n\t\treturn args.cancel;\r\n\t}\r\n\r\n\t/**\r\n\t * 检 查坐标是否落在当前控件区域中..true=在区域内\r\n\t *\r\n\t * @method checkPoint\r\n\t * @param {point} p 位置参数\r\n\t * @param {number} [pad] 可选参数,表示线条多远内都算在线上\r\n\t * @return {boolean} 当前位置如果在区域内则为true,否则为false。\r\n\t */\r\n\tcheckPoint(p, pad) {\r\n\t\t//jmGraph 需要判断dom位置\r\n\t\tif(this.type == 'jmGraph') {\r\n\t\t\t//获取dom位置\r\n\t\t\tlet position = this.getPosition();\r\n\t\t\t// 由于高清屏会有放大坐标,所以这里用pagex就只能用真实的canvas大小\r\n\t\t\tconst right = position.left + this.width;\r\n\t\t\tconst bottom = position.top + this.height;\r\n\t\t\tif(p.pageX > right || p.pageX < position.left) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(p.pageY > bottom || p.pageY < position.top) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\tlet bounds = this.getBounds();\t\r\n\t\tlet rotation = this.getRotation();//获取当前旋转参数\r\n\t\tlet ps = this.points;\r\n\t\t//如果不是路径组成,则采用边界做为顶点\r\n\t\tif(!ps || !ps.length) {\r\n\t\t\tps = [];\r\n\t\t\tps.push({x: bounds.left, y: bounds.top}); //左上角\r\n\t\t\tps.push({x: bounds.right, y: bounds.top});//右上角\r\n\t\t\tps.push({x: bounds.right, y: bounds.bottom});//右下角\r\n\t\t\tps.push({x: bounds.left, y: bounds.bottom}); //左下\r\n\t\t\tps.push({x: bounds.left, y: bounds.top}); //左上角 //闭合\r\n\t\t}\r\n\t\t//如果有指定padding 表示接受区域加宽,命中更易\r\n\t\tpad = Number(pad || this.style['touchPadding'] || this.style['lineWidth'] || 1);\r\n\t\tif(ps && ps.length) {\r\n\t\t\t\r\n\t\t\t//如果有旋转参数,则需要转换坐标再处理\r\n\t\t\tif(rotation && rotation.angle != 0) {\r\n\t\t\t\tps = jmUtils.clone(ps, true);//拷贝一份数据\r\n\t\t\t\t//rotateX ,rotateY 是相对当前控件的位置\r\n\t\t\t\tps = jmUtils.rotatePoints(ps, {\r\n\t\t\t\t\tx: rotation.rotateX + bounds.left,\r\n\t\t\t\t\ty: rotation.rotateY + bounds.top\r\n\t\t\t\t}, rotation.angle);\r\n\t\t\t}\r\n\t\t\t//如果当前路径不是实心的\r\n\t\t\t//就只用判断点是否在边上即可\t\r\n\t\t\tif(ps.length > 2 && (!this.style['fill'] || this.style['stroke'])) {\r\n\t\t\t\tlet i = 0;\r\n\t\t\t\tlet count = ps.length;\r\n\t\t\t\tfor(let j = i+1; j <= count; j = (++i + 1)) {\r\n\t\t\t\t\t//如果j超出最后一个\r\n\t\t\t\t\t//则当为封闭图形时跟第一点连线处理.否则直接返回false\r\n\t\t\t\t\tif(j == count) {\r\n\t\t\t\t\t\tif(this.style.close) {\r\n\t\t\t\t\t\t\tlet r = jmUtils.pointInPolygon(p,[ps[i],ps[0]], pad);\r\n\t\t\t\t\t\t\tif(r) return true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} \r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t//判断是否在点i,j连成的线上\r\n\t\t\t\t\t\tlet s = jmUtils.pointInPolygon(p,[ps[i],ps[j]], pad);\r\n\t\t\t\t\t\tif(s) return true;\r\n\t\t\t\t\t}\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t//不是封闭的图形,则直接返回\r\n\t\t\t\tif(!this.style['fill']) return false;\r\n\t\t\t}\r\n\r\n\t\t\tlet r = jmUtils.pointInPolygon(p,ps, pad);\t\t\r\n\t\t\treturn r;\r\n\t\t}\r\n\r\n\t\tif(p.x > bounds.right || p.x < bounds.left) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(p.y > bounds.bottom || p.y < bounds.top) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 触发控件事件,组合参数并按控件层级关系执行事件冒泡。\r\n\t *\r\n\t * @method raiseEvent\r\n\t * @param {string} name 事件名称\r\n\t * @param {object} args 事件执行参数\r\n\t * @return {boolean} 如果事件被组止冒泡则返回false,否则返回true\r\n\t */\r\n\traiseEvent(name, args) {\r\n\t\tif(this.visible === false) return ;//如果不显示则不响应事件\t\r\n\t\tif(!args.position) {\t\t\r\n\t\t\tconst graph = this.graph;\r\n\r\n\t\t\tconst srcElement = args.srcElement || args.target;\t\t\t\r\n\t\t\t\r\n\t\t\tconst position = jmUtils.getEventPosition(args, graph.scaleSize);//初始化事件位置\r\n\t\t\r\n\t\t\targs = {\r\n\t\t\t\tposition: position,\r\n\t\t\t\tbutton: args.button == 0 || position.isTouch? 1: args.button,\r\n\t\t\t\tkeyCode: args.keyCode || args.charCode || args.which,\r\n\t\t\t\tctrlKey: args.ctrlKey,\r\n\t\t\t\tcancel : false,\r\n\t\t\t\tevent: args, // 原生事件\r\n\t\t\t\tsrcElement : srcElement\r\n\t\t\t};\t\t\r\n\t\t}\r\n\t\targs.path = args.path||[]; //事件冒泡路径\r\n\r\n\t\t//先执行子元素事件,如果事件没有被阻断,则向上冒泡\r\n\t\tlet stoped = false;\r\n\t\tif(this.children) {\r\n\t\t\tthis.children.each(function(j, el) {\r\n\t\t\t\t//未被阻止才执行\t\t\t\r\n\t\t\t\tif(args.cancel !== true) {\r\n\t\t\t\t\t//如果被阻止冒泡,\r\n\t\t\t\t\tstoped = el.raiseEvent(name, args) === false? true: stoped;\r\n\t\t\t\t\t// 不再响应其它元素\r\n\t\t\t\t\tif(stoped) return false;\r\n\t\t\t\t}\r\n\t\t\t}, true);//按逆序处理\r\n\t\t}\r\n\t\t// 如果已被阻止,不再响应上级事件\r\n\t\tif(stoped) return false;\r\n\t\t\r\n\t\t//获取当前对象的父元素绝对位置\r\n\t\t//生成当前坐标对应的父级元素的相对位置\r\n\t\tlet abounds = this.parent && this.parent.absoluteBounds?this.parent.absoluteBounds : this.absoluteBounds;\r\n\t\tif(!abounds) return false;\t\r\n\t\t//args = jmUtils.clone(args);//参数副本\r\n\t\targs.position.x = args.position.offsetX - abounds.left;\r\n\t\targs.position.y = args.position.offsetY - abounds.top;\r\n\r\n\t\t// 是否在当前控件内操作\r\n\t\tconst inpos = this.interactive !== false && this.checkPoint(args.position);\r\n\t\t\r\n\t\t//事件发生在边界内或健盘事件发生在画布中才触发\r\n\t\tif(inpos) {\r\n\t\t\t//如果没有指定触发对象,则认为当前为第一触发对象\r\n\t\t\tif(!args.target) {\r\n\t\t\t\targs.target = this;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.runEventAndPopEvent(name, args);\r\n\r\n\t\t\tif(!this.focused && (name === 'mousemove' || name === 'touchmove')) {\r\n\t\t\t\tthis.focused = true;//表明当前焦点在此控件中\r\n\t\t\t\tthis.raiseEvent(name === 'mousemove'? 'mouseover': 'touchover', args);\r\n\t\t\t}\t\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//如果焦点不在,且原焦点在,则触发mouseleave事件\r\n\t\t\tif(this.interactive !== false && !inpos &&\r\n\t\t\t\tthis.focused && \r\n\t\t\t\t(name === 'mousemove' || name === 'touchmove')) {\r\n\r\n\t\t\t\tthis.focused = false;//表明当前焦点离开\r\n\t\t\t\tthis.runEventHandle(name === 'mousemove'? 'mouseleave' : 'touchleave', args);//执行事件\t\r\n\t\t\t}\t\r\n\t\t}\r\n\t\t\t\r\n\t\treturn args.cancel === false;//如果被阻止则返回false,否则返回true\r\n\t}\r\n\r\n\t/**\r\n\t * 执行事件,并进行冒泡\r\n\t * @param {string} name 事件名称 \r\n\t * @param {object} args 事件参数\r\n\t */\r\n\trunEventAndPopEvent(name, args) {\t\r\n\r\n\t\tif(args.cancel !== true) {\r\n\t\t\t// 添加到触发路径\r\n\t\t\targs.path.push(this);\r\n\r\n\t\t\t//如果返回true则阻断冒泡\r\n\t\t\tthis.runEventHandle(name, args);//执行事件\r\n\r\n\t\t\t// // 向父节点冒泡事件\t\t\r\n\t\t\t// if(args.cancel !== true && this.parent && this.parent.runEventAndPopEvent) {\r\n\t\t\t// \t// 相对位置需要改为父节点的\r\n\t\t\t// \tif(args.position) {\r\n\t\t\t// \t\tlet bounds = this.parent.getBounds();\r\n\t\t\t// \t\targs.position.x += bounds.left;\r\n\t\t\t// \t\targs.position.y += bounds.top;\r\n\t\t\t// \t}\r\n\t\t\t// \tthis.parent.runEventAndPopEvent(name, args);\r\n\t\t\t// }\t\t\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 清空控件指定事件\r\n\t *\r\n\t * @method clearEvents\r\n\t * @param {string} name 需要清除的事件名称\r\n\t */\r\n\tclearEvents(name) {\r\n\t\tvar eventCollection = this.getEvent(name) ;\t\t\r\n\t\tif(eventCollection) {\r\n\t\t\teventCollection.clear;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 查找其父级类型为type的元素,直到找到指定的对象或到最顶级控件后返回空。\r\n\t *\r\n\t * @method findParent \r\n\t * @param {object} 类型名称或类型对象\r\n\t * @return {object} 指定类型的实例\r\n\t */\r\n\tfindParent(type) {\r\n\t\t//如果为类型名称,则返回名称相同的类型对象\r\n\t\tif(typeof type === 'string') {\r\n\t\t\tif(this.type == type)\r\n\t\t\t\treturn this;\r\n\t\t}\r\n\t\telse if(this.is(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif(this.parent) {\r\n\t\t\treturn this.parent.findParent(type);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/**\r\n\t * 设定是否可以移动\r\n\t * 此方法需指定jmgraph或在控件添加到jmgraph后再调用才能生效。\r\n\t *\r\n\t * @method canMove\r\n\t * @param {boolean} m true=可以移动,false=不可移动或清除移动。\r\n\t * @param {jmGraph} [graph] 当前画布,如果为空的话必需是已加入画布的控件,否则得指定画布。\r\n\t */\r\n\tcanMove(m, graph) {\r\n\t\tif(!this.__mvMonitor) {\r\n\t\t\t/**\r\n\t\t\t * 控制控件移动对象\r\n\t\t\t * \r\n\t\t\t * @property __mvMonitor\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor = {};\r\n\t\t\tthis.__mvMonitor.mouseDown = false;\r\n\t\t\tthis.__mvMonitor.curposition={x:0,y:0};\r\n\t\t\tvar self = this;\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标事件\r\n\t\t\t *\r\n\t\t\t * @method mv\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.mv = function(evt) {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\t//如果鼠标经过当前可移动控件,则显示可移动指针\r\n\t\t\t\t//if(evt.path && evt.path.indexOf(_this)>-1) {\r\n\t\t\t\t//\t_this.cursor('move');\t\r\n\t\t\t\t//}\r\n\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.parent.bounds = null;\r\n\t\t\t\t\tlet parentbounds = _this.parent.getAbsoluteBounds();\t\t\r\n\t\t\t\t\tlet offsetx = evt.position.offsetX - _this.__mvMonitor.curposition.x;\r\n\t\t\t\t\tlet offsety = evt.position.offsetY - _this.__mvMonitor.curposition.y;\t\t\t\t\r\n\t\t\t\t\t//console.log(offsetx + ',' + offsety);\r\n\t\t\t\t\t//如果锁定边界\r\n\t\t\t\t\tif(_this.lockSide) {\r\n\t\t\t\t\t\tlet thisbounds = _this.bounds || _this.getAbsoluteBounds();\t\t\t\t\t\r\n\t\t\t\t\t\t//检查边界出界\r\n\t\t\t\t\t\tlet outside = jmUtils.checkOutSide(parentbounds,thisbounds,{x:offsetx,y:offsety});\r\n\t\t\t\t\t\tif(outside.left < 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.left) offsetx -= outside.left;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(outside.right > 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.right) offsetx -= outside.right;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(outside.top < 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.top) offsety -= outside.top;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(outside.bottom > 0) {\r\n\t\t\t\t\t\t\tif(_this.lockSide.bottom) offsety -= outside.bottom;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(offsetx || offsety) {\r\n\t\t\t\t\t\t_this.offset(offsetx, offsety, true, evt);\r\n\t\t\t\t\t\t_this.__mvMonitor.curposition.x = evt.position.offsetX;\r\n\t\t\t\t\t\t_this.__mvMonitor.curposition.y = evt.position.offsetY;\t\r\n\t\t\t\t\t\t//console.log(offsetx + '.' + offsety);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标松开事件\r\n\t\t\t *\r\n\t\t\t * @method mu\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.mu = function(evt) {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.__mvMonitor.mouseDown = false;\r\n\t\t\t\t\t//_this.cursor('default');\r\n\t\t\t\t\t_this.emit('moveend',{position:_this.__mvMonitor.curposition});\t\r\n\t\t\t\t\t//return false;\r\n\t\t\t\t}\t\t\t\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标离开事件\r\n\t\t\t *\r\n\t\t\t * @method ml\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.ml = function() {\r\n\t\t\t\tlet _this = self;\r\n\t\t\t\tif(_this.__mvMonitor.mouseDown) {\r\n\t\t\t\t\t_this.__mvMonitor.mouseDown = false;\r\n\t\t\t\t\t//_this.cursor('default');\t\r\n\t\t\t\t\t_this.emit('moveend',{position:_this.__mvMonitor.curposition});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\r\n\t\t\t}\r\n\t\t\t/**\r\n\t\t\t * 控件移动鼠标按下事件\r\n\t\t\t *\r\n\t\t\t * @method md\r\n\t\t\t * @private\r\n\t\t\t */\r\n\t\t\tthis.__mvMonitor.md = function(evt) {\r\n\t\t\t\t\r\n\t\t\t\tif(this.__mvMonitor.mouseDown) return;\r\n\t\t\t\tif(evt.button == 0 || evt.button == 1) {\r\n\t\t\t\t\tthis.__mvMonitor.mouseDown = true;\r\n\t\t\t\t\t//this.cursor('move');\r\n\t\t\t\t\t//var parentbounds = this.parent.absoluteBounds || this.parent.getAbsoluteBounds();\t\r\n\t\t\t\t\tthis.__mvMonitor.curposition.x = evt.position.offsetX;//evt.position.x + parentbounds.left;\r\n\t\t\t\t\tthis.__mvMonitor.curposition.y = evt.position.offsetY;//evt.position.y + parentbounds.top;\r\n\t\t\t\t\t//触发控件移动事件\r\n\t\t\t\t\tthis.emit('movestart',{position:this.__mvMonitor.curposition});\r\n\t\t\t\t\t\r\n\t\t\t\t\tevt.cancel = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\tgraph = graph || this.graph ;//获取最顶级元素画布\r\n\t\t\r\n\t\tif(m !== false) {\t\t\t\r\n\t\t\tgraph.bind('mousemove',this.__mvMonitor.mv);\r\n\t\t\tgraph.bind('mouseup',this.__mvMonitor.mu);\r\n\t\t\tgraph.bind('mouseleave',this.__mvMonitor.ml);\r\n\t\t\tthis.bind('mousedown',this.__mvMonitor.md);\r\n\t\t\tgraph.bind('touchmove',this.__mvMonitor.mv);\r\n\t\t\tgraph.bind('touchend',this.__mvMonitor.mu);\r\n\t\t\tthis.bind('touchstart',this.__mvMonitor.md);\r\n\t\t}\r\n\t\telse {\t\t\t\r\n\t\t\tgraph.unbind('mousemove',this.__mvMonitor.mv);\r\n\t\t\tgraph.unbind('mouseup',this.__mvMonitor.mu);\r\n\t\t\tgraph.unbind('mouseleave',this.__mvMonitor.ml);\r\n\t\t\tthis.unbind('mousedown',this.__mvMonitor.md);\r\n\t\t\tgraph.unbind('touchmove',this.__mvMonitor.mv);\r\n\t\t\tgraph.unbind('touchend',this.__mvMonitor.mu);\r\n\t\t\tthis.unbind('touchstart',this.__mvMonitor.md);\t\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n};\r\n\r\nexport { jmControl };","import {jmControl} from \"./jmControl.js\";\r\n/**\r\n * 基础路径,大部分图型的基类\r\n * 指定一系列点,画出图形\r\n *\r\n * @class jmPath\r\n * @extends jmControl\r\n * @param {object} params 路径参数 points=所有描点\r\n */\r\n\r\nexport default class jmPath extends jmControl {\t\r\n\r\n\tconstructor(params, t='jmPath') {\r\n\t\tsuper(params, t);\t\t\r\n\t\tthis.points = params && params.points ? params.points : [];\t\r\n\t\tthis.polygonIndices = params && params.polygonIndices ? params.polygonIndices : [];\t\r\n\t}\r\n\t\r\n\t/**\r\n\t * 描点集合\r\n\t * point格式:{x:0,y:0,m:true}\r\n\t * @property points\r\n\t * @type {array}\r\n\t */\r\n\tget points() {\r\n\t\tlet s = this.property('points');\r\n\t\treturn s;\r\n\t}\r\n\tset points(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('points', v);\r\n\t}\r\n\r\n\t/**\r\n\t * 顶点数组索引,对应points中的顶点\r\n\t * @property polygonIndices\r\n\t * @type {array} \r\n\t */\r\n\tget polygonIndices() {\r\n\t\tlet s = this.property('polygonIndices');\r\n\t\treturn s;\r\n\t}\r\n\tset polygonIndices(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\treturn this.property('polygonIndices', v);\r\n\t}\r\n\t\r\n\t\r\n}\r\n\r\nexport { jmPath };\r\n","import {jmUtils} from \"./jmUtils.js\";\r\nimport {jmList} from \"./jmList.js\";\r\nimport {jmProperty} from './jmProperty.js';\r\nimport {jmShadow} from \"./jmShadow.js\";\r\nimport {jmGradient} from \"./jmGradient.js\";\r\nimport {jmEvents} from \"./jmEvents.js\";\r\nimport {jmControl} from \"./jmControl.js\";\r\nimport {jmPath} from \"./jmPath.js\";\r\n\r\n/**\r\n * jmGraph画图类库\r\n * 对canvas画图api进行二次封装,使其更易调用,省去很多重复的工作。\r\n *\r\n * @module jmGraph\r\n * @class jmGraph\r\n * @extends jmControl\r\n * @param {element} canvas 标签canvas\r\n * @param {object} option 参数:{width:宽,height:高}\r\n * @param {function} callback 初始化后的回调\r\n */\r\nexport default class jmGraph extends jmControl {\r\n\r\n\tconstructor(canvas, option, callback) {\r\n\t\tif(typeof option == 'function') {\r\n\t\t\tcallback = option;\r\n\t\t\toption = {};\r\n\t\t}\r\n\t\r\n\t\toption = option || {};\r\n\t\toption.mode = option.mode || '2d'; // webgl | 2d\r\n\t\toption.interactive = true;\r\n\t\toption.isRegular = true;// 规则的\r\n\r\n\t\tsuper(option, 'jmGraph');\r\n\r\n\t\tthis.option = option || {};\r\n\t\t\r\n\t\tthis.devicePixelRatio = 1; // 根据屏幕的缩放倍数\r\n\r\n\t\t/**\r\n\t\t * 工具类\r\n\t\t * @property utils/util\r\n\t\t * @type {jmUtils}\r\n\t\t */\r\n\t\tthis.util = this.utils = jmUtils;\t\r\n\t\t// 模式 webgl | 2d\r\n\t\tthis.mode = option.mode;\r\n\r\n\t\t//如果是小程序\r\n\t\tif(typeof wx != 'undefined' && wx.canIUse && wx.canIUse('canvas')) {\t\t\t\r\n\t\t\tif(typeof canvas === 'string') canvas = wx.createSelectorQuery().select('#' + canvas);\r\n\t\t\tthis.isWXMiniApp = true;// 微信小程序平台\r\n\t\t\tthis.container = canvas;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif(typeof canvas === 'string' && typeof document != 'undefined') {\r\n\t\t\t\tcanvas = document.getElementById(canvas);\r\n\t\t\t}\r\n\t\t\telse if(canvas.length) {\r\n\t\t\t\tcanvas = canvas[0];\r\n\t\t\t}\r\n\r\n\t\t\tif(canvas.tagName != 'CANVAS') {\r\n\t\t\t\tthis.container = canvas;\r\n\t\t\t\tlet cn = document.createElement('canvas');\r\n\t\t\t\tcanvas.appendChild(cn);\r\n\t\t\t\tcn.width = canvas.offsetWidth||canvas.clientWidth;\r\n\t\t\t\tcn.height = canvas.offsetHeight||canvas.clientHeight;\r\n\t\t\t\tcanvas = cn;\r\n\t\t\t}\t\r\n\t\t\telse {\r\n\t\t\t\tthis.container = canvas.parentElement;\r\n\t\t\t}\r\n\t\t}\t\r\n\t\tthis.canvas = canvas;\t\r\n\t\tthis.context = canvas.getContext(this.mode);\r\n\r\n\t\tthis.textureCanvas = option.textureCanvas || null;\r\n\t\t\r\n\t\t// webgl模式\r\n\t\tif(this.mode === 'webgl') {\r\n\r\n\t\t\tthis.context.enable(this.context.BLEND);// 开启混合功能:(注意,它不可和gl.DEPTH_TEST一起使用)\r\n\t\t\tthis.context.blendFunc(this.context.SRC_ALPHA, this.context.ONE_MINUS_SRC_ALPHA); // 指定混合函数:\r\n\t\t\t// webglcontextlost webglcontextrestored\r\n\t\t\tjmUtils.bindEvent(canvas, 'webglcontextlost', (e)=> {\r\n\t\t\t\tconsole.log('canvas webglcontextlost', e);\r\n\t\t\t\tthis.emit('webglcontextlost', e);\r\n\t\t\t});\r\n\t\t\tjmUtils.bindEvent(canvas, 'webglcontextrestored', (e)=> {\r\n\t\t\t\tconsole.log('canvas webglcontextrestored', e);\r\n\t\t\t\tthis.emit('webglcontextrestored', e);\r\n\t\t\t});\r\n\t\t} \r\n\t\tthis.__init(callback);\r\n\t}\r\n\r\n\t/**\r\n\t * 初始化画布\r\n\t * @method init\r\n\t */\r\n\t__init(callback) {\r\n\t\t/**\r\n\t\t * 当前所有图形类型\r\n\t\t * @property shapes\r\n\t\t * @type {object}\r\n\t\t */\r\n\t\tthis.shapes = Object.assign({\r\n\t\t\t\"path\": jmPath,\r\n\t\t}, this.option.shapes);\r\n\t\t\r\n\t\t/**\r\n\t\t * 画控件前初始化\r\n\t\t * 为了解决一像素线条问题\r\n\t\t */\r\n\t\tthis.on('beginDraw', function() {\t\r\n\t\t\tthis.context.translate && this.context.translate(0.5, 0.5);\r\n\t\t});\r\n\t\t/**\r\n\t\t * 结束控件绘制 为了解决一像素线条问题\r\n\t\t */\r\n\t\tthis.on('endDraw', function() {\t\r\n\t\t\tthis.context.translate && this.context.translate(-0.5, -0.5);\t\t\r\n\t\t});\r\n\r\n\t\t// devicePixelRatio初始化\r\n\t\tlet dpr = typeof window != 'undefined' && window.devicePixelRatio > 1? window.devicePixelRatio : 1;\r\n\t\tif(this.isWXMiniApp) {\r\n\t\t\tdpr = wx.getSystemInfoSync().pixelRatio || 1;\r\n\t\t}\t\t\r\n\t\tthis.devicePixelRatio = dpr;\r\n\t\t// 为了解决锯齿问题,先放大canvas再缩放\r\n\t\tthis.dprScaleSize = this.devicePixelRatio > 1? this.devicePixelRatio : 2;\r\n\t\t\r\n\t\tif(this.option.width > 0) this.width = this.option.width;\r\n\t\tif(this.option.height > 0) this.height = this.option.height;\t\r\n\t\tthis.resize();\t\t\r\n\r\n\t\t//绑定事件\r\n\t\tthis.eventHandler = new jmEvents(this, this.canvas.canvas || this.canvas);\t\r\n\r\n\t\t//如果指定了自动刷新\r\n\t\tif(this.option.autoRefresh) {\r\n\t\t\tthis.autoRefresh();\r\n\t\t}\r\n\r\n\t\tif(callback) callback(this);\t\t\r\n\t}\r\n\r\n\t// 重置canvas大小,并判断高清屏,画图先放大二倍\r\n\tresize(w, h) {\r\n\t\tif(!this.canvas) return;\r\n\r\n\t\tthis.__normalSize = this.__normalSize || { width: 0, height: 0};\r\n\t\tw = w || this.__normalSize.width || this.width, h = h || this.__normalSize.height || this.height;\r\n\r\n\t\tif(w) this.__normalSize.width = w;\r\n\t\tif(h) this.__normalSize.height = h;\r\n\t\r\n\t\tthis.css('width', w + \"px\");\r\n\t\tthis.css('height', h + \"px\");\r\n\t\tif(this.mode === '2d') {\r\n\t\t\tthis.canvas.height = h * this.dprScaleSize;\r\n\t\t\tthis.canvas.width = w * this.dprScaleSize;\r\n\t\t\tif(this.dprScaleSize !== 1) this.context.scale && this.context.scale(this.dprScaleSize, this.dprScaleSize);\t\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.canvas.width = w;\r\n\t\t\tthis.canvas.height = h;\r\n\t\t}\r\n\r\n\t\tthis.context.viewport && this.context.viewport(0, 0, w, h);\r\n\t}\r\n\r\n\t/**\r\n\t * 内部坐标转为页面坐标,这里主要是有devicePixelRatio倍数问题\r\n\t * @param {x, y} point 内部坐标\r\n\t */\r\n\tpointToPixes(point) {\r\n\t\tif(this.dprScaleSize && this.dprScaleSize !== 1) {\r\n\t\t\tpoint = Object.assign({}, point, {\r\n\t\t\t\tx: point.x / this.dprScaleSize,\r\n\t\t\t\ty: point.y / this.dprScaleSize\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn point;\r\n\t}\r\n\r\n\t/**\r\n\t * 宽度\r\n\t * @property width\r\n\t * @type {number}\r\n\t */\r\n\tget width() {\r\n\t\tif(this.__normalSize && this.__normalSize.width) return this.__normalSize.width;\r\n\t\tif(this.canvas) return this.canvas.width;\r\n\t\treturn 0;\r\n\t}\r\n\tset width(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tif(this.canvas) {\r\n\t\t\tthis.resize(v);\r\n\t\t}\t\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 高度\r\n\t * @property height\r\n\t * @type {number}\r\n\t */\r\n\tget height() {\r\n\t\tif(this.__normalSize && this.__normalSize.height) return this.__normalSize.height;\r\n\t\tif(this.canvas) return this.canvas.height;\r\n\t\treturn 0;\r\n\t}\r\n\tset height(v) {\r\n\t\tthis.needUpdate = true;\r\n\t\tif(this.canvas) {\r\n\t\t\tthis.resize(0, v);\r\n\t\t}\r\n\t\treturn v;\r\n\t}\r\n\r\n\t/**\r\n\t * 创建jmGraph的静态对象\r\n\t *\r\n\t * @method create\r\n\t * @return {jmGraph} jmGraph实例对象\r\n\t */\r\n\tstatic create(...args) {\r\n\t\treturn new jmGraph(...args);\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前画布在浏览器中的绝对定位\r\n\t *\r\n\t * @method getPosition\r\n\t * @return {postion} 返回定位坐标\r\n\t */\r\n\tgetPosition() {\r\n\t\tconst p = jmUtils.getElementPosition(this.canvas.canvas || this.canvas);\r\n\t\tp.width = this.width;\r\n\t\tp.height = this.height;\r\n\t\tp.right = p.left + p.width;\r\n\t\tp.bottom = p.top + p.height;\r\n\t\treturn p;\r\n\t}\r\n\r\n\t/**\r\n\t * 注册图形类型,图形类型必需有统一的构造函数。参数为画布句柄和参数对象。\r\n\t *\r\n\t * @method registerShape \r\n\t * @param {string} name 控件图形名称\r\n\t * @param {class} shape 图形控件类型\r\n\t */\r\n\tregisterShape(name, shape) {\r\n\t\tthis.shapes[name] = shape;\r\n\t}\r\n\r\n\t/**\r\n\t * 从已注册的图形类创建图形\r\n\t * 简单直观创建对象\r\n\t *\r\n\t * @method createShape \r\n\t * @param {string} shape 注册控件的名称 也可以直接是控件类型\r\n\t * @param {object} args 实例化控件的参数\r\n\t * @return {object} 已实例化控件的对象\r\n\t */\r\n\tcreateShape(shape, args) {\r\n\t\tif(typeof shape === 'string') {\r\n\t\t\tshape = this.shapes[shape];\r\n\t\t}\r\n\t\tif(shape) {\r\n\t\t\tif(!args) args = {};\r\n\t\t\targs.graph = this;\r\n\t\t\tlet obj = new shape(args);\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 生成阴影对象\r\n\t *\r\n\t * @method createShadow\r\n\t * @param {number} x x偏移量\r\n\t * @param {number} y y偏移量\r\n\t * @param {number} blur 模糊值\r\n\t * @param {string} color 颜色\r\n\t * @return {jmShadow} 阴影对象\r\n\t */\r\n\tcreateShadow(x, y, blur, color) {\r\n\t\tconst sh = new jmShadow(x, y, blur, color);\r\n\t\treturn sh;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成线性渐变对象\r\n\t *\r\n\t * @method createLinearGradient\r\n\t * @param {number} x1 线性渐变起始点X坐标\r\n\t * @param {number} y1 线性渐变起始点Y坐标\r\n\t * @param {number} x2 线性渐变结束点X坐标\r\n\t * @param {number} y2 线性渐变结束点Y坐标\r\n\t * @return {jmGradient} 线性渐变对象\r\n\t */\r\n\tcreateLinearGradient(x1, y1, x2, y2) {\r\n\t\tconst gradient = new jmGradient({\r\n\t\t\ttype:'linear',\r\n\t\t\tx1: x1,\r\n\t\t\ty1: y1,\r\n\t\t\tx2: x2,\r\n\t\t\ty2: y2\r\n\t\t});\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成放射渐变对象\r\n\t *\r\n\t * @method createRadialGradient\r\n\t * @param {number} x1 放射渐变小圆中心X坐标\r\n\t * @param {number} y1 放射渐变小圆中心Y坐标\r\n\t * @param {number} r1 放射渐变小圆半径\r\n\t * @param {number} x2 放射渐变大圆中心X坐标\r\n\t * @param {number} y2 放射渐变大圆中心Y坐标\r\n\t * @param {number} r2 放射渐变大圆半径\r\n\t * @return {jmGradient} 放射渐变对象\r\n\t */\r\n\tcreateRadialGradient(x1, y1, r1, x2, y2, r2) {\t\r\n\t\tconst gradient = new jmGradient({\r\n\t\t\ttype:'radial',\r\n\t\t\tx1: x1,\r\n\t\t\ty1: y1,\r\n\t\t\tr1: r1,\r\n\t\t\tx2: x2,\r\n\t\t\ty2: y2,\r\n\t\t\tr2: r2\r\n\t\t});\r\n\t\treturn gradient;\r\n\t}\r\n\r\n\t/**\r\n\t * 重新刷新整个画板\r\n\t * 以加入动画事件触发延时10毫秒刷新,保存最尽的调用只刷新一次,加强性能的效果。\r\n\t *\r\n\t * @method refresh\r\n\t */\r\n\trefresh() {\t\r\n\t\t//加入动画,触发redraw,会导致多次refresh只redraw一次\r\n\t\t/*this.animate(function() {\r\n\t\t\treturn false;\r\n\t\t},100,'jmgraph_refresh');*/\r\n\t\tthis.redraw();\r\n\t}\r\n\r\n\t/**\r\n\t * 重新刷新整个画板\r\n\t * 此方法直接重画,与refresh效果类似\r\n\t *\r\n\t * @method redraw\r\n\t * @param {number} [w] 清除画布的宽度\r\n\t * @param {number} [h] 清除画布的高度\r\n\t */\r\n\tredraw(w, h) {\t\r\n\t\tthis.clear(w||this.width, h||this.height);\r\n\t\tthis.paint();\r\n\t}\r\n\r\n\t/**\r\n\t * 清除画布\r\n\t * \r\n\t * @method clear\r\n\t * @param {number} [w] 清除画布的宽度\r\n\t * @param {number} [h] 清除画布的高度\r\n\t */\r\n\tclear(w, h) {\r\n\t\tif(!w || !h) {\r\n\t\t\tw = this.width;\r\n\t\t\th = this.height;\r\n\t\t\t/*if(this.scaleSize) {\r\n\t\t\t\tw = w / this.scaleSize.x;\r\n\t\t\t\th = h / this.scaleSize.y;\r\n\t\t\t}*/\r\n\t\t}\r\n\t\t\r\n\t\tif(this.context.clearRect) {\r\n\t\t\tif(this.style && this.style.fill) {\r\n\t\t\t\tthis.points = [\r\n\t\t\t\t\t{x:0, y:0},\r\n\t\t\t\t\t{x:w, y:0},\r\n\t\t\t\t\t{x:w, y:h},\r\n\t\t\t\t\t{x:0, y:h}\r\n\t\t\t\t];\r\n\t\t\t\tthis.style.close = true;// 封闭填充\r\n\t\t\t}\r\n\r\n\t\t\tthis.context.clearRect(0, 0, w, h);\r\n\t\t}\r\n\t\telse if(this.mode === 'webgl' && this.context.clear) {\r\n\t\t\tconst color = this.style && this.style.fill? this.utils.hexToRGBA(this.style.fill): {\r\n\t\t\t\tr: 0,\r\n\t\t\t\tg: 0,\r\n\t\t\t\tb: 0,\r\n\t\t\t\ta: 0\r\n\t\t\t};\r\n\t\t\tthis.context.clearColor(color.r, color.g, color.b, color.a); // 设置清空颜色缓冲时的颜色值\r\n \tthis.context.clear(this.context.COLOR_BUFFER_BIT); // 清空颜色缓冲区,也就是清空画布\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* 设置画布样式,此处只是设置其css样式\r\n\t*\r\n\t* @method css\r\n\t* @param {string} name 样式名\r\n\t* @param {string} value 样式值\r\n\t*/\r\n\tcss(name, value) {\r\n\t\tif(this.canvas && this.canvas.style) {\r\n\t\t\tif(typeof value != 'undefined') this.canvas.style[name] = value;\r\n\t\t\treturn this.canvas.style[name];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 生成路径对象\r\n\t *\r\n\t * @method createPath\r\n\t * @param {array} points 路径中的描点集合\r\n\t * @param {style} style 当前路径的样式\r\n\t * @return {jmPath} 路径对象jmPath\r\n\t */\r\n\tcreatePath(points, style, option={}) {\r\n\t\tconst path = this.createShape('path',{\r\n\t\t\tpoints: points,\r\n\t\t\tstyle: style,\r\n\t\t\t...option\r\n\t\t});\r\n\t\treturn path;\r\n\t}\r\n\r\n\t/**\r\n\t * 生成直线\r\n\t * \r\n\t * @method createLine\r\n\t * @param {point} start 直线的起点\r\n\t * @param {point} end 直线的终点\r\n\t * @param {style} 直线的样式\r\n\t * @return {jmLine} 直线对象\r\n\t */\r\n\tcreateLine(start, end, style) {\r\n\t\tconst line = this.createShape('line', {\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\t\t\tstyle: style\r\n\t\t});\r\n\t\treturn line;\r\n\t}\r\n\r\n\t/**\r\n\t * 缩小整个画布按比例0.9\r\n\t * \r\n\t * @method zoomOut\r\n\t */\r\n\tzoomOut() {\r\n\t\tthis.scale(0.9 ,0.9);\r\n\t}\r\n\r\n\t/**\r\n\t * 放大 每次增大0.1的比例\r\n\t * \r\n\t * @method zoomIn\r\n\t */\r\n\tzoomIn() {\t\t\r\n\t\tthis.scale(1.1 ,1.1);\r\n\t}\r\n\r\n\t/**\r\n\t * 大小复原\r\n\t * \r\n\t * @method zoomActual\r\n\t */\r\n\tzoomActual() {\r\n\t\tif(this.scaleSize) {\r\n\t\t\tthis.scale(1 / this.scaleSize.x ,1 / this.scaleSize.y);\t\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.scale(1 ,1);\t\r\n\t\t}\t\r\n\t}\r\n\r\n\t/**\r\n\t * 放大缩小画布\r\n\t * \r\n\t * @method scale\r\n\t * @param {number} dx 缩放X轴比例\r\n\t * @param {number} dy 缩放Y轴比例\r\n\t */\r\n\tscale(dx, dy) {\r\n\t\tif(!this.normalSize) {\r\n\t\t\tthis.normalSize = {\r\n\t\t\t\twidth: this.canvas.width,\r\n\t\t\t\theight: this.canvas.height\r\n\t\t\t};\t\t\r\n\t\t}\r\n\t\t\r\n\t\tthis.context.scale(dx,dy);\r\n\t\tif(!this.scaleSize) {\r\n\t\t\tthis.scaleSize = {x:dx,y:dy};\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.scaleSize = {x:dx * this.scaleSize.x, y:dy * this.scaleSize.y};\r\n\t\t}\r\n\t\tthis.refresh();\r\n\t}\r\n\r\n\t/**\r\n\t * 保存为base64图形数据\r\n\t * \r\n\t * @method toDataURL\r\n\t * @return {string} 当前画布图的base64字符串\r\n\t */\r\n\ttoDataURL() {\r\n\t\tlet data = this.canvas.toDataURL?this.canvas.toDataURL():'';\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/** \r\n\t * 自动刷新画版\r\n\t * @param {function} callback 执行回调\r\n\t */\r\n\tautoRefresh(callback) {\r\n\t\tif(this.___isAutoRefreshing) return;\r\n\t\tconst self = this;\r\n\t\tthis.___isAutoRefreshing = true;\r\n\t\t\r\n\t\tfunction update() {\r\n\t\t\tif(self.destroyed) {\r\n\t\t\t\tself.___isAutoRefreshing = false;\r\n\t\t\t\treturn;// 已销毁\r\n\t\t\t}\r\n\t\t\tif(self.needUpdate) self.redraw();\r\n\t\t\t// 触发刷新事件\r\n\t\t\tself.emit('update');\r\n\r\n\t\t\tself.__requestAnimationFrameFunHandler && self.cancelAnimationFrame(self.__requestAnimationFrameFunHandler);\r\n\t\t\tself.__requestAnimationFrameFunHandler = self.requestAnimationFrame(update);\r\n\t\t\tif(callback) callback();\r\n\t\t}\r\n\t\tself.__requestAnimationFrameFunHandler && this.cancelAnimationFrame(self.__requestAnimationFrameFunHandler);\r\n\t\tself.__requestAnimationFrameFunHandler = this.requestAnimationFrame(update);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 销毁当前对象\r\n\tdestroy() {\r\n\t\tthis.eventHandler.destroy();\r\n\t\tthis.destroyed = true;// 标记已销毁\r\n\t}\r\n}\r\n\r\nexport { \r\n\tjmGraph, \r\n\tjmUtils,\r\n\tjmList,\r\n\tjmProperty,\r\n\tjmShadow,\r\n\tjmGradient,\r\n\tjmEvents,\r\n\tjmControl,\r\n\tjmPath,\r\n };\r\n"],"names":["jmList","Array","ps","arg","length","isArray","i","push","option","type","obj","this","includes","_typeof","removeAt","index","splice","removeHandler","call","find","cb","inverse","len","handler","count","colorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","transparent","jmUtils","source","target","v","deep","copyHandler","deepIndex","undefined","isType","dest","clone","slice","k","__proto__","tagName","getContext","name","fun","opt","indexOf","ns","split","bindEvent","attachEvent","addEventListener","removeEventListener","detachEvent","el","pos","offsetParent","top","offsetTop","left","offsetLeft","x","y","evt","scale","isTouch","touches","event","changedTouches","targetTouches","srcElement","px","pageX","clientX","document","documentElement","scrollLeft","body","py","pageY","clientY","scrollTop","ox","offsetX","oy","offsetY","p","getElementPosition","layerX","layerY","screenX","screenY","constructor","pt","polygon","offset","j","n","inside","redo","Math","abs","min","max","f","l","sqrt","_x","parentBounds","targetBounds","result","right","bottom","rp","r","cos","sin","x1","y1","c","sc","substring","trimStart","trimEnd","per","trim","tmp","checkPercent","h","toLowerCase","iv","floor","hex","__hexToRGBA_Cache","m","res","color","a","substr","g","b","Number","hexToNumber","toFixed","match","byteToDecimal","hexToRGBA","callback","win","requestAnimationFrame","window","setTimeout","cancelAnimationFrame","clearTimeout","control_id_counter","jmObject","graph","id","is","arguments","animateHandles","params","add","millisec","handle","self","dispatcher","_this","overduehandles","curTimes","Date","getTime","each","ani","times","apply","e","console","info","toString","remove","animate","PROPERTY_KEY","Symbol","jmProperty","mode","pars","pros","value","args","oldValue","newValue","emit","property","needUpdate","findParent","canvas","jmShadow","blur","fromString","s","ms","test","jmGradient","stops","control","gradient","context","bounds","absoluteBounds","getAbsoluteBounds","x2","y2","location","getLocation","d","radius","width","height","percentToNumber","sx1","sy1","sx2","sy2","webglControl","createLinearGradient","r1","r2","createRadialGradient","createCircularGradient","toColor","addColorStop","get","par","spindex","lastIndexOf","isNaN","addStop","str","jmEvents","container","mouseHandler","jmMouseEvent","keyHandler","jmKeyEvent","eventName","raiseEvent","destroy","instance","eventEvents","init","doc","preventDefault","touchStart","passive","touchMove","touchEnd","touchCancel","removeEvent","checkKeyEvent","earcut","data","holeIndices","dim","maxX","maxY","invSize","hasHoles","outerLen","outerNode","linkedList","triangles","next","prev","start","list","queue","end","steiner","leftmost","getLeftmost","sort","compareX","hole","bridge","hx","hy","qx","Infinity","stop","mx","my","tanMin","pointInTriangle","locallyInside","area","sectorContainsSector","findHoleBridge","bridgeReverse","splitPolygon","filterPoints","eliminateHole","eliminateHoles","minX","minY","earcutLinked","clockwise","last","signedArea","insertNode","equals","removeNode","again","ear","pass","z","zOrder","prevZ","nextZ","q","tail","numMerges","pSize","qSize","inSize","sortLinked","indexCurve","ax","bx","cx","ay","by","cy","x0","y0","minZ","maxZ","isEarHashed","isEar","intersects","cureLocalIntersections","intersectsPolygon","middleInside","isValidDiagonal","splitEarcut","p1","p2","q1","q2","o1","sign","o2","o3","o4","onSegment","num","a2","Node","b2","an","bp","sum","deviation","polygonArea","trianglesArea","flatten","vertices","holes","dimensions","holeIndex","WebglGradientTextureCache","WeblGradient","dx","dy","pow","key","textureCanvas","createElement","ctx","willReadFrequently","clearRect","forEach","utils","fillStyle","beginPath","moveTo","lineTo","closePath","fill","getImageData","createShader","gl","src","shader","shaderSource","compileShader","GLSL_TO_SIZE","mapSize","GL_TABLE","GL_TO_GLSL_TYPES","mapType","typeNames","Object","keys","tn","createProgram","vertexSrc","fragmentSrc","vertexShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","error","VALIDATE_STATUS","getError","getProgramInfoLog","warn","deleteProgram","useProgram","deleteShader","attrs","attributes","ACTIVE_ATTRIBUTES","attribData","getActiveAttrib","size","getAttribLocation","extractAttributes","uniforms","ACTIVE_UNIFORMS","uniformData","getActiveUniform","replace","getUniformLocation","extractUniforms","createBuffer","ARRAY_BUFFER","drawType","STATIC_DRAW","buffer","Error","bindBuffer","bufferData","unitSize","BYTES_PER_ELEMENT","create2DTexture","texture","createTexture","pixelStorei","UNPACK_FLIP_Y_WEBGL","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameterf","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","WeblBase","style","globalAlpha","__curent_program","attr","strip","dataType","FLOAT","vertexAttribPointer","enableVertexAttribArray","writeVertexAttrib","disableVertexAttribArray","Float32Array","createFloat32Buffer","Uint16Array","createUint16Buffer","bufferHandler","deleteBuffer","log","img","texImage2D","RGBA","UNSIGNED_BYTE","pixels","Uint8Array","deleteTexture","points","pointsToArray","earCutPoints","p3","concat","map","arr","webglGradient","pathVertexSource","pathFragmentSource","WebglPath","WebglBase","isRegular","needCut","pathProgram","strokeStyle","rgbToDecimal","isGradient","parentAbsoluteBounds","uniform2f","a_center_point","uniform4f","v_single_color","colorData","colorBuffer","a_color","setParentBounds","pathPoints","a_position","fixedPoints","vertexBuffer","linePoints","genLinePoints","lines","index1","index2","line1","line2","equalPoint","sub1","cuted","intersection","getIntersection","sub2","cutLines","area_abc","area_abd","area_cda","t","line","point","root","polygons","unshift","getIntersectionLines","pathToLines","treeLine","lineWidth","setFragColor","uniform1f","a_point_size","a_type","uniform1i","regular","pathToPoints","writePoints","drawArrays","LINES","POINTS","filled","earCutPointsToTriangles","triangle","fillColor","fillImage","getPolygon","imgData","toImageData","TRIANGLE_FAN","ImageData","createDataTexture","createImgTexture","u_sample","v_texture_bounds","fillTexture","coordBuffer","a_text_coord","jmStyleMap","jmControl","position","zIndex","interactive","_this2","initializing","on","bind","children","css","cur","oadd","parent","contain","oremove","levelItems","zindex","clear","__setStyle","mpkey","styleValue","_this3","mpname","toGradient","setStyle","translate","angle","tranX","tranY","getRotation","rotateX","rotateY","rotate","transform","scaleX","skewX","skewY","scaleY","cursor","isReset","rect","local","center","margin","getBounds","rotation","trans","offseted","cpoints","rec","prec","beginDraw","close","stroke","endDraw","draw","visible","initPoints","needDraw","save","item","paint","restore","__events","eventCollection","getEvent","events","unbind","runEventHandle","cancel","pad","getPosition","rotatePoints","pointInPolygon","getEventPosition","scaleSize","button","keyCode","charCode","which","ctrlKey","path","stoped","abounds","inpos","checkPoint","runEventAndPopEvent","focused","__mvMonitor","mouseDown","curposition","mv","outside","parentbounds","offsetx","offsety","lockSide","thisbounds","checkOutSide","mu","ml","md","jmPath","polygonIndices","jmGraph","cn","devicePixelRatio","util","wx","canIUse","createSelectorQuery","select","isWXMiniApp","getElementById","appendChild","offsetWidth","clientWidth","offsetHeight","clientHeight","parentElement","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","__init","shapes","assign","dpr","getSystemInfoSync","pixelRatio","dprScaleSize","resize","eventHandler","autoRefresh","w","__normalSize","viewport","shape","redraw","clearColor","COLOR_BUFFER_BIT","createShape","normalSize","refresh","toDataURL","___isAutoRefreshing","__requestAnimationFrameFunHandler","update","destroyed"],"mappings":"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"}
|