2015-12-06 21:46:23 +03:00
/ *
2016-01-23 21:41:53 +03:00
html2canvas 0.5 . 0 - beta3 < http : //html2canvas.hertzen.com>
Copyright ( c ) 2016 Niklas von Hertzen
2015-12-06 21:46:23 +03:00
Released under License
* /
2016-01-23 21:53:20 +03:00
! function ( e ) { if ( "object" == typeof exports && "undefined" != typeof module ) module . exports = e ( ) ; else if ( "function" == typeof define && define . amd ) define ( [ ] , e ) ; else { var n ; "undefined" != typeof window ? n = window : "undefined" != typeof global ? n = global : "undefined" != typeof self && ( n = self ) , ( n . html2canvas || ( n . html2canvas = { } ) ) . svg = e ( ) } } ( function ( ) { var define , module , exports ; return function e ( n , f , o ) { function d ( t , l ) { if ( ! f [ t ] ) { if ( ! n [ t ] ) { var s = "function" == typeof require && require ; if ( ! l && s ) return s ( t , ! 0 ) ; if ( i ) return i ( t , ! 0 ) ; var u = new Error ( "Cannot find module '" + t + "'" ) ; throw u . code = "MODULE_NOT_FOUND" , u } var a = f [ t ] = { exports : { } } ; n [ t ] [ 0 ] . call ( a . exports , function ( e ) { var f = n [ t ] [ 1 ] [ e ] ; return d ( f ? f : e ) } , a , a . exports , e , n , f , o ) } return f [ t ] . exports } for ( var i = "function" == typeof require && require , t = 0 ; t < o . length ; t ++ ) d ( o [ t ] ) ; return d } ( { 1 : [ function ( ) { } , { } ] , 2 : [ function ( e , n , f ) { function o ( e , n , f ) { if ( ! ( this instanceof o ) ) return new o ( e , n , f ) ; var d , i = typeof e ; if ( "number" === i ) d = e > 0 ? e >>> 0 : 0 ; else if ( "string" === i ) d = o . byteLength ( e , n ) ; else { if ( "object" !== i || null === e ) throw new TypeError ( "must start with number, buffer, array or string" ) ; "Buffer" === e . type && K ( e . data ) && ( e = e . data ) , d = + e . length > 0 ? Math . floor ( + e . length ) : 0 } if ( d > L ) throw new RangeError ( "Attempt to allocate Buffer larger than maximum size: 0x" + L . toString ( 16 ) + " bytes" ) ; var t ; o . TYPED _ARRAY _SUPPORT ? t = o . _augment ( new Uint8Array ( d ) ) : ( t = this , t . length = d , t . _isBuffer = ! 0 ) ; var l ; if ( o . TYPED _ARRAY _SUPPORT && "number" == typeof e . byteLength ) t . _set ( e ) ; else if ( A ( e ) ) if ( o . isBuffer ( e ) ) for ( l = 0 ; d > l ; l ++ ) t [ l ] = e . readUInt8 ( l ) ; else for ( l = 0 ; d > l ; l ++ ) t [ l ] = ( e [ l ] % 256 + 256 ) % 256 ; else if ( "string" === i ) t . write ( e , 0 , n ) ; else if ( "number" === i && ! o . TYPED _ARRAY _SUPPORT && ! f ) for ( l = 0 ; d > l ; l ++ ) t [ l ] = 0 ; return d > 0 && d <= o . poolSize && ( t . parent = M ) , t } function d ( e , n , f ) { if ( ! ( this instanceof d ) ) return new d ( e , n , f ) ; var i = new o ( e , n , f ) ; return delete i . parent , i } function i ( e , n , f , o ) { f = Number ( f ) || 0 ; var d = e . length - f ; o ? ( o = Number ( o ) , o > d && ( o = d ) ) : o = d ; var i = n . length ; if ( i % 2 !== 0 ) throw new Error ( "Invalid hex string" ) ; o > i / 2 && ( o = i / 2 ) ; for ( var t = 0 ; o > t ; t ++ ) { var l = parseInt ( n . substr ( 2 * t , 2 ) , 16 ) ; if ( isNaN ( l ) ) throw new Error ( "Invalid hex string" ) ; e [ f + t ] = l } return t } function t ( e , n , f , o ) { var d = G ( C ( n , e . length - f ) , e , f , o ) ; return d } function l ( e , n , f , o ) { var d = G ( D ( n ) , e , f , o ) ; return d } function s ( e , n , f , o ) { return l ( e , n , f , o ) } function u ( e , n , f , o ) { var d = G ( F ( n ) , e , f , o ) ; return d } function a ( e , n , f , o ) { var d = G ( E ( n , e . length - f ) , e , f , o , 2 ) ; return d } function p ( e , n , f ) { return I . fromByteArray ( 0 === n && f === e . length ? e : e . slice ( n , f ) ) } function c ( e , n , f ) { var o = "" , d = "" ; f = Math . min ( e . length , f ) ; for ( var i = n ; f > i ; i ++ ) e [ i ] <= 127 ? ( o += H ( d ) + String . fromCharCode ( e [ i ] ) , d = "" ) : d += "%" + e [ i ] . toString ( 16 ) ; return o + H ( d ) } function y ( e , n , f ) { var o = "" ; f = Math . min ( e . length , f ) ; for ( var d = n ; f > d ; d ++ ) o += String . fromCharCode ( 127 & e [ d ] ) ; return o } function m ( e , n , f ) { var o = "" ; f = Math . min ( e . length , f ) ; for ( var d = n ; f > d ; d ++ ) o += String . fromCharCode ( e [ d ] ) ; return o } function r ( e , n , f ) { var o = e . length ; ( ! n || 0 > n ) && ( n = 0 ) , ( ! f || 0 > f || f > o ) && ( f = o ) ; for ( var d = "" , i = n ; f > i ; i ++ ) d += B ( e [ i ] ) ; return d } function v ( e , n , f ) { for ( var o = e . slice ( n , f ) , d = "" , i = 0 ; i < o . length ; i += 2 ) d += String . fromCharCode ( o [ i ] + 256 * o [ i + 1 ] ) ; return d } function w ( e , n , f ) { if ( e % 1 !== 0 || 0 > e ) throw new RangeError ( "offset is not uint" ) ; if ( e + n > f ) throw new RangeError ( "Trying to access beyond buffer length" ) } function b ( e , n , f , d , i , t ) { if ( ! o . isBuffer ( e ) ) throw new TypeError ( "buffer must be a Buffer instance" ) ; if ( n > i || t > n ) throw new RangeError ( "value is out of bounds" ) ; if ( f + d > e . length ) throw new RangeError ( "index out of range" ) } function g ( e , n , f , o ) { 0 > n && ( n = 65535 + n + 1 ) ; for ( var d = 0 , i = Math . min ( e . length - f , 2 ) ; i > d ; d ++ ) e [ f + d ] = ( n & 255 << 8 * ( o ? d : 1 - d ) ) >>> 8 * ( o ? d : 1 - d ) } function h ( e , n , f , o ) { 0 > n && ( n = 4294967295 + n + 1 ) ; for ( var d = 0 , i = Math . min ( e . length - f , 4 ) ; i > d ; d ++ ) e [ f + d ] = n >>> 8 * ( o ? d : 3 - d ) & 255 } function x ( e , n , f , o , d , i ) { if ( n > d || i > n ) throw new RangeError ( "value is out of bounds" ) ; if ( f + o > e . length ) throw new RangeError ( "index out of range" ) ; if ( 0 > f ) throw new RangeError ( "index out of range" ) } function j ( e , n , f , o , d ) { return d || x ( e , n , f , 4 , 3.4028234663852886 e38 , - 3.4028234663852886 e38 ) , J . write ( e , n , f , o , 23 , 4 ) , f + 4 } function k ( e , n , f , o , d ) { return d || x ( e , n , f , 8 , 1.7976931348623157 e308 , - 1.7976931348623157 e308 ) , J . write ( e , n , f , o , 52 , 8 ) , f + 8 } function q ( e ) { if ( e = z (
J . className = "cufon-alt" , J . appendChild ( fabric . document . createTextNode ( d ) ) , H . appendChild ( J ) } var K = H . style , L = I . style || { } , M = c . convert ( p . height - m + v ) , N = Math . ceil ( M ) , O = N / M ; I . width = Math . ceil ( c . convert ( A + r - w ) * O ) , I . height = N , m += p . minY , L . top = Math . round ( c . convert ( m - o . ascent ) ) + "px" , L . left = Math . round ( c . convert ( w ) ) + "px" ; var P = Math . ceil ( c . convert ( A * O ) ) , Q = P + "px" , R = c . convert ( o . height ) , S = ( t . lineHeight - 1 ) * c . convert ( - o . ascent / 5 ) * ( D - 1 ) ; Cufon . textOptions . width = P , Cufon . textOptions . height = R * D + S , Cufon . textOptions . lines = D , Cufon . textOptions . totalLineHeight = S , f ? ( K . width = Q , K . height = R + "px" ) : ( K . paddingLeft = Q , K . paddingBottom = R - 1 + "px" ) ; var T = Cufon . textOptions . context || I . getContext ( "2d" ) , U = N / p . height ; Cufon . textOptions . fontAscent = o . ascent * U , Cufon . textOptions . boundaries = null ; for ( var V = Cufon . textOptions . shadowOffsets , h = g . length ; h -- ; ) V [ h ] = [ g [ h ] [ 0 ] * U , g [ h ] [ 1 ] * U ] ; T . save ( ) , T . scale ( U , U ) , T . translate ( - w - 1 / U * I . width / 2 + ( Cufon . fonts [ o . family ] . offsetLeft || 0 ) , - m - Cufon . textOptions . height / U / 2 + ( Cufon . fonts [ o . family ] . offsetTop || 0 ) ) , T . lineWidth = o . face [ "underline-thickness" ] , T . save ( ) ; var W = Cufon . getTextDecoration ( t ) , X = "italic" === t . fontStyle ; if ( T . save ( ) , s ( ) , b ) for ( var h = 0 , x = b . length ; x > h ; ++ h ) { var j = b [ h ] ; T . save ( ) , T . translate . apply ( T , g [ h ] ) , u ( j . color ) , T . restore ( ) } return u ( ) , T . restore ( ) , T . restore ( ) , T . restore ( ) , H } } ( ) ) , Cufon . registerEngine ( "vml" , function ( ) { function e ( e , f ) { return n ( e , /(?:em|ex|%)$/i . test ( f ) ? "1em" : f ) } function n ( e , n ) { if ( /px$/i . test ( n ) ) return parseFloat ( n ) ; var f = e . style . left , o = e . runtimeStyle . left ; e . runtimeStyle . left = e . currentStyle . left , e . style . left = n ; var d = e . style . pixelLeft ; return e . style . left = f , e . runtimeStyle . left = o , d } if ( fabric . document . namespaces ) { var f = fabric . document . createElement ( "canvas" ) ; if ( ! ( f && f . getContext && f . getContext . apply ) ) { null == fabric . document . namespaces . cvml && fabric . document . namespaces . add ( "cvml" , "urn:schemas-microsoft-com:vml" ) ; var o = fabric . document . createElement ( "cvml:shape" ) ; if ( o . style . behavior = "url(#default#VML)" , o . coordsize ) return o = null , fabric . document . write ( '<style type="text/css">.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}</style>' ) , function ( f , o , d , i , t , l , s ) { var u = null === o ; u && ( o = t . alt ) ; var a = f . viewBox , p = d . computedFontSize || ( d . computedFontSize = new Cufon . CSS . Size ( e ( l , d . get ( "fontSize" ) ) + "px" , f . baseSize ) ) , c = d . computedLSpacing ; void 0 == c && ( c = d . get ( "letterSpacing" ) , d . computedLSpacing = c = "normal" == c ? 0 : ~ ~ p . convertFrom ( n ( l , c ) ) ) ; var y , m ; if ( u ) y = t , m = t . firstChild ; else { if ( y = fabric . document . createElement ( "span" ) , y . className = "cufon cufon-vml" , y . alt = o , m = fabric . document . createElement ( "span" ) , m . className = "cufon-vml-canvas" , y . appendChild ( m ) , i . printable ) { var r = fabric . document . createElement ( "span" ) ; r . className = "cufon-alt" , r . appendChild ( fabric . document . createTextNode ( o ) ) , y . appendChild ( r ) } s || y . appendChild ( fabric . document . createElement ( "cvml:shape" ) ) } var v = y . style , w = m . style , b = p . convert ( a . height ) , g = Math . ceil ( b ) , h = g / b , x = a . minX , j = a . minY ; w . height = g , w . top = Math . round ( p . convert ( j - f . ascent ) ) , w . left = Math . round ( p . convert ( x ) ) , v . height = p . convert ( f . height ) + "px" ; for ( var k , q , z = ( Cufon . getTextDecoration ( i ) , d . get ( "color" ) ) , A = Cufon . CSS . textTransform ( o , d ) . split ( "" ) , B = 0 , C = 0 , D = null , E = i . textShadow , F = 0 , G = 0 , H = A . length ; H > F ; ++ F ) k = f . glyphs [ A [ F ] ] || f . missingGlyph , k && ( B += D = ~ ~ ( k . w || f . w ) + c ) ; if ( null === D ) return null ; var I , J = - x + B + ( a . width - D ) , K = p . convert ( J * h ) , L = Math . round ( K ) , M = J + "," + a . height , N = "r" + M + "nsnf" ; for ( F = 0 ; H > F ; ++ F ) if ( k = f . glyphs [ A [ F ] ] || f . missingGlyph ) { u ? ( q = m . childNodes [ G ] , q . firstChild && q . removeChild ( q . firstChild ) ) : ( q = fabric . document . createElement ( "cvml:shape" ) , m . appendChild ( q ) ) , q . stroked = "f" , q . coordsize = M , q . coordorigin = I = x - C + "," + j , q . path = ( k . d ? "m" + k . d + "xe" : "" ) + "m" + I + N , q . fillcolor = z ; var O = q . style ; if ( O . width = L , O . height = g , E ) { var P , Q = E [ 0 ] , R = E [ 1 ] , S = Cufon . CSS . color ( Q . color ) , T = fabric . document . createElement ( "cvml:shadow" )
2016-01-23 21:41:53 +03:00
} , parsePointsAttribute : function ( e ) { if ( ! e ) return null ; e = e . replace ( /,/g , " " ) . trim ( ) , e = e . split ( /\s+/ ) ; var n , f , o = [ ] ; for ( n = 0 , f = e . length ; f > n ; n += 2 ) o . push ( { x : parseFloat ( e [ n ] ) , y : parseFloat ( e [ n + 1 ] ) } ) ; return o } , getCSSRules : function ( e ) { for ( var o , d = e . getElementsByTagName ( "style" ) , i = { } , t = 0 , l = d . length ; l > t ; t ++ ) { var s = d [ 0 ] . textContent ; s = s . replace ( /\/\*[\s\S]*?\*\//g , "" ) , o = s . match ( /[^{]*\{[\s\S]*?\}/g ) , o = o . map ( function ( e ) { return e . trim ( ) } ) , o . forEach ( function ( e ) { for ( var o = e . match ( /([\s\S]*?)\s*\{([^}]*)\}/ ) , d = { } , t = o [ 2 ] . trim ( ) , l = t . replace ( /;$/ , "" ) . split ( /\s*;\s*/ ) , s = 0 , u = l . length ; u > s ; s ++ ) { var a = l [ s ] . split ( /\s*:\s*/ ) , p = n ( a [ 0 ] ) , c = f ( p , a [ 1 ] , a [ 0 ] ) ; d [ p ] = c } e = o [ 1 ] , e . split ( "," ) . forEach ( function ( e ) { i [ e . trim ( ) ] = r . util . object . clone ( d ) } ) } ) } return i } , loadSVGFromURL : function ( e , n , f ) { function o ( o ) { var d = o . responseXML ; d && ! d . documentElement && r . window . ActiveXObject && o . responseText && ( d = new ActiveXObject ( "Microsoft.XMLDOM" ) , d . async = "false" , d . loadXML ( o . responseText . replace ( /<!DOCTYPE[\s\S]*?(\[[\s\S]*\])*?>/i , "" ) ) ) , d && d . documentElement && r . parseSVGDocument ( d . documentElement , function ( f , o ) { q . set ( e , { objects : r . util . array . invoke ( f , "toObject" ) , options : o } ) , n ( f , o ) } , f ) } e = e . replace ( /^\n\s*/ , "" ) . trim ( ) , q . has ( e , function ( f ) { f ? q . get ( e , function ( e ) { var f = y ( e ) ; n ( f . objects , f . options ) } ) : new r . util . request ( e , { method : "get" , onComplete : o } ) } ) } , loadSVGFromString : function ( e , n , f ) { e = e . trim ( ) ; var o ; if ( "undefined" != typeof DOMParser ) { var d = new DOMParser ; d && d . parseFromString && ( o = d . parseFromString ( e , "text/xml" ) ) } else r . window . ActiveXObject && ( o = new ActiveXObject ( "Microsoft.XMLDOM" ) , o . async = "false" , o . loadXML ( e . replace ( /<!DOCTYPE[\s\S]*?(\[[\s\S]*\])*?>/i , "" ) ) ) ; r . parseSVGDocument ( o . documentElement , function ( e , f ) { n ( e , f ) } , f ) } , createSVGFontFacesMarkup : function ( e ) { for ( var n = "" , f = 0 , o = e . length ; o > f ; f ++ ) "text" === e [ f ] . type && e [ f ] . path && ( n += [ "@font-face {" , "font-family: " , e [ f ] . fontFamily , "; " , "src: url('" , e [ f ] . path , "')" , "}" ] . join ( "" ) ) ; return n && ( n = [ '<style type="text/css">' , "<![CDATA[" , n , "]]>" , "</style>" ] . join ( "" ) ) , n } , createSVGRefElementsMarkup : function ( e ) { var n = [ ] ; return m ( n , e , "backgroundColor" ) , m ( n , e , "overlayColor" ) , n . join ( "" ) } } ) } ( "undefined" != typeof exports ? exports : this ) , fabric . ElementsParser = function ( e , n , f , o ) { this . elements = e , this . callback = n , this . options = f , this . reviver = o } , fabric . ElementsParser . prototype . parse = function ( ) { this . instances = new Array ( this . elements . length ) , this . numElements = this . elements . length , this . createObjects ( ) } , fabric . ElementsParser . prototype . createObjects = function ( ) { for ( var e = 0 , n = this . elements . length ; n > e ; e ++ ) ! function ( e , n ) { setTimeout ( function ( ) { e . createObject ( e . elements [ n ] , n ) } , 0 ) } ( this , e ) } , fabric . ElementsParser . prototype . createObject = function ( e , n ) { var f = fabric [ fabric . util . string . capitalize ( e . tagName ) ] ; if ( f && f . fromElement ) try { this . _createObject ( f , e , n ) } catch ( o ) { fabric . log ( o ) } else this . checkIfDone ( ) } , fabric . ElementsParser . prototype . _createObject = function ( e , n , f ) { if ( e . async ) e . fromElement ( n , this . createCallback ( f , n ) , this . options ) ; else { var o = e . fromElement ( n , this . options ) ; this . resolveGradient ( o , "fill" ) , this . resolveGradient ( o , "stroke" ) , this . reviver && this . reviver ( n , o ) , this . instances [ f ] = o , this . checkIfDone ( ) } } , fabric . ElementsParser . prototype . createCallback = function ( e , n ) { var f = this ; return function ( o ) { f . resolveGradient ( o , "fill" ) , f . resolveGradient ( o , "stroke" ) , f . reviver && f . reviver ( n , o ) , f . instances [ e ] = o , f . checkIfDone ( ) } } , fabric . ElementsParser . prototype . resolveGradient = function ( e , n ) { var f = e . get ( n ) ; if ( /^url\(/ . test ( f ) ) { var o = f . slice ( 5 , f . length - 1 ) ; fabric . gradientDefs [ o ] && e . set ( n , fabric . Gradient . fromElement ( fabric . gradientDefs [ o ] , e ) ) } } , fabric . ElementsParser . prototype . checkIfDone = function ( ) { 0 === -- this . numElements && ( this . instances = this . instances . filter ( function ( e ) { return null != e } ) , this . callback ( this . instances ) ) } , function ( e ) { "use strict" ; function n ( e , n ) { this . x = e , this . y = n } var f = e . fabric || ( e . fabric = { } ) ; return f . Point ? void f . warn ( "fabric.Point is already defined" ) : ( f . Point = n , void ( n . prototype = { constructor : n , add : function ( e ) { return new n ( this . x + e . x , this . y + e . y ) } , addEquals : function ( e ) { return this . x += e . x , this . y += e . y , this } , scalarAdd : function ( e ) { return new n ( this . x + e , this . y + e ) } , scalarAddEquals : function ( e ) { return this . x += e , this . y
break } } } else o = n + 1 ; return o } , moveTo : function ( e , n ) { return f ( this . _objects , e ) , this . _objects . splice ( n , 0 , e ) , this . renderAll && this . renderAll ( ) } , dispose : function ( ) { return this . clear ( ) , this . interactive && this . removeListeners ( ) , this } , toString : function ( ) { return "#<fabric.Canvas (" + this . complexity ( ) + "): { objects: " + this . getObjects ( ) . length + " }>" } } ) , e ( fabric . StaticCanvas . prototype , fabric . Observable ) , e ( fabric . StaticCanvas . prototype , fabric . Collection ) , e ( fabric . StaticCanvas . prototype , fabric . DataURLExporter ) , e ( fabric . StaticCanvas , { EMPTY _JSON : '{"objects": [], "background": "white"}' , supports : function ( e ) { var n = fabric . util . createCanvasElement ( ) ; if ( ! n || ! n . getContext ) return null ; var f = n . getContext ( "2d" ) ; if ( ! f ) return null ; switch ( e ) { case "getImageData" : return "undefined" != typeof f . getImageData ; case "setLineDash" : return "undefined" != typeof f . setLineDash ; case "toDataURL" : return "undefined" != typeof n . toDataURL ; case "toDataURLWithQuality" : try { return n . toDataURL ( "image/jpeg" , 0 ) , ! 0 } catch ( o ) { } return ! 1 ; default : return null } } } ) , fabric . StaticCanvas . prototype . toJSON = fabric . StaticCanvas . prototype . toObject } ( ) , fabric . BaseBrush = fabric . util . createClass ( { color : "rgb(0, 0, 0)" , width : 1 , shadow : null , strokeLineCap : "round" , strokeLineJoin : "round" , setShadow : function ( e ) { return this . shadow = new fabric . Shadow ( e ) , this } , _setBrushStyles : function ( ) { var e = this . canvas . contextTop ; e . strokeStyle = this . color , e . lineWidth = this . width , e . lineCap = this . strokeLineCap , e . lineJoin = this . strokeLineJoin } , _setShadow : function ( ) { if ( this . shadow ) { var e = this . canvas . contextTop ; e . shadowColor = this . shadow . color , e . shadowBlur = this . shadow . blur , e . shadowOffsetX = this . shadow . offsetX , e . shadowOffsetY = this . shadow . offsetY } } , _resetShadow : function ( ) { var e = this . canvas . contextTop ; e . shadowColor = "" , e . shadowBlur = e . shadowOffsetX = e . shadowOffsetY = 0 } } ) , function ( ) { var e = fabric . util . array . min , n = fabric . util . array . max ; fabric . PencilBrush = fabric . util . createClass ( fabric . BaseBrush , { initialize : function ( e ) { this . canvas = e , this . _points = [ ] } , onMouseDown : function ( e ) { this . _prepareForDrawing ( e ) , this . _captureDrawingPath ( e ) , this . _render ( ) } , onMouseMove : function ( e ) { this . _captureDrawingPath ( e ) , this . canvas . clearContext ( this . canvas . contextTop ) , this . _render ( ) } , onMouseUp : function ( ) { this . _finalizeAndAddPath ( ) } , _prepareForDrawing : function ( e ) { var n = new fabric . Point ( e . x , e . y ) ; this . _reset ( ) , this . _addPoint ( n ) , this . canvas . contextTop . moveTo ( n . x , n . y ) } , _addPoint : function ( e ) { this . _points . push ( e ) } , _reset : function ( ) { this . _points . length = 0 , this . _setBrushStyles ( ) , this . _setShadow ( ) } , _captureDrawingPath : function ( e ) { var n = new fabric . Point ( e . x , e . y ) ; this . _addPoint ( n ) } , _render : function ( ) { var e = this . canvas . contextTop , n = this . canvas . viewportTransform , f = this . _points [ 0 ] , o = this . _points [ 1 ] ; e . save ( ) , e . transform ( n [ 0 ] , n [ 1 ] , n [ 2 ] , n [ 3 ] , n [ 4 ] , n [ 5 ] ) , e . beginPath ( ) , 2 === this . _points . length && f . x === o . x && f . y === o . y && ( f . x -= . 5 , o . x += . 5 ) , e . moveTo ( f . x , f . y ) ; for ( var d = 1 , i = this . _points . length ; i > d ; d ++ ) { var t = f . midPointFrom ( o ) ; e . quadraticCurveTo ( f . x , f . y , t . x , t . y ) , f = this . _points [ d ] , o = this . _points [ d + 1 ] } e . lineTo ( f . x , f . y ) , e . stroke ( ) , e . restore ( ) } , _getSVGPathData : function ( ) { return this . box = this . getPathBoundingBox ( this . _points ) , this . convertPointsToSVGPath ( this . _points , this . box . minX , this . box . minY ) } , getPathBoundingBox : function ( f ) { for ( var o = [ ] , d = [ ] , i = f [ 0 ] , t = f [ 1 ] , l = i , s = 1 , u = f . length ; u > s ; s ++ ) { var a = i . midPointFrom ( t ) ; o . push ( l . x ) , o . push ( a . x ) , d . push ( l . y ) , d . push ( a . y ) , i = f [ s ] , t = f [ s + 1 ] , l = a } return o . push ( i . x ) , d . push ( i . y ) , { minX : e ( o ) , minY : e ( d ) , maxX : n ( o ) , maxY : n ( d ) } } , convertPointsToSVGPath : function ( e , n , f ) { var o = [ ] , d = new fabric . Point ( e [ 0 ] . x - n , e [ 0 ] . y - f ) , i = new fabric . Point ( e [ 1 ] . x - n , e [ 1 ] . y - f ) ; o . push ( "M " , e [ 0 ] . x - n , " " , e [ 0 ] . y - f , " " ) ; for ( var t = 1 , l = e . length ; l > t ; t ++ ) { var s = d . midPointFrom ( i ) ; o . push ( "Q " , d . x , " " , d . y , " " , s . x , " " , s . y , " " ) , d = new fabric . Point ( e [ t ] . x - n , e [ t ] . y - f ) , t + 1 < e . length && ( i = new fabric . Point ( e [ t + 1 ] . x - n , e [ t + 1 ] . y - f ) ) } return o . push ( "L " , d . x , " " , d . y , " " ) , o } , createPath : function ( e ) { var n = new fabric . Path ( e ) ; return n . fill = null , n . stroke = this . color , n . strokeWidth = this . width , n . strokeLineCap = this . strokeLineCap , n . strokeLineJoin = this . strokeLineJoin , this . shadow && ( this . shadow . affectStroke = ! 0 , n . setShadow ( this . shadow ) ) , n } , _finalizeAndAddPath : function ( ) { var
return [ i , t , l , u , p ] . join ( "" ) } , getSvgTransformMatrix : function ( ) { return this . transformMatrix ? " matrix(" + this . transformMatrix . join ( " " ) + ")" : "" } , _createBaseSVGMarkup : function ( ) { var e = [ ] ; return this . fill && this . fill . toLive && e . push ( this . fill . toSVG ( this , ! 1 ) ) , this . stroke && this . stroke . toLive && e . push ( this . stroke . toSVG ( this , ! 1 ) ) , this . shadow && e . push ( this . shadow . toSVG ( this ) ) , e } } ) , fabric . util . object . extend ( fabric . Object . prototype , { hasStateChanged : function ( ) { return this . stateProperties . some ( function ( e ) { return this . get ( e ) !== this . originalState [ e ] } , this ) } , saveState : function ( e ) { return this . stateProperties . forEach ( function ( e ) { this . originalState [ e ] = this . get ( e ) } , this ) , e && e . stateProperties && e . stateProperties . forEach ( function ( e ) { this . originalState [ e ] = this . get ( e ) } , this ) , this } , setupState : function ( ) { return this . originalState = { } , this . saveState ( ) , this } } ) , function ( e ) { "use strict" ; function n ( e , n ) { var f = e . origin , o = e . axis1 , d = e . axis2 , i = e . dimension , t = n . nearest , l = n . center , s = n . farthest ; return function ( ) { switch ( this . get ( f ) ) { case t : return Math . min ( this . get ( o ) , this . get ( d ) ) ; case l : return Math . min ( this . get ( o ) , this . get ( d ) ) + . 5 * this . get ( i ) ; case s : return Math . max ( this . get ( o ) , this . get ( d ) ) } } } var f = e . fabric || ( e . fabric = { } ) , o = f . util . object . extend , d = { x1 : 1 , x2 : 1 , y1 : 1 , y2 : 1 } , i = f . StaticCanvas . supports ( "setLineDash" ) ; return f . Line ? void f . warn ( "fabric.Line is already defined" ) : ( f . Line = f . util . createClass ( f . Object , { type : "line" , x1 : 0 , y1 : 0 , x2 : 0 , y2 : 0 , initialize : function ( e , n ) { n = n || { } , e || ( e = [ 0 , 0 , 0 , 0 ] ) , this . callSuper ( "initialize" , n ) , this . set ( "x1" , e [ 0 ] ) , this . set ( "y1" , e [ 1 ] ) , this . set ( "x2" , e [ 2 ] ) , this . set ( "y2" , e [ 3 ] ) , this . _setWidthHeight ( n ) } , _setWidthHeight : function ( e ) { e || ( e = { } ) , this . width = Math . abs ( this . x2 - this . x1 ) || 1 , this . height = Math . abs ( this . y2 - this . y1 ) || 1 , this . left = "left" in e ? e . left : this . _getLeftToOriginX ( ) , this . top = "top" in e ? e . top : this . _getTopToOriginY ( ) } , _set : function ( e , n ) { return this [ e ] = n , "undefined" != typeof d [ e ] && this . _setWidthHeight ( ) , this } , _getLeftToOriginX : n ( { origin : "originX" , axis1 : "x1" , axis2 : "x2" , dimension : "width" } , { nearest : "left" , center : "center" , farthest : "right" } ) , _getTopToOriginY : n ( { origin : "originY" , axis1 : "y1" , axis2 : "y2" , dimension : "height" } , { nearest : "top" , center : "center" , farthest : "bottom" } ) , _render : function ( e , n ) { if ( e . beginPath ( ) , n ) { var f = this . getCenterPoint ( ) ; e . translate ( f . x , f . y ) } if ( ! this . strokeDashArray || this . strokeDashArray && i ) { var o = this . x1 <= this . x2 ? - 1 : 1 , d = this . y1 <= this . y2 ? - 1 : 1 ; e . moveTo ( 1 === this . width ? 0 : o * this . width / 2 , 1 === this . height ? 0 : d * this . height / 2 ) , e . lineTo ( 1 === this . width ? 0 : - 1 * o * this . width / 2 , 1 === this . height ? 0 : - 1 * d * this . height / 2 ) } e . lineWidth = this . strokeWidth ; var t = e . strokeStyle ; e . strokeStyle = this . stroke || e . fillStyle , this . stroke && this . _renderStroke ( e ) , e . strokeStyle = t } , _renderDashedStroke : function ( e ) { var n = this . x1 <= this . x2 ? - 1 : 1 , o = this . y1 <= this . y2 ? - 1 : 1 , d = 1 === this . width ? 0 : n * this . width / 2 , i = 1 === this . height ? 0 : o * this . height / 2 ; e . beginPath ( ) , f . util . drawDashedLine ( e , d , i , - d , - i , this . strokeDashArray ) , e . closePath ( ) } , toObject : function ( e ) { return o ( this . callSuper ( "toObject" , e ) , { x1 : this . get ( "x1" ) , y1 : this . get ( "y1" ) , x2 : this . get ( "x2" ) , y2 : this . get ( "y2" ) } ) } , toSVG : function ( e ) { var n = this . _createBaseSVGMarkup ( ) , f = "" ; if ( ! this . group ) { var o = - this . width / 2 - ( this . x1 > this . x2 ? this . x2 : this . x1 ) , d = - this . height / 2 - ( this . y1 > this . y2 ? this . y2 : this . y1 ) ; f = "translate(" + o + ", " + d + ") " } return n . push ( "<line " , 'x1="' , this . x1 , '" y1="' , this . y1 , '" x2="' , this . x2 , '" y2="' , this . y2 , '" style="' , this . getSvgStyles ( ) , '" transform="' , this . getSvgTransform ( ) , f , this . getSvgTransformMatrix ( ) , '"/>\n' ) , e ? e ( n . join ( "" ) ) : n . join ( "" ) } , complexity : function ( ) { return 1 } } ) , f . Line . ATTRIBUTE _NAMES = f . SHARED _ATTRIBUTES . concat ( "x1 y1 x2 y2" . split ( " " ) ) , f . Line . fromElement = function ( e , n ) { var d = f . parseAttributes ( e , f . Line . ATTRIBUTE _NAMES ) , i = [ d . x1 || 0 , d . y1 || 0 , d . x2 || 0 , d . y2 || 0 ] ; return new f . Line ( i , o ( d , n ) ) } , void ( f . Line . fromObject = function ( e ) { var n = [ e . x1 , e . y1 , e . x2 , e . y2 ] ; return new f . Line ( n , e ) } ) ) } ( "undefined" != typeof exports ? exports : this ) , function ( e ) { "use strict" ; function n ( e ) { return "radius" in e && e . radius > 0 } var f = e . fabric || ( e . fabric = { } ) , o = 2 * Math . PI , d = f . util . object . extend ; return f . Circle ? void f . warn ( "fabric.Circle is already defined." ) : ( f . Circle = f . util . createClass ( f . Object ,
2016-01-23 21:53:20 +03:00
} , complexity : function ( ) { return 1 } } ) , fabric . Image . CSS _CANVAS = "canvas-img" , fabric . Image . prototype . getSvgSrc = fabric . Image . prototype . getSrc , fabric . Image . fromObject = function ( e , n ) { fabric . util . loadImage ( e . src , function ( f ) { fabric . Image . prototype . _initFilters . call ( e , e , function ( o ) { e . filters = o || [ ] ; var d = new fabric . Image ( f , e ) ; n && n ( d ) } ) } , null , e . crossOrigin ) } , fabric . Image . fromURL = function ( e , n , f ) { fabric . util . loadImage ( e , function ( e ) { n ( new fabric . Image ( e , f ) ) } , null , f && f . crossOrigin ) } , fabric . Image . ATTRIBUTE _NAMES = fabric . SHARED _ATTRIBUTES . concat ( "x y width height xlink:href" . split ( " " ) ) , fabric . Image . fromElement = function ( e , f , o ) { var d = fabric . parseAttributes ( e , fabric . Image . ATTRIBUTE _NAMES ) ; fabric . Image . fromURL ( d [ "xlink:href" ] , f , n ( o ? fabric . util . object . clone ( o ) : { } , d ) ) } , fabric . Image . async = ! 0 , void ( fabric . Image . pngCompression = 1 ) ) } ( "undefined" != typeof exports ? exports : this ) , fabric . Image . filters = fabric . Image . filters || { } , fabric . Image . filters . BaseFilter = fabric . util . createClass ( { type : "BaseFilter" , toObject : function ( ) { return { type : this . type } } , toJSON : function ( ) { return this . toObject ( ) } } ) , function ( e ) { "use strict" ; var n = e . fabric || ( e . fabric = { } ) , f = n . util . object . extend ; n . Image . filters . Brightness = n . util . createClass ( n . Image . filters . BaseFilter , { type : "Brightness" , initialize : function ( e ) { e = e || { } , this . brightness = e . brightness || 0 } , applyTo : function ( e ) { for ( var n = e . getContext ( "2d" ) , f = n . getImageData ( 0 , 0 , e . width , e . height ) , o = f . data , d = this . brightness , i = 0 , t = o . length ; t > i ; i += 4 ) o [ i ] += d , o [ i + 1 ] += d , o [ i + 2 ] += d ; n . putImageData ( f , 0 , 0 ) } , toObject : function ( ) { return f ( this . callSuper ( "toObject" ) , { brightness : this . brightness } ) } } ) , n . Image . filters . Brightness . fromObject = function ( e ) { return new n . Image . filters . Brightness ( e ) } } ( "undefined" != typeof exports ? exports : this ) , function ( e ) { "use strict" ; var n = e . fabric || ( e . fabric = { } ) , f = n . util . object . extend ; n . Image . filters . Convolute = n . util . createClass ( n . Image . filters . BaseFilter , { type : "Convolute" , initialize : function ( e ) { e = e || { } , this . opaque = e . opaque , this . matrix = e . matrix || [ 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 ] ; var f = n . util . createCanvasElement ( ) ; this . tmpCtx = f . getContext ( "2d" ) } , _createImageData : function ( e , n ) { return this . tmpCtx . createImageData ( e , n ) } , applyTo : function ( e ) { for ( var n = this . matrix , f = e . getContext ( "2d" ) , o = f . getImageData ( 0 , 0 , e . width , e . height ) , d = Math . round ( Math . sqrt ( n . length ) ) , i = Math . floor ( d / 2 ) , t = o . data , l = o . width , s = o . height , u = l , a = s , p = this . _createImageData ( u , a ) , c = p . data , y = this . opaque ? 1 : 0 , m = 0 ; a > m ; m ++ ) for ( var r = 0 ; u > r ; r ++ ) { for ( var v = m , w = r , b = 4 * ( m * u + r ) , g = 0 , h = 0 , x = 0 , j = 0 , k = 0 ; d > k ; k ++ ) for ( var q = 0 ; d > q ; q ++ ) { var z = v + k - i , A = w + q - i ; if ( ! ( 0 > z || z > s || 0 > A || A > l ) ) { var B = 4 * ( z * l + A ) , C = n [ k * d + q ] ; g += t [ B ] * C , h += t [ B + 1 ] * C , x += t [ B + 2 ] * C , j += t [ B + 3 ] * C } } c [ b ] = g , c [ b + 1 ] = h , c [ b + 2 ] = x , c [ b + 3 ] = j + y * ( 255 - j ) } f . putImageData ( p , 0 , 0 ) } , toObject : function ( ) { return f ( this . callSuper ( "toObject" ) , { opaque : this . opaque , matrix : this . matrix } ) } } ) , n . Image . filters . Convolute . fromObject = function ( e ) { return new n . Image . filters . Convolute ( e ) } } ( "undefined" != typeof exports ? exports : this ) , function ( e ) { "use strict" ; var n = e . fabric || ( e . fabric = { } ) , f = n . util . object . extend ; n . Image . filters . GradientTransparency = n . util . createClass ( n . Image . filters . BaseFilter , { type : "GradientTransparency" , initialize : function ( e ) { e = e || { } , this . threshold = e . threshold || 100 } , applyTo : function ( e ) { for ( var n = e . getContext ( "2d" ) , f = n . getImageData ( 0 , 0 , e . width , e . height ) , o = f . data , d = this . threshold , i = o . length , t = 0 , l = o . length ; l > t ; t += 4 ) o [ t + 3 ] = d + 255 * ( i - t ) / i ; n . putImageData ( f , 0 , 0 ) } , toObject : function ( ) { return f ( this . callSuper ( "toObject" ) , { threshold : this . threshold } ) } } ) , n . Image . filters . GradientTransparency . fromObject = function ( e ) { return new n . Image . filters . GradientTransparency ( e ) } } ( "undefined" != typeof exports ? exports : this ) , function ( e ) { "use strict" ; var n = e . fabric || ( e . fabric = { } ) ; n . Image . filters . Grayscale = n . util . createClass ( n . Image . filters . BaseFilter , { type : "Grayscale" , applyTo : function ( e ) { for ( var n , f = e . getContext ( "2d" ) , o = f . getImageData ( 0 , 0 , e . width , e . height ) , d = o . data , i = o . width * o . height * 4 , t = 0 ; i > t ; ) n = ( d [ t ] + d [ t + 1 ] + d [ t + 2 ] ) / 3 , d [ t ] = n , d [ t + 1 ] = n , d [ t + 2 ] = n , t += 4 ; f . putImageData ( o , 0 , 0 ) } } ) , n . Image . filters . Grayscale . fromObject = function ( ) { return new n . Image . filters . Grayscale } } ( "undefined" != typeof exports ? exports : this ) , function ( e ) { "use strict" ; var n =