import{IMAGE_SMOOTHING_DISABLED}from"./source/common.js";import{assign}from"./obj.js";import{containsCoordinate,createEmpty,extend,forEachCorner,getCenter,getHeight,getTopLeft,getWidth}from"./extent.js";import{createCanvasContext2D}from"./dom.js";import{getPointResolution,transform}from"./proj.js";import{solveLinearSystem}from"./math.js";let brokenDiagonalRendering_;function drawTestTriangle(e,t,n,o,r){e.beginPath(),e.moveTo(0,0),e.lineTo(t,n),e.lineTo(o,r),e.closePath(),e.save(),e.clip(),e.fillRect(0,0,Math.max(t,o)+1,Math.max(n,r)),e.restore()}function verifyBrokenDiagonalRendering(e,t){return 2<Math.abs(e[4*t]-210)||2<Math.abs(e[4*t+3]-191.25)}function isBrokenDiagonalRendering(){if(void 0===brokenDiagonalRendering_){const t=document.createElement("canvas").getContext("2d");t.globalCompositeOperation="lighter",t.fillStyle="rgba(210, 0, 0, 0.75)",drawTestTriangle(t,4,5,4,0),drawTestTriangle(t,4,5,0,5);var e=t.getImageData(0,0,3,3).data;brokenDiagonalRendering_=verifyBrokenDiagonalRendering(e,0)||verifyBrokenDiagonalRendering(e,4)||verifyBrokenDiagonalRendering(e,8)}return brokenDiagonalRendering_}function calculateSourceResolution(e,t,n,o){var r=transform(n,t,e);let a=getPointResolution(t,o,n);var o=t.getMetersPerUnit(),n=(void 0!==o&&(a*=o),e.getMetersPerUnit()),t=(void 0!==n&&(a/=n),e.getExtent());return t&&!containsCoordinate(t,r)||(o=getPointResolution(e,a,r)/a,isFinite(o)&&0<o&&(a/=o)),a}function calculateSourceExtentResolution(t,n,e,o){var r=getCenter(e);let a=calculateSourceResolution(t,n,r,o);return(!isFinite(a)||a<=0)&&forEachCorner(e,function(e){return a=calculateSourceResolution(t,n,e,o),isFinite(a)&&0<a}),a}function render(e,t,v,T,n,p,o,r,a,l,i,R){const x=createCanvasContext2D(Math.round(v*e),Math.round(v*t));if(assign(x,R),0===a.length)return x.canvas;function D(e){return Math.round(e*v)/v}x.scale(v,v),x.globalCompositeOperation="lighter";const C=createEmpty();a.forEach(function(e,t,n){extend(C,e.extent)});e=getWidth(C),t=getHeight(C);const E=createCanvasContext2D(Math.round(v*e/T),Math.round(v*t/T)),s=(assign(E,R),v/T),b=(a.forEach(function(e,t,n){var o=e.extent[0]-C[0],r=-(e.extent[3]-C[3]),a=getWidth(e.extent),i=getHeight(e.extent);0<e.image.width&&0<e.image.height&&E.drawImage(e.image,l,l,e.image.width-2*l,e.image.height-2*l,o*s,r*s,a*s,i*s)}),getTopLeft(o));return r.getTriangles().forEach(function(e,t,n){var o=e.source,e=e.target,r=o[0][0],a=o[0][1],i=o[1][0],l=o[1][1],s=o[2][0],o=o[2][1],g=D((e[0][0]-b[0])/p),c=D(-(e[0][1]-b[1])/p),u=D((e[1][0]-b[0])/p),m=D(-(e[1][1]-b[1])/p),f=D((e[2][0]-b[0])/p),e=D(-(e[2][1]-b[1])/p),i=[[i-=r,l-=a,0,0,u-g],[s-=r,o-=a,0,0,f-g],[0,0,i,l,m-c],[0,0,s,o,e-c]],l=solveLinearSystem(i);if(l){if(x.save(),x.beginPath(),isBrokenDiagonalRendering()||R===IMAGE_SMOOTHING_DISABLED){x.moveTo(u,m);var d=g-u,h=c-m;for(let e=0;e<4;e++)x.lineTo(u+D((e+1)*d/4),m+D(e*h/3)),3!=e&&x.lineTo(u+D((e+1)*d/4),m+D((e+1)*h/3));x.lineTo(f,e)}else x.moveTo(u,m),x.lineTo(g,c),x.lineTo(f,e);x.clip(),x.transform(l[0],l[2],l[1],l[3],g,c),x.translate(C[0]-r,C[3]-a),x.scale(T/v,-T/v),x.drawImage(E.canvas,0,0),x.restore()}}),i&&(x.save(),x.globalCompositeOperation="source-over",x.strokeStyle="black",x.lineWidth=1,r.getTriangles().forEach(function(e,t,n){var e=e.target,o=(e[0][0]-b[0])/p,r=-(e[0][1]-b[1])/p,a=(e[1][0]-b[0])/p,i=-(e[1][1]-b[1])/p,l=(e[2][0]-b[0])/p,e=-(e[2][1]-b[1])/p;x.beginPath(),x.moveTo(a,i),x.lineTo(o,r),x.lineTo(l,e),x.closePath(),x.stroke()}),x.restore()),x.canvas}export{calculateSourceResolution,calculateSourceExtentResolution,render};