@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 4.61 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{packFloatRGBA as t}from"../../core/floatRGBA.js";import{isExtent as o}from"../../geometry/support/jsonUtils.js";import n from"./Rect.js";import{defaultSdfTextureSize as r,spritePadding as i}from"../../views/2d/engine/webgl/definitions.js";const e=.45;function a(t,o=.5){switch(t.type){case"CIMPointSymbol":{const o=t.symbolLayers;if(!o||1!==o.length)return null;const n=o[0];return"CIMVectorMarker"!==n.type?null:a(n)}case"CIMVectorMarker":{const n=t.markerGraphics;if(!n||1!==n.length)return null;const r=n[0];if(!r)return null;const i=r.geometry;if(!i)return null;const e=r.symbol;return!e||"CIMPolygonSymbol"!==e.type&&"CIMLineSymbol"!==e.type||e.symbolLayers?.some((t=>!!t.effects))?null:{type:"sdf",geom:i,sdfPaddingRatio:o,asFill:"CIMPolygonSymbol"===e.type}}}}function l(t){return t?t.rings?t.rings:t.paths?t.paths:void 0!==t.xmin&&void 0!==t.ymin&&void 0!==t.xmax&&void 0!==t.ymax?[[[t.xmin,t.ymin],[t.xmin,t.ymax],[t.xmax,t.ymax],[t.xmax,t.ymin],[t.xmin,t.ymin]]]:null:null}function s(t){let o=1/0,r=-1/0,i=1/0,e=-1/0;for(const n of t)for(const t of n)t[0]<o&&(o=t[0]),t[0]>r&&(r=t[0]),t[1]<i&&(i=t[1]),t[1]>e&&(e=t[1]);return new n(o,i,r-o,e-i)}function f(t){let o=1/0,n=-1/0,r=1/0,i=-1/0;for(const e of t)for(const t of e)t[0]<o&&(o=t[0]),t[0]>n&&(n=t[0]),t[1]<r&&(r=t[1]),t[1]>i&&(i=t[1]);return[o,r,n,i]}function m(t){return t?t.rings?f(t.rings):t.paths?f(t.paths):o(t)?[t.xmin,t.ymin,t.xmax,t.ymax]:null:null}function c(t,o){const[n,e,a,l]=m(t),s=a-n,f=l-e,c=r,h=i,u=Math.floor(.5*(c*o-h)),y=(c-2*(u+h))/Math.max(s,f),d=Math.round(s*y),x=Math.round(f*y);return{pixelDimensions:[s,f],texelDimensions:[Math.round((d+2*u)/y),Math.round((x+2*u)/y)]}}function h(t,o,n,a,l,s,f){const[m,c,h,u]=t;if(h<m||u<c)return{frameSizeRatio:0,anchorX:0,anchorY:0,widthRatio:1,sdfPaddingRatio:.5};const y=h-m,d=u-c,x=Math.max(y,d);let M=.5;if(null!=s&&null!=n){if(!f&&null!=o){s*=(o.ymax-o.ymin)/n}const t=s/(s+x),r=.1;t>e&&t<1&&(M=Math.min(t+r,.99))}const g=r,p=i,R=Math.floor(.5*(g*M-p)),w=(g-2*(R+p))/x,P=Math.round(y*w)+2*R,b=Math.round(d*w)+2*R;let C=1;if(o){C=b*(1-M)/((o.ymax-o.ymin)*w)}let I=0,S=0,j=1;a&&(l?o&&n&&o.ymax-o.ymin>0&&(j=(o.xmax-o.xmin)/(o.ymax-o.ymin),I=a.x/(n*j),S=a.y/n):(I=a.x,S=a.y)),o&&(I=.5*(o.xmax+o.xmin)+I*(o.xmax-o.xmin),S=.5*(o.ymax+o.ymin)+S*(o.ymax-o.ymin)),I-=m,S-=c,I*=w,S*=w,I+=R,S+=R;let v=I/P-.5,F=S/b-.5;return l&&n&&(v*=n*j,F*=n),{frameSizeRatio:C,anchorX:v,anchorY:F,widthRatio:j,sdfPaddingRatio:M}}function u(t){const o=l(t.geom),n=s(o),e=r,a=i,f=Math.floor(.5*(e*t.sdfPaddingRatio-a)),m=e-2*(f+a),c=m/Math.max(n.width,n.height),h=Math.round(n.width*c)+2*f,u=Math.round(n.height*c)+2*f,M=[];for(const r of o)if(r&&r.length>1){const o=[];for(const i of r){let[r,e]=i;r-=n.x,e-=n.y,r*=c,e*=c,r+=f-.5,e+=f-.5,t.asFill?o.push([r,e]):o.push([Math.round(r),Math.round(e)])}if(t.asFill){const t=o.length-1;o[0][0]===o[t][0]&&o[0][1]===o[t][1]||o.push(o[0])}M.push(o)}const g=y(M,h,u,f);return t.asFill&&d(M,h,u,f,g),{data:x(g,f),width:h,height:u,sdfPaddingRatio:t.sdfPaddingRatio,sdfDecodeCoeff:2*f/m}}function y(t,o,n,r){const i=o*n,e=new Array(i),a=r*r+1;for(let l=0;l<i;++l)e[l]=a;for(const l of t){const t=l.length;for(let i=1;i<t;++i){const t=l[i-1],a=l[i];let s,f,m,c;t[0]<a[0]?(s=t[0],f=a[0]):(s=a[0],f=t[0]),t[1]<a[1]?(m=t[1],c=a[1]):(m=a[1],c=t[1]);let h=Math.floor(s)-r,u=Math.floor(f)+r,y=Math.floor(m)-r,d=Math.floor(c)+r;h<0&&(h=0),u>o&&(u=o),y<0&&(y=0),d>n&&(d=n);const x=a[0]-t[0],M=a[1]-t[1],g=x*x+M*M;for(let r=h;r<u;r++)for(let i=y;i<d;i++){const l=r+.5,s=i+.5;let f,m,c=(l-t[0])*x+(s-t[1])*M;c<0?(f=t[0],m=t[1]):c>g?(f=a[0],m=a[1]):(c/=g,f=t[0]+c*x,m=t[1]+c*M);const h=(l-f)*(l-f)+(s-m)*(s-m),u=(n-i-1)*o+r;h<e[u]&&(e[u]=h)}}}for(let l=0;l<i;++l)e[l]=Math.sqrt(e[l]);return e}function d(t,o,n,r,i){for(const e of t){const t=e.length;for(let a=1;a<t;++a){const t=e[a-1],l=e[a];let s,f,m,c;t[0]<l[0]?(s=t[0],f=l[0]):(s=l[0],f=t[0]),t[1]<l[1]?(m=t[1],c=l[1]):(m=l[1],c=t[1]);let h=Math.floor(s),u=Math.floor(f)+1,y=Math.floor(m),d=Math.floor(c)+1;h<r&&(h=r),u>o-r&&(u=o-r),y<r&&(y=r),d>n-r&&(d=n-r);for(let e=y;e<d;++e){if(t[1]>e==l[1]>e)continue;const a=e+.5,s=(n-e-1)*o;for(let o=h;o<u;++o){o+.5<(l[0]-t[0])*(a-t[1])/(l[1]-t[1])+t[0]&&(i[s+o]=-i[s+o])}for(let t=r;t<h;++t)i[s+t]=-i[s+t]}}}}function x(o,n){const r=2*n,i=o.length,e=new Uint8Array(4*i);for(let a=0;a<i;++a){const n=.5-o[a]/r;t(n,e,4*a)}return e}export{u as buildSDF,m as getExtent,c as getSDFDimensions,a as getSDFInfo,h as getSDFMetrics};