UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.98 kB
import{packFloatRGBA as t}from"../../../../core/floatRGBA.js";import{onAbort as e,createAbortError as s}from"../../../../core/promiseUtils.js";const i=1e20;class r{constructor(t){this._svg=null,this.size=t;const e=document.createElement("canvas");e.width=e.height=t,this._context=e.getContext("2d"),this._gridOuter=new Float64Array(t*t),this._gridInner=new Float64Array(t*t),this._f=new Float64Array(t),this._d=new Float64Array(t),this._z=new Float64Array(t+1),this._v=new Int16Array(t)}dispose(){this._context=this._gridOuter=this._gridInner=this._f=this._d=this._z=this._v=null,this._svg&&(document.body.removeChild(this._svg),this._svg=null)}draw(r,h,n=31){this._initSVG();const o=this.createSVGString(r);return new Promise(((r,a)=>{const d=new Image;d.src="data:image/svg+xml; charset=utf8, "+encodeURIComponent(o),d.onload=()=>{d.onload=null,this._context.clearRect(0,0,this.size,this.size),this._context.drawImage(d,0,0,this.size,this.size);const e=this._context.getImageData(0,0,this.size,this.size),s=new Uint8Array(this.size*this.size*4);for(let t=0;t<this.size*this.size;t++){const s=e.data[4*t+3]/255;this._gridOuter[t]=1===s?0:0===s?i:Math.max(0,.5-s)**2,this._gridInner[t]=1===s?i:0===s?0:Math.max(0,s-.5)**2}this._edt(this._gridOuter,this.size,this.size),this._edt(this._gridInner,this.size,this.size);for(let i=0;i<this.size*this.size;i++){const e=this._gridOuter[i]-this._gridInner[i];t(.5-e/(2*n),s,4*i)}r(s)};const l=h&&h.signal;l&&e(l,(()=>a(s())))}))}_initSVG(){if(!this._svg){const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("style","position: absolute;"),t.setAttribute("width","0"),t.setAttribute("height","0"),t.setAttribute("aria-hidden","true"),t.setAttribute("role","presentation"),document.body.appendChild(t),this._svg=t}return this._svg}createSVGString(t){const e=this._initSVG(),s=document.createElementNS("http://www.w3.org/2000/svg","path");s.setAttribute("d",t),e.appendChild(s);const i=s.getBBox(),r=i.width/i.height,h=this.size/2;let n,o,a,d;if(r>1){o=n=h/i.width;const t=h*(1/r);a=this.size/4,d=h-t/2}else{n=o=h/i.height;a=h-h*r/2,d=this.size/4}const l=-i.x*n+a,_=-i.y*o+d;s.setAttribute("style",`transform: matrix(${n}, 0, 0, ${o}, ${l}, ${_})`);const g=`<svg style="fill:red;" height="${this.size}" width="${this.size}" xmlns="http://www.w3.org/2000/svg">${e.innerHTML}</svg>`;return e.removeChild(s),g}_edt(t,e,s){const i=this._f,r=this._d,h=this._v,n=this._z;for(let o=0;o<e;o++){for(let r=0;r<s;r++)i[r]=t[r*e+o];this._edt1d(i,r,h,n,s);for(let i=0;i<s;i++)t[i*e+o]=r[i]}for(let o=0;o<s;o++){for(let s=0;s<e;s++)i[s]=t[o*e+s];this._edt1d(i,r,h,n,e);for(let s=0;s<e;s++)t[o*e+s]=Math.sqrt(r[s])}}_edt1d(t,e,s,r,h){s[0]=0,r[0]=-i,r[1]=+i;for(let n=1,o=0;n<h;n++){let e=(t[n]+n*n-(t[s[o]]+s[o]*s[o]))/(2*n-2*s[o]);for(;e<=r[o];)o--,e=(t[n]+n*n-(t[s[o]]+s[o]*s[o]))/(2*n-2*s[o]);o++,s[o]=n,r[o]=e,r[o+1]=+i}for(let i=0,n=0;i<h;i++){for(;r[n+1]<i;)n++;e[i]=(i-s[n])*(i-s[n])+t[s[n]]}}}export{r as default};