mirror of
https://github.com/konvajs/konva.git
synced 2025-04-05 20:48:28 +08:00
30 lines
64 KiB
JavaScript
30 lines
64 KiB
JavaScript
/**
|
|
* KineticJS JavaScript Library core
|
|
* http://www.kineticjs.com/
|
|
* Copyright 2012, Eric Rowell
|
|
* Licensed under the MIT or GPL Version 2 licenses.
|
|
* Date: Sep 22 2012
|
|
*
|
|
* Copyright (C) 2011 - 2012 by Eric Rowell
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
var Kinetic={};Kinetic.Filters={},Kinetic.Plugins={},Kinetic.Global={BUBBLE_WHITELIST:["mousedown","mousemove","mouseup","mouseover","mouseout","click","dblclick","touchstart","touchmove","touchend","tap","dbltap","dragstart","dragmove","dragend"],BUFFER_WHITELIST:["fill","stroke","textFill","textStroke"],BUFFER_BLACKLIST:["shadow"],stages:[],idCounter:0,tempNodes:{},shapes:{},maxDragTimeInterval:20,drag:{moving:!1,offset:{x:0,y:0},lastDrawTime:0},warn:function(e){console&&console.warn&&console.warn("Kinetic warning: "+e)},extend:function(e,t){for(var n in t.prototype)n in e.prototype||(e.prototype[n]=t.prototype[n])},_pullNodes:function(e){var t=this.tempNodes;for(var n in t){var r=t[n];r.getStage()!==undefined&&r.getStage()._id===e._id&&(e._addId(r),e._addName(r),this._removeTempNode(r))}},_addTempNode:function(e){this.tempNodes[e._id]=e},_removeTempNode:function(e){delete this.tempNodes[e._id]}},Kinetic.Transition=function(e,t){function r(e,t,i,s){for(var o in e)o!=="duration"&&o!=="easing"&&o!=="callback"&&(Kinetic.Type._isObject(e[o])?(i[o]={},r(e[o],t[o],i[o],s)):n._add(n._getTween(t,o,e[o],i,s)))}this.node=e,this.config=t,this.tweens=[];var n=this,i={};r(t,e.attrs,i,i);var s=0;for(var o=0;o<this.tweens.length;o++){var u=this.tweens[o];u.onFinished=function(){s++,s>=n.tweens.length&&n.onFinished()}}},Kinetic.Transition.prototype={start:function(){for(var e=0;e<this.tweens.length;e++)this.tweens[e].start()},stop:function(){for(var e=0;e<this.tweens.length;e++)this.tweens[e].stop()},resume:function(){for(var e=0;e<this.tweens.length;e++)this.tweens[e].resume()},_onEnterFrame:function(){for(var e=0;e<this.tweens.length;e++)this.tweens[e].onEnterFrame()},_add:function(e){this.tweens.push(e)},_getTween:function(e,t,n,r,i){var s=this.config,o=this.node,u=s.easing;u===undefined&&(u="linear");var a=new Kinetic.Tween(o,function(e){r[t]=e,o.setAttrs(i)},Kinetic.Tweens[u],e[t],n,s.duration);return a}},Kinetic.Filters.Grayscale=function(e){var t=e.data;for(var n=0;n<t.length;n+=4){var r=.34*t[n]+.5*t[n+1]+.16*t[n+2];t[n]=r,t[n+1]=r,t[n+2]=r}},Kinetic.Type={_isElement:function(e){return!!e&&e.nodeType==1},_isFunction:function(e){return!!(e&&e.constructor&&e.call&&e.apply)},_isObject:function(e){return!!e&&e.constructor==Object},_isArray:function(e){return Object.prototype.toString.call(e)=="[object Array]"},_isNumber:function(e){return Object.prototype.toString.call(e)=="[object Number]"},_isString:function(e){return Object.prototype.toString.call(e)=="[object String]"},_hasMethods:function(e){var t=[];for(var n in e)this._isFunction(e[n])&&t.push(n);return t.length>0},_getXY:function(e){if(this._isNumber(e))return{x:e,y:e};if(this._isArray(e)){if(e.length===1){var t=e[0];if(this._isNumber(t))return{x:t,y:t};if(this._isArray(t))return{x:t[0],y:t[1]};if(this._isObject(t))return t}else if(e.length>=2)return{x:e[0],y:e[1]}}else if(this._isObject(e))return e;return{x:0,y:0}},_getSize:function(e){if(this._isNumber(e))return{width:e,height:e};if(this._isArray(e))if(e.length===1){var t=e[0];if(this._isNumber(t))return{width:t,height:t};if(this._isArray(t)){if(t.length>=4)return{width:t[2],height:t[3]};if(t.length>=2)return{width:t[0],height:t[1]}}else if(this._isObject(t))return t}else{if(e.length>=4)return{width:e[2],height:e[3]};if(e.length>=2)return{width:e[0],height:e[1]}}else if(this._isObject(e))return e;return{width:0,height:0}},_getPoints:function(e){if(e===undefined)return[];if(this._isObject(e[0]))return e;var t=[];for(var n=0;n<e.length;n+=2)t.push({x:e[n],y:e[n+1]});return t},_getImage:function(e,t){if(!e)t(null);else if(this._isElement(e))t(e);else if(this._isString(e)){var n=new Image;n.onload=function(){t(n)},n.src=e}else if(e.data){var r=document.createElement("canvas");r.width=e.width,r.height=e.height;var i=r.getContext("2d");i.putImageData(e,0,0);var s=r.toDataURL(),n=new Image;n.onload=function(){t(n)},n.src=s}else t(null)},_rgbToHex:function(e,t,n){return((1<<24)+(e<<16)+(t<<8)+n).toString(16).slice(1)},_hexToRgb:function(e){var t=parseInt(e,16);return{r:t>>16&255,g:t>>8&255,b:t&255}},_getRandomColorKey:function(){var e=Math.round(Math.random()*255),t=Math.round(Math.random()*255),n=Math.round(Math.random()*255);return this._rgbToHex(e,t,n)}},Kinetic.Canvas=function(e,t){this.element=document.createElement("canvas"),this.context=this.element.getContext("2d"),this.element.width=e,this.element.height=t},Kinetic.Canvas.prototype={clear:function(){var e=this.getContext(),t=this.getElement();e.clearRect(0,0,t.width,t.height)},getElement:function(){return this.element},getContext:function(){return this.context},setWidth:function(e){this.element.width=e},setHeight:function(e){this.element.height=e},getWidth:function(){return this.element.width},getHeight:function(){return this.element.height},setSize:function(e,t){this.setWidth(e),this.setHeight(t)},toDataURL:function(e,t){try{return this.element.toDataURL(e,t)}catch(n){return this.element.toDataURL()}}},Kinetic.Tween=function(e,t,n,r,i,s){this._listeners=[],this.addListener(this),this.obj=e,this.propFunc=t,this.begin=r,this._pos=r,this.setDuration(s),this.isPlaying=!1,this._change=0,this.prevTime=0,this.prevPos=0,this.looping=!1,this._time=0,this._position=0,this._startTime=0,this._finish=0,this.name="",this.func=n,this.setFinish(i)},Kinetic.Tween.prototype={setTime:function(e){this.prevTime=this._time,e>this.getDuration()?this.looping?(this.rewind(e-this._duration),this.update(),this.broadcastMessage("onLooped",{target:this,type:"onLooped"})):(this._time=this._duration,this.update(),this.stop(),this.broadcastMessage("onFinished",{target:this,type:"onFinished"})):e<0?(this.rewind(),this.update()):(this._time=e,this.update())},getTime:function(){return this._time},setDuration:function(e){this._duration=e===null||e<=0?1e5:e},getDuration:function(){return this._duration},setPosition:function(e){this.prevPos=this._pos,this.propFunc(e),this._pos=e,this.broadcastMessage("onChanged",{target:this,type:"onChanged"})},getPosition:function(e){return e===undefined&&(e=this._time),this.func(e,this.begin,this._change,this._duration)},setFinish:function(e){this._change=e-this.begin},getFinish:function(){return this.begin+this._change},start:function(){this.rewind(),this.startEnterFrame(),this.broadcastMessage("onStarted",{target:this,type:"onStarted"})},rewind:function(e){this.stop(),this._time=e===undefined?0:e,this.fixTime(),this.update()},fforward:function(){this._time=this._duration,this.fixTime(),this.update()},update:function(){this.setPosition(this.getPosition(this._time))},startEnterFrame:function(){this.stopEnterFrame(),this.isPlaying=!0,this.onEnterFrame()},onEnterFrame:function(){this.isPlaying&&this.nextFrame()},nextFrame:function(){this.setTime((this.getTimer()-this._startTime)/1e3)},stop:function(){this.stopEnterFrame(),this.broadcastMessage("onStopped",{target:this,type:"onStopped"})},stopEnterFrame:function(){this.isPlaying=!1},continueTo:function(e,t){this.begin=this._pos,this.setFinish(e),this._duration!==undefined&&this.setDuration(t),this.start()},resume:function(){this.fixTime(),this.startEnterFrame(),this.broadcastMessage("onResumed",{target:this,type:"onResumed"})},yoyo:function(){this.continueTo(this.begin,this._time)},addListener:function(e){return this.removeListener(e),this._listeners.push(e)},removeListener:function(e){var t=this._listeners,n=t.length;while(n--)if(t[n]==e)return t.splice(n,1),!0;return!1},broadcastMessage:function(){var e=[];for(var t=0;t<arguments.length;t++)e.push(arguments[t]);var n=e.shift(),r=this._listeners,i=r.length;for(var t=0;t<i;t++)r[t][n]&&r[t][n].apply(r[t],e)},fixTime:function(){this._startTime=this.getTimer()-this._time*1e3},getTimer:function(){return(new Date).getTime()-this._time}},Kinetic.Tweens={"back-ease-in":function(e,t,n,r,i,s){var o=1.70158;return n*(e/=r)*e*((o+1)*e-o)+t},"back-ease-out":function(e,t,n,r,i,s){var o=1.70158;return n*((e=e/r-1)*e*((o+1)*e+o)+1)+t},"back-ease-in-out":function(e,t,n,r,i,s){var o=1.70158;return(e/=r/2)<1?n/2*e*e*(((o*=1.525)+1)*e-o)+t:n/2*((e-=2)*e*(((o*=1.525)+1)*e+o)+2)+t},"elastic-ease-in":function(e,t,n,r,i,s){var o=0;return e===0?t:(e/=r)==1?t+n:(s||(s=r*.3),!i||i<Math.abs(n)?(i=n,o=s/4):o=s/(2*Math.PI)*Math.asin(n/i),-(i*Math.pow(2,10*(e-=1))*Math.sin((e*r-o)*2*Math.PI/s))+t)},"elastic-ease-out":function(e,t,n,r,i,s){var o=0;return e===0?t:(e/=r)==1?t+n:(s||(s=r*.3),!i||i<Math.abs(n)?(i=n,o=s/4):o=s/(2*Math.PI)*Math.asin(n/i),i*Math.pow(2,-10*e)*Math.sin((e*r-o)*2*Math.PI/s)+n+t)},"elastic-ease-in-out":function(e,t,n,r,i,s){var o=0;return e===0?t:(e/=r/2)==2?t+n:(s||(s=r*.3*1.5),!i||i<Math.abs(n)?(i=n,o=s/4):o=s/(2*Math.PI)*Math.asin(n/i),e<1?-0.5*i*Math.pow(2,10*(e-=1))*Math.sin((e*r-o)*2*Math.PI/s)+t:i*Math.pow(2,-10*(e-=1))*Math.sin((e*r-o)*2*Math.PI/s)*.5+n+t)},"bounce-ease-out":function(e,t,n,r){return(e/=r)<1/2.75?n*7.5625*e*e+t:e<2/2.75?n*(7.5625*(e-=1.5/2.75)*e+.75)+t:e<2.5/2.75?n*(7.5625*(e-=2.25/2.75)*e+.9375)+t:n*(7.5625*(e-=2.625/2.75)*e+.984375)+t},"bounce-ease-in":function(e,t,n,r){return n-Kinetic.Tweens["bounce-ease-out"](r-e,0,n,r)+t},"bounce-ease-in-out":function(e,t,n,r){return e<r/2?Kinetic.Tweens["bounce-ease-in"](e*2,0,n,r)*.5+t:Kinetic.Tweens["bounce-ease-out"](e*2-r,0,n,r)*.5+n*.5+t},"ease-in":function(e,t,n,r){return n*(e/=r)*e+t},"ease-out":function(e,t,n,r){return-n*(e/=r)*(e-2)+t},"ease-in-out":function(e,t,n,r){return(e/=r/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t},"strong-ease-in":function(e,t,n,r){return n*(e/=r)*e*e*e*e+t},"strong-ease-out":function(e,t,n,r){return n*((e=e/r-1)*e*e*e*e+1)+t},"strong-ease-in-out":function(e,t,n,r){return(e/=r/2)<1?n/2*e*e*e*e*e+t:n/2*((e-=2)*e*e*e*e+2)+t},linear:function(e,t,n,r){return n*e/r+t}},Kinetic.Transform=function(){this.m=[1,0,0,1,0,0]},Kinetic.Transform.prototype={translate:function(e,t){this.m[4]+=this.m[0]*e+this.m[2]*t,this.m[5]+=this.m[1]*e+this.m[3]*t},scale:function(e,t){this.m[0]*=e,this.m[1]*=e,this.m[2]*=t,this.m[3]*=t},rotate:function(e){var t=Math.cos(e),n=Math.sin(e),r=this.m[0]*t+this.m[2]*n,i=this.m[1]*t+this.m[3]*n,s=this.m[0]*-n+this.m[2]*t,o=this.m[1]*-n+this.m[3]*t;this.m[0]=r,this.m[1]=i,this.m[2]=s,this.m[3]=o},getTranslation:function(){return{x:this.m[4],y:this.m[5]}},multiply:function(e){var t=this.m[0]*e.m[0]+this.m[2]*e.m[1],n=this.m[1]*e.m[0]+this.m[3]*e.m[1],r=this.m[0]*e.m[2]+this.m[2]*e.m[3],i=this.m[1]*e.m[2]+this.m[3]*e.m[3],s=this.m[0]*e.m[4]+this.m[2]*e.m[5]+this.m[4],o=this.m[1]*e.m[4]+this.m[3]*e.m[5]+this.m[5];this.m[0]=t,this.m[1]=n,this.m[2]=r,this.m[3]=i,this.m[4]=s,this.m[5]=o},invert:function(){var e=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),t=this.m[3]*e,n=-this.m[1]*e,r=-this.m[2]*e,i=this.m[0]*e,s=e*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),o=e*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);this.m[0]=t,this.m[1]=n,this.m[2]=r,this.m[3]=i,this.m[4]=s,this.m[5]=o},getMatrix:function(){return this.m}},Kinetic.Animation=function(e){e||(e={});for(var t in e)this[t]=e[t];this.frame={time:0,timeDiff:0,lastTime:(new Date).getTime()},this.id=Kinetic.Animation.animIdCounter++},Kinetic.Animation.prototype={start:function(){this.stop(),this.frame.lastTime=(new Date).getTime(),Kinetic.Animation._addAnimation(this),Kinetic.Animation._handleAnimation()},stop:function(){Kinetic.Animation._removeAnimation(this)}},Kinetic.Animation.animations=[],Kinetic.Animation.animIdCounter=0,Kinetic.Animation.animRunning=!1,Kinetic.Animation._addAnimation=function(e){this.animations.push(e)},Kinetic.Animation._removeAnimation=function(e){var t=e.id,n=this.animations;for(var r=0;r<n.length;r++)if(n[r].id===t)return this.animations.splice(r,1),!1},Kinetic.Animation._updateFrameObject=function(e){var t=(new Date).getTime();e.frame.timeDiff=t-e.frame.lastTime,e.frame.lastTime=t,e.frame.time+=e.frame.timeDiff},Kinetic.Animation._runFrames=function(){var e={};for(var t=0;t<this.animations.length;t++){var n=this.animations[t];this._updateFrameObject(n),n.node&&n.node._id!==undefined&&(e[n.node._id]=n.node),n.func&&n.func(n.frame)}for(var r in e)e[r].draw()},Kinetic.Animation._animationLoop=function(){if(this.animations.length>0){this._runFrames();var e=this;requestAnimFrame(function(){e._animationLoop()})}else this.animRunning=!1},Kinetic.Animation._handleAnimation=function(){var e=this;this.animRunning||(this.animRunning=!0,e._animationLoop())},requestAnimFrame=function(e){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),Kinetic.Node=function(e){this._nodeInit(e)},Kinetic.Node.prototype={_nodeInit:function(e){this.defaultNodeAttrs={visible:!0,listening:!0,name:undefined,opacity:1,x:0,y:0,scale:{x:1,y:1},rotation:0,offset:{x:0,y:0},dragConstraint:"none",dragBounds:{},draggable:!1},this.setDefaultAttrs(this.defaultNodeAttrs),this.eventListeners={},this.transAnim=new Kinetic.Animation,this.setAttrs(e),this.on("draggableChange.kinetic",function(){this._onDraggableChange()});var t=this;this.on("idChange.kinetic",function(e){var n=t.getStage();n&&(n._removeId(e.oldVal),n._addId(t))}),this.on("nameChange.kinetic",function(e){var n=t.getStage();n&&(n._removeName(e.oldVal,t._id),n._addName(t))}),this._onDraggableChange()},on:function(e,t){var n=e.split(" ");for(var r=0;r<n.length;r++){var i=n[r],s=i,o=s.split("."),u=o[0],a=o.length>1?o[1]:"";this.eventListeners[u]||(this.eventListeners[u]=[]),this.eventListeners[u].push({name:a,handler:t})}},off:function(e){var t=e.split(" ");for(var n=0;n<t.length;n++){var r=t[n],i=r,s=i.split("."),o=s[0];if(this.eventListeners[o]&&s.length>1){var u=s[1];for(var a=0;a<this.eventListeners[o].length;a++)if(this.eventListeners[o][a].name===u){this.eventListeners[o].splice(a,1);if(this.eventListeners[o].length===0){delete this.eventListeners[o];break}a--}}else delete this.eventListeners[o]}},getAttrs:function(){return this.attrs},setDefaultAttrs:function(e){this.attrs===undefined&&(this.attrs={});if(e)for(var t in e)this.attrs[t]===undefined&&(this.attrs[t]=e[t])},setAttrs:function(e){var t=Kinetic.Type,n=this;if(e!==undefined){function r(e,i,s){for(var o in i){var u=i[o],a=e[o];s===0&&n._fireBeforeChangeEvent(o,a,u),e[o]===undefined&&u!==undefined&&(e[o]={});if(t._isObject(u)&&!t._isArray(u)&&!t._isElement(u)&&!t._hasMethods(u))Kinetic.Type._isObject(e[o])||(e[o]={}),r(e[o],u,s+1);else switch(o){case"radius":if(Kinetic.Type._isNumber(u))n._setAttr(e,o,u);else{var f=t._getXY(u);n._setAttr(e[o],"x",f.x),n._setAttr(e[o],"y",f.y)}break;case"rotationDeg":n._setAttr(e,"rotation",i[o]*Math.PI/180),o="rotation";break;case"offset":var l=t._getXY(u);n._setAttr(e[o],"x",l.x),n._setAttr(e[o],"y",l.y);break;case"scale":var l=t._getXY(u);n._setAttr(e[o],"x",l.x),n._setAttr(e[o],"y",l.y);break;case"points":n._setAttr(e,o,t._getPoints(u));break;case"crop":var l=t._getXY(u),c=t._getSize(u);n._setAttr(e[o],"x",l.x),n._setAttr(e[o],"y",l.y),n._setAttr(e[o],"width",c.width),n._setAttr(e[o],"height",c.height);break;default:n._setAttr(e,o,u)}s===0&&n._fireChangeEvent(o,a,u)}}r(this.attrs,e,0)}},isVisible:function(){return this.attrs.visible&&this.getParent()&&!this.getParent().isVisible()?!1:this.attrs.visible},show:function(){this.setAttrs({visible:!0})},hide:function(){this.setAttrs({visible:!1})},getZIndex:function(){return this.index},getAbsoluteZIndex:function(){function i(t){var s=[];for(var o=0;o<t.length;o++){var u=t[o];r++,u.nodeType!=="Shape"&&(s=s.concat(u.getChildren())),u._id===n._id&&(o=t.length)}s.length>0&&s[0].getLevel()<=e&&i(s)}var e=this.getLevel(),t=this.getStage(),n=this,r=0;return n.nodeType!=="Stage"&&i(n.getStage().getChildren()),r},getLevel:function(){var e=0,t=this.parent;while(t)e++,t=t.parent;return e},setPosition:function(){var e=Kinetic.Type._getXY(Array.prototype.slice.call(arguments));this.setAttrs(e)},getPosition:function(){return{x:this.attrs.x,y:this.attrs.y}},getAbsolutePosition:function(){var e=this.getAbsoluteTransform(),t=this.getOffset();return e.translate(t.x,t.y),e.getTranslation()},setAbsolutePosition:function(){var e=Kinetic.Type._getXY(Array.prototype.slice.call(arguments)),t=this._clearTransform();this.attrs.x=t.x,this.attrs.y=t.y,delete t.x,delete t.y;var n=this.getAbsoluteTransform();n.invert(),n.translate(e.x,e.y),e={x:this.attrs.x+n.getTranslation().x,y:this.attrs.y+n.getTranslation().y},this.setPosition(e.x,e.y),this._setTransform(t)},move:function(){var e=Kinetic.Type._getXY(Array.prototype.slice.call(arguments)),t=this.getX(),n=this.getY();e.x!==undefined&&(t+=e.x),e.y!==undefined&&(n+=e.y),this.setAttrs({x:t,y:n})},getRotationDeg:function(){return this.attrs.rotation*180/Math.PI},rotate:function(e){this.setAttrs({rotation:this.getRotation()+e})},rotateDeg:function(e){this.setAttrs({rotation:this.getRotation()+e*Math.PI/180})},moveToTop:function(){var e=this.index;this.parent.children.splice(e,1),this.parent.children.push(this),this.parent._setChildrenIndices();if(this.nodeType==="Layer"){var t=this.getStage();t&&(t.content.removeChild(this.canvas.element),t.content.appendChild(this.canvas.element))}},moveUp:function(){var e=this.index;if(e<this.parent.getChildren().length-1){this.parent.children.splice(e,1),this.parent.children.splice(e+1,0,this),this.parent._setChildrenIndices();if(this.nodeType==="Layer"){var t=this.getStage();t&&(t.content.removeChild(this.canvas.element),this.index<t.getChildren().length-1?t.content.insertBefore(this.canvas.element,t.getChildren()[this.index+1].canvas.element):t.content.appendChild(this.canvas.element))}}},moveDown:function(){var e=this.index;if(e>0){this.parent.children.splice(e,1),this.parent.children.splice(e-1,0,this),this.parent._setChildrenIndices();if(this.nodeType==="Layer"){var t=this.getStage();if(t){var n=t.getChildren();t.content.removeChild(this.canvas.element),t.content.insertBefore(this.canvas.element,n[this.index+1].canvas.element)}}}},moveToBottom:function(){var e=this.index;if(e>0){this.parent.children.splice(e,1),this.parent.children.unshift(this),this.parent._setChildrenIndices();if(this.nodeType==="Layer"){var t=this.getStage();if(t){var n=t.getChildren();t.content.removeChild(this.canvas.element),t.content.insertBefore(this.canvas.element,n[1].canvas.element)}}}},setZIndex:function(e){var t=this.index;this.parent.children.splice(t,1),this.parent.children.splice(e,0,this),this.parent._setChildrenIndices()},getAbsoluteOpacity:function(){var e=1,t=this;while(t.nodeType!=="Stage")e*=t.attrs.opacity,t=t.parent;return e},isDragging:function(){var e=Kinetic.Global;return e.drag.node&&e.drag.node._id===this._id&&e.drag.moving},moveTo:function(e){var t=this.parent;t.children.splice(this.index,1),t._setChildrenIndices(),e.children.push(this),this.index=e.children.length-1,this.parent=e,e._setChildrenIndices()},getParent:function(){return this.parent},getLayer:function(){return this.nodeType==="Layer"?this:this.getParent().getLayer()},getStage:function(){return this.nodeType!=="Stage"&&this.getParent()?this.getParent().getStage():this.nodeType==="Stage"?this:undefined},simulate:function(e){this._handleEvent(e,{})},transitionTo:function(e){var t=this.nodeType==="Stage"?this:this.getLayer(),n=this,r=new Kinetic.Transition(this,e);return this.transAnim.func=function(){r._onEnterFrame()},this.transAnim.node=t,r.onFinished=function(){n.transAnim.stop(),n.transAnim.node.draw(),e.callback&&e.callback()},r.start(),this.transAnim.start(),r},getAbsoluteTransform:function(){var e=new Kinetic.Transform,t=[],n=this.parent;t.unshift(this);while(n)t.unshift(n),n=n.parent;for(var r=0;r<t.length;r++){var i=t[r],s=i.getTransform();e.multiply(s)}return e},getTransform:function(){var e=new Kinetic.Transform;return(this.attrs.x!==0||this.attrs.y!==0)&&e.translate(this.attrs.x,this.attrs.y),this.attrs.rotation!==0&&e.rotate(this.attrs.rotation),(this.attrs.scale.x!==1||this.attrs.scale.y!==1)&&e.scale(this.attrs.scale.x,this.attrs.scale.y),this.attrs.offset&&(this.attrs.offset.x!==0||this.attrs.offset.y!==0)&&e.translate(-1*this.attrs.offset.x,-1*this.attrs.offset.y),e},clone:function(e){var t=this.shapeType||this.nodeType,n=new Kinetic[t](this.attrs);for(var r in this.eventListeners){var i=this.eventListeners[r];for(var s=0;s<i.length;s++){var o=i[s];o.name.indexOf("kinetic")<0&&(n.eventListeners[r]||(n.eventListeners[r]=[]),n.eventListeners[r].push(o))}}return n.setAttrs(e),n},toDataURL:function(e){var t=e&&e.mimeType?e.mimeType:null,n=e&&e.quality?e.quality:null,r;e&&e.width&&e.height?r=new Kinetic.Canvas(e.width,e.height):r=this.getStage().bufferCanvas;var i=r.getContext();return r.clear(),this._draw(r),r.toDataURL(t,n)},toImage:function(e){Kinetic.Type._getImage(this.toDataURL(e),function(t){e.callback(t)})},_clearTransform:function(){var e={x:this.attrs.x,y:this.attrs.y,rotation:this.attrs.rotation,scale:{x:this.attrs.scale.x,y:this.attrs.scale.y},offset:{x:this.attrs.offset.x,y:this.attrs.offset.y}};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scale={x:1,y:1},this.attrs.offset={x:0,y:0},e},_setTransform:function(e){for(var t in e)this.attrs[t]=e[t]},_fireBeforeChangeEvent:function(e,t,n){this._handleEvent("before"+e.toUpperCase()+"Change",{oldVal:t,newVal:n})},_fireChangeEvent:function(e,t,n){this._handleEvent(e+"Change",{oldVal:t,newVal:n})},_setAttr:function(e,t,n){n!==undefined&&(e===undefined&&(e={}),e[t]=n)},_listenDrag:function(){this._dragCleanup();var e=Kinetic.Global,t=this;this.on("mousedown.kinetic touchstart.kinetic",function(e){t._initDrag()})},_initDrag:function(){var e=Kinetic.Global,t=this.getStage(),n=t.getUserPosition();if(n){var r=this.getTransform().getTranslation(),i=this.getAbsoluteTransform().getTranslation(),s=this.getAbsolutePosition();e.drag.node=this,e.drag.offset.x=n.x-s.x,e.drag.offset.y=n.y-s.y,this.nodeType==="Stage"?t.dragAnim.node=this:t.dragAnim.node=this.getLayer(),t.dragAnim.start()}},_onDraggableChange:function(){if(this.attrs.draggable)this._listenDrag();else{this._dragCleanup();var e=this.getStage(),t=Kinetic.Global;e&&t.drag.node&&t.drag.node._id===this._id&&e._endDrag()}},_dragCleanup:function(){this.off("mousedown.kinetic"),this.off("touchstart.kinetic")},_handleEvent:function(e,t,n){this.nodeType==="Shape"&&(t.shape=this);var r=this.getStage(),i=this.eventListeners,s=!0;e==="mouseover"&&n&&this._id===n._id?s=!1:e==="mouseout"&&n&&this._id===n._id&&(s=!1);if(s){if(i[e]){var o=i[e];for(var u=0;u<o.length;u++)o[u].handler.apply(this,[t])}Kinetic.Global.BUBBLE_WHITELIST.indexOf(e)>=0&&!t.cancelBubble&&this.parent&&(n&&n.parent?this._handleEvent.call(this.parent,e,t,n.parent):this._handleEvent.call(this.parent,e,t))}},_draw:function(e){if(this.isVisible()&&(!e||e.name!=="buffer"||this.getListening())){this.__draw&&this.__draw(e);var t=this.children;if(t)for(var n=0;n<t.length;n++){var r=t[n];r.draw?r.draw(e):r._draw(e)}}}},Kinetic.Node.addSetters=function(e,t){for(var n=0;n<t.length;n++){var r=t[n];this._addSetter(e,r)}},Kinetic.Node.addGetters=function(e,t){for(var n=0;n<t.length;n++){var r=t[n];this._addGetter(e,r)}},Kinetic.Node.addGettersSetters=function(e,t){this.addSetters(e,t),this.addGetters(e,t)},Kinetic.Node._addSetter=function(e,t){var n=this,r="set"+t.charAt(0).toUpperCase()+t.slice(1);e.prototype[r]=function(){arguments.length==1?arg=arguments[0]:arg=Array.prototype.slice.call(arguments);var e={};e[t]=arg,this.setAttrs(e)}},Kinetic.Node._addGetter=function(e,t){var n=this,r="get"+t.charAt(0).toUpperCase()+t.slice(1);e.prototype[r]=function(e){return this.attrs[t]}},Kinetic.Node.addGettersSetters(Kinetic.Node,["x","y","scale","rotation","opacity","name","id","offset","draggable","dragConstraint","dragBounds","listening"]),Kinetic.Node.addSetters(Kinetic.Node,["rotationDeg"]),Kinetic.Node.Array=function(){var e=[].slice.call(arguments),t=e.length,n=0;this.length=t;for(;n<t;n++)this[n]=e[n];return this},Kinetic.Node.Array.prototype=new Array;for(var key in Kinetic.Node.prototype)key in Kinetic.Node.Array.prototype||function(e){Kinetic.Node.Array.prototype[e]=function(){for(var t=0;t<this.length;t++)Kinetic.Node.prototype[e].apply(this[t],arguments)}}(key);Kinetic.Container=function(e){this._containerInit(e)},Kinetic.Container.prototype={_containerInit:function(e){this.children=[],Kinetic.Node.call(this,e)},getChildren:function(){return this.children},removeChildren:function(){while(this.children.length>0)this.remove(this.children[0])},add:function(e){e._id=Kinetic.Global.idCounter++,e.index=this.children.length,e.parent=this,this.children.push(e);var t=e.getStage();if(!t)Kinetic.Global._addTempNode(e);else{t._addId(e),t._addName(e);var n=Kinetic.Global;n._pullNodes(t)}return this._add!==undefined&&this._add(e),this},remove:function(e){if(e&&e.index!==undefined&&this.children[e.index]._id==e._id){var t=this.getStage();t&&(t._removeId(e.getId()),t._removeName(e.getName(),e._id)),Kinetic.Global._removeTempNode(e),this.children.splice(e.index,1),this._setChildrenIndices();while(e.children&&e.children.length>0)e.remove(e.children[0]);e._remove!==undefined&&e._remove()}return this},get:function(e){var t=this.getStage(),n,r=e.slice(1);if(e.charAt(0)==="#")n=t.ids[r]!==undefined?[t.ids[r]]:[];else{if(e.charAt(0)!==".")return e==="Shape"||e==="Group"||e==="Layer"?this._getNodes(e):!1;n=t.names[r]!==undefined?t.names[r]:[]}var i=new Kinetic.Node.Array;for(var s=0;s<n.length;s++){var o=n[s];this.isAncestorOf(o)&&i.push(o)}return i},isAncestorOf:function(e){if(this.nodeType==="Stage")return!0;var t=e.getParent();while(t){if(t._id===this._id)return!0;t=t.getParent()}return!1},clone:function(e){var t=Kinetic.Node.prototype.clone.call(this,e);for(var n in this.children)t.add(this.children[n].clone());return t},getIntersections:function(){var e=Kinetic.Type._getXY(Array.prototype.slice.call(arguments)),t=[],n=this.get("Shape");for(var r=0;r<n.length;r++){var i=n[r];i.isVisible()&&i.intersects(e)&&t.push(i)}return t},_getNodes:function(e){function n(r){var i=r.getChildren();for(var s=0;s<i.length;s++){var o=i[s];o.nodeType===e?t.push(o):o.nodeType!=="Shape"&&n(o)}}var t=[];return n(this),t},_setChildrenIndices:function(){for(var e=0;e<this.children.length;e++)this.children[e].index=e}},Kinetic.Global.extend(Kinetic.Container,Kinetic.Node),Kinetic.Stage=function(e){this._initStage(e)},Kinetic.Stage.prototype={_initStage:function(e){this.setDefaultAttrs({width:400,height:200}),typeof e.container=="string"&&(e.container=document.getElementById(e.container)),Kinetic.Container.call(this,e),this._setStageDefaultProperties(),this._id=Kinetic.Global.idCounter++,this._buildDOM(),this._bindContentEvents(),this.on("widthChange.kinetic",function(){this._resizeDOM()}),this.on("heightChange.kinetic",function(){this._resizeDOM()});var t=Kinetic.Global;t.stages.push(this),this._addId(this),this._addName(this)},draw:function(){this._draw()},setSize:function(){var e=Kinetic.Type._getSize(Array.prototype.slice.call(arguments));this.setAttrs(e)},getSize:function(){return{width:this.attrs.width,height:this.attrs.height}},clear:function(){var e=this.children;for(var t=0;t<e.length;t++)e[t].clear()},toJSON:function(){function t(n){var r={};r.attrs={};for(var i in n.attrs){var s=n.attrs[i];!e._isFunction(s)&&!e._isElement(s)&&!e._hasMethods(s)&&(r.attrs[i]=s)}r.nodeType=n.nodeType,r.shapeType=n.shapeType;if(n.nodeType!=="Shape"){r.children=[];var o=n.getChildren();for(var u=0;u<o.length;u++){var a=o[u];r.children.push(t(a))}}return r}var e=Kinetic.Type;return JSON.stringify(t(this))},reset:function(){this.removeChildren(),this._setStageDefaultProperties(),this.setAttrs(this.defaultNodeAttrs)},load:function(e){function t(e,n){var r=n.children;if(r!==undefined)for(var i=0;i<r.length;i++){var s=r[i],o;s.nodeType==="Shape"?s.shapeType===undefined?o="Shape":o=s.shapeType:o=s.nodeType;var u=new Kinetic[o](s.attrs);e.add(u),t(u,s)}}this.reset();var n=JSON.parse(e);this.attrs=n.attrs,t(this,n),this.draw()},getMousePosition:function(e){return this.mousePos},getTouchPosition:function(e){return this.touchPos},getUserPosition:function(e){return this.getTouchPosition()||this.getMousePosition()},getContainer:function(){return this.attrs.container},getStage:function(){return this},getDOM:function(){return this.content},toDataURL:function(e){function a(r){var i=u[r],f=i.getCanvas().toDataURL(),l=new Image;l.onload=function(){o.drawImage(l,0,0),r<u.length-1?a(r+1):e.callback(s.toDataURL(t,n))},l.src=f}var t=e&&e.mimeType?e.mimeType:null,n=e&&e.quality?e.quality:null,r=e&&e.width?e.width:this.attrs.width,i=e&&e.height?e.height:this.attrs.height,s=new Kinetic.Canvas(r,i),o=s.getContext(),u=this.children;a(0)},toImage:function(e){this.toDataURL({callback:function(t){Kinetic.Type._getImage(t,function(t){e.callback(t)})}})},getIntersection:function(e){var t,n=this.getChildren();for(var r=n.length-1;r>=0;r--){var i=n[r],s=i.bufferCanvas.context.getImageData(Math.round(e.x),Math.round(e.y),1,1).data;if(s[3]===255){var o=Kinetic.Type._rgbToHex(s[0],s[1],s[2]);return t=Kinetic.Global.shapes[o],{shape:t,pixel:s}}if(s[0]>0||s[1]>0||s[2]>0||s[3]>0)return{pixel:s}}return null},_resizeDOM:function(){var e=this.attrs.width,t=this.attrs.height;this.content.style.width=e+"px",this.content.style.height=t+"px",this.bufferCanvas.setSize(e,t);var n=this.children;for(var r=0;r<n.length;r++){var i=n[r];i.getCanvas().setSize(e,t),i.bufferCanvas.setSize(e,t),i.draw()}},_add:function(e){e.canvas.setSize(this.attrs.width,this.attrs.height),e.bufferCanvas.setSize(this.attrs.width,this.attrs.height),e.draw(),this.content.appendChild(e.canvas.element)},_setUserPosition:function(e){e||(e=window.event),this._setMousePosition(e),this._setTouchPosition(e)},_bindContentEvents:function(){var e=Kinetic.Global,t=this,n=["mousedown","mousemove","mouseup","mouseout","touchstart","touchmove","touchend"];for(var r=0;r<n.length;r++){var i=n[r];(function(){var e=i;t.content.addEventListener(e,function(n){t["_"+e](n)},!1)})()}},_mouseout:function(e){this._setUserPosition(e);var t=Kinetic.Global,n=this.targetShape;n&&!t.drag.moving&&(n._handleEvent("mouseout",e),this.targetShape=null),this.mousePos=undefined,this._endDrag(e)},_mousemove:function(e){this._setUserPosition(e);var t=Kinetic.Global,n=this.getIntersection(this.getUserPosition());if(n){var r=n.shape;r&&(!t.drag.moving&&n.pixel[3]===255&&(!this.targetShape||this.targetShape._id!==r._id)?(this.targetShape&&this.targetShape._handleEvent("mouseout",e,r),r._handleEvent("mouseover",e,this.targetShape),this.targetShape=r):r._handleEvent("mousemove",e))}else this.targetShape&&!t.drag.moving&&(this.targetShape._handleEvent("mouseout",e),this.targetShape=null);this._startDrag(e)},_mousedown:function(e){this._setUserPosition(e);var t=this.getIntersection(this.getUserPosition());if(t&&t.shape){var n=t.shape;this.clickStart=!0,n._handleEvent("mousedown",e)}this.attrs.draggable&&this._initDrag()},_mouseup:function(e){this._setUserPosition(e);var t=Kinetic.Global,n=this.getIntersection(this.getUserPosition()),r=this;if(n&&n.shape){var i=n.shape;i._handleEvent("mouseup",e),this.clickStart&&(!t.drag.moving||!t.drag.node)&&(i._handleEvent("click",e),this.inDoubleClickWindow&&i._handleEvent("dblclick",e),this.inDoubleClickWindow=!0,setTimeout(function(){r.inDoubleClickWindow=!1},this.dblClickWindow))}this.clickStart=!1,this._endDrag(e)},_touchstart:function(e){this._setUserPosition(e),e.preventDefault
|
|
();var t=this.getIntersection(this.getUserPosition());if(t&&t.shape){var n=t.shape;this.tapStart=!0,n._handleEvent("touchstart",e)}this.attrs.draggable&&this._initDrag()},_touchend:function(e){this._setUserPosition(e);var t=Kinetic.Global,n=this.getIntersection(this.getUserPosition()),r=this;if(n&&n.shape){var i=n.shape;i._handleEvent("touchend",e),this.tapStart&&(!t.drag.moving||!t.drag.node)&&(i._handleEvent("tap",e),this.inDoubleClickWindow&&i._handleEvent("dbltap",e),this.inDoubleClickWindow=!0,setTimeout(function(){r.inDoubleClickWindow=!1},this.dblClickWindow))}this.tapStart=!1,this._endDrag(e)},_touchmove:function(e){this._setUserPosition(e),e.preventDefault();var t=this.getIntersection(this.getUserPosition());if(t&&t.shape){var n=t.shape;n._handleEvent("touchmove",e)}this._startDrag(e)},_setMousePosition:function(e){var t=e.clientX-this._getContentPosition().left,n=e.clientY-this._getContentPosition().top;this.mousePos={x:t,y:n}},_setTouchPosition:function(e){if(e.touches!==undefined&&e.touches.length===1){var t=e.touches[0],n=t.clientX-this._getContentPosition().left,r=t.clientY-this._getContentPosition().top;this.touchPos={x:n,y:r}}},_getContentPosition:function(){var e=this.content.getBoundingClientRect();return{top:e.top,left:e.left}},_endDrag:function(e){var t=Kinetic.Global,n=t.drag.node;n&&(n.nodeType==="Stage"?n.draw():n.getLayer().draw(),t.drag.moving&&(t.drag.moving=!1,n._handleEvent("dragend",e))),t.drag.node=null,this.dragAnim.stop()},_startDrag:function(e){var t=this,n=Kinetic.Global,r=n.drag.node;if(r){var i=t.getUserPosition(),s=r.attrs.dragConstraint,o=r.attrs.dragBounds,u={x:r.attrs.x,y:r.attrs.y},a={x:i.x-n.drag.offset.x,y:i.y-n.drag.offset.y};o.left!==undefined&&a.x<o.left&&(a.x=o.left),o.right!==undefined&&a.x>o.right&&(a.x=o.right),o.top!==undefined&&a.y<o.top&&(a.y=o.top),o.bottom!==undefined&&a.y>o.bottom&&(a.y=o.bottom),r.setAbsolutePosition(a),s==="horizontal"?r.attrs.y=u.y:s==="vertical"&&(r.attrs.x=u.x),n.drag.moving||(n.drag.moving=!0,n.drag.node._handleEvent("dragstart",e)),n.drag.node._handleEvent("dragmove",e)}},_buildDOM:function(){this.content=document.createElement("div"),this.content.style.position="relative",this.content.style.display="inline-block",this.content.className="kineticjs-content",this.attrs.container.appendChild(this.content),this.bufferCanvas=new Kinetic.Canvas({width:this.attrs.width,height:this.attrs.height}),this._resizeDOM()},_addId:function(e){e.attrs.id!==undefined&&(this.ids[e.attrs.id]=e)},_removeId:function(e){e!==undefined&&delete this.ids[e]},_addName:function(e){var t=e.attrs.name;t!==undefined&&(this.names[t]===undefined&&(this.names[t]=[]),this.names[t].push(e))},_removeName:function(e,t){if(e!==undefined){var n=this.names[e];if(n!==undefined){for(var r=0;r<n.length;r++){var i=n[r];i._id===t&&n.splice(r,1)}n.length===0&&delete this.names[e]}}},_onContent:function(e,t){var n=e.split(" ");for(var r=0;r<n.length;r++){var i=n[r];this.content.addEventListener(i,t,!1)}},_setStageDefaultProperties:function(){this.nodeType="Stage",this.dblClickWindow=400,this.targetShape=null,this.mousePos=undefined,this.clickStart=!1,this.touchPos=undefined,this.tapStart=!1,this.ids={},this.names={},this.dragAnim=new Kinetic.Animation}},Kinetic.Global.extend(Kinetic.Stage,Kinetic.Container),Kinetic.Node.addGettersSetters(Kinetic.Stage,["width","height"]),Kinetic.Layer=function(e){this._initLayer(e)},Kinetic.Layer.prototype={_initLayer:function(e){this.setDefaultAttrs({clearBeforeDraw:!0}),this.nodeType="Layer",this.beforeDrawFunc=undefined,this.afterDrawFunc=undefined,this.canvas=new Kinetic.Canvas,this.canvas.getElement().style.position="absolute",this.bufferCanvas=new Kinetic.Canvas,this.bufferCanvas.name="buffer",Kinetic.Container.call(this,e)},draw:function(e){this.beforeDrawFunc!==undefined&&this.beforeDrawFunc.call(this),e?this._draw(e):(this._draw(this.getCanvas()),this._draw(this.bufferCanvas)),this.afterDrawFunc!==undefined&&this.afterDrawFunc.call(this)},drawBuffer:function(){this.draw(this.bufferCanvas)},drawScene:function(){this.draw(this.getCanvas())},beforeDraw:function(e){this.beforeDrawFunc=e},afterDraw:function(e){this.afterDrawFunc=e},getCanvas:function(){return this.canvas},getContext:function(){return this.canvas.context},clear:function(){this.getCanvas().clear()},show:function(){Kinetic.Node.prototype.show.call(this),this.canvas.element.style.display="block"},hide:function(){Kinetic.Node.prototype.hide.call(this),this.canvas.element.style.display="none"},toDataURL:function(e){var t,n=e&&e.mimeType?e.mimeType:null,r=e&&e.quality?e.quality:null;return e&&e.width&&e.height?t=new Kinetic.Canvas(e.width,e.height):t=this.getCanvas(),t.toDataURL(n,r)},_remove:function(){try{this.getStage().content.removeChild(this.canvas.element)}catch(e){Kinetic.Global.warn("unable to remove layer scene canvas element from the document")}},__draw:function(e){this.attrs.clearBeforeDraw&&e.clear()}},Kinetic.Global.extend(Kinetic.Layer,Kinetic.Container),Kinetic.Node.addGettersSetters(Kinetic.Layer,["clearBeforeDraw"]),Kinetic.Group=function(e){this._initGroup(e)},Kinetic.Group.prototype={_initGroup:function(e){this.nodeType="Group",Kinetic.Container.call(this,e)}},Kinetic.Global.extend(Kinetic.Group,Kinetic.Container),Kinetic.Shape=function(e){this._initShape(e)},Kinetic.Shape.prototype={_initShape:function(e){this.nodeType="Shape",this.appliedShadow=!1;var t=Kinetic.Global.shapes,n;for(;;){n=Kinetic.Type._getRandomColorKey();if(n&&!(n in t))break}this.colorKey=n,t[n]=this,Kinetic.Node.call(this,e)},getContext:function(){return this.getLayer().getContext()},getCanvas:function(){return this.getLayer().getCanvas()},stroke:function(e){var t=this.getStrokeWidth(),n=this.getStroke();if(n||t){var r=Kinetic.Global,i=!1;e.save(),this.attrs.shadow&&!this.appliedShadow&&(i=this._applyShadow(e)),e.lineWidth=t||2,e.strokeStyle=n||"black",e.stroke(e),e.restore(),i&&this.stroke(e)}},fill:function(e){var t=!1,n=this.attrs.fill;if(n){e.save(),this.attrs.shadow&&!this.appliedShadow&&(t=this._applyShadow(e));var r=n.start,i=n.end,s=null;if(Kinetic.Type._isString(n))e.fillStyle=n,e.fill(e);else if(n.image){var o=n.repeat?n.repeat:"repeat";n.scale&&e.scale(n.scale.x,n.scale.y),n.offset&&e.translate(n.offset.x,n.offset.y),e.fillStyle=e.createPattern(n.image,o),e.fill(e)}else if(!r.radius&&!i.radius){var u=e.createLinearGradient(r.x,r.y,i.x,i.y),a=n.colorStops;for(var f=0;f<a.length;f+=2)u.addColorStop(a[f],a[f+1]);e.fillStyle=u,e.fill(e)}else if(!r.radius&&r.radius!==0||!i.radius&&i.radius!==0)e.fillStyle="black",e.fill(e);else{var u=e.createRadialGradient(r.x,r.y,r.radius,i.x,i.y,i.radius),a=n.colorStops;for(var f=0;f<a.length;f+=2)u.addColorStop(a[f],a[f+1]);e.fillStyle=u,e.fill(e)}e.restore()}t&&this.fill(e)},fillText:function(e,t){var n=!1;this.attrs.textFill&&(e.save(),this.attrs.shadow&&!this.appliedShadow&&(n=this._applyShadow(e)),e.fillStyle=this.attrs.textFill,e.fillText(t,0,0),e.restore()),n&&this.fillText(e,t,0,0)},strokeText:function(e,t){var n=!1;if(this.attrs.textStroke||this.attrs.textStrokeWidth){e.save(),this.attrs.shadow&&!this.appliedShadow&&(n=this._applyShadow(e));var r=this.attrs.textStroke?this.attrs.textStroke:"black",i=this.attrs.textStrokeWidth?this.attrs.textStrokeWidth:2;e.lineWidth=i,e.strokeStyle=r,e.strokeText(t,0,0),e.restore()}n&&this.strokeText(e,t,0,0)},drawImage:function(){var e=!1,t=arguments[0];t.save();var n=Array.prototype.slice.call(arguments);if(n.length===6||n.length===10)this.attrs.shadow&&!this.appliedShadow&&(e=this._applyShadow(t)),n.length===6?t.drawImage(n[1],n[2],n[3],n[4],n[5]):t.drawImage(n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],n[9]);t.restore(),e&&this.drawImage.apply(this,n)},applyLineJoin:function(e){this.attrs.lineJoin&&(e.lineJoin=this.attrs.lineJoin)},_applyShadow:function(e){var t=this.attrs.shadow;if(t){var n=this.getAbsoluteOpacity(),r=t.color?t.color:"black",i=t.blur?t.blur:5,s=t.offset?t.offset:{x:0,y:0};return t.opacity&&(e.globalAlpha=t.opacity*n),e.shadowColor=r,e.shadowBlur=i,e.shadowOffsetX=s.x,e.shadowOffsetY=s.y,this.appliedShadow=!0,!0}return!1},intersects:function(){var e=Kinetic.Type._getXY(Array.prototype.slice.call(arguments)),t=this.getStage(),n=t.bufferCanvas;n.clear(),this._draw(n);var r=n.context.getImageData(Math.round(e.x),Math.round(e.y),1,1).data;return r[3]>0},_remove:function(){delete Kinetic.Global.shapes[this.colorKey]},__draw:function(e){if(this.attrs.drawFunc){var t=this.getStage(),n=e.getContext(),r=[],i=this.parent;r.unshift(this);while(i)r.unshift(i),i=i.parent;n.save();for(var s=0;s<r.length;s++){var o=r[s],u=o.getTransform(),a=u.getMatrix();n.transform(a[0],a[1],a[2],a[3],a[4],a[5])}var f=this.getAbsoluteOpacity();f!==1&&(n.globalAlpha=f),this.applyLineJoin(n),this.appliedShadow=!1;var l=Kinetic.Global.BUFFER_WHITELIST,c=Kinetic.Global.BUFFER_BLACKLIST,h={};if(e.name==="buffer"){for(var s=0;s<l.length;s++){var p=l[s];h[p]=this.attrs[p];if(this.attrs[p]||p==="fill"&&!this.attrs.stroke&&!("image"in this.attrs))this.attrs[p]="#"+this.colorKey}for(var s=0;s<c.length;s++){var p=c[s];h[p]=this.attrs[p],this.attrs[p]=""}"image"in this.attrs&&(h.image=this.attrs.image,this.imageBuffer?this.attrs.image=this.imageBuffer:(this.attrs.image=null,this.attrs.fill="#"+this.colorKey)),n.globalAlpha=1}this.attrs.drawFunc.call(this,e.getContext());if(e.name==="buffer"){var d=l.concat(c);for(var s=0;s<d.length;s++){var p=d[s];this.attrs[p]=h[p]}this.attrs.image=h.image}n.restore()}}},Kinetic.Global.extend(Kinetic.Shape,Kinetic.Node),Kinetic.Node.addGettersSetters(Kinetic.Shape,["fill","stroke","lineJoin","strokeWidth","shadow","drawFunc","filter"]),Kinetic.Rect=function(e){this._initRect(e)},Kinetic.Rect.prototype={_initRect:function(e){this.setDefaultAttrs({width:0,height:0,cornerRadius:0}),this.shapeType="Rect",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){e.beginPath(),this.attrs.cornerRadius===0?e.rect(0,0,this.attrs.width,this.attrs.height):(e.moveTo(this.attrs.cornerRadius,0),e.lineTo(this.attrs.width-this.attrs.cornerRadius,0),e.arc(this.attrs.width-this.attrs.cornerRadius,this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI*3/2,0,!1),e.lineTo(this.attrs.width,this.attrs.height-this.attrs.cornerRadius),e.arc(this.attrs.width-this.attrs.cornerRadius,this.attrs.height-this.attrs.cornerRadius,this.attrs.cornerRadius,0,Math.PI/2,!1),e.lineTo(this.attrs.cornerRadius,this.attrs.height),e.arc(this.attrs.cornerRadius,this.attrs.height-this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI/2,Math.PI,!1),e.lineTo(0,this.attrs.cornerRadius),e.arc(this.attrs.cornerRadius,this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI,Math.PI*3/2,!1)),e.closePath(),this.fill(e),this.stroke(e)},setSize:function(){var e=Kinetic.Type._getSize(Array.prototype.slice.call(arguments));this.setAttrs(e)},getSize:function(){return{width:this.attrs.width,height:this.attrs.height}}},Kinetic.Global.extend(Kinetic.Rect,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Rect,["width","height","cornerRadius"]),Kinetic.Circle=function(e){this._initCircle(e)},Kinetic.Circle.prototype={_initCircle:function(e){this.setDefaultAttrs({radius:0}),this.shapeType="Circle",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){e.beginPath(),e.arc(0,0,this.getRadius(),0,Math.PI*2,!0),e.closePath(),this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.Circle,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Circle,["radius"]),Kinetic.Ellipse=function(e){this._initEllipse(e)},Kinetic.Ellipse.prototype={_initEllipse:function(e){this.setDefaultAttrs({radius:{x:0,y:0}}),this.shapeType="Ellipse",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){var t=this.getRadius();e.beginPath(),e.save(),t.x!==t.y&&e.scale(1,t.y/t.x),e.arc(0,0,t.x,0,Math.PI*2,!0),e.restore(),e.closePath(),this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.Ellipse,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Ellipse,["radius"]),Kinetic.Image=function(e){this._initImage(e)},Kinetic.Image.prototype={_initImage:function(e){this.shapeType="Image",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e);var t=this;this.on("imageChange",function(e){t._syncSize()}),this._syncSize()},drawFunc:function(e){var t=this.getWidth(),n=this.getHeight();e.beginPath(),e.rect(0,0,t,n),e.closePath(),this.fill(e),this.stroke(e);if(this.attrs.image)if(this.attrs.crop&&this.attrs.crop.width&&this.attrs.crop.height){var r=this.attrs.crop.x?this.attrs.crop.x:0,i=this.attrs.crop.y?this.attrs.crop.y:0,s=this.attrs.crop.width,o=this.attrs.crop.height;this.drawImage(e,this.attrs.image,r,i,s,o,0,0,t,n)}else this.drawImage(e,this.attrs.image,0,0,t,n)},setSize:function(){var e=Kinetic.Type._getSize(Array.prototype.slice.call(arguments));this.setAttrs(e)},getSize:function(){return{width:this.attrs.width,height:this.attrs.height}},applyFilter:function(e){var t=new Kinetic.Canvas(this.attrs.image.width,this.attrs.image.height),n=t.getContext();n.drawImage(this.attrs.image,0,0);try{var r=n.getImageData(0,0,t.getWidth(),t.getHeight());e.filter(r,e);var i=this;Kinetic.Type._getImage(r,function(t){i.setImage(t),e.callback&&e.callback()})}catch(s){Kinetic.Global.warn("Unable to apply filter.")}},createImageBuffer:function(e){var t=new Kinetic.Canvas(this.attrs.width,this.attrs.height),n=t.getContext();n.drawImage(this.attrs.image,0,0);try{var r=n.getImageData(0,0,t.getWidth(),t.getHeight()),i=r.data,s=Kinetic.Type._hexToRgb(this.colorKey);for(var o=0,u=i.length;o<u;o+=4)i[o]=s.r,i[o+1]=s.g,i[o+2]=s.b;var a=this;Kinetic.Type._getImage(r,function(t){a.imageBuffer=t,e&&e()})}catch(f){Kinetic.Global.warn("Unable to create image buffer.")}},clearImageBuffer:function(){delete this.imageBuffer},_syncSize:function(){this.attrs.image&&(this.attrs.width||this.setAttrs({width:this.attrs.image.width}),this.attrs.height||this.setAttrs({height:this.attrs.image.height}))}},Kinetic.Global.extend(Kinetic.Image,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Image,["image","crop","filter","width","height"]),Kinetic.Polygon=function(e){this._initPolygon(e)},Kinetic.Polygon.prototype={_initPolygon:function(e){this.setDefaultAttrs({points:[]}),this.shapeType="Polygon",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){e.beginPath(),e.moveTo(this.attrs.points[0].x,this.attrs.points[0].y);for(var t=1;t<this.attrs.points.length;t++)e.lineTo(this.attrs.points[t].x,this.attrs.points[t].y);e.closePath(),this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.Polygon,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Polygon,["points"]),Kinetic.Text=function(e){this._initText(e)},Kinetic.Text.prototype={_initText:function(e){this.setDefaultAttrs({fontFamily:"Calibri",text:"",fontSize:12,align:"left",verticalAlign:"top",fontStyle:"normal",padding:0,width:"auto",height:"auto",detectionType:"path",cornerRadius:0,lineHeight:1.2}),this.dummyCanvas=document.createElement("canvas"),this.shapeType="Text",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e);var t=["fontFamily","fontSize","fontStyle","padding","align","lineHeight","text","width","height"],n=this;for(var r=0;r<t.length;r++){var i=t[r];this.on(i+"Change.kinetic",n._setTextData)}n._setTextData()},drawFunc:function(e){e.beginPath();var t=this.getBoxWidth(),n=this.getBoxHeight();this.attrs.cornerRadius===0?e.rect(0,0,t,n):(e.moveTo(this.attrs.cornerRadius,0),e.lineTo(t-this.attrs.cornerRadius,0),e.arc(t-this.attrs.cornerRadius,this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI*3/2,0,!1),e.lineTo(t,n-this.attrs.cornerRadius),e.arc(t-this.attrs.cornerRadius,n-this.attrs.cornerRadius,this.attrs.cornerRadius,0,Math.PI/2,!1),e.lineTo(this.attrs.cornerRadius,n),e.arc(this.attrs.cornerRadius,n-this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI/2,Math.PI,!1),e.lineTo(0,this.attrs.cornerRadius),e.arc(this.attrs.cornerRadius,this.attrs.cornerRadius,this.attrs.cornerRadius,Math.PI,Math.PI*3/2,!1)),e.closePath(),this.fill(e),this.stroke(e);var r=this.attrs.padding,i=this.attrs.lineHeight*this.getTextHeight(),s=this.textArr;e.font=this.attrs.fontStyle+" "+this.attrs.fontSize+"pt "+this.attrs.fontFamily,e.textBaseline="middle",e.textAlign="left",e.save(),e.translate(r,0),e.translate(0,r+this.getTextHeight()/2);var o=this.appliedShadow;for(var u=0;u<s.length;u++){var a=s[u];this.appliedShadow=o,e.save(),this.attrs.align==="right"?e.translate(this.getBoxWidth()-this._getTextSize(a).width-r*2,0):this.attrs.align==="center"&&e.translate((this.getBoxWidth()-this._getTextSize(a).width-r*2)/2,0),this.fillText(e,a),this.strokeText(e,a),e.restore(),e.translate(0,i)}e.restore()},getBoxWidth:function(){return this.attrs.width==="auto"?this.getTextWidth()+this.attrs.padding*2:this.attrs.width},getBoxHeight:function(){return this.attrs.height==="auto"?this.getTextHeight()*this.textArr.length*this.attrs.lineHeight+this.attrs.padding*2:this.attrs.height},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},_getTextSize:function(e){var t=this.dummyCanvas,n=t.getContext("2d");n.save(),n.font=this.attrs.fontStyle+" "+this.attrs.fontSize+"pt "+this.attrs.fontFamily;var r=n.measureText(e);return n.restore(),{width:r.width,height:parseInt(this.attrs.fontSize,10)}},_setTextData:function(){var e=this.attrs.text.split(""),t=[],n=0,r=!0;this.textWidth=0,this.textHeight=this._getTextSize(this.attrs.text).height;var i=this.attrs.lineHeight*this.textHeight;while(e.length>0&&r&&(this.attrs.height==="auto"||i*(n+1)<this.attrs.height-this.attrs.padding*2)){var s=0,o=undefined;r=!1;while(s<e.length){if(e.indexOf("\n")===s){e.splice(s,1),o=e.splice(0,s).join("");break}var u=e.slice(0,s);if(this.attrs.width!=="auto"&&this._getTextSize(u.join("")).width>this.attrs.width-this.attrs.padding*2){if(s==0)break;var a=u.lastIndexOf(" "),f=u.lastIndexOf("-"),l=Math.max(a,f);if(l>=0){o=e.splice(0,1+l).join("");break}o=e.splice(0,s).join("");break}s++,s===e.length&&(o=e.splice(0,s).join(""))}this.textWidth=Math.max(this.textWidth,this._getTextSize(o).width),o!==undefined&&(t.push(o),r=!0),n++}this.textArr=t}},Kinetic.Global.extend(Kinetic.Text,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Text,["fontFamily","fontSize","fontStyle","textFill","textStroke","textStrokeWidth","padding","align","lineHeight","text","width","height","cornerRadius","fill","stroke","strokeWidth","shadow"]),Kinetic.Line=function(e){this._initLine(e)},Kinetic.Line.prototype={_initLine:function(e){this.setDefaultAttrs({points:[],lineCap:"butt",dashArray:[],detectionType:"pixel"}),this.shapeType="Line",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){var t={};e.beginPath(),e.moveTo(this.attrs.points[0].x,this.attrs.points[0].y);for(var n=1;n<this.attrs.points.length;n++){var r=this.attrs.points[n].x,i=this.attrs.points[n].y;if(this.attrs.dashArray.length>0){var s=this.attrs.points[n-1].x,o=this.attrs.points[n-1].y;this._dashedLine(e,s,o,r,i,this.attrs.dashArray)}else e.lineTo(r,i)}!this.attrs.lineCap||(e.lineCap=this.attrs.lineCap),this.stroke(e)},_dashedLine:function(e,t,n,r,i,s){var o=s.length,u=r-t,a=i-n,f=u>a,l=f?a/u:u/a;l>9999?l=9999:l<-9999&&(l=-9999);var c=Math.sqrt(u*u+a*a),h=0,p=!0;while(c>=.1&&h<1e4){var d=s[h++%o];d===0&&(d=.001),d>c&&(d=c);var v=Math.sqrt(d*d/(1+l*l));f?(t+=u<0&&a<0?v*-1:v,n+=u<0&&a<0?l*v*-1:l*v):(t+=u<0&&a<0?l*v*-1:l*v,n+=u<0&&a<0?v*-1:v),e[p?"lineTo":"moveTo"](t,n),c-=d,p=!p}e.moveTo(r,i)}},Kinetic.Global.extend(Kinetic.Line,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Line,["dashArray","lineCap","points"]),Kinetic.Sprite=function(e){this._initSprite(e)},Kinetic.Sprite.prototype={_initSprite:function(e){this.setDefaultAttrs({index:0,frameRate:17}),e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e),this.anim=new Kinetic.Animation;var t=this;this.on("animationChange.kinetic",function(){t.setIndex(0)})},drawFunc:function(e){var t=this.attrs.animation,n=this.attrs.index,r=this.attrs.animations[t][n];e.beginPath(),e.rect(0,0,r.width,r.height),e.closePath(),this.fill(e),this.stroke(e),this.attrs.image&&(e.beginPath(),e.rect(0,0,r.width,r.height),e.closePath(),this.drawImage(e,this.attrs.image,r.x,r.y,r.width,r.height,0,0,r.width,r.height))},start:function(){var e=this,t=this.getLayer();this.anim.node=t,this.interval=setInterval(function(){var t=e.attrs.index;e._updateIndex(),e.afterFrameFunc&&t===e.afterFrameIndex&&(e.afterFrameFunc(),delete e.afterFrameFunc,delete e.afterFrameIndex)},1e3/this.attrs.frameRate),this.anim.start()},stop:function(){this.anim.stop(),clearInterval(this.interval)},afterFrame:function(e,t){this.afterFrameIndex=e,this.afterFrameFunc=t},_updateIndex:function(){var e=this.attrs.index,t=this.attrs.animation;e<this.attrs.animations[t].length-1?this.attrs.index++:this.attrs.index=0}},Kinetic.Global.extend(Kinetic.Sprite,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Sprite,["animation","animations","index"]),Kinetic.Star=function(e){this._initStar(e)},Kinetic.Star.prototype={_initStar:function(e){this.setDefaultAttrs({numPoints:0,innerRadius:0,outerRadius:0}),this.shapeType="Star",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){e.beginPath(),e.moveTo(0,0-this.attrs.outerRadius);for(var t=1;t<this.attrs.numPoints*2;t++){var n=t%2===0?this.attrs.outerRadius:this.attrs.innerRadius,r=n*Math.sin(t*Math.PI/this.attrs.numPoints),i=-1*n*Math.cos(t*Math.PI/this.attrs.numPoints);e.lineTo(r,i)}e.closePath(),this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.Star,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.Star,["numPoints","innerRadius","outerRadius"]),Kinetic.RegularPolygon=function(e){this._initRegularPolygon(e)},Kinetic.RegularPolygon.prototype={_initRegularPolygon:function(e){this.setDefaultAttrs({radius:0,sides:0}),this.shapeType="RegularPolygon",e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e)},drawFunc:function(e){e.beginPath(),e.moveTo(0,0-this.attrs.radius);for(var t=1;t<this.attrs.sides;t++){var n=this.attrs.radius*Math.sin(t*2*Math.PI/this.attrs.sides),r=-1*this.attrs.radius*Math.cos(t*2*Math.PI/this.attrs.sides);e.lineTo(n,r)}e.closePath(),this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.RegularPolygon,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.RegularPolygon,["radius","sides"]),Kinetic.Path=function(e){this._initPath(e)},Kinetic.Path.prototype={_initPath:function(e){this.shapeType="Path",this.dataArray=[];var t=this;e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e),this.dataArray=Kinetic.Path.parsePathData(this.attrs.data),this.on("dataChange",function(){t.dataArray=Kinetic.Path.parsePathData(t.attrs.data)})},drawFunc:function(e){var t=this.dataArray;e.beginPath();for(var n=0;n<t.length;n++){var r=t[n].command,i=t[n].points;switch(r){case"L":e.lineTo(i[0],i[1]);break;case"M":e.moveTo(i[0],i[1]);break;case"C":e.bezierCurveTo(i[0],i[1],i[2],i[3],i[4],i[5]);break;case"Q":e.quadraticCurveTo(i[0],i[1],i[2],i[3]);break;case"A":var s=i[0],o=i[1],u=i[2],a=i[3],f=i[4],l=i[5],c=i[6],h=i[7],p=u>a?u:a,d=u>a?1:u/a,v=u>a?a/u:1;e.translate(s,o),e.rotate(c),e.scale(d,v),e.arc(0,0,p,f,f+l,1-h),e.scale(1/d,1/v),e.rotate(-c),e.translate(-s,-o);break;case"z":e.closePath()}}this.fill(e),this.stroke(e)}},Kinetic.Global.extend(Kinetic.Path,Kinetic.Shape),Kinetic.Path.getLineLength=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},Kinetic.Path.getPointOnLine=function(e,t,n,r,i,s,o){s===undefined&&(s=t),o===undefined&&(o=n);var u=(i-n)/(r-t+1e-8),a=Math.sqrt(e*e/(1+u*u)),f=u*a,l;if((o-n)/(s-t+1e-8)===u)l={x:s+a,y:o+f};else{var c,h,p=this.getLineLength(t,n,r,i);if(p<1e-8)return undefined;var d=(s-t)*(r-t)+(o-n)*(i-n);d/=p*p,c=t+d*(r-t),h=n+d*(i-n);var v=this.getLineLength(s,o,c,h),m=Math.sqrt(e*e-v*v);a=Math.sqrt(m*m/(1+u*u)),f=u*a,l={x:c+a,y:h+f}}return l},Kinetic.Path.getPointOnCubicBezier=function(e,t,n,r,i,s,o,u,a){function f(e){return e*e*e}function l(e){return 3*e*e*(1-e)}function c(e){return 3*e*(1-e)*(1-e)}function h(e){return(1-e)*(1-e)*(1-e)}var p=u*f(e)+s*l(e)+r*c(e)+t*h(e),d=a*f(e)+o*l(e)+i*c(e)+n*h(e);return{x:p,y:d}},Kinetic.Path.getPointOnQuadraticBezier=function(e,t,n,r,i,s,o){function u(e){return e*e}function a(e){return 2*e*(1-e)}function f(e){return(1-e)*(1-e)}var l=s*u(e)+r*a(e)+t*f(e),c=o*u(e)+i*a(e)+n*f(e);return{x:l,y:c}},Kinetic.Path.getPointOnEllipticalArc=function(e,t,n,r,i,s){var o=Math.cos(s),u=Math.sin(s),a={x:n*Math.cos(i),y:r*Math.sin(i)};return{x:e+(a.x*o-a.y*u),y:t+(a.x*u+a.y*o)}},Kinetic.Path.parsePathData=function(e){if(!e)return[];var t=e,n=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"];t=t.replace(new RegExp(" ","g"),",");for(var r=0;r<n.length;r++)t=t.replace(new RegExp(n[r],"g"),"|"+n[r]);var i=t.split("|"),s=[],o=0,u=0;for(var r=1;r<i.length;r++){var a=i[r],f=a.charAt(0);a=a.slice(1),a=a.replace(new RegExp(",-","g"),"-"),a=a.replace(new RegExp("-","g"),",-"),a=a.replace(new RegExp("e,-","g"),"e-");var l=a.split(",");l.length>0&&l[0]===""&&l.shift();for(var c=0;c<l.length;c++)l[c]=parseFloat(l[c]);while(l.length>0){if(isNaN(l[0]))break;var h=null,p=[],d=o,v=u;switch(f){case"l":o+=l.shift(),u+=l.shift(),h="L",p.push(o,u);break;case"L":o=l.shift(),u=l.shift(),p.push(o,u);break;case"m":o+=l.shift(),u+=l.shift(),h="M",p.push(o,u),f="l";break;case"M":o=l.shift(),u=l.shift(),h="M",p.push(o,u),f="L";break;case"h":o+=l.shift(),h="L",p.push(o,u);break;case"H":o=l.shift(),h="L",p.push(o,u);break;case"v":u+=l.shift(),h="L",p.push(o,u);break;case"V":u=l.shift(),h="L",p.push(o,u);break;case"C":p.push(l.shift(),l.shift(),l.shift(),l.shift()),o=l.shift(),u=l.shift(),p.push(o,u);break;case"c":p.push(o+l.shift(),u+l.shift(),o+l.shift(),u+l.shift()),o+=l.shift(),u+=l.shift(),h="C",p.push(o,u);break;case"S":var m=o,g=u,y=s[s.length-1];y.command==="C"&&(m=o+(o-y.points[2]),g=u+(u-y.points[3])),p.push(m,g,l.shift(),l.shift()),o=l.shift(),u=l.shift(),h="C",p.push(o,u);break;case"s":var m=o,g=u,y=s[s.length-1];y.command==="C"&&(m=o+(o-y.points[2]),g=u+(u-y.points[3])),p.push(m,g,o+l.shift(),u+l.shift()),o+=l.shift(),u+=l.shift(),h="C",p.push(o,u);break;case"Q":p.push(l.shift(),l.shift()),o=l.shift(),u=l.shift(),p.push(o,u);break;case"q":p.push(o+l.shift(),u+l.shift()),o+=l.shift(),u+=l.shift(),h="Q",p.push(o,u);break;case"T":var m=o,g=u,y=s[s.length-1];y.command==="Q"&&(m=o+(o-y.points[0]),g=u+(u-y.points[1])),o=l.shift(),u=l.shift(),h="Q",p.push(m,g,o,u);break;case"t":var m=o,g=u,y=s[s.length-1];y.command==="Q"&&(m=o+(o-y.points[0]),g=u+(u-y.points[1])),o+=l.shift(),u+=l.shift(),h="Q",p.push(m,g,o,u);break;case"A":var b=l.shift(),w=l.shift(),E=l.shift(),S=l.shift(),x=l.shift(),T=o,N=u;o=l.shift(),u=l.shift(),h="A",p=this.convertEndpointToCenterParameterization(T,N,o,u,S,x,b,w,E);break;case"a":var b=l.shift(),w=l.shift(),E=l.shift(),S=l.shift(),x=l.shift(),T=o,N=u;o+=l.shift(),u+=l.shift(),h="A",p=this.convertEndpointToCenterParameterization(T,N,o,u,S,x,b,w,E)}s.push({command:h||f,points:p,start:{x:d,y:v},pathLength:this.calcLength(d,v,h||f,p)})}(f==="z"||f==="Z")&&s.push({command:"z",points:[],start:undefined,pathLength:0})}return s},Kinetic.Path.calcLength=function(e,n,r,i){var s,o,u,a=Kinetic.Path;switch(r){case"L":return a.getLineLength(e,n,i[0],i[1]);case"C":s=0,o=a.getPointOnCubicBezier(0,e,n,i[0],i[1],i[2],i[3],i[4],i[5]);for(t=.01;t<=1;t+=.01)u=a.getPointOnCubicBezier(t,e,n,i[0],i[1],i[2],i[3],i[4],i[5]),s+=a.getLineLength(o.x,o.y,u.x,u.y),o=u;return s;case"Q":s=0,o=a.getPointOnQuadraticBezier(0,e,n,i[0],i[1],i[2],i[3]);for(t=.01;t<=1;t+=.01)u=a.getPointOnQuadraticBezier(t,e,n,i[0],i[1],i[2],i[3]),s+=a.getLineLength(o.x,o.y,u.x,u.y),o=u;return s;case"A":s=0;var f=i[4],l=i[5],c=i[4]+l,h=Math.PI/180;Math.abs(f-c)<h&&(h=Math.abs(f-c)),o=a.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],f,0);if(l<0)for(t=f-h;t>c;t-=h)u=a.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],t,0),s+=a.getLineLength(o.x,o.y,u.x,u.y),o=u;else for(t=f+h;t<c;t+=h)u=a.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],t,0),s+=a.getLineLength(o.x,o.y,u.x,u.y),o=u;return u=a.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],c,0),s+=a.getLineLength(o.x,o.y,u.x,u.y),s}return 0},Kinetic.Path.convertEndpointToCenterParameterization=function(e,t,n,r,i,s,o,u,a){var f=a*(Math.PI/180),l=Math.cos(f)*(e-n)/2+Math.sin(f)*(t-r)/2,c=-1*Math.sin(f)*(e-n)/2+Math.cos(f)*(t-r)/2,h=l*l/(o*o)+c*c/(u*u);h>1&&(o*=Math.sqrt(h),u*=Math.sqrt(h));var p=Math.sqrt((o*o*u*u-o*o*c*c-u*u*l*l)/(o*o*c*c+u*u*l*l));i==s&&(p*=-1),isNaN(p)&&(p=0);var d=p*o*c/u,v=p*-u*l/o,m=(e+n)/2+Math.cos(f)*d-Math.sin(f)*v,g=(t+r)/2+Math.sin(f)*d+Math.cos(f)*v,y=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},b=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(y(e)*y(t))},w=function(e,t){return(e[0]*t[1]<e[1]*t[0]?-1:1)*Math.acos(b(e,t))},E=w([1,0],[(l-d)/o,(c-v)/u]),S=[(l-d)/o,(c-v)/u],x=[(-1*l-d)/o,(-1*c-v)/u],T=w(S,x);return b(S,x)<=-1&&(T=Math.PI),b(S,x)>=1&&(T=0),s===0&&T>0&&(T-=2*Math.PI),s==1&&T<0&&(T+=2*Math.PI),[m,g,o,u,E,T,f,s]},Kinetic.Node.addGettersSetters(Kinetic.Path,["data"]),Kinetic.TextPath=function(e){this._initTextPath(e)},Kinetic.TextPath.prototype={_initTextPath:function(e){this.setDefaultAttrs({fontFamily:"Calibri",fontSize:12,fontStyle:"normal",detectionType:"path",text:""}),this.dummyCanvas=document.createElement("canvas"),this.shapeType="TextPath",this.dataArray=[];var t=this;e.drawFunc=this.drawFunc,Kinetic.Shape.call(this,e),this.dataArray=Kinetic.Path.parsePathData(this.attrs.data),this.on("dataChange",function(){t.dataArray=Kinetic.Path.parsePathData(this.attrs.data)});var n=["text","textStroke","textStrokeWidth"];for(var r=0;r<n.length;r++){var i=n[r];this.on(i+"Change",t._setTextData)}t._setTextData()},drawFunc:function(e){var t=this.charArr;e.font=this.attrs.fontStyle+" "+this.attrs.fontSize+"pt "+this.attrs.fontFamily,e.textBaseline="middle",e.textAlign="left",e.save();var n=this.glyphInfo;for(var r=0;r<n.length;r++){e.save();var i=n[r].p0,s=n[r].p1,o=parseFloat(this.attrs.fontSize);e.translate(i.x,i.y),e.rotate(n[r].rotation),this.fillText(e,n[r].text),this.strokeText(e,n[r].text),e.restore()}e.restore()},getTextWidth:function(){return this.textWidth},getTextHeight:function(){return this.textHeight},_getTextSize:function(e){var t=this.dummyCanvas,n=t.getContext("2d");n.save(),n.font=this.attrs.fontStyle+" "+this.attrs.fontSize+"pt "+this.attrs.fontFamily;var r=n.measureText(e);return n.restore(),{width:r.width,height:parseInt(this.attrs.fontSize,10)}},_setTextData:function(){var e=this,t=this._getTextSize(this.attrs.text);this.textWidth=t.width,this.textHeight=t.height,this.glyphInfo=[];var n=this.attrs.text.split(""),r,i,s,o=-1,u=0,a=function(){u=0;var t=e.dataArray;for(var n=o+1;n<t.length;n++){if(t[n].pathLength>0)return o=n,t[n];t[n].command=="M"&&(r={x:t[n].points[0],y:t[n].points[1]})}return{}},f=function(t,n){var o=e._getTextSize(t).width,f=0,l=0,c=!1;i=undefined;while(Math.abs(o-f)/o>.01&&l<25){l++;var h=f;while(s===undefined)s=a(),s&&h+s.pathLength<o&&(h+=s.pathLength,s=undefined);if(s==={}||r===undefined)return undefined;var p=!1;switch(s.command){case"L":Kinetic.Path.getLineLength(r.x,r.y,s.points[0],s.points[1])>o?i=Kinetic.Path.getPointOnLine(o,r.x,r.y,s.points[0],s.points[1],r.x,r.y):s=undefined;break;case"A":var d=s.points[4],v=s.points[5],m=s.points[4]+v;u===0?u=d+1e-8:o>f?u+=Math.PI/180*v/Math.abs(v):u-=Math.PI/360*v/Math.abs(v),Math.abs(u)>Math.abs(m)&&(u=m,p=!0),i=Kinetic.Path.getPointOnEllipticalArc(s.points[0],s.points[1],s.points[2],s.points[3],u,s.points[6]);break;case"C":u===0?o>s.pathLength?u=1e-8:u=o/s.pathLength:o>f?u+=(o-f)/s.pathLength:u-=(f-o)/s.pathLength,u>1&&(u=1,p=!0),i=Kinetic.Path.getPointOnCubicBezier(u,s.start.x,s.start.y,s.points[0],s.points[1],s.points[2],s.points[3],s.points[4],s.points[5]);break;case"Q":u===0?u=o/s.pathLength:o>f?u+=(o-f)/s.pathLength:u-=(f-o)/s.pathLength,u>1&&(u=1,p=!0),i=Kinetic.Path.getPointOnQuadraticBezier(u,s.start.x,s.start.y,s.points[0],s.points[1],s.points[2],s.points[3])}i!==undefined&&(f=Kinetic.Path.getLineLength(r.x,r.y,i.x,i.y)),p&&(p=!1,s=undefined)}};for(var l=0;l<n.length;l++){f(n[l]);if(r===undefined||i===undefined)break;var c=Kinetic.Path.getLineLength(r.x,r.y,i.x,i.y),h=0,p=Kinetic.Path.getPointOnLine(h+c/2,r.x,r.y,i.x,i.y),d=Math.atan2(i.y-r.y,i.x-r.x);this.glyphInfo.push({transposeX:p.x,transposeY:p.y,text:n[l],rotation:d,p0:r,p1:i}),r=i}}},Kinetic.Global.extend(Kinetic.TextPath,Kinetic.Shape),Kinetic.Node.addGettersSetters(Kinetic.TextPath,["fontFamily","fontSize","fontStyle","textFill","textStroke","textStrokeWidth","text"]);
|