1/** 2 * @license jCanvas v21.0.1 3 * Copyright 2017 Caleb Evans 4 * Released under the MIT license 5 */ 6(function(jQuery,global,factory){'use strict';if(typeof module==='object'&&typeof module.exports==='object'){module.exports=function(jQuery,w){return factory(jQuery,w)}}else{factory(jQuery,global)}}(typeof window!=='undefined'?window.jQuery:{},typeof window!=='undefined'?window:this,function($,window){'use strict';var document=window.document,Image=window.Image,Array=window.Array,getComputedStyle=window.getComputedStyle,Math=window.Math,Number=window.Number,parseFloat=window.parseFloat;var defaults,extendObject=$.extend,inArray=$.inArray,typeOf=function(operand){return Object.prototype.toString.call(operand).slice(8,-1).toLowerCase()},isPlainObject=$.isPlainObject,PI=Math.PI,round=Math.round,abs=Math.abs,sin=Math.sin,cos=Math.cos,atan2=Math.atan2,arraySlice=Array.prototype.slice,jQueryEventFix=$.event.fix,maps={},caches={dataCache:{},propCache:{},imageCache:{}},baseTransforms={rotate:0,scaleX:1,scaleY:1,translateX:0,translateY:0,masks:[]},css={},tangibleEvents=['mousedown','mousemove','mouseup','mouseover','mouseout','touchstart','touchmove','touchend'];function jCanvasObject(args){var params=this,propName;for(propName in args){if(Object.prototype.hasOwnProperty.call(args,propName)){params[propName]=args[propName]}} 7return params} 8var jCanvas={events:{},eventHooks:{},future:{}};function jCanvasDefaults(){extendObject(this,jCanvasDefaults.baseDefaults)} 9jCanvasDefaults.baseDefaults={align:'center',arrowAngle:90,arrowRadius:0,autosave:!0,baseline:'middle',bringToFront:!1,ccw:!1,closed:!1,compositing:'source-over',concavity:0,cornerRadius:0,count:1,cropFromCenter:!0,crossOrigin:null,cursors:null,disableEvents:!1,draggable:!1,dragGroups:null,groups:null,data:null,dx:null,dy:null,end:360,eventX:null,eventY:null,fillStyle:'transparent',fontStyle:'normal',fontSize:'12pt',fontFamily:'sans-serif',fromCenter:!0,height:null,imageSmoothing:!0,inDegrees:!0,intangible:!1,index:null,letterSpacing:null,lineHeight:1,layer:!1,mask:!1,maxWidth:null,miterLimit:10,name:null,opacity:1,r1:null,r2:null,radius:0,repeat:'repeat',respectAlign:!1,restrictDragToAxis:null,rotate:0,rounded:!1,scale:1,scaleX:1,scaleY:1,shadowBlur:0,shadowColor:'transparent',shadowStroke:!1,shadowX:0,shadowY:0,sHeight:null,sides:0,source:'',spread:0,start:0,strokeCap:'butt',strokeDash:null,strokeDashOffset:0,strokeJoin:'miter',strokeStyle:'transparent',strokeWidth:1,sWidth:null,sx:null,sy:null,text:'',translate:0,translateX:0,translateY:0,type:null,visible:!0,width:null,x:0,y:0};defaults=new jCanvasDefaults();jCanvasObject.prototype=defaults;function isString(operand){return(typeOf(operand)==='string')} 10function isFunction(operand){return(typeOf(operand)==='function')} 11function isNumeric(operand){return!isNaN(Number(operand))&&!isNaN(parseFloat(operand))} 12function _getContext(canvas){return(canvas&&canvas.getContext?canvas.getContext('2d'):null)} 13function _coerceNumericProps(props){var propName,propType,propValue;for(propName in props){if(Object.prototype.hasOwnProperty.call(props,propName)){propValue=props[propName];propType=typeOf(propValue);if(propType==='string'&&isNumeric(propValue)&&propName!=='text'){props[propName]=parseFloat(propValue)}}} 14if(props.text!==undefined){props.text=String(props.text)}} 15function _cloneTransforms(transforms){transforms=extendObject({},transforms);transforms.masks=transforms.masks.slice(0);return transforms} 16function _saveCanvas(ctx,data){var transforms;ctx.save();transforms=_cloneTransforms(data.transforms);data.savedTransforms.push(transforms)} 17function _restoreCanvas(ctx,data){if(data.savedTransforms.length===0){data.transforms=_cloneTransforms(baseTransforms)}else{ctx.restore();data.transforms=data.savedTransforms.pop()}} 18function _setStyle(canvas,ctx,params,styleName){if(params[styleName]){if(isFunction(params[styleName])){ctx[styleName]=params[styleName].call(canvas,params)}else{ctx[styleName]=params[styleName]}}} 19function _setGlobalProps(canvas,ctx,params){_setStyle(canvas,ctx,params,'fillStyle');_setStyle(canvas,ctx,params,'strokeStyle');ctx.lineWidth=params.strokeWidth;if(params.rounded){ctx.lineCap=ctx.lineJoin='round'}else{ctx.lineCap=params.strokeCap;ctx.lineJoin=params.strokeJoin;ctx.miterLimit=params.miterLimit} 20if(!params.strokeDash){params.strokeDash=[]} 21if(ctx.setLineDash){ctx.setLineDash(params.strokeDash)} 22ctx.webkitLineDash=params.strokeDash;ctx.lineDashOffset=ctx.webkitLineDashOffset=ctx.mozDashOffset=params.strokeDashOffset;ctx.shadowOffsetX=params.shadowX;ctx.shadowOffsetY=params.shadowY;ctx.shadowBlur=params.shadowBlur;ctx.shadowColor=params.shadowColor;ctx.globalAlpha=params.opacity;ctx.globalCompositeOperation=params.compositing;if(params.imageSmoothing){ctx.imageSmoothingEnabled=params.imageSmoothing}} 23function _enableMasking(ctx,data,params){if(params.mask){if(params.autosave){_saveC
23anvas(ctx,data)} 24ctx.clip();data.transforms.masks.push(params._args)}} 25function _restoreTransform(ctx,params){if(params._transformed){ctx.restore()}} 26function _closePath(canvas,ctx,params){var data;if(params.closed){ctx.closePath()} 27if(params.shadowStroke&¶ms.strokeWidth!==0){ctx.stroke();ctx.fill();ctx.shadowColor='transparent';ctx.shadowBlur=0;ctx.stroke()}else{ctx.fill();if(params.fillStyle!=='transparent'){ctx.shadowColor='transparent'} 28if(params.strokeWidth!==0){ctx.stroke()}} 29if(!params.closed){ctx.closePath()} 30_restoreTransform(ctx,params);if(params.mask){data=_getCanvasData(canvas);_enableMasking(ctx,data,params)}} 31function _transformShape(canvas,ctx,params,width,height){params._toRad=(params.inDegrees?(PI/180):1);params._transformed=!0;ctx.save();if(!params.fromCenter&&!params._centered&&width!==undefined){if(height===undefined){height=width} 32params.x+=width/2;params.y+=height/2;params._centered=!0} 33if(params.rotate){_rotateCanvas(ctx,params,null)} 34if(params.scale!==1||params.scaleX!==1||params.scaleY!==1){_scaleCanvas(ctx,params,null)} 35if(params.translate||params.translateX||params.translateY){_translateCanvas(ctx,params,null)}} 36jCanvas.extend=function extend(plugin){if(plugin.name){if(plugin.props){extendObject(defaults,plugin.props)} 37$.fn[plugin.name]=function self(args){var $canvases=this,canvas,e,ctx,params;for(e=0;e<$canvases.length;e+=1){canvas=$canvases[e];ctx=_getContext(canvas);if(ctx){params=new jCanvasObject(args);_addLayer(canvas,params,args,self);_setGlobalProps(canvas,ctx,params);plugin.fn.call(canvas,ctx,params)}} 38return $canvases};if(plugin.type){maps.drawings[plugin.type]=plugin.name}} 39return $.fn[plugin.name]};function _getCanvasData(canvas){var dataCache=caches.dataCache,data;if(dataCache._canvas===canvas&&dataCache._data){data=dataCache._data}else{data=$.data(canvas,'jCanvas');if(!data){data={canvas:canvas,layers:[],layer:{names:{},groups:{}},eventHooks:{},intersecting:[],lastIntersected:null,cursor:$(canvas).css('cursor'),drag:{layer:null,dragging:!1},event:{type:null,x:null,y:null},events:{},transforms:_cloneTransforms(baseTransforms),savedTransforms:[],animating:!1,animated:null,pixelRatio:1,scaled:!1,redrawOnMousemove:!1};$.data(canvas,'jCanvas',data)} 40dataCache._canvas=canvas;dataCache._data=data} 41return data} 42function _addLayerEvents($canvas,data,layer){var eventName;for(eventName in jCanvas.events){if(Object.prototype.hasOwnProperty.call(jCanvas.events,eventName)){if(layer[eventName]||(layer.cursors&&layer.cursors[eventName])){_addExplicitLayerEvent($canvas,data,layer,eventName)}}} 43if(!data.events.mouseout){$canvas.bind('mouseout.jCanvas',function(){var layer=data.drag.layer,l;if(layer){data.drag={};_triggerLayerEvent($canvas,data,layer,'dragcancel')} 44for(l=0;l<data.layers.length;l+=1){layer=data.layers[l];if(layer._hovered){$canvas.triggerLayerEvent(data.layers[l],'mouseout')}} 45$canvas.drawLayers()});data.events.mouseout=!0}} 46function _addLayerEvent($canvas,data,layer,eventName){jCanvas.events[eventName]($canvas,data);layer._event=!0} 47function _addExplicitLayerEvent($canvas,data,layer,eventName){_addLayerEvent($canvas,data,layer,eventName);if(eventName==='mouseover'||eventName==='mouseout'||eventName==='mousemove'){data.redrawOnMousemove=!0}} 48function _enableDrag($canvas,data,layer){var dragHelperEvents,eventName,i;if(layer.draggable||layer.cursors){dragHelperEvents=['mousedown','mousemove','mouseup'];for(i=0;i<dragHelperEvents.length;i+=1){eventName=dragHelperEvents[i];_addLayerEvent($canvas,data,layer,eventName)} 49layer._event=!0}} 50function _updateLayerName($canvas,data,layer,props){var nameMap=data.layer.names;if(!props){props=layer}else{if(props.name!==undefined&&isString(layer.name)&&layer.name!==props.name){delete nameMap[layer.name]}} 51if(isString(props.name)){nameMap[props.name]=layer}} 52function _updateLayerGroups($canvas,data,layer,props){var groupMap=data.layer.groups,group,groupName,g,index,l;if(!props){props=layer}else{if(props.groups!==undefined&&layer.groups!==null){for(g=0;g<layer.groups.length;g+=1){groupName=layer.groups[g];group=groupMap[groupName];if(group){for(l=0;l<group.length;l+=1){if(group[l]===layer){index=l;group.splice(l,1);break}} 53if(group.length===0){delete groupMap[groupName]}}}}} 54if(props.groups!==undefined&&props.groups!==null){for(g=0;g<props.groups.length;g+=1){groupName=props.groups[g];group=groupMap[groupName];if(!group){group=groupMap[groupName]=[];group.name=groupName} 55if(index===undefined){index=group.length} 56group.splice(index,0,layer)}}} 57$.fn.getEventHooks=function getEventHooks(){var $canvases=this,canvas,data,eventHooks={};
57if($canvases.length!==0){canvas=$canvases[0];data=_getCanvasData(canvas);eventHooks=data.eventHooks} 58return eventHooks};$.fn.setEventHooks=function setEventHooks(eventHooks){var $canvases=this,e,data;for(e=0;e<$canvases.length;e+=1){data=_getCanvasData($canvases[e]);extendObject(data.eventHooks,eventHooks)} 59return $canvases};$.fn.getLayers=function getLayers(callback){var $canvases=this,canvas,data,layers,layer,l,matching=[];if($canvases.length!==0){canvas=$canvases[0];data=_getCanvasData(canvas);layers=data.layers;if(isFunction(callback)){for(l=0;l<layers.length;l+=1){layer=layers[l];if(callback.call(canvas,layer)){matching.push(layer)}}}else{matching=layers}} 60return matching};$.fn.getLayer=function getLayer(layerId){var $canvases=this,canvas,data,layers,layer,l,idType;if($canvases.length!==0){canvas=$canvases[0];data=_getCanvasData(canvas);layers=data.layers;idType=typeOf(layerId);if(layerId&&layerId.layer){layer=layerId}else if(idType==='number'){if(layerId<0){layerId=layers.length+layerId} 61layer=layers[layerId]}else if(idType==='regexp'){for(l=0;l<layers.length;l+=1){if(isString(layers[l].name)&&layers[l].name.match(layerId)){layer=layers[l];break}}}else{layer=data.layer.names[layerId]}} 62return layer};$.fn.getLayerGroup=function getLayerGroup(groupId){var $canvases=this,canvas,data,groups,groupName,group,idType=typeOf(groupId);if($canvases.length!==0){canvas=$canvases[0];if(idType==='array'){group=groupId}else if(idType==='regexp'){data=_getCanvasData(canvas);groups=data.layer.groups;for(groupName in groups){if(groupName.match(groupId)){group=groups[groupName];break}}}else{data=_getCanvasData(canvas);group=data.layer.groups[groupId]}} 63return group};$.fn.getLayerIndex=function getLayerIndex(layerId){var $canvases=this,layers=$canvases.getLayers(),layer=$canvases.getLayer(layerId);return inArray(layer,layers)};$.fn.setLayer=function setLayer(layerId,props){var $canvases=this,$canvas,e,data,layer,propName,propValue,propType;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layer=$($canvases[e]).getLayer(layerId);if(layer){_updateLayerName($canvas,data,layer,props);_updateLayerGroups($canvas,data,layer,props);_coerceNumericProps(props);for(propName in props){if(Object.prototype.hasOwnProperty.call(props,propName)){propValue=props[propName];propType=typeOf(propValue);if(propType==='object'&&isPlainObject(propValue)){layer[propName]=extendObject({},propValue);_coerceNumericProps(layer[propName])}else if(propType==='array'){layer[propName]=propValue.slice(0)}else if(propType==='string'){if(propValue.indexOf('+=')===0){layer[propName]+=parseFloat(propValue.substr(2))}else if(propValue.indexOf('-=')===0){layer[propName]-=parseFloat(propValue.substr(2))}else if(!isNaN(propValue)&&isNumeric(propValue)&&propName!=='text'){layer[propName]=parseFloat(propValue)}else{layer[propName]=propValue}}else{layer[propName]=propValue}}} 64_addLayerEvents($canvas,data,layer);_enableDrag($canvas,data,layer);if($.isEmptyObject(props)===!1){_triggerLayerEvent($canvas,data,layer,'change',props)}}} 65return $canvases};$.fn.setLayers=function setLayers(props,callback){var $canvases=this,$canvas,e,layers,l;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);layers=$canvas.getLayers(callback);for(l=0;l<layers.length;l+=1){$canvas.setLayer(layers[l],props)}} 66return $canvases};$.fn.setLayerGroup=function setLayerGroup(groupId,props){var $canvases=this,$canvas,e,group,l;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);group=$canvas.getLayerGroup(groupId);if(group){for(l=0;l<group.length;l+=1){$canvas.setLayer(group[l],props)}}} 67return $canvases};$.fn.moveLayer=function moveLayer(layerId,index){var $canvases=this,$canvas,e,data,layers,layer;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layers=data.layers;layer=$canvas.getLayer(layerId);if(layer){layer.index=inArray(layer,layers);layers.splice(layer.index,1);layers.splice(index,0,layer);if(index<0){index=layers.length+index} 68layer.index=index;_triggerLayerEvent($canvas,data,layer,'move')}} 69return $canvases};$.fn.removeLayer=function removeLayer(layerId){var $canvases=this,$canvas,e,data,layers,layer;for(e=0;
69e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layers=$canvas.getLayers();layer=$canvas.getLayer(layerId);if(layer){layer.index=inArray(layer,layers);layers.splice(layer.index,1);delete layer._layer;_updateLayerName($canvas,data,layer,{name:null});_updateLayerGroups($canvas,data,layer,{groups:null});_triggerLayerEvent($canvas,data,layer,'remove')}} 70return $canvases};$.fn.removeLayers=function removeLayers(callback){var $canvases=this,$canvas,e,data,layers,layer,l;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layers=$canvas.getLayers(callback).slice(0);for(l=0;l<layers.length;l+=1){layer=layers[l];$canvas.removeLayer(layer)} 71data.layer.names={};data.layer.groups={}} 72return $canvases};$.fn.removeLayerGroup=function removeLayerGroup(groupId){var $canvases=this,$canvas,e,group,l;if(groupId!==undefined){for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);group=$canvas.getLayerGroup(groupId);if(group){group=group.slice(0);for(l=0;l<group.length;l+=1){$canvas.removeLayer(group[l])}}}} 73return $canvases};$.fn.addLayerToGroup=function addLayerToGroup(layerId,groupName){var $canvases=this,$canvas,e,layer,groups=[groupName];for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);layer=$canvas.getLayer(layerId);if(layer.groups){groups=layer.groups.slice(0);if(inArray(groupName,layer.groups)===-1){groups.push(groupName)}} 74$canvas.setLayer(layer,{groups:groups})} 75return $canvases};$.fn.removeLayerFromGroup=function removeLayerFromGroup(layerId,groupName){var $canvases=this,$canvas,e,layer,groups=[],index;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);layer=$canvas.getLayer(layerId);if(layer.groups){index=inArray(groupName,layer.groups);if(index!==-1){groups=layer.groups.slice(0);groups.splice(index,1);$canvas.setLayer(layer,{groups:groups})}}} 76return $canvases};function _getIntersectingLayer(data){var layer,i,mask,m;layer=null;for(i=data.intersecting.length-1;i>=0;i-=1){layer=data.intersecting[i];if(layer._masks){for(m=layer._masks.length-1;m>=0;m-=1){mask=layer._masks[m];if(!mask.intersects){layer.intersects=!1;break}} 77if(layer.intersects&&!layer.intangible){break}}} 78if(layer&&layer.intangible){layer=null} 79return layer} 80function _drawLayer($canvas,ctx,layer,nextLayerIndex){if(layer&&layer.visible&&layer._method){if(nextLayerIndex){layer._next=nextLayerIndex}else{layer._next=null} 81if(layer._method){layer._method.call($canvas,layer)}}} 82function _handleLayerDrag($canvas,data,eventType){var layers,layer,l,drag,dragGroups,group,groupName,g,newX,newY;drag=data.drag;layer=drag.layer;dragGroups=(layer&&layer.dragGroups)||[];layers=data.layers;if(eventType==='mousemove'||eventType==='touchmove'){if(!drag.dragging){drag.dragging=!0;layer.dragging=!0;if(layer.bringToFront){layers.splice(layer.index,1);layer.index=layers.push(layer)} 83layer._startX=layer.x;layer._startY=layer.y;layer._endX=layer._eventX;layer._endY=layer._eventY;_triggerLayerEvent($canvas,data,layer,'dragstart')} 84if(drag.dragging){newX=layer._eventX-(layer._endX-layer._startX);newY=layer._eventY-(layer._endY-layer._startY);if(layer.updateDragX){newX=layer.updateDragX.call($canvas[0],layer,newX)} 85if(layer.updateDragY){newY=layer.updateDragY.call($canvas[0],layer,newY)} 86layer.dx=newX-layer.x;layer.dy=newY-layer.y;if(layer.restrictDragToAxis!=='y'){layer.x=newX} 87if(layer.restrictDragToAxis!=='x'){layer.y=newY} 88_triggerLayerEvent($canvas,data,layer,'drag');for(g=0;g<dragGroups.length;g+=1){groupName=dragGroups[g];group=data.layer.groups[groupName];if(layer.groups&&group){for(l=0;l<group.length;l+=1){if(group[l]!==layer){if(layer.restrictDragToAxis!=='y'&&group[l].restrictDragToAxis!=='y'){group[l].x+=layer.dx} 89if(layer.restrictDragToAxis!=='x'&&group[l].restrictDragToAxis!=='x'){group[l].y+=layer.dy}}}}}}}else if(eventType==='mouseup'||eventType==='touchend'){if(drag.dragging){layer.dragging=!1;drag.dragging=!1;data.redrawOnMousemove=data.originalRedrawOnMousemove;_triggerLayerEvent($canvas,data,layer,'dragstop')} 90data.drag={}}} 91css.cursors=['grab','grabbing','zoom-in','zoom-out'];css.prefix=(function(){var styles=getComputedStyle(document.documentElement,''),pre=(arraySlice.call(styles).join('').match(/-(moz|webkit|ms)-/)||(styles.OLink===''&&['','o']))[1];return'-'+pre+'-'})();function _setCursor($canvas,layer,eventType){var cursor;if(layer.cursors){cursor=layer.cursors[eventType]} 92if($.inArray(cursor,css.cursors)!==-1){cursor=css.prefix+cursor} 93if(cursor){$canvas.css({cursor:cursor})}} 94function _resetCursor($canvas,data){$canvas.css({cursor:data.cursor})} 95function _runEventCallback($canvas,layer,eventType,callbacks,arg){if(callbacks[eventType]&&layer._running&&!layer._running[eventType]){layer._running[eventType]=!0;callbacks[eventType].call($canvas[0],layer,arg);layer._running[eventType]=!1}} 96function _layerCanFireEvent(layer,eventType){return(!layer.disableEvents&&(!layer.intangible||$.inArray(eventType,tangibleEvents)===-1))} 97function _triggerLayerEvent($canvas,data,layer,eventType,arg){if(_layerCanFireEvent(layer,eventType)){if(eventType!=='mouseout'){_setCursor($canvas,layer,eventType)} 98_runEventCallback($canvas,layer,eventType,layer,arg);_runEventCallback($canvas,layer,eventType,data.eventHooks,arg);_runEventCallback($canvas,layer,eventType,jCanvas.eventHooks,arg)}} 99$.fn.triggerLayerEvent=function(layer,eventType){var $canvases=this,$canvas,e,data;for(e=0;
99e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layer=$canvas.getLayer(layer);if(layer){_triggerLayerEvent($canvas,data,layer,eventType)}} 100return $canvases};$.fn.drawLayer=function drawLayer(layerId){var $canvases=this,e,ctx,$canvas,layer;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);ctx=_getContext($canvases[e]);if(ctx){layer=$canvas.getLayer(layerId);_drawLayer($canvas,ctx,layer)}} 101return $canvases};$.fn.drawLayers=function drawLayers(args){var $canvases=this,$canvas,e,ctx,params=args||{},layers,layer,lastLayer,l,index,lastIndex,data,eventCache,eventType,isImageLayer;index=params.index;if(!index){index=0} 102for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);if(params.clear!==!1){$canvas.clearCanvas()} 103if(params.complete){data.drawLayersComplete=params.complete} 104layers=data.layers;for(l=index;l<layers.length;l+=1){layer=layers[l];layer.index=l;if(params.resetFire){layer._fired=!1} 105_drawLayer($canvas,ctx,layer,l+1);layer._masks=data.transforms.masks.slice(0);if(layer._method===$.fn.drawImage&&layer.visible){isImageLayer=!0;break}} 106if(isImageLayer){continue} 107lastIndex=l;if(params.complete){params.complete.call($canvases[e]);delete data.drawLayersComplete} 108layer=_getIntersectingLayer(data);eventCache=data.event;eventType=eventCache.type;if(data.drag.layer){_handleLayerDrag($canvas,data,eventType)} 109lastLayer=data.lastIntersected;if(lastLayer!==null&&layer!==lastLayer&&lastLayer._hovered&&!lastLayer._fired&&!data.drag.dragging){data.lastIntersected=null;lastLayer._fired=!0;lastLayer._hovered=!1;_triggerLayerEvent($canvas,data,lastLayer,'mouseout');_resetCursor($canvas,data)} 110if(layer){if(!layer[eventType]){eventType=_getMouseEventName(eventType)} 111if(layer._event&&layer.intersects){data.lastIntersected=layer;if((layer.mouseover||layer.mouseout||layer.cursors)&&!data.drag.dragging){if(!layer._hovered&&!layer._fired){layer._fired=!0;layer._hovered=!0;_triggerLayerEvent($canvas,data,layer,'mouseover')}} 112if(!layer._fired){layer._fired=!0;eventCache.type=null;_triggerLayerEvent($canvas,data,layer,eventType)} 113if(layer.draggable&&!layer.disableEvents&&(eventType==='mousedown'||eventType==='touchstart')){data.drag.layer=layer;data.originalRedrawOnMousemove=data.redrawOnMousemove;data.redrawOnMousemove=!0}}} 114if(layer===null&&!data.drag.dragging){_resetCursor($canvas,data)} 115if(lastIndex===layers.length){data.intersecting.length=0;data.transforms=_cloneTransforms(baseTransforms);data.savedTransforms.length=0}}} 116return $canvases};function _addLayer(canvas,params,args,method){var $canvas,data,layers,layer=(params._layer?args:params);params._args=args;if(params.draggable||params.dragGroups){params.layer=!0;params.draggable=!0} 117if(!params._method){if(method){params._method=method}else if(params.method){params._method=$.fn[params.method]}else if(params.type){params._method=$.fn[maps.drawings[params.type]]}} 118if(params.layer&&!params._layer){$canvas=$(canvas);data=_getCanvasData(canvas);layers=data.layers;if(layer.name===null||(isString(layer.name)&&data.layer.names[layer.name]===undefined)){_coerceNumericProps(params);layer=new jCanvasObject(params);layer.canvas=canvas;layer.layer=!0;layer._layer=!0;layer._running={};if(layer.data!==null){layer.data=extendObject({},layer.data)}else{layer.data={}} 119if(layer.groups!==null){layer.groups=layer.groups.slice(0)}else{layer.groups=[]} 120_updateLayerName($canvas,data,layer);_updateLayerGroups($canvas,data,layer);_addLayerEvents($canvas,data,layer);_enableDrag($canvas,data,layer);params._event=layer._event;if(layer._method===$.fn.drawText){$canvas.measureText(layer)} 121if(layer.index===null){layer.index=layers.length} 122layers.splice(layer.index,0,layer);params._args=layer;_triggerLayerEvent($canvas,data,layer,'add')}}else if(!params.layer){_coerceNumericProps(params)} 123return layer} 124$.fn.addLayer=function addLayer(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);params.layer=!0;_addLayer($canvases[e],params,args)}} 125return $canvases};css.props=['width','height','opacity','lineHeight'];css.propsObj={};function _showProps(obj){var cssProp,p;for(p=0;p<css.props.length;p+=1){cssProp=css.props[p];obj[cssProp]=obj['_'+cssProp]}} 126function _hideProps(obj,reset){var cssProp,p;for(p=0;p<css.props.length;p+=1){cssProp=css.props[p];if(obj[cssProp]!==undefined){obj['_'+cssProp]=obj[cssProp];css.propsObj[cssProp]=!0;if(reset){delete obj[cssProp]}}}} 127function _parseEndValues(canvas,layer,endValues){var propName,propValue,
127subPropName,subPropValue;for(propName in endValues){if(Object.prototype.hasOwnProperty.call(endValues,propName)){propValue=endValues[propName];if(isFunction(propValue)){endValues[propName]=propValue.call(canvas,layer,propName)} 128if(typeOf(propValue)==='object'&&isPlainObject(propValue)){for(subPropName in propValue){if(Object.prototype.hasOwnProperty.call(propValue,subPropName)){subPropValue=propValue[subPropName];if(layer[propName]!==undefined){layer[propName+'.'+subPropName]=layer[propName][subPropName];endValues[propName+'.'+subPropName]=subPropValue}}} 129delete endValues[propName]}}} 130return endValues} 131function _removeSubPropAliases(layer){var propName;for(propName in layer){if(Object.prototype.hasOwnProperty.call(layer,propName)){if(propName.indexOf('.')!==-1){delete layer[propName]}}}} 132function _colorToRgbArray(color){var originalColor,elem,rgb=[],multiple=1;if(color==='transparent'){color='rgba(0, 0, 0, 0)'}else if(color.match(/^([a-z]+|#[0-9a-f]+)$/gi)){elem=document.head;originalColor=elem.style.color;elem.style.color=color;color=$.css(elem,'color');elem.style.color=originalColor} 133if(color.match(/^rgb/gi)){rgb=color.match(/(\d+(\.\d+)?)/gi);if(color.match(/%/gi)){multiple=2.55} 134rgb[0]*=multiple;rgb[1]*=multiple;rgb[2]*=multiple;if(rgb[3]!==undefined){rgb[3]=parseFloat(rgb[3])}else{rgb[3]=1}} 135return rgb} 136function _animateColor(fx){var n=3,i;if(typeOf(fx.start)!=='array'){fx.start=_colorToRgbArray(fx.start);fx.end=_colorToRgbArray(fx.end)} 137fx.now=[];if(fx.start[3]!==1||fx.end[3]!==1){n=4} 138for(i=0;i<n;i+=1){fx.now[i]=fx.start[i]+((fx.end[i]-fx.start[i])*fx.pos);if(i<3){fx.now[i]=round(fx.now[i])}} 139if(fx.start[3]!==1||fx.end[3]!==1){fx.now='rgba('+fx.now.join(',')+')'}else{fx.now.slice(0,3);fx.now='rgb('+fx.now.join(',')+')'} 140if(fx.elem.nodeName){fx.elem.style[fx.prop]=fx.now}else{fx.elem[fx.prop]=fx.now}} 141$.fn.animateLayer=function animateLayer(){var $canvases=this,$canvas,e,ctx,args=arraySlice.call(arguments,0),data,layer,props;if(typeOf(args[2])==='object'){args.splice(2,0,args[2].duration||null);args.splice(3,0,args[3].easing||null);args.splice(4,0,args[4].complete||null);args.splice(5,0,args[5].step||null)}else{if(args[2]===undefined){args.splice(2,0,null);args.splice(3,0,null);args.splice(4,0,null)}else if(isFunction(args[2])){args.splice(2,0,null);args.splice(3,0,null)} 142if(args[3]===undefined){args[3]=null;args.splice(4,0,null)}else if(isFunction(args[3])){args.splice(3,0,null)}} 143function complete($canvas,data,layer){return function(){_showProps(layer);_removeSubPropAliases(layer);if(!data.animating||data.animated===layer){$canvas.drawLayers()} 144layer._animating=!1;data.animating=!1;data.animated=null;if(args[4]){args[4].call($canvas[0],layer)} 145_triggerLayerEvent($canvas,data,layer,'animateend')}} 146function step($canvas,data,layer){return function(now,fx){var parts,propName,subPropName,hidden=!1;if(fx.prop[0]==='_'){hidden=!0;fx.prop=fx.prop.replace('_','');layer[fx.prop]=layer['_'+fx.prop]} 147if(fx.prop.indexOf('.')!==-1){parts=fx.prop.split('.');propName=parts[0];subPropName=parts[1];if(layer[propName]){layer[propName][subPropName]=fx.now}} 148if(layer._pos!==fx.pos){layer._pos=fx.pos;if(!layer._animating&&!data.animating){layer._animating=!0;data.animating=!0;data.animated=layer} 149if(!data.animating||data.animated===layer){$canvas.drawLayers()}} 150if(args[5]){args[5].call($canvas[0],now,fx,layer)} 151_triggerLayerEvent($canvas,data,layer,'animate',fx);if(hidden){fx.prop='_'+fx.prop}}} 152for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);layer=$canvas.getLayer(args[0]);if(layer&&layer._method!==$.fn.draw){props=extendObject({},args[1]);props=_parseEndValues($canvases[e],layer,props);_hideProps(props,!0);_hideProps(layer);layer.style=css.propsObj;$(layer).animate(props,{duration:args[2],easing:($.easing[args[3]]?args[3]:null),complete:complete($canvas,data,layer),step:step($canvas,data,layer)});_triggerLayerEvent($canvas,data,layer,'animatestart')}}} 153return $canvases};$.fn.animateLayerGroup=function animateLayerGroup(groupId){var $canvases=this,$canvas,e,args=arraySlice.call(arguments,0),group,l;for(e=0;
153e<$canvases.length;e+=1){$canvas=$($canvases[e]);group=$canvas.getLayerGroup(groupId);if(group){for(l=0;l<group.length;l+=1){args[0]=group[l];$canvas.animateLayer.apply($canvas,args)}}} 154return $canvases};$.fn.delayLayer=function delayLayer(layerId,duration){var $canvases=this,$canvas,e,data,layer;duration=duration||0;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layer=$canvas.getLayer(layerId);if(layer){$(layer).delay(duration);_triggerLayerEvent($canvas,data,layer,'delay')}} 155return $canvases};$.fn.delayLayerGroup=function delayLayerGroup(groupId,duration){var $canvases=this,$canvas,e,group,layer,l;duration=duration||0;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);group=$canvas.getLayerGroup(groupId);if(group){for(l=0;l<group.length;l+=1){layer=group[l];$canvas.delayLayer(layer,duration)}}} 156return $canvases};$.fn.stopLayer=function stopLayer(layerId,clearQueue){var $canvases=this,$canvas,e,data,layer;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);data=_getCanvasData($canvases[e]);layer=$canvas.getLayer(layerId);if(layer){$(layer).stop(clearQueue);_triggerLayerEvent($canvas,data,layer,'stop')}} 157return $canvases};$.fn.stopLayerGroup=function stopLayerGroup(groupId,clearQueue){var $canvases=this,$canvas,e,group,layer,l;for(e=0;e<$canvases.length;e+=1){$canvas=$($canvases[e]);group=$canvas.getLayerGroup(groupId);if(group){for(l=0;l<group.length;l+=1){layer=group[l];$canvas.stopLayer(layer,clearQueue)}}} 158return $canvases};function _supportColorProps(props){var p;for(p=0;p<props.length;p+=1){$.fx.step[props[p]]=_animateColor}} 159_supportColorProps(['color','backgroundColor','borderColor','borderTopColor','borderRightColor','borderBottomColor','borderLeftColor','fillStyle','outlineColor','strokeStyle','shadowColor']);maps.touchEvents={'mousedown':'touchstart','mouseup':'touchend','mousemove':'touchmove'};maps.mouseEvents={'touchstart':'mousedown','touchend':'mouseup','touchmove':'mousemove'};function _getTouchEventName(eventName){if(maps.touchEvents[eventName]){eventName=maps.touchEvents[eventName]} 160return eventName} 161function _getMouseEventName(eventName){if(maps.mouseEvents[eventName]){eventName=maps.mouseEvents[eventName]} 162return eventName} 163function _createEvent(eventName){jCanvas.events[eventName]=function($canvas,data){var helperEventName,touchEventName,eventCache;eventCache=data.event;helperEventName=(eventName==='mouseover'||eventName==='mouseout')?'mousemove':eventName;touchEventName=_getTouchEventName(helperEventName);function eventCallback(event){eventCache.x=event.offsetX;eventCache.y=event.offsetY;eventCache.type=helperEventName;eventCache.event=event;if(event.type!=='mousemove'||data.redrawOnMousemove||data.drag.dragging){$canvas.drawLayers({resetFire:!0})} 164event.preventDefault()} 165if(!data.events[helperEventName]){if(touchEventName!==helperEventName){$canvas.bind(helperEventName+'.jCanvas '+touchEventName+'.jCanvas',eventCallback)}else{$canvas.bind(helperEventName+'.jCanvas',eventCallback)} 166data.events[helperEventName]=!0}}} 167function _createEvents(eventNames){var n;for(n=0;n<eventNames.length;n+=1){_createEvent(eventNames[n])}} 168_createEvents(['click','dblclick','mousedown','mouseup','mousemove','mouseover','mouseout','touchstart','touchmove','touchend','pointerdown','pointermove','pointerup','contextmenu']);function _detectEvents(canvas,ctx,params){var layer,data,eventCache,intersects,transforms,x,y,angle;layer=params._args;if(layer){data=_getCanvasData(canvas);eventCache=data.event;if(eventCache.x!==null&&eventCache.y!==null){x=eventCache.x*data.pixelRatio;y=eventCache.y*data.pixelRatio;intersects=ctx.isPointInPath(x,y)||(ctx.isPointInStroke&&ctx.isPointInStroke(x,y))} 169transforms=data.transforms;layer.eventX=eventCache.x;layer.eventY=eventCache.y;layer.event=eventCache.event;angle=data.transforms.rotate;x=layer.eventX;y=layer.eventY;if(angle!==0){layer._eventX=(x*cos(-angle))-(y*sin(-angle));layer._eventY=(y*cos(-angle))+(x*sin(-angle))}else{layer._eventX=x;layer._eventY=y} 170layer._eventX/=transforms.scaleX;layer._eventY/=transforms.scaleY;if(intersects){data.intersecting.push(layer)} 171layer.intersects=Boolean(intersects)}} 172$.event.fix=function(event){var offset,originalEvent,touches;event=jQueryEventFix.call($.event,event);originalEvent=event.originalEvent;if(originalEvent){touches=originalEvent.changedTouches;if(event.pageX!==undefined&&event.offsetX===undefined){try{offset=$(event.currentTarget).offset();if(offset){event.offsetX=event.pageX-offset.left;event.offsetY=event.pageY-offset.top}}catch(error){}}else if(touches){try{offset=$(event.currentTarget).offset();if(offset){event.offsetX=touches[0].pageX-offset.left;event.offsetY=touches[0].pageY-offset.top}}catch(error){}}} 173return event};maps.drawings={'arc':'drawArc','bezier':'drawBezier','ellipse':'drawEllipse','function':'draw','image':'drawImage','line':'drawLine','path':'drawPath','polygon':'drawPolygon','slice':'drawSlice','quadratic':'drawQuadratic','rectangle':'drawRect','text':'drawText','vector':'drawVector','save':'saveC
173anvas','restore':'restoreCanvas','rotate':'rotateCanvas','scale':'scaleCanvas','translate':'translateCanvas'};$.fn.draw=function draw(args){var $canvases=this,e,ctx,params=new jCanvasObject(args);if(maps.drawings[params.type]&¶ms.type!=='function'){$canvases[maps.drawings[params.type]](args)}else{for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,draw);if(params.visible){if(params.fn){params.fn.call($canvases[e],ctx,params)}}}}} 174return $canvases};$.fn.clearCanvas=function clearCanvas(args){var $canvases=this,e,ctx,params=new jCanvasObject(args);for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){if(params.width===null||params.height===null){ctx.save();ctx.setTransform(1,0,0,1,0,0);ctx.clearRect(0,0,$canvases[e].width,$canvases[e].height);ctx.restore()}else{_addLayer($canvases[e],params,args,clearCanvas);_transformShape($canvases[e],ctx,params,params.width,params.height);ctx.clearRect(params.x-(params.width/2),params.y-(params.height/2),params.width,params.height);_restoreTransform(ctx,params)}}} 175return $canvases};$.fn.saveCanvas=function saveCanvas(args){var $canvases=this,e,ctx,params,data,i;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);_addLayer($canvases[e],params,args,saveCanvas);for(i=0;i<params.count;i+=1){_saveCanvas(ctx,data)}}} 176return $canvases};$.fn.restoreCanvas=function restoreCanvas(args){var $canvases=this,e,ctx,params,data,i;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);_addLayer($canvases[e],params,args,restoreCanvas);for(i=0;i<params.count;i+=1){_restoreCanvas(ctx,data)}}} 177return $canvases};function _rotateCanvas(ctx,params,transforms){params._toRad=(params.inDegrees?(PI/180):1);ctx.translate(params.x,params.y);ctx.rotate(params.rotate*params._toRad);ctx.translate(-params.x,-params.y);if(transforms){transforms.rotate+=(params.rotate*params._toRad)}} 178function _scaleCanvas(ctx,params,transforms){if(params.scale!==1){params.scaleX=params.scaleY=params.scale} 179ctx.translate(params.x,params.y);ctx.scale(params.scaleX,params.scaleY);ctx.translate(-params.x,-params.y);if(transforms){transforms.scaleX*=params.scaleX;transforms.scaleY*=params.scaleY}} 180function _translateCanvas(ctx,params,transforms){if(params.translate){params.translateX=params.translateY=params.translate} 181ctx.translate(params.translateX,params.translateY);if(transforms){transforms.translateX+=params.translateX;transforms.translateY+=params.translateY}} 182$.fn.rotateCanvas=function rotateCanvas(args){var $canvases=this,e,ctx,params,data;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);_addLayer($canvases[e],params,args,rotateCanvas);if(params.autosave){_saveCanvas(ctx,data)} 183_rotateCanvas(ctx,params,data.transforms)}} 184return $canvases};$.fn.scaleCanvas=function scaleCanvas(args){var $canvases=this,e,ctx,params,data;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);_addLayer($canvases[e],params,args,scaleCanvas);if(params.autosave){_saveCanvas(ctx,data)} 185_scaleCanvas(ctx,params,data.transforms)}} 186return $canvases};$.fn.translateCanvas=function translateCanvas(args){var $canvases=this,e,ctx,params,data;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);_addLayer($canvases[e],params,args,translateCanvas);if(params.autosave){_saveCanvas(ctx,data)} 187_translateCanvas(ctx,params,data.transforms)}} 188return $canvases};$.fn.drawRect=function drawRect(args){var $canvases=this,e,ctx,params,x1,y1,x2,y2,r,temp;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawRect);if(params.visible){_transformShape($canvases[e],ctx,params,params.width,params.height);
188_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();if(params.width&¶ms.height){x1=params.x-(params.width/2);y1=params.y-(params.height/2);r=abs(params.cornerRadius);if(r){x2=params.x+(params.width/2);y2=params.y+(params.height/2);if(params.width<0){temp=x1;x1=x2;x2=temp} 189if(params.height<0){temp=y1;y1=y2;y2=temp} 190if((x2-x1)-(2*r)<0){r=(x2-x1)/2} 191if((y2-y1)-(2*r)<0){r=(y2-y1)/2} 192ctx.moveTo(x1+r,y1);ctx.lineTo(x2-r,y1);ctx.arc(x2-r,y1+r,r,3*PI/2,PI*2,!1);ctx.lineTo(x2,y2-r);ctx.arc(x2-r,y2-r,r,0,PI/2,!1);ctx.lineTo(x1+r,y2);ctx.arc(x1+r,y2-r,r,PI/2,PI,!1);ctx.lineTo(x1,y1+r);ctx.arc(x1+r,y1+r,r,PI,3*PI/2,!1);params.closed=!0}else{ctx.rect(x1,y1,params.width,params.height)}} 193_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 194return $canvases};function _getCoterminal(angle){while(angle<0){angle+=(2*PI)} 195return angle} 196function _getArcX(params,angle){return params.x+(params.radius*cos(angle))} 197function _getArcY(params,angle){return params.y+(params.radius*sin(angle))} 198function _drawArc(canvas,ctx,params,path){var x1,y1,x2,y2,x3,y3,x4,y4,offsetX,offsetY,diff;if(params===path){offsetX=0;offsetY=0}else{offsetX=params.x;offsetY=params.y} 199if(!path.inDegrees&&path.end===360){path.end=PI*2} 200path.start*=params._toRad;path.end*=params._toRad;path.start-=(PI/2);path.end-=(PI/2);diff=PI/180;if(path.ccw){diff*=-1} 201x1=_getArcX(path,path.start+diff);y1=_getArcY(path,path.start+diff);x2=_getArcX(path,path.start);y2=_getArcY(path,path.start);_addStartArrow(canvas,ctx,params,path,x1,y1,x2,y2);ctx.arc(path.x+offsetX,path.y+offsetY,path.radius,path.start,path.end,path.ccw);x3=_getArcX(path,path.end+diff);y3=_getArcY(path,path.end+diff);x4=_getArcX(path,path.end);y4=_getArcY(path,path.end);_addEndArrow(canvas,ctx,params,path,x4,y4,x3,y3)} 202$.fn.drawArc=function drawArc(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawArc);if(params.visible){_transformShape($canvases[e],ctx,params,params.radius*2);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();
202_drawArc($canvases[e],ctx,params,params);_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 203return $canvases};$.fn.drawEllipse=function drawEllipse(args){var $canvases=this,e,ctx,params,controlW,controlH;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawEllipse);if(params.visible){_transformShape($canvases[e],ctx,params,params.width,params.height);_setGlobalProps($canvases[e],ctx,params);controlW=params.width*(4/3);controlH=params.height;ctx.beginPath();ctx.moveTo(params.x,params.y-(controlH/2));ctx.bezierCurveTo(params.x-(controlW/2),params.y-(controlH/2),params.x-(controlW/2),params.y+(controlH/2),params.x,params.y+(controlH/2));ctx.bezierCurveTo(params.x+(controlW/2),params.y+(controlH/2),params.x+(controlW/2),params.y-(controlH/2),params.x,params.y-(controlH/2));_detectEvents($canvases[e],ctx,params);params.closed=!0;_closePath($canvases[e],ctx,params)}}} 204return $canvases};$.fn.drawPolygon=function drawPolygon(args){var $canvases=this,e,ctx,params,theta,dtheta,hdtheta,apothem,x,y,i;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawPolygon);if(params.visible){_transformShape($canvases[e],ctx,params,params.radius*2);_setGlobalProps($canvases[e],ctx,params);dtheta=(2*PI)/params.sides;hdtheta=dtheta/2;theta=hdtheta+(PI/2);apothem=params.radius*cos(hdtheta);ctx.beginPath();for(i=0;i<params.sides;i+=1){x=params.x+(params.radius*cos(theta));y=params.y+(params.radius*sin(theta));ctx.lineTo(x,y);if(params.concavity){x=params.x+((apothem+(-apothem*params.concavity))*cos(theta+hdtheta));y=params.y+((apothem+(-apothem*params.concavity))*sin(theta+hdtheta));ctx.lineTo(x,y)} 205theta+=dtheta}
206_detectEvents($canvases[e],ctx,params);params.closed=!0;_closePath($canvases[e],ctx,params)}}} 207return $canvases};$.fn.drawSlice=function drawSlice(args){var $canvases=this,e,ctx,params,angle,dx,dy;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawSlice);if(params.visible){_transformShape($canvases[e],ctx,params,params.radius*2);_setGlobalProps($canvases[e],ctx,params);params.start*=params._toRad;params.end*=params._toRad;params.start-=(PI/2);params.end-=(PI/2);params.start=_getCoterminal(params.start);params.end=_getCoterminal(params.end);if(params.end<params.start){params.end+=(2*PI)} 208angle=((params.start+params.end)/2);dx=(params.radius*params.spread*cos(angle));dy=(params.radius*params.spread*sin(angle));params.x+=dx;params.y+=dy;ctx.beginPath();ctx.arc(params.x,params.y,params.radius,params.start,params.end,params.ccw);ctx.lineTo(params.x,params.y);_detectEvents($canvases[e],ctx,params);params.closed=!0;_closePath($canvases[e],ctx,params)}}} 209return $canvases};function _addArrow(canvas,ctx,params,path,x1,y1,x2,y2){var leftX,leftY,rightX,rightY,offsetX,offsetY,angle;if(path.arrowRadius&&!params.closed){angle=atan2((y2-y1),(x2-x1));angle-=PI;offsetX=(params.strokeWidth*cos(angle));offsetY=(params.strokeWidth*sin(angle));leftX=x2+(path.arrowRadius*cos(angle+(path.arrowAngle/2)));leftY=y2+(path.arrowRadius*sin(angle+(path.arrowAngle/2)));rightX=x2+(path.arrowRadius*cos(angle-(path.arrowAngle/2)));rightY=y2+(path.arrowRadius*sin(angle-(path.arrowAngle/2)));ctx.moveTo(leftX-offsetX,leftY-offsetY);ctx.lineTo(x2-offsetX,y2-offsetY);ctx.lineTo(rightX-offsetX,rightY-offsetY);ctx.moveTo(x2-offsetX,y2-offsetY);ctx.lineTo(x2+offsetX,y2+offsetY);ctx.moveTo(x2,y2)}} 210function _addStartArrow(canvas,ctx,params,path,x1,y1,x2,y2){if(!path._arrowAngleConverted){path.arrowAngle*=params._toRad;path._arrowAngleConverted=!0} 211if(path.startArrow){_addArrow(canvas,ctx,params,path,x1,y1,x2,y2)}} 212function _addEndArrow(canvas,ctx,params,path,x1,y1,x2,y2){if(!path._arrowAngleConverted){path.arrowAngle*=params._toRad;path._arrowAngleConverted=!0} 213if(path.endArrow){_addArrow(canvas,ctx,params,path,x1,y1,x2,y2)}} 214function _drawLine(canvas,ctx,params,path){var l,lx,ly;l=2;_addStartArrow(canvas,ctx,params,path,path.x2+params.x,path.y2+params.y,path.x1+params.x,path.y1+params.y);
214if(path.x1!==undefined&&path.y1!==undefined){ctx.moveTo(path.x1+params.x,path.y1+params.y)} 215while(!0){lx=path['x'+l];ly=path['y'+l];if(lx!==undefined&&ly!==undefined){ctx.lineTo(lx+params.x,ly+params.y);l+=1}else{break}} 216l-=1;_addEndArrow(canvas,ctx,params,path,path['x'+(l-1)]+params.x,path['y'+(l-1)]+params.y,path['x'+l]+params.x,path['y'+l]+params.y)} 217$.fn.drawLine=function drawLine(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawLine);if(params.visible){_transformShape($canvases[e],ctx,params);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();_drawLine($canvases[e],ctx,params,params);_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 218return $canvases};function _drawQuadratic(canvas,ctx,params,path){var l,lx,ly,lcx,lcy;l=2;_addStartArrow(canvas,ctx,params,path,path.cx1+params.x,path.cy1+params.y,path.x1+params.x,path.y1+params.y);if(path.x1!==undefined&&path.y1!==undefined){ctx.moveTo(p
218ath.x1+params.x,path.y1+params.y)} 219while(!0){lx=path['x'+l];ly=path['y'+l];lcx=path['cx'+(l-1)];lcy=path['cy'+(l-1)];if(lx!==undefined&&ly!==undefined&&lcx!==undefined&&lcy!==undefined){ctx.quadraticCurveTo(lcx+params.x,lcy+params.y,lx+params.x,ly+params.y);l+=1}else{break}} 220l-=1;_addEndArrow(canvas,ctx,params,path,path['cx'+(l-1)]+params.x,path['cy'+(l-1)]+params.y,path['x'+l]+params.x,path['y'+l]+params.y)} 221$.fn.drawQuadratic=function drawQuadratic(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawQuadratic);if(params.visible){_transformShape($canvases[e],ctx,params);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();_drawQuadratic($canvases[e],ctx,params,params);_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 222return $canvases};function _drawBezier(canvas,ctx,params,path){var l,lc,lx,ly,lcx1,lcy1,lcx2,lcy2;l=2;lc=1;_addStartArrow(canvas,ctx,params,path,path.cx1+params.x,path.cy1+params.y,path.x1+params.x,path.y1+params.y);
222if(path.x1!==undefined&&path.y1!==undefined){ctx.moveTo(path.x1+params.x,path.y1+params.y)} 223while(!0){lx=path['x'+l];ly=path['y'+l];lcx1=path['cx'+lc];lcy1=path['cy'+lc];lcx2=path['cx'+(lc+1)];lcy2=path['cy'+(lc+1)];if(lx!==undefined&&ly!==undefined&&lcx1!==undefined&&lcy1!==undefined&&lcx2!==undefined&&lcy2!==undefined){ctx.bezierCurveTo(lcx1+params.x,lcy1+params.y,lcx2+params.x,lcy2+params.y,lx+params.x,ly+params.y);l+=1;lc+=2}else{break}} 224l-=1;lc-=2;_addEndArrow(canvas,ctx,params,path,path['cx'+(lc+1)]+params.x,path['cy'+(lc+1)]+params.y,path['x'+l]+params.x,path['y'+l]+params.y)} 225$.fn.drawBezier=function drawBezier(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawBezier);if(params.visible){_transformShape($canvases[e],ctx,params);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();_drawBezier($canvases[e],ctx,params,params);_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 226return $canvases};function _getVectorX(params,angle,length){angle*=params._toRad;angle-=(PI/2);return(length*cos(angle))} 227function _getVectorY(params,angle,length){angle*=params._toRad;angle-=(PI/2);return(length*sin(angle))} 228function _drawVector(canvas,ctx,params,path){var l,angle,length,offsetX,offsetY,x,y,x3,y3,x4,y4;if(params===path){offsetX=0;offsetY=0}else{offsetX=params.x;offsetY=params.y} 229l=1;x=x3=x4=path.x+offsetX;y=y3=y4=path.y+offsetY;_addStartArrow(canvas,ctx,params,path,x+_getVectorX(params,path.a1,path.l1),y+_getVectorY(params,path.a1,path.l1),x,y);if(path.x!==undefined&&path.y!==undefined){ctx.moveTo(x,y)} 230while(!0){angle=path['a'+l];length=path['l'+l];if(angle!==undefined&&length!==undefined){x3=x4;y3=y4;x4+=_getVectorX(params,angle,length);y4+=_getVectorY(params,angle,length);ctx.lineTo(x4,y4);l+=1}else{break}} 231_addEndArrow(canvas,ctx,params,path,x3,y3,x4,y4)} 232$.fn.drawVector=function drawVector(args){var $canvases=this,e,ctx,params;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawVector);if(params.visible){_transformShape($canvases[e],ctx,params);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();_drawVector($canvases[e],ctx,params,params);
232_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 233return $canvases};$.fn.drawPath=function drawPath(args){var $canvases=this,e,ctx,params,l,lp;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawPath);if(params.visible){_transformShape($canvases[e],ctx,params);_setGlobalProps($canvases[e],ctx,params);ctx.beginPath();l=1;while(!0){lp=params['p'+l];if(lp!==undefined){lp=new jCanvasObject(lp);if(lp.type==='line'){_drawLine($canvases[e],ctx,params,lp)}else if(lp.type==='quadratic'){_drawQuadratic($canvases[e],ctx,params,lp)}else if(lp.type==='bezier'){_drawBezier($canvases[e],ctx,params,lp)}else if(lp.type==='vector'){_drawVector($canvases[e],ctx,params,lp)}else if(lp.type==='arc'){_drawArc($canvases[e],ctx,params,lp)} 234l+=1}else{break}} 235_detectEvents($canvases[e],ctx,params);_closePath($canvases[e],ctx,params)}}} 236return $canvases};function _setCanvasFont(canvas,ctx,params){if(!isNaN(Number(params.fontSize))){params.fontSize+='px'} 237ctx.font=params.fontStyle+' '+params.fontSize+' '+params.fontFamily} 238function _measureText(canvas,ctx,params,lines){var originalSize,curWidth,l,propCache=caches.propCache;if(propCache.text===params.text&&propCache.fontStyle===params.fontStyle&&propCache.fontSize===params.fontSize&&propCache.fontFamily===params.fontFamily&&propCache.maxWidth===params.maxWidth&&propCache.lineHeight===params.lineHeight){params.width=propCache.width;params.height=propCache.height}else{params.width=ctx.measureText(lines[0]).width;for(l=1;l<lines.length;l+=1){curWidth=ctx.measureText(lines[l]).width;if(curWidth>params.width){params.width=curWidth}} 239originalSize=canvas.style.fontSize;canvas.style.fontSize=params.fontSize;params.height=parseFloat($.css(canvas,'fontSize'))*lines.length*params.lineHeight;canvas.style.fontSize=originalSize}} 240function _wrapText(ctx,params){var allText=String(params.text),maxWidth=params.maxWidth,manualLines=allText.split('\n'),allLines=[],lines,line,l,text,words,w;for(l=0;l<manualLines.length;l+=1){text=manualLines[l];words=text.split(' ');lines=[];line='';if(words.length===1||ctx.measureText(text).width<maxWidth){lines=[text]}else{for(w=0;w<words.length;w+=1){if(ctx.measureText(line+words[w]).width>maxWidth){if(line!==''){lines.push(line)} 241line=''} 242line+=words[w];if(w!==(words.length-1)){line+=' '}} 243lines.push(line)} 244allLines=allLines.concat(lines.join('\n').replace(/((\n))|($)/gi,'$2').split('\n'))} 245return allLines} 246$.fn.drawText=function drawText(args){var $canvases=this,e,ctx,params,layer,lines,line,l,fontSize,constantCloseness=500,nchars,chars,ch,c,x,y;for(e=0;e<$canvases.length;e+=1){ctx=_getContext($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer($canvases[e],params,args,drawText);if(params.visible){ctx.textBaseline=params.baseline;ctx.textAlign=params.align;_setCanvasFont($canvases[e],ctx,params);if(params.maxWidth!==null){lines=_wrapText(ctx,params)}else{lines=params.text.toString().split('\n')} 247_measureText($canvases[e],ctx,params,lines);if(layer){layer.width=params.width;layer.height=params.height} 248_transformShape($canvases[e],ctx,params,params.width,params.height);_setGlobalProps($canvases[e],ctx,params);x=params.x;if(params.align==='left'){if(params.respectAlign){params.x+=params.width/2}else{x-=params.width/2}}else if(params.align==='right'){if(params.respectAlign){params.x-=params.width/2}else{x+=params.width/2}} 249if(params.radius){fontSize=parseFloat(params.fontSize);if(params.letterSpacing===null){params.letterSpacing=fontSize/constantCloseness} 250for(l=0;l<lines.length;l+=1){ctx.save();ctx.translate(params.x,params.y);line=lines[l];if(params.flipArcText){chars=line.split('');chars.reverse();line=chars.join('')} 251nchars=line.length;ctx.rotate(-(PI*params.letterSpacing*(nchars-1))/2);for(c=0;c<nchars;c+=1){ch=line[c];if(c!==0){ctx.rotate(PI*params.letterSpacing)} 252ctx.save();ctx.translate(0,-params.radius);if(params.flipArcText){ctx.scale(-1,-1)} 253ctx.fillText(ch,0,0);if(params.fillStyle!=='transparent'){ctx.shadowColor='transparent'} 254if(params.strokeWidth!==0){ctx.strokeText(ch,0,0)}
255ctx.restore()} 256params.radius-=fontSize;params.letterSpacing+=fontSize/(constantCloseness*2*PI);ctx.restore()}}else{for(l=0;l<lines.length;l+=1){line=lines[l];y=params.y+(l*params.height/lines.length)-(((lines.length-1)*params.height/lines.length)/2);ctx.shadowColor=params.shadowColor;ctx.fillText(line,x,y);if(params.fillStyle!=='transparent'){ctx.shadowColor='transparent'} 257if(params.strokeWidth!==0){ctx.strokeText(line,x,y)}}} 258y=0;if(params.baseline==='top'){y+=params.height/2}else if(params.baseline==='bottom'){y-=params.height/2} 259if(params._event){ctx.beginPath();ctx.rect(params.x-(params.width/2),params.y-(params.height/2)+y,params.width,params.height);_detectEvents($canvases[e],ctx,params);ctx.closePath()} 260_restoreTransform(ctx,params)}}} 261caches.propCache=params;return $canvases};$.fn.measureText=function measureText(args){var $canvases=this,ctx,params,lines;params=$canvases.getLayer(args);if(!params||(params&&!params._layer)){params=new jCanvasObject(args)} 262ctx=_getContext($canvases[0]);if(ctx){_setCanvasFont($canvases[0],ctx,params);if(params.maxWidth!==null){lines=_wrapText(ctx,params)}else{lines=params.text.split('\n')} 263_measureText($canvases[0],ctx,params,lines)} 264return params};$.fn.drawImage=function drawImage(args){var $canvases=this,canvas,e,ctx,data,params,layer,img,imgCtx,source,imageCache=caches.imageCache;function draw(canvas,ctx,data,params,layer){if(params.width===null&¶ms.sWidth===null){params.width=params.sWidth=img.width} 265if(params.height===null&¶ms.sHeight===null){params.height=params.sHeight=img.height} 266if(layer){layer.width=params.width;layer.height=params.height} 267if(params.sWidth!==null&¶ms.sHeight!==null&¶ms.sx!==null&¶ms.sy!==null){if(params.width===null){params.width=params.sWidth} 268if(params.height===null){params.height=params.sHeight} 269if(params.cropFromCenter){params.sx+=params.sWidth/2;params.sy+=params.sHeight/2} 270if((params.sy-(params.sHeight/2))<0){params.sy=(params.sHeight/2)} 271if((params.sy+(params.sHeight/2))>img.height){params.sy=img.height-(params.sHeight/2)} 272if((params.sx-(params.sWidth/2))<0){params.sx=(params.sWidth/2)} 273if((params.sx+(params.sWidth/2))>img.width){params.sx=img.width-(params.sWidth/2)} 274_transformShape(canvas,ctx,params,params.width,params.height);_setGlobalProps(canvas,ctx,params);ctx.drawImage(img,params.sx-(params.sWidth/2),params.sy-(params.sHeight/2),params.sWidth,params.sHeight,params.x-(params.width/2),params.y-(params.height/2),params.width,params.height)}else{_transformShape(canvas,ctx,params,params.width,params.height);_setGlobalProps(canvas,ctx,params);ctx.drawImage(img,params.x-(params.width/2),params.y-(params.height/2),params.width,params.height)} 275ctx.beginPath();ctx.rect(params.x-(params.width/2),params.y-(params.height/2),params.width,params.height);_detectEvents(canvas,ctx,params);ctx.closePath();_restoreTransform(ctx,params);_enableMasking(ctx,data,params)} 276function onload(canvas,ctx,data,params,layer){return function(){var $canvas=$(canvas);draw(canvas,ctx,data,params,layer);if(params.layer){_triggerLayerEvent($canvas,data,layer,'load')}else if(params.load){params.load.call($canvas[0],layer)} 277if(params.layer){layer._masks=data.transforms.masks.slice(0);if(params._next){var complete=data.drawLayersComplete;delete data.drawLayersComplete;$canvas.drawLayers({clear:!1,resetFire:!0,index:params._next,complete:complete})}}}} 278for(e=0;e<$canvases.length;e+=1){canvas=$canvases[e];ctx=_getContext($canvases[e]);if(ctx){data=_getCanvasData($canvases[e]);params=new jCanvasObject(args);layer=_addLayer($canvases[e],params,args,drawImage);if(params.visible){source=params.source;imgCtx=source.getContext;if(source.src||imgCtx){img=source}else if(source){if(imageCache[source]&&imageCache[source].complete){img=imageCache[source]}else{img=new Image();if(!source.match(/^data:/i)){img.crossOrigin=params.crossOrigin} 279img.src=source;imageCache[source]=img}} 280if(img){if(img.complete||imgCtx){onload(canvas,ctx,data,params,layer)()}else{img.onload=onload(canvas,ctx,data,params,layer);img.src=img.src}}}}} 281return $canvases};$.fn.createPattern=function createPattern(args){var $canvases=this,ctx,params,img,imgCtx,pattern,source;function onload(){pattern=ctx.createPattern(img,params.repeat);
281if(params.load){params.load.call($canvases[0],pattern)}} 282ctx=_getContext($canvases[0]);if(ctx){params=new jCanvasObject(args);source=params.source;if(isFunction(source)){img=$('<canvas />')[0];img.width=params.width;img.height=params.height;imgCtx=_getContext(img);source.call(img,imgCtx);onload()}else{imgCtx=source.getContext;if(source.src||imgCtx){img=source}else{img=new Image();if(!source.match(/^data:/i)){img.crossOrigin=params.crossOrigin} 283img.src=source} 284if(img.complete||imgCtx){onload()}else{img.onload=onload;img.src=img.src}}}else{pattern=null} 285return pattern};$.fn.createGradient=function createGradient(args){var $canvases=this,ctx,params,gradient,stops=[],nstops,start,end,i,a,n,p;params=new jCanvasObject(args);ctx=_getContext($canvases[0]);if(ctx){params.x1=params.x1||0;params.y1=params.y1||0;params.x2=params.x2||0;params.y2=params.y2||0;if(params.r1!==null&¶ms.r2!==null){gradient=ctx.createRadialGradient(params.x1,params.y1,params.r1,params.x2,params.y2,params.r2)}else{gradient=ctx.createLinearGradient(params.x1,params.y1,params.x2,params.y2)} 286for(i=1;params['c'+i]!==undefined;i+=1){if(params['s'+i]!==undefined){stops.push(params['s'+i])}else{stops.push(null)}} 287nstops=stops.length;if(stops[0]===null){stops[0]=0} 288if(stops[nstops-1]===null){stops[nstops-1]=1} 289for(i=0;i<nstops;i+=1){if(stops[i]!==null){n=1;p=0;start=stops[i];for(a=(i+1);a<nstops;a+=1){if(stops[a]!==null){end=stops[a];break}else{n+=1}} 290if(start>end){stops[a]=stops[i]}}else if(stops[i]===null){p+=1;stops[i]=start+(p*((end-start)/n))} 291gradient.addColorStop(stops[i],params['c'+(i+1)])}}else{gradient=null} 292return gradient};$.fn.setPixels=function setPixels(args){var $canvases=this,canvas,e,ctx,canvasData,params,px,imgData,pixelData,i,len;for(e=0;e<$canvases.length;e+=1){canvas=$canvases[e];ctx=_getContext(canvas);canvasData=_getCanvasData($canvases[e]);if(ctx){params=new jCanvasObject(args);_addLayer(canvas,params,args,setPixels);_transformShape($canvases[e],ctx,params,params.width,params.height);if(params.width===null||params.height===null){params.width=canvas.width;params.height=canvas.height;params.x=params.width/2;params.y=params.height/2} 293if(params.width!==0&¶ms.height!==0){imgData=ctx.getImageData((params.x-(params.width/2))*canvasData.pixelRatio,(params.y-(params.height/2))*canvasData.pixelRatio,params.width*canvasData.pixelRatio,params.height*canvasData.pixelRatio);pixelData=imgData.data;len=pixelData.length;if(params.each){for(i=0;i<len;i+=4){px={r:pixelData[i],g:pixelData[i+1],b:pixelData[i+2],a:pixelData[i+3]};params.each.call(canvas,px,params);pixelData[i]=px.r;pixelData[i+1]=px.g;pixelData[i+2]=px.b;pixelData[i+3]=px.a}} 294ctx.putImageData(imgData,(params.x-(params.width/2))*canvasData.pixelRatio,(params.y-(params.height/2))*canvasData.pixelRatio);ctx.restore()}}} 295return $canvases};$.fn.getCanvasImage=function getCanvasImage(type,quality){var $canvases=this,canvas,dataURL=null;if($canvases.length!==0){canvas=$canvases[0];if(canvas.toDataURL){if(quality===undefined){quality=1} 296dataURL=canvas.toDataURL('image/'+type,quality)}} 297return dataURL};$.fn.detectPixelRatio=function detectPixelRatio(callback){var $canvases=this,canvas,e,ctx,devicePixelRatio,backingStoreRatio,ratio,oldWidth,oldHeight,data;for(e=0;e<$canvases.length;e+=1){canvas=$canvases[e];ctx=_getContext(canvas);data=_getCanvasData($canvases[e]);if(!data.scaled){devicePixelRatio=window.devicePixelRatio||1;backingStoreRatio=ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1;ratio=devicePixelRatio/backingStoreRatio;if(ratio!==1){oldWidth=canvas.width;oldHeight=canvas.height;canvas.width=oldWidth*ratio;canvas.height=oldHeight*ratio;canvas.style.width=oldWidth+'px';canvas.style.height=oldHeight+'px';ctx.scale(ratio,ratio)} 298data.pixelRatio=ratio;data.scaled=!0;if(callback){callback.call(canvas,ratio)}}} 299return $canvases};jCanvas.clearCache=function clearCache(){var cacheName;for(cacheName in caches){if(Object.prototype.hasOwnProperty.call(caches,cacheName)){caches[cacheName]={}}}};$.support.canvas=($('<canvas />')[0].getContext!==undefined);extendObject(jCanvas,{defaults:defaults,setGlobalProps:_setGlobalProps,transformShape:_transformShape,detectEvents:_detectEvents,closePath:_closePath,setCanvasFont:_setCanvasFont,measureText:_measureText});$.jCanvas=jCanvas;$.jCanvasObject=jCanvasObject}))
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.