2015-01-22 14:42:16 +08:00
/*! KineticJS v5.2.0 2015-01-22 http://lavrton.github.io/KineticJS/ by Eric Rowell @ericdrowell, Anton Lavrenov @lavrton - MIT License https://github.com/lavrton/KineticJS/wiki/License*/
var Kinetic = { } ; ! function ( a ) { var b = Math . PI / 180 ; Kinetic = { version : "5.2.0" , stages : [ ] , idCounter : 0 , ids : { } , names : { } , shapes : { } , listenClickTap : ! 1 , inDblClickWindow : ! 1 , enableTrace : ! 1 , traceArrMax : 100 , dblClickWindow : 400 , pixelRatio : void 0 , dragDistance : 0 , angleDeg : ! 0 , showWarnings : ! 0 , Filters : { } , Node : function ( a ) { this . _init ( a ) } , Shape : function ( a ) { this . _ _init ( a ) } , Container : function ( a ) { this . _ _init ( a ) } , Stage : function ( a ) { this . _ _ _init ( a ) } , BaseLayer : function ( a ) { this . _ _ _init ( a ) } , Layer : function ( a ) { this . _ _ _ _init ( a ) } , FastLayer : function ( a ) { this . _ _ _ _init ( a ) } , Group : function ( a ) { this . _ _ _init ( a ) } , isDragging : function ( ) { var a = Kinetic . DD ; return a ? a . isDragging : ! 1 } , isDragReady : function ( ) { var a = Kinetic . DD ; return a ? ! ! a . node : ! 1 } , _addId : function ( a , b ) { void 0 !== b && ( this . ids [ b ] = a ) } , _removeId : function ( a ) { void 0 !== a && delete this . ids [ a ] } , _addName : function ( a , b ) { if ( void 0 !== b ) for ( var c = b . split ( /\s/g ) , d = 0 ; d < c . length ; d ++ ) { var e = c [ d ] ; e && ( void 0 === this . names [ e ] && ( this . names [ e ] = [ ] ) , this . names [ e ] . push ( a ) ) } } , _removeName : function ( a , b ) { if ( void 0 !== a ) { var c = this . names [ a ] ; if ( void 0 !== c ) { for ( var d = 0 ; d < c . length ; d ++ ) { var e = c [ d ] ; e . _id === b && c . splice ( d , 1 ) } 0 === c . length && delete this . names [ a ] } } } , getAngle : function ( a ) { return this . angleDeg ? a * b : a } , _parseUA : function ( a ) { var b = a . toLowerCase ( ) , c = /(chrome)[ \/]([\w.]+)/ . exec ( b ) || /(webkit)[ \/]([\w.]+)/ . exec ( b ) || /(opera)(?:.*version|)[ \/]([\w.]+)/ . exec ( b ) || /(msie) ([\w.]+)/ . exec ( b ) || b . indexOf ( "compatible" ) < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/ . exec ( b ) || [ ] , d = ! ! a . match ( /Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i ) , e = ! ! a . match ( /IEMobile/i ) ; return { browser : c [ 1 ] || "" , version : c [ 2 ] || "0" , mobile : d , ieMobile : e } } , UA : void 0 } , Kinetic . UA = Kinetic . _parseUA ( a . navigator && a . navigator . userAgent || "" ) } ( this ) , function ( a , b ) { if ( "object" == typeof exports ) { var c = b ( ) ; if ( global . window === global ) Kinetic . document = global . document , Kinetic . window = global ; else { var d = require ( "canvas" ) , e = require ( "jsdom" ) . jsdom ; Kinetic . document = e ( "<!DOCTYPE html><html><head></head><body></body></html>" ) , Kinetic . window = Kinetic . document . createWindow ( ) , Kinetic . window . Image = d . Image , Kinetic . _nodeCanvas = d } return Kinetic . root = a , void ( module . exports = c ) } "function" == typeof define && define . amd && define ( b ) , Kinetic . document = document , Kinetic . window = window , Kinetic . root = a } ( this , function ( ) { return Kinetic } ) , function ( ) { Kinetic . Collection = function ( ) { var a = [ ] . slice . call ( arguments ) , b = a . length , c = 0 ; for ( this . length = b ; b > c ; c ++ ) this [ c ] = a [ c ] ; return this } , Kinetic . Collection . prototype = [ ] , Kinetic . Collection . prototype . each = function ( a ) { for ( var b = 0 ; b < this . length ; b ++ ) a ( this [ b ] , b ) } , Kinetic . Collection . prototype . toArray = function ( ) { var a , b = [ ] , c = this . length ; for ( a = 0 ; c > a ; a ++ ) b . push ( this [ a ] ) ; return b } , Kinetic . Collection . toCollection = function ( a ) { var b , c = new Kinetic . Collection , d = a . length ; for ( b = 0 ; d > b ; b ++ ) c . push ( a [ b ] ) ; return c } , Kinetic . Collection . _mapMethod = function ( a ) { Kinetic . Collection . prototype [ a ] = function ( ) { var b , c = this . length , d = [ ] . slice . call ( arguments ) ; for ( b = 0 ; c > b ; b ++ ) this [ b ] [ a ] . apply ( this [ b ] , d ) ; return this } } , Kinetic . Collection . mapMethods = function ( a ) { var b = a . prototype ; for ( var c in b ) Kinetic . Collection . _mapMethod ( c ) } , Kinetic . Transform = function ( a ) { this . m = a && a . slice ( ) || [ 1 , 0 , 0 , 1 , 0 , 0 ] } , Kinetic . Transform . prototype = { copy : function ( ) { return new Kinetic . Transform ( this . m ) } , point : function ( a ) { var b = this . m ; return { x : b [ 0 ] * a . x + b [ 2 ] * a . y + b [ 4 ] , y : b [ 1 ] * a . x + b [ 3 ] * a . y + b [ 5 ] } } , translate : function ( a , b ) { return this . m [ 4 ] += this . m [ 0 ] * a + this . m [ 2 ] * b , this . m [ 5 ] += this . m [ 1 ] * a + this . m [ 3 ] * b , this } , scale : function ( a , b ) { return this . m [ 0 ] *= a , this . m [ 1 ] *= a , this . m [ 2 ] *= b , this . m [ 3 ] *= b , this } , rotate : function ( a ) { var b = Math . cos ( a ) , c = Math . sin ( a ) , d = this . m [ 0 ] * b + this . m [ 2 ] * c , e = this . m [ 1 ] * b + this . m [ 3 ] * c , f = this . m [ 0 ] * - c + this . m [ 2 ] * b , g = this . m [ 1 ] * - c + this . m [ 3 ] * b ; return this . m [ 0 ] = d , this . m [ 1 ] = e , this . m [ 2 ] = f , this . m [ 3 ] = g , this } , getTranslation : function ( ) { return { x : this . m [ 4 ] , y : this . m [ 5 ] } } , skew : function ( a , b ) { var c = this . m [ 0 ] + this . m [ 2 ] * b , d = this . m [ 1 ] + this . m [ 3 ] * b , e = this . m [ 2 ] + this . m [ 0 ] * a , f = this . m [ 3 ] + this . m [ 1 ] * a ; return this . m [ 0 ] = c , this . m [ 1 ] = d , this . m [ 2 ] = e , this . m [ 3 ] = f , this } , multiply : function ( a ) { var b = this . m [ 0 ] * a . m [ 0 ] + this . m [ 2 ] * a . m [ 1 ] , c = this . m [ 1 ] * a . m [ 0 ] + this . m [ 3 ] * a . m [ 1 ] , d = this . m [ 0 ] * a . m [ 2 ] + this . m [ 2 ] * a . m [ 3 ] , e = this . m [ 1 ] * a . m [ 2 ] + this . m [ 3
2015-01-21 16:24:43 +08:00
} , _get : function ( a ) { return this . className === a || this . nodeType === a ? [ this ] : [ ] } , _off : function ( a , b ) { var c , d , e = this . eventListeners [ a ] ; for ( c = 0 ; c < e . length ; c ++ ) if ( d = e [ c ] . name , ! ( "kinetic" === d && "kinetic" !== b || b && d !== b ) ) { if ( e . splice ( c , 1 ) , 0 === e . length ) { delete this . eventListeners [ a ] ; break } c -- } } , _fireChangeEvent : function ( a , b , d ) { this . _fire ( a + c , { oldVal : b , newVal : d } ) } , setId : function ( a ) { var b = this . getId ( ) ; return Kinetic . _removeId ( b ) , Kinetic . _addId ( this , a ) , this . _setAttr ( h , a ) , this } , setName : function ( a ) { var b = this . getName ( ) ; return Kinetic . _removeName ( b , this . _id ) , Kinetic . _addName ( this , a ) , this . _setAttr ( m , a ) , this } , setAttr : function ( a , b ) { var c = n + Kinetic . Util . _capitalize ( a ) , d = this [ c ] ; return Kinetic . Util . _isFunction ( d ) ? d . call ( this , b ) : this . _setAttr ( a , b ) , this } , _setAttr : function ( a , b ) { var c ; void 0 !== b && ( c = this . attrs [ a ] , this . attrs [ a ] = b , this . _fireChangeEvent ( a , c , b ) ) } , _setComponentAttr : function ( a , b , c ) { var d ; void 0 !== c && ( d = this . attrs [ a ] , d || ( this . attrs [ a ] = this . getAttr ( a ) ) , this . attrs [ a ] [ b ] = c , this . _fireChangeEvent ( a , d , c ) ) } , _fireAndBubble : function ( a , b , c ) { var d = ! 0 ; if ( b && this . nodeType === o && ( b . target = this ) , a === k && c && ( this . _id === c . _id || this . isAncestorOf && this . isAncestorOf ( c ) ) ? d = ! 1 : a === l && c && ( this . _id === c . _id || this . isAncestorOf && this . isAncestorOf ( c ) ) && ( d = ! 1 ) , d ) { this . _fire ( a , b ) ; var e = ( a === k || a === l ) && ( c && c . isAncestorOf && c . isAncestorOf ( this ) || ! ( ! c || ! c . isAncestorOf ) ) ; b && ! b . cancelBubble && this . parent && this . parent . isListening ( ) && ! e && ( c && c . parent ? this . _fireAndBubble . call ( this . parent , a , b , c . parent ) : this . _fireAndBubble . call ( this . parent , a , b ) ) } } , _fire : function ( a , b ) { var c , d = this . eventListeners [ a ] ; if ( b . type = a , d ) for ( c = 0 ; c < d . length ; c ++ ) d [ c ] . handler . call ( this , b ) } , draw : function ( ) { return this . drawScene ( ) , this . drawHit ( ) , this } } ) , Kinetic . Node . create = function ( a , b ) { return this . _createNode ( JSON . parse ( a ) , b ) } , Kinetic . Node . _createNode = function ( a , b ) { var c , d , e , f = Kinetic . Node . prototype . getClassName . call ( a ) , g = a . children ; if ( b && ( a . attrs . container = b ) , c = new Kinetic [ f ] ( a . attrs ) , g ) for ( d = g . length , e = 0 ; d > e ; e ++ ) c . add ( this . _createNode ( g [ e ] ) ) ; return c } , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "position" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "x" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "y" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "opacity" , 1 ) , Kinetic . Factory . addGetter ( Kinetic . Node , "name" ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "name" ) , Kinetic . Factory . addGetter ( Kinetic . Node , "id" ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "id" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "rotation" , 0 ) , Kinetic . Factory . addComponentsGetterSetter ( Kinetic . Node , "scale" , [ "x" , "y" ] ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "scaleX" , 1 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "scaleY" , 1 ) , Kinetic . Factory . addComponentsGetterSetter ( Kinetic . Node , "skew" , [ "x" , "y" ] ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "skewX" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "skewY" , 0 ) , Kinetic . Factory . addComponentsGetterSetter ( Kinetic . Node , "offset" , [ "x" , "y" ] ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "offsetX" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "offsetY" , 0 ) , Kinetic . Factory . addSetter ( Kinetic . Node , "dragDistance" ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "dragDistance" ) , Kinetic . Factory . addSetter ( Kinetic . Node , "width" , 0 ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "width" ) , Kinetic . Factory . addSetter ( Kinetic . Node , "height" , 0 ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "height" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "listening" , "inherit" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "filters" , void 0 , function ( a ) { return this . _filterUpToDate = ! 1 , a } ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "visible" , "inherit" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Node , "transformsEnabled" , "all" ) , Kinetic . Factory . addOverloadedGetterSetter ( Kinetic . Node , "size" ) , Kinetic . Factory . backCompat ( Kinetic . Node , { rotateDeg : "rotate" , setRotationDeg : "setRotation" , getRotationDeg : "getRotation" } ) , Kinetic . Collection . mapMethods ( Kinetic . Node ) } ( ) , function ( ) { Kinetic . Filters . Grayscale = function ( a ) { var b , c , d = a . data , e = d . length ; for ( b = 0 ; e > b ; b += 4 ) c = . 34 * d [ b ] + . 5 * d [ b + 1 ] + . 16 * d [ b + 2 ] , d [ b ] =
a . children = [ ] ; for ( var b = this . getChildren ( ) , c = b . length , d = 0 ; c > d ; d ++ ) { var e = b [ d ] ; a . children . push ( e . toObject ( ) ) } return a } , _getDescendants : function ( a ) { for ( var b = [ ] , c = a . length , d = 0 ; c > d ; d ++ ) { var e = a [ d ] ; this . isAncestorOf ( e ) && b . push ( e ) } return b } , isAncestorOf : function ( a ) { for ( var b = a . getParent ( ) ; b ; ) { if ( b . _id === this . _id ) return ! 0 ; b = b . getParent ( ) } return ! 1 } , clone : function ( a ) { var b = Kinetic . Node . prototype . clone . call ( this , a ) ; return this . getChildren ( ) . each ( function ( a ) { b . add ( a . clone ( ) ) } ) , b } , getAllIntersections : function ( a ) { var b = [ ] ; return this . find ( "Shape" ) . each ( function ( c ) { c . isVisible ( ) && c . intersects ( a ) && b . push ( c ) } ) , b } , _setChildrenIndices : function ( ) { this . children . each ( function ( a , b ) { a . index = b } ) } , drawScene : function ( a , b ) { var c = this . getLayer ( ) , d = a || c && c . getCanvas ( ) , e = d && d . getContext ( ) , f = this . _cache . canvas , g = f && f . scene ; return this . isVisible ( ) && ( g ? this . _drawCachedSceneCanvas ( e ) : this . _drawChildren ( d , "drawScene" , b ) ) , this } , drawHit : function ( a , b ) { var c = this . getLayer ( ) , d = a || c && c . hitCanvas , e = d && d . getContext ( ) , f = this . _cache . canvas , g = f && f . hit ; return this . shouldDrawHit ( d ) && ( c && c . clearHitCache ( ) , g ? this . _drawCachedHitCanvas ( e ) : this . _drawChildren ( d , "drawHit" , b ) ) , this } , _drawChildren : function ( a , b , c ) { var d , e , f = this . getLayer ( ) , g = a && a . getContext ( ) , h = this . getClipWidth ( ) , i = this . getClipHeight ( ) , j = h && i ; j && f && ( d = this . getClipX ( ) , e = this . getClipY ( ) , g . save ( ) , f . _applyTransform ( this , g ) , g . beginPath ( ) , g . rect ( d , e , h , i ) , g . clip ( ) , g . reset ( ) ) , this . children . each ( function ( d ) { d [ b ] ( a , c ) } ) , j && g . restore ( ) } , shouldDrawHit : function ( a ) { var b = this . getLayer ( ) , c = Kinetic . DD , d = c && Kinetic . isDragging ( ) && - 1 !== Kinetic . DD . anim . getLayers ( ) . indexOf ( b ) ; return a && a . isCache || b && b . hitGraphEnabled ( ) && this . isVisible ( ) && ! d } } ) , Kinetic . Util . extend ( Kinetic . Container , Kinetic . Node ) , Kinetic . Container . prototype . get = Kinetic . Container . prototype . find , Kinetic . Factory . addComponentsGetterSetter ( Kinetic . Container , "clip" , [ "x" , "y" , "width" , "height" ] ) , Kinetic . Factory . addGetterSetter ( Kinetic . Container , "clipX" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Container , "clipY" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Container , "clipWidth" ) , Kinetic . Factory . addGetterSetter ( Kinetic . Container , "clipHeight" ) , Kinetic . Collection . mapMethods ( Kinetic . Container ) } ( ) , function ( ) { function a ( a ) { a . fill ( ) } function b ( a ) { a . stroke ( ) } function c ( a ) { a . fill ( ) } function d ( a ) { a . stroke ( ) } function e ( ) { this . _clearCache ( f ) } var f = "hasShadow" ; Kinetic . Util . addMethods ( Kinetic . Shape , { _ _init : function ( f ) { this . nodeType = "Shape" , this . _fillFunc = a , this . _strokeFunc = b , this . _fillFuncHit = c , this . _strokeFuncHit = d ; for ( var g , h = Kinetic . shapes ; ; ) if ( g = Kinetic . Util . getRandomColor ( ) , g && ! ( g in h ) ) break ; this . colorKey = g , h [ g ] = this , Kinetic . Node . call ( this , f ) , this . on ( "shadowColorChange.kinetic shadowBlurChange.kinetic shadowOffsetChange.kinetic shadowOpacityChange.kinetic shadowEnabledChange.kinetic" , e ) } , hasChildren : function ( ) { return ! 1 } , getChildren : function ( ) { return [ ] } , getContext : function ( ) { return this . getLayer ( ) . getContext ( ) } , getCanvas : function ( ) { return this . getLayer ( ) . getCanvas ( ) } , hasShadow : function ( ) { return this . _getCache ( f , this . _hasShadow ) } , _hasShadow : function ( ) { return this . getShadowEnabled ( ) && 0 !== this . getShadowOpacity ( ) && ! ! ( this . getShadowColor ( ) || this . getShadowBlur ( ) || this . getShadowOffsetX ( ) || this . getShadowOffsetY ( ) ) } , hasFill : function ( ) { return ! ! ( this . getFill ( ) || this . getFillPatternImage ( ) || this . getFillLinearGradientColorStops ( ) || this . getFillRadialGradientColorStops ( ) ) } , hasStroke : function ( ) { return ! ! ( this . stroke ( ) || this . strokeRed ( ) || this . strokeGreen ( ) || this . strokeBlue ( ) ) } , intersects : function ( a ) { var b , c = this . getStage ( ) , d = c . bufferHitCanvas ; return d . getContext ( ) . clear ( ) , this . drawScene ( d ) , b = d . context . getImageData ( Math . round ( a . x ) , Math . round ( a . y ) , 1 , 1 ) . data , b [ 3 ] > 0 } , destroy : function ( ) { Kinetic . Node . prototype . destroy . call ( this ) , delete Kinetic . shapes [ this . colorKey ] } , _useBufferCanvas : function ( ) { return ( this . hasShadow ( ) || 1 !== this . getAbsoluteOpacity ( ) ) && this . hasFill ( ) && this . hasStroke ( ) && this . getStage ( ) } , drawScene : function ( a , b ) { var c , d , e , f = this . getLayer ( ) , g = a || f . getCanvas ( ) , h = g . getContext ( ) , i = this . _cache . canvas , j = this . sceneFunc ( ) , k = this . hasShadow ( ) ; if ( this . isVisible ( ) ) if ( i ) this . _drawCachedSceneCanvas ( h ) ; else if ( j ) { if
2015-01-21 18:24:22 +08:00
} , _hitFunc : function ( a ) { var b = this . getWidth ( ) , c = this . getHeight ( ) ; a . beginPath ( ) , a . rect ( 0 , 0 , b , c ) , a . closePath ( ) , a . fillStrokeShape ( this ) } , getWidth : function ( ) { var a = this . getImage ( ) ; return this . attrs . width || ( a ? a . width : 0 ) } , getHeight : function ( ) { var a = this . getImage ( ) ; return this . attrs . height || ( a ? a . height : 0 ) } } , Kinetic . Util . extend ( Kinetic . Image , Kinetic . Shape ) , Kinetic . Factory . addGetterSetter ( Kinetic . Image , "image" ) , Kinetic . Factory . addComponentsGetterSetter ( Kinetic . Image , "crop" , [ "x" , "y" , "width" , "height" ] ) , Kinetic . Factory . addGetterSetter ( Kinetic . Image , "cropX" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Image , "cropY" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Image , "cropWidth" , 0 ) , Kinetic . Factory . addGetterSetter ( Kinetic . Image , "cropHeight" , 0 ) , Kinetic . Collection . mapMethods ( Kinetic . Image ) } ( ) , function ( ) { function a ( a ) { a . fillText ( this . partialText , 0 , 0 ) } function b ( a ) { a . strokeText ( this . partialText , 0 , 0 ) } var c = "auto" , d = "center" , e = "Change.kinetic" , f = "2d" , g = "-" , h = "" , i = "left" , j = "text" , k = "Text" , l = "middle" , m = "normal" , n = "px " , o = " " , p = "right" , q = "word" , r = "char" , s = "none" , t = [ "fontFamily" , "fontSize" , "fontStyle" , "fontVariant" , "padding" , "align" , "lineHeight" , "text" , "width" , "height" , "wrap" ] , u = t . length , v = Kinetic . Util . createCanvasElement ( ) . getContext ( f ) ; Kinetic . Text = function ( a ) { this . _ _ _init ( a ) } , Kinetic . Text . prototype = { _ _ _init : function ( d ) { d = d || { } , d . fill = d . fill || "black" , void 0 === d . width && ( d . width = c ) , void 0 === d . height && ( d . height = c ) , Kinetic . Shape . call ( this , d ) , this . _fillFunc = a , this . _strokeFunc = b , this . className = k ; for ( var f = 0 ; u > f ; f ++ ) this . on ( t [ f ] + e , this . _setTextData ) ; this . _setTextData ( ) , this . sceneFunc ( this . _sceneFunc ) , this . hitFunc ( this . _hitFunc ) } , _sceneFunc : function ( a ) { var b , c = this . getPadding ( ) , e = this . getTextHeight ( ) , f = this . getLineHeight ( ) * e , g = this . textArr , h = g . length , j = this . getWidth ( ) ; for ( a . setAttr ( "font" , this . _getContextFont ( ) ) , a . setAttr ( "textBaseline" , l ) , a . setAttr ( "textAlign" , i ) , a . save ( ) , a . translate ( c , 0 ) , a . translate ( 0 , c + e / 2 ) , b = 0 ; h > b ; b ++ ) { var k = g [ b ] , m = k . text , n = k . width ; a . save ( ) , this . getAlign ( ) === p ? a . translate ( j - n - 2 * c , 0 ) : this . getAlign ( ) === d && a . translate ( ( j - n - 2 * c ) / 2 , 0 ) , this . partialText = m , a . fillStrokeShape ( this ) , a . restore ( ) , a . translate ( 0 , f ) } a . restore ( ) } , _hitFunc : function ( a ) { var b = this . getWidth ( ) , c = this . getHeight ( ) ; a . beginPath ( ) , a . rect ( 0 , 0 , b , c ) , a . closePath ( ) , a . fillStrokeShape ( this ) } , setText : function ( a ) { var b = Kinetic . Util . _isString ( a ) ? a : a . toString ( ) ; return this . _setAttr ( j , b ) , this } , getWidth : function ( ) { return this . attrs . width === c ? this . getTextWidth ( ) + 2 * this . getPadding ( ) : this . attrs . width } , getHeight : function ( ) { return this . attrs . height === c ? this . getTextHeight ( ) * this . textArr . length * this . getLineHeight ( ) + 2 * this . getPadding ( ) : this . attrs . height } , getTextWidth : function ( ) { return this . textWidth } , getTextHeight : function ( ) { return this . textHeight } , _getTextSize : function ( a ) { var b , c = v , d = this . getFontSize ( ) ; return c . save ( ) , c . font = this . _getContextFont ( ) , b = c . measureText ( a ) , c . restore ( ) , { width : b . width , height : parseInt ( d , 10 ) } } , _getContextFont : function ( ) { return this . getFontStyle ( ) + o + this . getFontVariant ( ) + o + this . getFontSize ( ) + n + this . getFontFamily ( ) } , _addTextLine : function ( a , b ) { return this . textArr . push ( { text : a , width : b } ) } , _getTextWidth : function ( a ) { return v . measureText ( a ) . width } , _setTextData : function ( ) { var a = this . getText ( ) . split ( "\n" ) , b = + this . getFontSize ( ) , d = 0 , e = this . getLineHeight ( ) * b , f = this . attrs . width , h = this . attrs . height , i = f !== c , j = h !== c , k = this . getPadding ( ) , l = f - 2 * k , m = h - 2 * k , n = 0 , p = this . getWrap ( ) , q = p !== s , t = p !== r && q ; this . textArr = [ ] , v . save ( ) , v . font = this . _getContextFont ( ) ; for ( var u = 0 , w = a . length ; w > u ; ++ u ) { var x = a [ u ] , y = this . _getTextWidth ( x ) ; if ( i && y > l ) for ( ; x . length > 0 ; ) { for ( var z = 0 , A = x . length , B = "" , C = 0 ; A > z ; ) { var D = z + A >>> 1 , E = x . slice ( 0 , D + 1 ) , F = this . _getTextWidth ( E ) ; l >= F ? ( z = D + 1 , B = E , C = F ) : A = D } if ( ! B ) break ; if ( t ) { var G = Math . max ( B . lastIndexOf ( o ) , B . lastIndexOf ( g ) ) + 1 ; G > 0 && ( z = G , B = B . slice ( 0 , z ) , C = this . _getTextWidth ( B ) ) } if ( this . _addTextLine ( B , C ) , d = Math . max ( d , C ) , n += e , ! q || j && n + e > m ) break ; if ( x = x . slice ( z ) , x . length > 0 && ( y = this . _getTextWidth ( x ) , l >= y ) ) { this . _addTextLine ( x , y ) , n += e , d = Math . max ( d , y ) ; break } } else this . _addTextLine ( x , y ) , n += e , d = Math . max ( d , y ) ; if ( j && n + e > m ) break } v . restore ( ) , this . textHeight = b , this . textWidth = d } } , Kinetic . Util . extend ( Kinetic . Text , K