var __extends=this&&this.__extends||function(){var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)};return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}}();import CanvasLayerRenderer from"./Layer.js";import TileRange from"../../TileRange.js";import TileState from"../../TileState.js";import{apply as applyTransform,compose as composeTransform,makeInverse}from"../../transform.js";import{assign}from"../../obj.js";import{createEmpty,equals,getIntersection,getTopLeft}from"../../extent.js";import{fromUserExtent}from"../../proj.js";import{getUid}from"../../util.js";import{numberSafeCompareFunction}from"../../array.js";import{toString as toTransformString}from"../../transform.js";var CanvasTileLayerRenderer=function(i){function e(e){e=i.call(this,e)||this;return e.extentChanged=!0,e.renderedExtent_=null,e.renderedPixelRatio,e.renderedProjection=null,e.renderedRevision,e.renderedTiles=[],e.newTiles_=!1,e.tmpExtent=createEmpty(),e.tmpTileRange_=new TileRange(0,0,0,0),e}return __extends(e,i),e.prototype.isDrawableTile=function(e){var t=this.getLayer(),e=e.getState(),t=t.getUseInterimTilesOnError();return e==TileState.LOADED||e==TileState.EMPTY||e==TileState.ERROR&&!t},e.prototype.getTile=function(e,t,r,i){var n=i.pixelRatio,i=i.viewState.projection,o=this.getLayer(),e=o.getSource().getTile(e,t,r,n,i);return e.getState()==TileState.ERROR&&(o.getUseInterimTilesOnError()?0<o.getPreload()&&(this.newTiles_=!0):e.setState(TileState.LOADED)),e=this.isDrawableTile(e)?e:e.getInterimTile()},e.prototype.loadedTileCallback=function(e,t,r){return!!this.isDrawableTile(r)&&i.prototype.loadedTileCallback.call(this,e,t,r)},e.prototype.prepareFrame=function(e){return!!this.getLayer().getSource()},e.prototype.renderFrame=function(e,F){var t=e.layerStatesArray[e.layerIndex],r=e.viewState,i=r.projection,M=r.resolution,n=r.center,r=r.rotation,o=e.pixelRatio,z=this.getLayer(),a=z.getSource(),k=a.getRevision(),s=a.getTileGridForProjection(i),l=s.getZForResolution(M,a.zDirection),d=s.getResolution(l),p=e.extent,q=t.extent&&fromUserExtent(t.extent,i),h=(q&&(p=getIntersection(p,fromUserExtent(t.extent,i))),a.getTilePixelRatio(o)),g=Math.round(e.size[0]*h),T=Math.round(e.size[1]*h),u=(r&&(T=g=Math.round(Math.sqrt(g*g+T*T))),d*g/2/h),Y=d*T/2/h,c=[n[0]-u,n[1]-Y,n[0]+u,n[1]+Y],m=s.getTileRangeForExtentAndZ(p,l),f={},Z=(f[l]={},this.createLoadedTileFinder(a,i,f)),K=this.tmpExtent,X=this.tmpTileRange_;this.newTiles_=!1;for(var y=m.minX;y<=m.maxX;++y)for(var x=m.minY;x<=m.maxY;++x){var v=this.getTile(l,y,x,e);if(this.isDrawableTile(v)){var R=getUid(this);if(v.getState()==TileState.LOADED&&(L=(f[l][v.tileCoord.toString()]=v).inTransition(R),this.newTiles_||!L&&-1!==this.renderedTiles.indexOf(v)||(this.newTiles_=!0)),1===v.getAlpha(R,e.time))continue}var R=s.getTileCoordChildTileRange(v.tileCoord,X,K),G=!1;(G=R?Z(l+1,R):G)||s.forEachTileCoordParentTileRange(v.tileCoord,Z,X,K)}var C,Q,S=d/M,u=(composeTransform(this.pixelTransform,e.size[0]/2,e.size[1]/2,1/h,1/h,r,-g/2,-T/2),toTransformString(this.pixelTransform)),E=(this.useContainer(F,u,t.opacity),this.context),n=E.canvas,w=(makeInverse(this.inversePixelTransform,this.pixelTransform),composeTransform(this.tempTransform,g/2,T/2,S,S,0,-g/2,-T/2),n.width!=g||n.height!=T?(n.width=g,n.height=T):this.containerReused||E.clearRect(0,0,g,T),q&&this.clipUnrotated(E,e,q),assign(E,a.getContextOptions()),this.preRender(E,e),this.renderedTiles.length=0,Object.keys(f).map(Number));w.sort(numberSafeCompareFunction),1!==t.opacity||this.containerReused&&!a.getOpaque(e.viewState.projection)?(C=[],Q=[]):w=w.reverse();for(var N=w.length-1;0<=N;--N){var B,_=w[N],j=a.getTilePixelSize(_,o,i),H=s.getResolution(_)/d,J=j[0]*H*S,V=j[1]*H*S,W=s.getTileCoordForCoordAndZ(getTopLeft(c),_),j=s.getTileCoordExtent(W),b=applyTransform(this.tempTransform,[h*(j[0]-c[0])/d,h*(c[3]-j[3])/d]),$=h*a.getGutterForProjection(i),ee=f[_];for(B in ee){var L,P=(v=ee[B]).tileCoord,I=W[1]-P[1],O=Math.round(b[0]-(I-1)*J),P=W[2]-P[2],te=Math.round(b[1]-(P-1)*V),O=O-(y=Math.round(b[0]-I*J)),I=te-(x=Math.round(b[1]-P*V)),te=l===_;if(!(L=te&&1!==v.getAlpha(getUid(this),e.time)))if(C){E.save();for(var U,A=[y,x,y+O,x,y+O,x+I,y,x+I],D=0,re=C.length;D<re;++D)l!==_&&_<Q[D]&&(U=C[D],E.beginPath(),E.moveTo(A[0],A[1]),E.lineTo(A[2],A[3]),E.lineTo(A[4],A[5]),E.lineTo(A[6],A[7]),E.moveTo(U[6],U[7]),E.lineTo(U[4],U[5]),E.lineTo(U[2],U[3]),E.lineTo(U[0],U[1]),E.clip());C.push(A),Q.push(_)}else E.clearRect(y,x,O,I);this.drawTileImage(v,e,y,x,O,I,$,te,t.opacity),C&&!L?(E.restore(),this.renderedTiles.unshift(v)):this.renderedTiles.push(v),this.updateUsedTiles(e.usedTiles,a,v)}}return this.renderedRevision=k,this.renderedResolution=d,this.extentChanged=!this.renderedExtent_||!equals(this.renderedExtent_,c),this.renderedExtent_=c,this.renderedPixelRatio=o,this.renderedProjection=i,this.manageTilePyramid(e,a,s,o,i,p,l,z.getPreload()),this.scheduleExpireCache(e,a),this.postRender(E,e),t.extent&&E.restore(),u!==n.style.transform&&(n.style.transform=u),this.container},e.prototype.drawTileImage=function(e,t,r,i,n,o,a,s,l){var d,p,h,g=this.getTileImage(e);g&&(d=getUid(this),(h=(p=l*(l=s?e.getAlpha(d,t.time):1))!==this.context.globalAlpha)&&(this.context.save(),this.context.globalAlpha=p),this.context.drawImage(g,a,a,g.width-2*a,g.height-2*a,r,i,n,o),h&&this.context.restore(),1!==l?t.animate=!0:s&&e.endTransition(d))},e.prototype.getImage=function(){var e=this.context;return e?e.canvas:null},e.prototype.getTileImage=function(e){return e.getImage()},e.prototype.scheduleExpireCache=function(e,t){t.canExpireCache()&&(t=function(e,t,r){var i=getUid(e);i in r.usedTiles&&e.expireCache(r.viewState.projection,r.usedTiles[i])}.bind(null,t),e.postRenderFunctions.push(t))},e.prototype.updateUsedTiles=function(e,t,r){t=getUid(t);t in e||(e[t]={}),e[t][r.getKey()]=!0},e.prototype.manageTilePyramid=function(e,t,r,i,n,o,a,s,l){for(var d,p,h,g,T,u=getUid(t),c=(u in e.wantedTiles||(e.wantedTiles[u]={}),e.wantedTiles[u]),m=e.tileQueue,f=0,y=r.getMinZoom();y<=a;++y)for(p=r.getTileRangeForExtentAndZ(o,y,p),h=r.getResolution(y),g=p.minX;g<=p.maxX;++g)for(T=p.minY;T<=p.maxY;++T)a-y<=s?(++f,(d=t.getTile(y,g,T,i,n)).getState()==TileState.IDLE&&(c[d.getKey()]=!0,m.isKeyQueued(d.getKey())||m.enqueue([d,u,r.getTileCoordCenter(d.tileCoord),h])),void 0!==l&&l(d)):t.useTile(y,g,T,n);t.updateCacheSize(f,n)},e}(CanvasLayerRenderer);CanvasTileLayerRenderer.prototype.getLayer;export default CanvasTileLayerRenderer;