@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 26.7 kB
JavaScript
import e from"../../Color.js";import{bidiText as t}from"../../core/BidiText.js";import{clone as r}from"../../core/lang.js";import a from"../../core/Logger.js";import{isSome as o,isNone as i}from"../../core/maybe.js";import s from"../../core/RandomLCG.js";import{pt2px as n,px2pt as l}from"../../core/screenUtils.js";import{create as c,expandPointInPlace as m}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as f}from"../../geometry/support/boundsUtils.js";import{createRendererExpression as y}from"../../support/arcadeOnDemand.js";import{Placement as u}from"./CIMPlacements.js";import{horizontalAlignment2HAlign as h,verticalAlignment2VAlign as p,EnvDrawHelper as M,Transformation as d,CanvasDrawHelper as S,lineGapType2LineHeight as b}from"./CIMSymbolDrawHelper.js";import{LineCapStyle as g,LineJoinStyle as C,BlockProgression as I,FontEffects as k,FontEncoding as x,FontType as w,GlyphHinting as P,TextReadingDirection as L,VerticalGlyphOrientation as v,BillBoardMode as D,TextureFilter as F,ExtremityPlacement as T}from"./enums.js";import{getValue as z,isCIMMarkerStrokePlacement as G,attributesToFields as E,analyzeTextParts as O,assignTextValuesFromFeature as A,isGeometryEngineRequired as N,importGeometryEngine as R}from"./utils.js";import j from"../../views/2d/arcade/callExpressionWithFeature.js";import{C_INFINITY as V}from"../../views/2d/engine/vectorTiles/GeometryUtils.js";import{GLYPH_SIZE as B,MAGIC_LABEL_LINE_HEIGHT as X,RANDOM_INSIDE_POLYGON_TEXTURE_SIZE as _}from"../../views/2d/engine/webgl/definitions.js";import{shapeGlyphs as H}from"../../views/2d/engine/webgl/mesh/templates/shapingUtils.js";const Y=Math.PI,$=Y/2,U=4,q=4,W=10,J=96/72,K=Math.PI/180,Q=a.getLogger("esri.symbols.cim.CIMSymbolHelper");function Z(e){if(!e||!e.type)return null;let t;switch(e.type){case"cim":return e.data;case"web-style":return e;case"simple-marker":{const r=ie.fromSimpleMarker(e);if(!r)return null;t=r;break}case"picture-marker":t=ie.fromPictureMarker(e);break;case"simple-line":t=ie.fromSimpleLineSymbol(e);break;case"simple-fill":t=ie.fromSimpleFillSymbol(e);break;case"picture-fill":t=ie.fromPictureFillSymbol(e);break;case"text":t=ie.fromTextSymbol(e)}return{type:"CIMSymbolReference",symbol:t}}function ee(e,t,r){switch(t.type){case"CIMSymbolReference":return ee(e,t.symbol,r);case"CIMPointSymbol":null==r&&(r={x:0,y:0}),e.drawSymbol(t,r);break;case"CIMLineSymbol":null==r&&(r={paths:[[[0,0],[10,0]]]}),e.drawSymbol(t,r);break;case"CIMPolygonSymbol":null==r&&(r={rings:[[[0,0],[0,10],[10,10],[10,0],[0,0]]]}),e.drawSymbol(t,r);break;case"CIMTextSymbol":{const r={x:0,y:0};e.drawSymbol(t,r);break}case"CIMVectorMarker":{const r=new u;e.drawMarker(t,r);break}}return e.envelope()}function te(e){if(!e)return 0;switch(e.type){case"CIMMarkerPlacementAlongLineSameSize":case"CIMMarkerPlacementAlongLineRandomSize":case"CIMMarkerPlacementAtExtremities":case"CIMMarkerPlacementAtMeasuredUnits":case"CIMMarkerPlacementAtRatioPositions":case"CIMMarkerPlacementOnLine":case"CIMMarkerPlacementOnVertices":return Math.abs(e.offset);default:return 0}}function re(e){if(!e)return 0;switch(e.type){case"CIMGeometricEffectArrow":return Math.abs(.5*e.width);case"CIMGeometricEffectBuffer":return Math.abs(e.size);case"CIMGeometricEffectExtension":case"CIMGeometricEffectRadial":return Math.abs(e.length);case"CIMGeometricEffectJog":return Math.abs(.5*e.length);case"CIMGeometricEffectMove":return Math.max(Math.abs(z(e.offsetX)),Math.abs(z(e.offsetY)));case"CIMGeometricEffectOffset":case"CIMGeometricEffectOffsetTangent":return Math.abs(e.offset);case"CIMGeometricEffectRegularPolygon":return Math.abs(e.radius);case"CIMGeometricEffectRotate":case"CIMGeometricEffectScale":default:return 0;case"CIMGeometricEffectTaperedPolygon":return.5*Math.max(Math.abs(e.fromWidth),Math.abs(e.toWidth));case"CIMGeometricEffectWave":return Math.abs(e.amplitude)}}function ae(e){if(!e)return 0;let t=0;for(const r of e)t+=re(r);return t}class oe{getSymbolInflateSize(e,t,r,a,o){return e||(e=[0,0,0,0]),t?this._getInflateSize(e,t,r,a,o):e}static safeSize(e){const t=Math.max(Math.abs(e[0]),Math.abs(e[2])),r=Math.max(Math.abs(e[1]),Math.abs(e[3]));return Math.sqrt(t*t+r*r)}_vectorMarkerBounds(e,t,r,a){let o=!0;const i=c();if(t&&t.markerGraphics)for(const s of t.markerGraphics){const t=[0,0,0,0];s.geometry&&(f(i,s.geometry),t[0]=0,t[1]=0,t[2]=0,t[3]=0,this.getSymbolInflateSize(t,s.symbol,r,0,a),i[0]+=t[0],i[1]+=t[1],i[2]+=t[2],i[3]+=t[3],o?(e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],o=!1):(e[0]=Math.min(e[0],i[0]),e[1]=Math.min(e[1],i[1]),e[2]=Math.max(e[2],i[2]),e[3]=Math.max(e[3],i[3])))}return e}_getInflateSize(e,t,r,a,o){if(Me(t)){const i=this._getLayersInflateSize(e,t.symbolLayers,r,a,o),s=ae(t.effects);return s>0&&(i[0]-=s,i[1]-=s,i[2]+=s,i[3]+=s),i}return this._getTextInflatedSize(e,t,o)}_getLayersInflateSize(e,t,r,a,i){let s=!0;if(!t)return e;for(const n of t){if(!n)continue;let t=[0,0,0,0];switch(n.type){case"CIMSolidFill":case"CIMPictureFill":case"CIMHatchFill":case"CIMGradientFill":break;case"CIMSolidStroke":case"CIMPictureStroke":case"CIMGradientStroke":{const e=n;let r=e.width;null!=r&&(e.capStyle===g.Square||e.joinStyle===C.Miter?r/=1.4142135623730951:r/=2,t[0]=-r,t[1]=-r,t[2]=r,t[3]=r);break}case"CIMCharacterMarker":case"CIMVectorMarker":case"CIMPictureMarker":{const e=n;if("CIMVectorMarker"===n.type){const e=n;if(t=this._vectorMarkerBounds(t,e,r,i),e.frame){const r=(e.frame.xmin+e.frame.xmax)/2,a=(e.frame.ymin+e.frame.ymax)/2;if(t[0]-=r,t[1]-=a,t[2]-=r,t[3]-=a,null!=e.size){const r=e.size/(e.frame.ymax-e.frame.ymin);t[0]*=r,t[1]*=r,t[2]*=r,t[3]*=r}}}else if("CIMPictureMarker"===n.type){const a=n,i=r.getResource(a.url);let s=1;if(o(i)&&i.height&&(s=i.width/i.height),null!=e.size){const r=e.size/2,o=e.size*s*a.scaleX/2;t=[-o,-r,o,r]}}else if(null!=e.size){const r=e.size/2;t=[-r,-r,r,r]}if(e.anchorPoint){let r,a;"Absolute"===e.anchorPointUnits?(r=e.anchorPoint.x,a=e.anchorPoint.y):(r=e.anchorPoint.x*(t[2]-t[0]),a=e.anchorPoint.y*(t[3]-t[1])),t[0]-=r,t[1]-=a,t[2]-=r,t[3]-=a}let s=z(e.rotation);if(e.rotateClockwise&&(s=-s),a&&(s-=a),s){const e=K*s,r=Math.cos(e),a=Math.sin(e),o=c([V,V,-V,-V]);m(o,[t[0]*r-t[1]*a,t[0]*a+t[1]*r]),m(o,[t[0]*r-t[3]*a,t[0]*a+t[3]*r]),m(o,[t[2]*r-t[1]*a,t[2]*a+t[1]*r]),m(o,[t[2]*r-t[3]*a,t[2]*a+t[3]*r]),t=o}let l=z(e.offsetX),f=z(e.offsetY);if(a){const e=K*a,t=Math.cos(e),r=Math.sin(e),o=l*r+f*t;l=l*t-f*r,f=o}t[0]+=l,t[1]+=f,t[2]+=l,t[3]+=f;const y=te(e.markerPlacement);y>0&&(t[0]-=y,t[1]-=y,t[2]+=y,t[3]+=y);break}}const l=ae(n.effects);l>0&&(t[0]-=l,t[1]-=l,t[2]+=l,t[3]+=l),s?(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],s=!1):(e[0]=Math.min(e[0],t[0]),e[1]=Math.min(e[1],t[1]),e[2]=Math.max(e[2],t[2]),e[3]=Math.max(e[3],t[3]))}return e}_getTextInflatedSize(e,r,a){const o=r.height??W;if(e[0]=-o/2,e[1]=-o/2,e[2]=o/2,e[3]=o/2,!a)return e;const i=a.get(r);if(!i)return e;const{text:s,mosaicItem:n}=i;if(!n?.glyphMosaicItems?.length)return e;const{lineGapType:l,lineGap:c}=r,m=l?b(l,c??0,o):0,f=t(s)[1],y=n.glyphMosaicItems,u="CIMBackgroundCallout"===r.callout?.type,M=H(y,f,{scale:o/B,angle:z(r.angle),xOffset:z(r.offsetX),yOffset:z(r.offsetY),hAlign:h(r.horizontalAlignment),vAlign:p(r.verticalAlignment),maxLineWidth:512,lineHeight:X*Math.max(.25,Math.min(m||1,4)),decoration:r.font.decoration||"none",isCIM:!0,hasBackground:u}).boundsT;return e[0]=M.x-M.halfWidth,e[1]=-M.y-M.halfHeight,e[2]=M.x+M.halfWidth,e[3]=-M.y+M.halfHeight,e}}class ie{static getEnvelope(e,t,r){if(!e)return null;const a=new M(r);if(Array.isArray(e)){let r;for(const o of e)r?r.union(ee(a,o,t)):r=ee(a,o,t);return r}return ee(a,e,t)}static getTextureAnchor(e,t){const r=this.getEnvelope(e,null,t);if(!r)return[0,0,0];const a=(r.x+.5*r.width)*J,o=(r.y+.5*r.height)*J,i=r.width*J+2,s=r.height*J+2;return[-a/i,-o/s,s]}static rasterize(e,t,r,a,o=!0){const i=r||this.getEnvelope(t,null,a);if(!i)return[null,0,0,0,0];const s=(i.x+.5*i.width)*J,n=(i.y+.5*i.height)*J;e.width=i.width*J,e.height=i.height*J,r||(e.width+=2,e.height+=2);const l=e.getContext("2d"),c=d.createScale(J,-J);c.translate(.5*e.width-s,.5*e.height+n);const m=new S(l,a,c);switch(t.type){case"CIMPointSymbol":{const e={type:"point",x:0,y:0};m.drawSymbol(t,e);break}case"CIMVectorMarker":{const e=new u;m.drawMarker(t,e);break}}const f=l.getImageData(0,0,e.width,e.height),y=new Uint8Array(f.data);if(o){let e;for(let t=0;t<y.length;t+=4)e=y[t+3]/255,y[t]=y[t]*e,y[t+1]=y[t+1]*e,y[t+2]=y[t+2]*e}return[y,e.width,e.height,-s/e.width,-n/e.height]}static fromTextSymbol(e){const{angle:r,color:a,font:o,haloColor:i,haloSize:s,horizontalAlignment:n,kerning:l,text:c,verticalAlignment:m,xoffset:f,yoffset:y,backgroundColor:u,borderLineColor:h,borderLineSize:p}=e;let M,d,S,b,g,C;o&&(M=o.family,d=o.style,S=o.weight,b=o.size,g=o.decoration);let F=!1;if(c){F=t(c)[1]}return(u||p)&&(C={type:"CIMBackgroundCallout",margin:null,backgroundSymbol:{type:"CIMPolygonSymbol",symbolLayers:[{type:"CIMSolidFill",color:fe(u)},{type:"CIMSolidStroke",color:fe(h),width:p}]},accentBarSymbol:null,gap:null,leaderLineSymbol:null,lineStyle:null}),{type:"CIMPointSymbol",symbolLayers:[{type:"CIMVectorMarker",enable:!0,anchorPointUnits:"Relative",dominantSizeAxis3D:"Y",size:10,billboardMode3D:"FaceNearPlane",frame:{xmin:-5,ymin:-5,xmax:5,ymax:5},markerGraphics:[{type:"CIMMarkerGraphic",geometry:{x:0,y:0},symbol:{type:"CIMTextSymbol",angle:r,blockProgression:I.BTT,depth3D:1,extrapolateBaselines:!0,fontEffects:k.Normal,fontEncoding:x.Unicode,fontFamilyName:M||"Arial",fontStyleName:ye(d,S),fontType:w.Unspecified,haloSize:s,height:b,hinting:P.Default,horizontalAlignment:ce(n??"center"),kerning:l,letterWidth:100,ligatures:!0,lineGapType:"Multiple",offsetX:z(f),offsetY:z(y),strikethrough:"line-through"===g,underline:"underline"===g,symbol:{type:"CIMPolygonSymbol",symbolLayers:[{type:"CIMSolidFill",enable:!0,color:fe(a)}]},haloSymbol:{type:"CIMPolygonSymbol",symbolLayers:[{type:"CIMSolidFill",enable:!0,color:fe(i)}]},shadowColor:[0,0,0,255],shadowOffsetX:1,shadowOffsetY:1,textCase:"Normal",textDirection:F?L.RTL:L.LTR,verticalAlignment:me(m??"baseline"),verticalGlyphOrientation:v.Right,wordSpacing:100,billboardMode3D:D.FaceNearPlane,callout:C},textString:c}],scaleSymbolsProportionally:!0,respectFrame:!0}],scaleX:1,angleAlignment:"Display"}}static fromPictureFillSymbol(e){const{height:t,outline:r,width:a,xoffset:o,xscale:i,yoffset:s,yscale:n}=e,l=[],c={type:"CIMPolygonSymbol",symbolLayers:l};if(r){const{cap:e,join:t,miterLimit:a,width:o}=r;l.push({type:"CIMSolidStroke",color:fe(r.color),capStyle:ne(e),joinStyle:le(t),miterLimit:a,width:o})}let m=e.url;"esriPFS"===e.type&&e.imageData&&(m=e.imageData);const f="angle"in e?e.angle??0:0,y=(a??0)*(i||1),u=(t??0)*(n||1);return l.push({type:"CIMPictureFill",invertBackfaceTexture:!1,scaleX:1,textureFilter:F.Picture,tintColor:null,url:m,height:u,width:y,offsetX:z(o),offsetY:z(s),rotation:z(-f),colorSubstitutions:null}),c}static fromSimpleFillSymbol(e){const{color:t,style:a,outline:o}=e,i=[],s={type:"CIMPolygonSymbol",symbolLayers:i};let n=null;if(o){const{cap:e,join:t,style:r}=o;"solid"!==r&&"none"!==r&&"esriSLSSolid"!==r&&"esriSLSNull"!==r&&(n=[{type:"CIMGeometricEffectDashes",dashTemplate:pe(r,e),lineDashEnding:"NoConstraint",scaleDash:!0,offsetAlongLine:null}]),i.push({type:"CIMSolidStroke",color:fe(o.color),capStyle:ne(e),joinStyle:le(t),miterLimit:o.miterLimit,width:o.width,effects:n})}if(a&&"solid"!==a&&"none"!==a&&"esriSFSSolid"!==a&&"esriSFSNull"!==a){const e={type:"CIMLineSymbol",symbolLayers:[{type:"CIMSolidStroke",color:fe(t),capStyle:g.Butt,joinStyle:C.Miter,width:.75}]};let o=0;const s=l(Se(a)?8:10);switch(a){case"vertical":case"esriSFSVertical":o=90;break;case"forward-diagonal":case"esriSFSForwardDiagonal":case"diagonal-cross":case"esriSFSDiagonalCross":o=-45;break;case"backward-diagonal":case"esriSFSBackwardDiagonal":o=45;break;case"cross":case"esriSFSCross":o=0}i.push({type:"CIMHatchFill",lineSymbol:e,offsetX:0,offsetY:0,rotation:o,separation:s}),"cross"===a||"esriSFSCross"===a?i.push({type:"CIMHatchFill",lineSymbol:r(e),offsetX:0,offsetY:0,rotation:90,separation:s}):"diagonal-cross"!==a&&"esriSFSDiagonalCross"!==a||i.push({type:"CIMHatchFill",lineSymbol:r(e),offsetX:0,offsetY:0,rotation:45,separation:s})}else!a||"solid"!==a&&"esriSFSSolid"!==a||i.push({type:"CIMSolidFill",enable:!0,color:fe(t)});return s}static fromSimpleLineSymbol(e){const{cap:t,color:r,join:a,marker:o,miterLimit:i,style:s,width:n}=e;let l=null;"solid"!==s&&"none"!==s&&"esriSLSSolid"!==s&&"esriSLSNull"!==s&&(l=[{type:"CIMGeometricEffectDashes",dashTemplate:pe(s,t),lineDashEnding:"NoConstraint",scaleDash:!0,offsetAlongLine:null}]);const c=[];if(o){let e;switch(o.placement){case"begin-end":e=T.Both;break;case"begin":e=T.JustBegin;break;case"end":e=T.JustEnd;break;default:e=T.None}const t=ie.fromSimpleMarker(o,n,r).symbolLayers[0];t.markerPlacement={type:"CIMMarkerPlacementAtExtremities",angleToLine:!0,offset:0,extremityPlacement:e,offsetAlongLine:0},c.push(t)}return"none"!==s&&"esriSLSNull"!==s&&c.push({type:"CIMSolidStroke",color:fe(r),capStyle:ne(t),joinStyle:le(a),miterLimit:i,width:n,effects:l}),{type:"CIMLineSymbol",symbolLayers:c}}static fromPictureMarker(e){const{angle:t,height:r,width:a,xoffset:o,yoffset:i}=e;let s=e.url;return"esriPMS"===e.type&&e.imageData&&(s=e.imageData),{type:"CIMPointSymbol",symbolLayers:[{type:"CIMPictureMarker",invertBackfaceTexture:!1,scaleX:1,textureFilter:F.Picture,tintColor:null,url:s,size:r,width:a,offsetX:z(o),offsetY:z(i),rotation:z(-t)}]}}static fromSimpleMarker(e,t,r){const{style:a}=e,o=e.color??r;if("path"===a){const t=[];if("outline"in e&&e.outline){const r=e.outline;t.push({type:"CIMSolidStroke",enable:!0,width:n(Math.round(l(r.width))),color:fe(r.color)})}t.push({type:"CIMSolidFill",enable:!0,color:fe(o),path:e.path});const[r,a]=de("square");return{type:"CIMPointSymbol",symbolLayers:[{type:"CIMVectorMarker",enable:!0,rotation:z(-e.angle),size:z(e.size||6),offsetX:z(e.xoffset),offsetY:z(e.yoffset),frame:r,markerGraphics:[{type:"CIMMarkerGraphic",geometry:a,symbol:{type:"CIMPolygonSymbol",symbolLayers:t}}]}]}}const[i,s]=de(a);let c;if(s&&i){const r=[];if("outline"in e&&e.outline){const t=e.outline;r.push({type:"CIMSolidStroke",enable:!0,width:null!=t.width&&t.width>.667?n(Math.round(l(t.width))):t.width,color:fe(t.color)})}else!t||"line-marker"!==e.type||"cross"!==e.style&&"x"!==e.style||r.push({type:"CIMSolidStroke",enable:!0,width:t,color:fe(o)});r.push({type:"CIMSolidFill",enable:!0,color:fe(o)});const a={type:"CIMPolygonSymbol",symbolLayers:r};c={type:"CIMPointSymbol",symbolLayers:[{type:"CIMVectorMarker",enable:!0,rotation:z(-e.angle),size:z(e.size||6*t),offsetX:z(e.xoffset),offsetY:z(e.yoffset),frame:i,markerGraphics:[{type:"CIMMarkerGraphic",geometry:s,symbol:a}]}]}}return c}static fromCIMHatchFill(e,t){const a=t*(e.separation??U),o=a/2,i=r(e.lineSymbol);i.symbolLayers?.forEach((e=>{switch(e.type){case"CIMSolidStroke":null!=e.width&&(e.width*=t),e.effects?.forEach((e=>{"CIMGeometricEffectDashes"===e.type&&(e.dashTemplate=e.dashTemplate.map((e=>e*t)))}));break;case"CIMVectorMarker":{null!=e.size&&(e.size*=t);const r=e.markerPlacement;null!=r&&"placementTemplate"in r&&(r.placementTemplate=r.placementTemplate.map((e=>e*t)));break}}}));let s=this._getLineSymbolPeriod(i)||q;for(;s<q;)s*=2;const n=s/2;return{type:"CIMVectorMarker",frame:{xmin:-n,xmax:n,ymin:-o,ymax:o},markerGraphics:[{type:"CIMMarkerGraphic",geometry:{paths:[[[-n,0],[n,0]]]},symbol:i}],size:a}}static fetchResources(e,t,r){if(e&&t)switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":{const a=e.symbolLayers;if(!a)return;for(const e of a)switch(ge(e,t,r),e.type){case"CIMPictureFill":case"CIMHatchFill":case"CIMGradientFill":case"CIMPictureStroke":case"CIMGradientStroke":case"CIMCharacterMarker":case"CIMPictureMarker":"url"in e&&e.url&&r.push(t.fetchResource(e.url,null));break;case"CIMVectorMarker":{const a=e.markerGraphics;if(!a)continue;for(const e of a)if(e){const a=e.symbol;a&&ie.fetchResources(a,t,r)}}}}}}static _getLineSymbolPeriod(e){if(e){const t=this._getEffectsRepeat(e.effects);if(t)return t;if(e.symbolLayers)for(const r of e.symbolLayers)if(r){const e=this._getEffectsRepeat(r.effects);if(e)return e;switch(r.type){case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":case"CIMObjectMarker3D":case"CIMglTFMarker3D":{const e=this._getPlacementRepeat(r.markerPlacement);if(e)return e}}}}return 0}static _getEffectsRepeat(e){if(e)for(const t of e)if(t)switch(t.type){case"CIMGeometricEffectDashes":{const e=t.dashTemplate;if(e&&e.length){let t=0;for(const r of e)t+=r;return 1&e.length&&(t*=2),t}break}case"CIMGeometricEffectWave":return t.period;default:Q.error(`unsupported geometric effect type ${t.type}`)}return 0}static _getPlacementRepeat(e){if(e)switch(e.type){case"CIMMarkerPlacementAlongLineSameSize":case"CIMMarkerPlacementAlongLineRandomSize":case"CIMMarkerPlacementAlongLineVariableSize":{const t=e.placementTemplate;if(t&&t.length){let e=0;for(const r of t)e+=+r;return 1&t.length&&(e*=2),e}break}}return 0}static fromCIMInsidePolygon(e){const t=e.markerPlacement,r={...e};r.markerPlacement=null,r.anchorPoint=null;const a=Math.abs(t.stepX),o=Math.abs(t.stepY),i=(t.randomness??100)/100;let n,c,m,f;if("Random"===t.gridType){const e=l(_),r=Math.max(Math.floor(e/a),1),y=Math.max(Math.floor(e/o),1);n=r*a/2,c=y*o/2,m=2*c;const u=new s(t.seed),h=i*a/1.5,p=i*o/1.5;f=[];for(let t=0;t<r;t++)for(let e=0;e<y;e++){const r=t*a-n+h*(.5-u.getFloat()),i=e*o-c+p*(.5-u.getFloat());f.push({x:r,y:i}),0===t&&f.push({x:r+2*n,y:i}),0===e&&f.push({x:r,y:i+2*c})}}else!0===t.shiftOddRows?(n=a/2,c=o,m=2*o,f=[{x:-n,y:0},{x:n,y:0},{x:0,y:c},{x:0,y:-c}]):(n=a/2,c=o/2,m=o,f=[{x:-a,y:0},{x:0,y:-o},{x:-a,y:-o},{x:0,y:0},{x:a,y:0},{x:0,y:o},{x:a,y:o},{x:-a,y:o},{x:a,y:-o}]);return{type:"CIMVectorMarker",frame:{xmin:-n,xmax:n,ymin:-c,ymax:c},markerGraphics:f.map((e=>({type:"CIMMarkerGraphic",geometry:e,symbol:{type:"CIMPointSymbol",symbolLayers:[r]}}))),size:m}}static getSize(e){if(e)switch(e.type){case"CIMTextSymbol":return e.height;case"CIMPointSymbol":{let t=0;if(e.symbolLayers)for(const r of e.symbolLayers)if(r)switch(r.type){case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":case"CIMObjectMarker3D":case"CIMglTFMarker3D":{const e=r.size;null!=e&&e>t&&(t=e);break}}return t}case"CIMLineSymbol":case"CIMPolygonSymbol":{let t=0;if(e.symbolLayers)for(const r of e.symbolLayers)if(r)switch(r.type){case"CIMSolidStroke":case"CIMPictureStroke":case"CIMGradientStroke":{const e=r.width;null!=e&&e>t&&(t=e);break}case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":case"CIMObjectMarker3D":case"CIMglTFMarker3D":if(r.markerPlacement&&G(r.markerPlacement)){const e=r.size;null!=e&&e>t&&(t=e)}}return t}}}static getMarkerScaleRatio(e){if(e&&"CIMVectorMarker"===e.type)if(!1!==e.scaleSymbolsProportionally&&e.frame&&null!=e.size){const t=e.frame.ymax-e.frame.ymin;return e.size/t}return 1}}class se{static findApplicableOverrides(e,t,r){if(e&&t){if(e.primitiveName){let a=!1;for(const t of r)if(t.primitiveName===e.primitiveName){a=!0;break}if(!a)for(const o of t)o.primitiveName===e.primitiveName&&r.push(o)}switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":if(e.effects)for(const a of e.effects)se.findApplicableOverrides(a,t,r);if(e.symbolLayers)for(const a of e.symbolLayers)se.findApplicableOverrides(a,t,r);break;case"CIMTextSymbol":break;case"CIMSolidStroke":case"CIMPictureStroke":case"CIMGradientStroke":case"CIMSolidFill":case"CIMPictureFill":case"CIMHatchFill":case"CIMGradientFill":case"CIMVectorMarker":case"CIMCharacterMarker":case"CIMPictureMarker":if(e.effects)for(const a of e.effects)se.findApplicableOverrides(a,t,r);if(e.markerPlacement&&se.findApplicableOverrides(e.markerPlacement,t,r),"CIMVectorMarker"===e.type){if(e.markerGraphics)for(const a of e.markerGraphics)se.findApplicableOverrides(a,t,r),se.findApplicableOverrides(a.symbol,t,r)}else"CIMCharacterMarker"===e.type?se.findApplicableOverrides(e.symbol,t,r):"CIMHatchFill"===e.type?se.findApplicableOverrides(e.lineSymbol,t,r):"CIMPictureMarker"===e.type&&se.findApplicableOverrides(e.animatedSymbolProperties,t,r)}}}static findEffectOverrides(e,t,r){if(!t||!e)return;const a=e.length;for(let o=0;o<a;o++){const a=e[o]?.primitiveName;if(a){let e=!1;for(const t of r)if(t.primitiveName===a){e=!0;break}if(!e)for(const o of t)o.primitiveName===a&&r.push(o)}}}static async resolveSymbolOverrides(e,t,a,o,i,s,n){if(!e||!e.symbol)return null;let{symbol:l,primitiveOverrides:c}=e;const m=!!c;if(!m&&!o)return l;l=r(l);let f=!0;if(t||(t={attributes:{}},f=!1),m){if(f||(c=c.filter((e=>!e.valueExpressionInfo?.expression.includes("$feature")))),n||(c=c.filter((e=>!e.valueExpressionInfo?.expression.includes("$view")))),c.length>0){const e=E(t.attributes);await se.evaluateOverrides(c,t,{spatialReference:a,fields:e,geometryType:i},s,n)}se.applyOverrides(l,c)}return o&&se.applyDictionaryTextOverrides(l,t,o),l}static async evaluateOverrides(e,t,r,a,o){if(!t)return;let i;for(const s of e){const e=s.valueExpressionInfo;if(e&&r&&r.geometryType){i||(i=[]),s.value=void 0;const n=y(e.expression,r.spatialReference,r.fields).then((e=>{s.value=j(e,t,{$view:o},r.geometryType,a)}));i.push(n)}}void 0!==i&&i.length>0&&await Promise.all(i)}static applyDictionaryTextOverrides(e,t,r,a="Normal"){if(e&&e.type)switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":case"CIMTextSymbol":{const o=e.symbolLayers;if(!o)return;for(const i of o)i&&"CIMVectorMarker"===i.type&&se.applyDictionaryTextOverrides(i,t,r,"CIMTextSymbol"===e.type?e.textCase:a)}break;case"CIMVectorMarker":{const a=e.markerGraphics;if(!a)return;for(const e of a)e&&se.applyDictionaryTextOverrides(e,t,r)}break;case"CIMMarkerGraphic":{const o=e.textString;if(o&&o.includes("[")){const i=O(o,r);e.textString=A(t,i,a)}}}}static applyOverrides(e,t,r,a){if(e.primitiveName)for(const i of t)if(i.primitiveName===e.primitiveName){const t=be(i.propertyName);if(a&&a.push({cim:e,nocapPropertyName:t,value:e[t]}),i.expression&&(i.value=se.toValue(i.propertyName,i.expression)),r){let t=!1;for(const a of r)a.primitiveName===e.primitiveName&&(t=!0);t||r.push(i)}o(i.value)&&(e[t]=i.value)}switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":if(e.effects)for(const o of e.effects)se.applyOverrides(o,t,r,a);if(e.symbolLayers)for(const o of e.symbolLayers)se.applyOverrides(o,t,r,a);break;case"CIMTextSymbol":break;case"CIMSolidStroke":case"CIMSolidFill":case"CIMVectorMarker":if(e.effects)for(const o of e.effects)se.applyOverrides(o,t,r,a);if("CIMVectorMarker"===e.type&&e.markerGraphics)for(const o of e.markerGraphics)se.applyOverrides(o,t,r,a),se.applyOverrides(o.symbol,t,r,a)}}static restoreOverrides(e){for(const t of e)t.cim[t.nocapPropertyName]=t.value}static buildOverrideKey(e){let t="";for(const r of e)void 0!==r.value&&(t+=`${r.primitiveName}${r.propertyName}${JSON.stringify(r.value)}`);return t}static toValue(t,r){if("DashTemplate"===t)return r.split(" ").map((e=>Number(e)));if("Color"===t){const t=new e(r).toRgba();return t[3]*=255,t}return r}}const ne=e=>{if(!e)return g.Butt;switch(e){case"butt":return g.Butt;case"square":return g.Square;case"round":return g.Round}},le=e=>{if(!e)return C.Miter;switch(e){case"miter":return C.Miter;case"round":return C.Round;case"bevel":return C.Bevel}},ce=e=>{if(i(e))return"Center";switch(e){case"left":return"Left";case"right":return"Right";case"center":return"Center"}},me=e=>{if(i(e))return"Center";switch(e){case"baseline":return"Baseline";case"top":return"Top";case"middle":return"Center";case"bottom":return"Bottom"}},fe=e=>{if(!e)return[0,0,0,0];const{r:t,g:r,b:a,a:o}=e;return[t,r,a,255*o]},ye=(e,t)=>{const r=ue(t),a=he(e);return r&&a?`${r}-${a}`:`${r}${a}`},ue=e=>{if(!e)return"";switch(e.toLowerCase()){case"bold":case"bolder":return"bold"}return""},he=e=>{if(!e)return"";switch(e.toLowerCase()){case"italic":case"oblique":return"italic"}return""},pe=(e,t)=>{const r="butt"===t;switch(e){case"dash":case"esriSLSDash":return r?[4,3]:[3,4];case"dash-dot":case"esriSLSDashDot":return r?[4,3,1,3]:[3,4,0,4];case"dot":case"esriSLSDot":return r?[1,3]:[0,4];case"long-dash":case"esriSLSLongDash":return r?[8,3]:[7,4];case"long-dash-dot":case"esriSLSLongDashDot":return r?[8,3,1,3]:[7,4,0,4];case"long-dash-dot-dot":case"esriSLSDashDotDot":return r?[8,3,1,3,1,3]:[7,4,0,4,0,4];case"short-dash":case"esriSLSShortDash":return r?[4,1]:[3,2];case"short-dash-dot":case"esriSLSShortDashDot":return r?[4,1,1,1]:[3,2,0,2];case"short-dash-dot-dot":case"esriSLSShortDashDotDot":return r?[4,1,1,1,1,1]:[3,2,0,2,0,2];case"short-dot":case"esriSLSShortDot":return r?[1,1]:[0,2];case"solid":case"esriSLSSolid":case"none":return Q.error("Unexpected: style does not require rasterization"),[0,0];default:return Q.error(`Tried to rasterize SLS, but found an unexpected style: ${e}!`),[0,0]}};function Me(e){return void 0!==e.symbolLayers}const de=e=>{const t=100,r=50;let a,o;const i=e;if("circle"===i||"esriSMSCircle"===i){const e=.25;let t=Math.acos(1-e/r),i=Math.ceil(Y/t/4);0===i&&(i=1),t=$/i,i*=4;const s=[];s.push([r,0]);for(let a=1;a<i;a++)s.push([r*Math.cos(a*t),-r*Math.sin(a*t)]);s.push([r,0]),a={rings:[s]},o={xmin:-r,ymin:-r,xmax:r,ymax:r}}else if("cross"===i||"esriSMSCross"===i){const e=0;a={rings:[[[e,r],[e,e],[r,e],[r,-e],[e,-e],[e,-r],[-e,-r],[-e,-e],[-r,-e],[-r,e],[-e,e],[-e,r],[e,r]]]},o={xmin:-r,ymin:-r,xmax:r,ymax:r}}else if("diamond"===i||"esriSMSDiamond"===i)a={rings:[[[-r,0],[0,r],[r,0],[0,-r],[-r,0]]]},o={xmin:-r,ymin:-r,xmax:r,ymax:r};else if("square"===i||"esriSMSSquare"===i)a={rings:[[[-r,-r],[-r,r],[r,r],[r,-r],[-r,-r]]]},o={xmin:-r,ymin:-r,xmax:r,ymax:r};else if("x"===i||"esriSMSX"===i){const e=0;a={rings:[[[0,e],[r-e,r],[r,r-e],[e,0],[r,e-r],[r-e,-r],[0,-e],[e-r,-r],[-r,e-r],[-e,0],[-r,r-e],[e-r,r],[0,e]]]},o={xmin:-r,ymin:-r,xmax:r,ymax:r}}else if("triangle"===i||"esriSMSTriangle"===i){const e=t*.5773502691896257,r=-e,i=2/3*t,s=i-t;a={rings:[[[r,s],[0,i],[e,s],[r,s]]]},o={xmin:r,ymin:s,xmax:e,ymax:i}}else"arrow"===i&&(a={rings:[[[-50,50],[50,0],[-50,-50],[-33,-20],[-33,20],[-50,50]]]},o={xmin:-r,ymin:-r,xmax:r,ymax:r});return[o,a]},Se=e=>"vertical"===e||"horizontal"===e||"cross"===e||"esriSFSCross"===e||"esriSFSVertical"===e||"esriSFSHorizontal"===e,be=e=>e?e.charAt(0).toLowerCase()+e.substr(1):e;function ge(e,t,r){if(!e.effects||o(t.geometryEngine))return;if(t.geometryEnginePromise)return void r.push(t.geometryEnginePromise);N(e.effects)&&(t.geometryEnginePromise=R(),r.push(t.geometryEnginePromise),t.geometryEnginePromise.then((e=>t.geometryEngine=e)))}export{ie as CIMSymbolHelper,oe as CIMSymbolInflatedSizeHelper,se as OverrideHelper,pe as slsDashToTemplateArray,Z as symbolToCIM};