cimAnalyzer.js 21 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/esri/copyright.txt for details.
  4. */
  5. import e from"../../Color.js";import{clone as t}from"../../core/lang.js";import i from"../../core/Logger.js";import{isSome as o}from"../../core/maybe.js";import{pt2px as r,px2pt as n}from"../../core/screenUtils.js";import{numericHash as l}from"../../core/string.js";import{createRendererExpression as a,ArcadeExpression as s}from"../../support/arcadeOnDemand.js";import{CIMSymbolHelper as c,OverrideHelper as f}from"./CIMSymbolHelper.js";import{Alignment as m,CapType as p,JoinType as u}from"./enums.js";import{getExtent as y,getSDFMetrics as h}from"./SDFHelper.js";import{fromCIMColor as g,getValue as d,_adjustTextCase as S,createLabelOverrideFunction as v,evaluateValueOrFunction as N,isGeometryEngineRequired as b,importGeometryEngine as O}from"./utils.js";import{CIMEffectHelper as C}from"./effects/CIMEffectHelper.js";import k from"../../views/2d/arcade/callExpressionWithFeature.js";import{RANDOM_INSIDE_POLYGON_TEXTURE_SIZE as P}from"../../views/2d/engine/webgl/definitions.js";import{getFontFamily as M}from"../../views/2d/engine/webgl/fontUtils.js";import{getMaterialGroup as I}from"../../views/2d/engine/webgl/grouping.js";const w=i.getLogger("esri.symbols.cim.cimAnalyzer");function L(e){switch(e){case"Butt":return p.BUTT;case"Square":return p.SQUARE;default:return p.ROUND}}function X(e){switch(e){case"Bevel":return u.BEVEL;case"Miter":return u.MITER;default:return u.ROUND}}function z(e){switch(e){case"Left":default:return"left";case"Right":return"right";case"Center":return"center";case"Justify":return w.warnOnce("Horizontal alignment 'justify' is not implemented. Falling back to 'center'."),"center"}}function A(e){switch(e){case"Top":default:return"top";case"Center":return"middle";case"Baseline":return"baseline";case"Bottom":return"bottom"}}function R(e){let t="",i="";if(e){const o=e.toLowerCase();o.includes("italic")?t="italic":o.includes("oblique")&&(t="oblique"),o.includes("bold")?i="bold":o.includes("light")&&(i="lighter")}return{style:t,weight:i}}function J(e){return e.underline?"underline":e.strikethrough?"line-through":"none"}function x(e,t,i,o){let r;e[t]?r=e[t]:(r={},e[t]=r),r[i]=o}function H(e){const t=e.markerPlacement;return t&&t.angleToLine?m.MAP:m.SCREEN}async function Y(e,t,i,o,r){const n=o??[];if(!e)return n;let l,s;const c={};if("CIMSymbolReference"!==e.type)return w.error("Expect cim type to be 'CIMSymbolReference'"),n;if(l=e.symbol,s=e.primitiveOverrides,s){const e=[];for(const i of s){const o=i.valueExpressionInfo;if(o&&t){const r=o.expression,n=a(r,t.spatialReference,t.fields).then((e=>{e&&x(c,i.primitiveName,i.propertyName,e)}));e.push(n)}else null!=i.value&&x(c,i.primitiveName,i.propertyName,i.value)}e.length>0&&await Promise.all(e)}const f=[];switch(fe(l,i,f),f.length>0&&await Promise.all(f),l.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":$(l,s,c,t,n,i,r)}return n}function $(e,t,i,o,r,n,l){if(!e)return;const a=e.symbolLayers;if(!a)return;const s=e.effects;let p;const u=c.getSize(e);"CIMPointSymbol"===e.type&&"Map"===e.angleAlignment&&(p=m.MAP);let y=a.length;for(;y--;){const c=a[y];if(!c||!1===c.enable)continue;let m;s&&s.length&&(m=[...s]);const h=c.effects;h&&h.length&&(s?m.push(...h):m=[...h]);const g=[];let d;f.findEffectOverrides(m,t,g),d=g.length>0?re(m,g,i,o):m;const S=[];switch(f.findApplicableOverrides(c,t,S),c.type){case"CIMSolidFill":E(c,d,i,S,o,r);break;case"CIMPictureFill":T(c,d,i,S,o,n,r);break;case"CIMHatchFill":j(c,d,i,S,o,r);break;case"CIMGradientFill":F(c,d,i,S,o,r);break;case"CIMSolidStroke":W(c,d,i,S,o,r,"CIMPolygonSymbol"===e.type,u);break;case"CIMPictureStroke":D(c,d,i,S,o,r,"CIMPolygonSymbol"===e.type,u);break;case"CIMGradientStroke":U(c,d,i,S,o,r,"CIMPolygonSymbol"===e.type,u);break;case"CIMCharacterMarker":if(G(c,d,i,S,o,r))break;break;case"CIMPictureMarker":if(G(c,d,i,S,o,r))break;"CIMLineSymbol"===e.type&&(p=H(c)),B(c,d,i,S,o,n,r,p,u);break;case"CIMVectorMarker":if(G(c,d,i,S,o,r))break;"CIMLineSymbol"===e.type&&(p=H(c)),q(c,d,i,S,o,r,n,p,u,l);break;default:w.error("Cannot analyze CIM layer",c.type)}}}function E(e,t,i,o,r,n){const a=e.primitiveName,s=g(e.color),[c,f]=ce(o,a,t,null,null),m=l(JSON.stringify(e)+f).toString();n.push({type:"fill",templateHash:m,materialHash:c?()=>m:m,cim:e,materialOverrides:null,colorLocked:e.colorLocked,color:ie(a,i,"Color",r,s,te),height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,effects:t,applyRandomOffset:!1,sampleAlphaOnly:!0})}function T(e,t,i,r,n,a,s){const c=e.primitiveName,f=e.tintColor?g(e.tintColor):{r:255,g:255,b:255,a:1},[m,p]=ce(r,c,t,null,null),u=l(JSON.stringify(e)+p).toString(),y=l(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString();let h=d(e.scaleX);if("width"in e){const t=e.width;let i=1;const r=a.getResource(e.url);o(r)&&(i=r.width/r.height),h/=i*(e.height/t)}s.push({type:"fill",templateHash:u,materialHash:m?()=>y:y,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,color:ie(c,i,"TintColor",n,f,te),height:ie(c,i,"Height",n,e.height),scaleX:ie(c,i,"ScaleX",n,h),angle:ie(c,i,"Rotation",n,d(e.rotation)),offsetX:ie(c,i,"OffsetX",n,d(e.offsetX)),offsetY:ie(c,i,"OffsetY",n,d(e.offsetY)),url:e.url,applyRandomOffset:!1,sampleAlphaOnly:!1})}function j(e,t,i,o,r,n){const a=["Rotation","OffsetX","OffsetY"],s=o.filter((t=>t.primitiveName!==e.primitiveName&&!a.includes(t.propertyName))),c=e.primitiveName,[f,m]=ce(o,c,t,null,null),p=l(JSON.stringify(e)+m).toString(),u=l(`${e.separation}${JSON.stringify(e.lineSymbol)}`).toString();let y={r:255,g:255,b:255,a:1};if(e.lineSymbol){const t=e.lineSymbol?.symbolLayers.find((e=>"CIMSolidStroke"===e.type));t&&(y=g(t.color))}n.push({type:"fill",templateHash:p,materialHash:f?ae(u,i,s,r):u,cim:e,materialOverrides:s,colorLocked:e.colorLocked,effects:t,color:y,height:ie(c,i,"Separation",r,e.separation),scaleX:1,angle:ie(c,i,"Rotation",r,d(e.rotation)),offsetX:ie(c,i,"OffsetX",r,d(e.offsetX)),offsetY:ie(c,i,"OffsetY",r,d(e.offsetY)),applyRandomOffset:!1,sampleAlphaOnly:!0})}function F(e,t,i,o,r,n){const a=e.primitiveName,[s,c]=ce(o,a,t,null,null),f=l(JSON.stringify(e)+c).toString();n.push({type:"fill",templateHash:f,materialHash:s?ae(f,i,o,r):f,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,applyRandomOffset:!1,sampleAlphaOnly:!1})}function W(e,t,i,o,r,n,a,s){const c=e.primitiveName,f=g(e.color),m=void 0!==e.width?e.width:4,p=L(e.capStyle),u=X(e.joinStyle),y=e.miterLimit,[h,d]=ce(o,c,t,null,null),S=l(JSON.stringify(e)+d).toString();let v,N;if(t&&t instanceof Array&&t.length>0){const e=t[t.length-1];if("CIMGeometricEffectDashes"===e.type&&"NoConstraint"===e.lineDashEnding&&null===e.offsetAlongLine){const e=(t=[...t]).pop();v=e.dashTemplate,N=e.scaleDash}}n.push({type:"line",templateHash:S,materialHash:h?()=>S:S,cim:e,materialOverrides:null,isOutline:a,colorLocked:e.colorLocked,effects:t,color:ie(c,i,"Color",r,f,te),width:ie(c,i,"Width",r,m),cap:ie(c,i,"CapStyle",r,p),join:ie(c,i,"JoinStyle",r,u),miterLimit:ie(c,i,"MiterLimit",r,y),referenceWidth:s,zOrder:ee(e.name),dashTemplate:v,scaleDash:N,sampleAlphaOnly:!0})}function D(e,t,i,o,r,n,a,s){const c=l(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),f=e.primitiveName,m=g(e.tintColor),p=void 0!==e.width?e.width:4,u=L(e.capStyle),y=X(e.joinStyle),h=e.miterLimit,[d,S]=ce(o,f,t,null,null),v=l(JSON.stringify(e)+S).toString();n.push({type:"line",templateHash:v,materialHash:d?()=>c:c,cim:e,materialOverrides:null,isOutline:a,colorLocked:e.colorLocked,effects:t,color:ie(f,i,"TintColor",r,m,te),width:ie(f,i,"Width",r,p),cap:ie(f,i,"CapStyle",r,u),join:ie(f,i,"JoinStyle",r,y),miterLimit:ie(f,i,"MiterLimit",r,h),referenceWidth:s,zOrder:ee(e.name),dashTemplate:null,scaleDash:!1,url:e.url,sampleAlphaOnly:!1})}function U(e,t,i,o,r,n,a,s){const c=e.primitiveName,f=void 0!==e.width?e.width:4,m=L(e.capStyle),p=X(e.joinStyle),u=e.miterLimit,[y,h]=ce(o,c,t,null,null),g=l(JSON.stringify(e)+h).toString();n.push({type:"line",templateHash:g,materialHash:y?ae(g,i,o,r):g,cim:e,materialOverrides:null,isOutline:a,colorLocked:e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},width:ie(c,i,"Width",r,f),cap:ie(c,i,"CapStyle",r,m),join:ie(c,i,"JoinStyle",r,p),miterLimit:ie(c,i,"MiterLimit",r,u),referenceWidth:s,zOrder:ee(e.name),dashTemplate:null,scaleDash:!1,sampleAlphaOnly:!1})}function G(e,t,i,o,r,a){const s=e.markerPlacement;if(!s||"CIMMarkerPlacementInsidePolygon"!==s.type)return!1;const c=s,f=Math.abs(c.stepX),m=Math.abs(c.stepY);if(0===f||0===m)return!0;const p=["Rotation","OffsetX","OffsetY"],u=o.filter((t=>t.primitiveName!==e.primitiveName&&!p.includes(t.propertyName))),y="url"in e?e.url:null,[h,S]=ce(o,c.primitiveName,t,null,null),v=l(JSON.stringify(e)+S).toString();let N,b,O=null;if("Random"===s.gridType){const e=n(P),t=Math.max(Math.floor(e/f),1),i=Math.max(Math.floor(e/m),1);N=m*i,O=e=>e?e*i:0;b=t*f/N}else s.shiftOddRows?(N=2*m,O=e=>e?2*e:0,b=f/m*.5):(N=m,O=null,b=f/m);let C={r:255,g:255,b:255,a:1};return"tintColor"in e&&(C=g(e.tintColor)),a.push({type:"fill",templateHash:v,materialHash:h?ae(v,i,u,r):v,cim:e,materialOverrides:u,colorLocked:e.colorLocked,effects:t,color:ie(c.primitiveName,i,"TintColor",r,C,te),height:ie(c.primitiveName,i,"StepY",r,N,O),scaleX:b,angle:ie(c.primitiveName,i,"GridAngle",r,c.gridAngle),offsetX:ie(c.primitiveName,i,"OffsetX",r,d(c.offsetX)),offsetY:ie(c.primitiveName,i,"OffsetY",r,d(c.offsetY)),url:y,applyRandomOffset:"Random"===s.gridType,sampleAlphaOnly:!y}),!0}function B(e,t,i,r,n,a,s,c,f){const m=e.primitiveName,p=d(e.size);let u=d(e.scaleX);const y=d(e.rotation),h=d(e.offsetX),S=d(e.offsetY),v=e.tintColor?g(e.tintColor):{r:255,g:255,b:255,a:1},b=l(`${e.url}${JSON.stringify(e.colorSubstitutions)}${JSON.stringify(e.animatedSymbolProperties)}`).toString(),O=ne(e.markerPlacement,r,i,n),C=le(e.animatedSymbolProperties,r,i,n),[k,P]=ce(r,m,t,O,C),M=l(JSON.stringify(e)+P).toString(),w=e.anchorPoint??{x:0,y:0};if("width"in e){const t=e.width;let i=1;const r=a.getResource(e.url);o(r)&&(i=r.width/r.height),u/=i*(p/t)}function L(e,t){return N(C,e,t)}const X=e.animatedSymbolProperties&&!0===e.animatedSymbolProperties.randomizeStartTime?(e,t,i,o)=>{const r=I(o),n=L(e,t);return b+`-MATERIALGROUP(${r})`+`-ASP(${JSON.stringify(n)})`}:k?(e,t)=>{const i=L(e,t);return b+`-ASP(${JSON.stringify(i)})`}:b;s.push({type:"marker",templateHash:M,materialHash:X,cim:e,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:!1,alignment:c,size:ie(m,i,"Size",n,p),scaleX:ie(m,i,"ScaleX",n,u),rotation:ie(m,i,"Rotation",n,y),offsetX:ie(m,i,"OffsetX",n,h),offsetY:ie(m,i,"OffsetY",n,S),color:ie(m,i,"TintColor",n,v,te),anchorPoint:{x:w.x,y:-w.y},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,frameHeight:0,rotateClockwise:e.rotateClockwise,referenceSize:f,sizeRatio:1,markerPlacement:O,url:e.url,animatedSymbolProperties:C})}function q(e,t,i,o,r,n,l,a,s,c){const f=e.markerGraphics;if(!f)return;let m=0;if(e.scaleSymbolsProportionally){const t=e.frame;t&&(m=t.ymax-t.ymin)}const p=ne(e.markerPlacement,o,i,r);for(const u of f)if(u){const f=u.symbol;if(!f)continue;switch(f.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":K(e,t,p,null,u,o,i,r,n,l,a,s,m,c);break;case"CIMTextSymbol":V(e,t,p,u,i,o,r,n,a,s,m)}}}function V(e,t,i,o,r,n,a,s,m,p,u){const y=[];f.findApplicableOverrides(o,n,y);const h=o.geometry;if(!("x"in h)||!("y"in h))return;const b=o.symbol,O=J(b),C=R(b.fontStyleName),k=M(b.fontFamilyName);b.font={family:k,decoration:O,...C};const P=e.frame,I=h.x-.5*(P.xmin+P.xmax),w=h.y-.5*(P.ymin+P.ymax),L=e.size/u,X=e.primitiveName,x=d(b.height)*L,H=d(b.angle),Y=d(e.offsetX)+(d(b.offsetX)+I)*L,$=d(e.offsetY)+(d(b.offsetY)+w)*L,E=g(c.getFillColor(b));let T=g(c.getStrokeColor(b)),j=c.getStrokeWidth(b);j||(T=g(c.getFillColor(b.haloSymbol)),j=b.haloSize*L);const[F,W]=ce(n,X,t,i,null),D=JSON.stringify(e.effects)+Number(e.colorLocked)+JSON.stringify(e.anchorPoint)+e.anchorPointUnits+JSON.stringify(e.markerPlacement),U=l(JSON.stringify(o)+D+W).toString();let G=ie(o.primitiveName,r,"TextString",a,o.textString,S,b.textCase);if(null==G)return;const{fontStyleName:B}=b,q=k+(B?"-"+B.toLowerCase():"-regular"),V=q;"string"==typeof G&&G.includes("[")&&b.fieldMap&&(G=v(b.fieldMap,G,b.textCase)),s.push({type:"text",templateHash:U,materialHash:F||"function"==typeof G||G.match(/\[(.*?)\]/)?(e,t,i)=>V+"-"+N(G,e,t,i):V+"-"+l(G),cim:b,materialOverrides:null,colorLocked:e.colorLocked,effects:t,alignment:m,anchorPoint:{x:e.anchorPoint?e.anchorPoint.x:0,y:e.anchorPoint?e.anchorPoint.y:0},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,fontName:q,decoration:O,weight:ie(X,r,"Weight",a,C.weight),style:ie(X,r,"Size",a,C.style),size:ie(X,r,"Size",a,x),angle:ie(X,r,"Rotation",a,H),offsetX:ie(X,r,"OffsetX",a,Y),offsetY:ie(X,r,"OffsetY",a,$),horizontalAlignment:z(b.horizontalAlignment),verticalAlignment:A(b.verticalAlignment),text:G,color:E,outlineColor:T,outlineSize:j,referenceSize:p,sizeRatio:1,markerPlacement:i})}function K(e,t,i,r,n,a,s,f,m,p,u,S,v,N){const b=n.symbol,O=b.symbolLayers;if(!O)return;if(N)return void _(e,t,i,r,n,s,a,f,m,p,u,S,v);let k=O.length;if(me(O))return void Q(e,t,i,r,n,O,a,s,f,m,u,S,v);const P=C.applyEffects(b.effects,n.geometry,p.geometryEngine);if(P)for(;k--;){const N=O[k];if(N&&!1!==N.enable)switch(N.type){case"CIMSolidFill":case"CIMSolidStroke":{const b=C.applyEffects(N.effects,P,p.geometryEngine),O=y(b);if(!O)continue;const[k,M,I]=h(O,e.frame,e.size,e.anchorPoint,"Relative"!==e.anchorPointUnits),w="CIMSolidFill"===N.type,L={type:"sdf",geom:b,asFill:w},X=e.primitiveName,z=d(e.size)??10,A=d(e.rotation),R=d(e.offsetX),J=d(e.offsetY),x=N.path,H=N.primitiveName,Y=g(w?c.getFillColor(N):c.getStrokeColor(N)),$=w?{r:0,g:0,b:0,a:0}:g(c.getStrokeColor(N)),E=c.getStrokeWidth(N);if(!w&&!E)break;let T=!1,j="";for(const e of a)e.primitiveName!==H&&e.primitiveName!==X||(void 0!==e.value?j+=`-${e.primitiveName}-${e.propertyName}-${JSON.stringify(e.value)}`:e.valueExpressionInfo&&(T=!0));o(t)&&"function"==typeof t&&(T=!0);const F=JSON.stringify({...e,markerGraphics:null}),W=l(JSON.stringify(L)+x).toString(),D={type:"marker",templateHash:l(JSON.stringify(n)+JSON.stringify(N)+F+j).toString(),materialHash:T?()=>W:W,cim:L,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:u,anchorPoint:{x:M,y:I},isAbsoluteAnchorPoint:!1,size:ie(e.primitiveName,s,"Size",f,z),rotation:ie(e.primitiveName,s,"Rotation",f,A),offsetX:ie(e.primitiveName,s,"OffsetX",f,R),offsetY:ie(e.primitiveName,s,"OffsetY",f,J),scaleX:1,frameHeight:v,rotateClockwise:e.rotateClockwise,referenceSize:S,sizeRatio:k,color:ie(H,s,"Color",f,Y,te),outlineColor:ie(H,s,"Color",f,$,te),outlineWidth:ie(H,s,"Width",f,E),markerPlacement:i,animatedSymbolProperties:r,path:x};m.push(D);break}default:_(e,t,i,r,n,s,a,f,m,p,u,S,v)}}}function Q(e,t,i,o,r,n,a,s,f,m,p,u,S){const v=r.geometry,N=n[0],b=n[1],O=y(v);if(!O)return;const[C,k,P]=h(O,e.frame,e.size,e.anchorPoint,"Relative"!==e.anchorPointUnits),M={type:"sdf",geom:v,asFill:!0},I=e.primitiveName,w=d(e.size),L=d(e.rotation),X=d(e.offsetX),z=d(e.offsetY),A=b.path,R=b.primitiveName,J=N.primitiveName,x=g(c.getFillColor(b)),H=g(c.getStrokeColor(N)),Y=c.getStrokeWidth(N);let $=!1,E="";for(const l of a)l.primitiveName!==R&&l.primitiveName!==J&&l.primitiveName!==I||(void 0!==l.value?E+=`-${l.primitiveName}-${l.propertyName}-${JSON.stringify(l.value)}`:l.valueExpressionInfo&&($=!0));const T=JSON.stringify({...e,markerGraphics:null}),j=l(JSON.stringify(M)+A).toString(),F={type:"marker",templateHash:l(JSON.stringify(r)+JSON.stringify(b)+JSON.stringify(N)+T+E).toString(),materialHash:$?()=>j:j,cim:M,materialOverrides:null,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:p,anchorPoint:{x:k,y:P},isAbsoluteAnchorPoint:!1,size:ie(e.primitiveName,s,"Size",f,w),rotation:ie(e.primitiveName,s,"Rotation",f,L),offsetX:ie(e.primitiveName,s,"OffsetX",f,X),offsetY:ie(e.primitiveName,s,"OffsetY",f,z),scaleX:1,frameHeight:S,rotateClockwise:e.rotateClockwise,referenceSize:u,sizeRatio:C,color:ie(R,s,"Color",f,x,te),outlineColor:ie(J,s,"Color",f,H,te),outlineWidth:ie(J,s,"Width",f,Y),markerPlacement:i,path:A,animatedSymbolProperties:o};m.push(F)}function _(e,t,i,n,a,s,f,m,p,u,y,h,g){const S=Z(e,a);let v=[];const N=["Rotation","OffsetX","OffsetY"];v=f.filter((t=>t.primitiveName!==e.primitiveName||!N.includes(t.propertyName)));let b="";for(const o of f)void 0!==o.value&&(b+=`-${o.primitiveName}-${o.propertyName}-${JSON.stringify(o.value)}`);const[O,C,k]=c.getTextureAnchor(S,u),P=e.primitiveName,M=d(e.rotation),I=d(e.offsetX),w=d(e.offsetY),L=l(JSON.stringify(S)+b).toString(),X={type:"marker",templateHash:L,materialHash:v.length>0||o(t)&&"function"==typeof t?ae(L,s,v,m):L,cim:S,materialOverrides:v,colorLocked:e.colorLocked,effects:t,scaleSymbolsProportionally:e.scaleSymbolsProportionally,alignment:y,anchorPoint:{x:O,y:C},isAbsoluteAnchorPoint:!1,size:e.size,rotation:ie(P,s,"Rotation",m,M),offsetX:ie(P,s,"OffsetX",m,I),offsetY:ie(P,s,"OffsetY",m,w),color:{r:255,g:255,b:255,a:1},outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,scaleX:1,frameHeight:g,rotateClockwise:e.rotateClockwise,referenceSize:h,sizeRatio:k/r(e.size),markerPlacement:i,animatedSymbolProperties:n};p.push(X)}function Z(e,t){return{type:e.type,enable:!0,name:e.name,colorLocked:e.colorLocked,primitiveName:e.primitiveName,anchorPoint:e.anchorPoint,anchorPointUnits:e.anchorPointUnits,offsetX:0,offsetY:0,rotateClockwise:e.rotateClockwise,rotation:0,size:e.size,billboardMode3D:e.billboardMode3D,depth3D:e.depth3D,frame:e.frame,markerGraphics:[t],scaleSymbolsProportionally:e.scaleSymbolsProportionally,respectFrame:e.respectFrame,clippingPath:e.clippingPath}}function ee(e){if(e&&0===e.indexOf("Level_")){const t=parseInt(e.substr(6),10);if(!isNaN(t))return t}return 0}function te(t){if(!t||0===t.length)return null;const i=new e(t).toRgba();return{r:i[0],g:i[1],b:i[2],a:i[3]}}function ie(e,t,i,o,r,n,l){const a=t[e];if(a){const e=a[i];if("string"==typeof e||"number"==typeof e||e instanceof Array)return n?n.call(null,e,l):e;if(null!=e&&e instanceof s)return(t,i,a)=>{let s=k(e,t,{$view:a},o.geometryType,i);return null!==s&&n&&(s=n.call(null,s,l)),null!==s?s:r}}return r}function oe(e){return e?e.charAt(0).toLowerCase()+e.substr(1):e}function re(e,i,o,r){for(const t of i){if(t.valueExpressionInfo){const e=o[t.primitiveName]&&o[t.primitiveName][t.propertyName];e instanceof s&&(t.fn=(t,i,o)=>k(e,t,{$view:o},r.geometryType,i))}}return(o,r,n)=>{for(const e of i)e.fn&&(e.value=e.fn(o,r,n));const l=[];for(let a of e){const e=a?.primitiveName;if(e){let o=!1;for(const r of i)if(r.primitiveName===e){const e=oe(r.propertyName);null!=r.value&&r.value!==a[e]&&(o||(a=t(a),o=!0),a[e]=r.value)}}l.push(a)}return l}}function ne(e,i,o,r){const n=[];if(f.findApplicableOverrides(e,i,n),0===n.length)return e;for(const t of n){if(t.valueExpressionInfo){const e=o[t.primitiveName]&&o[t.primitiveName][t.propertyName];e instanceof s&&(t.fn=(t,i,o)=>k(e,t,{$view:o},r.geometryType,i))}}return(i,o,r)=>{for(const e of n)e.fn&&(e.value=e.fn(i,o,r));const l=t(e),a=e.primitiveName;for(const e of n)if(e.primitiveName===a){const t=oe(e.propertyName);null!=e.value&&e.value!==l[t]&&(l[t]=e.value)}return l}}function le(e,i,o,r){const n=[];if(f.findApplicableOverrides(e,i,n),0===n.length)return e;for(const t of n){if(t.valueExpressionInfo){const e=o[t.primitiveName]&&o[t.primitiveName][t.propertyName];e instanceof s&&(t.fn=(t,i,o)=>k(e,t,{$view:o},r.geometryType,i))}}return(i,o,r)=>{for(const e of n)e.fn&&(e.value=e.fn(i,o,r));const l=t(e),a=e.primitiveName;for(const e of n)if(e.primitiveName===a){const t=oe(e.propertyName);null!=e.value&&e.value!==l[t]&&(l[t]=e.value)}return l}}function ae(e,t,i,o){for(const r of i){if(r.valueExpressionInfo){const e=t[r.primitiveName]&&t[r.primitiveName][r.propertyName];e instanceof s&&(r.fn=(t,i,r)=>k(e,t,{$view:r},o.geometryType,i))}}return(t,o,r)=>{for(const e of i)e.fn&&(e.value=e.fn(t,o,r));return l(e+f.buildOverrideKey(i)).toString()}}function se(e,t){if(!t||0===t.length)return e;const i=JSON.parse(JSON.stringify(e));return f.applyOverrides(i,t),i}function ce(e,t,i,r,n){let l=!1,a="";for(const o of e)o.primitiveName===t&&(void 0!==o.value?a+=`-${o.primitiveName}-${o.propertyName}-${JSON.stringify(o.value)}`:o.valueExpressionInfo&&(l=!0));return o(i)&&"function"==typeof i&&(l=!0),o(r)&&"function"==typeof r&&(l=!0),o(n)&&"function"==typeof n&&(l=!0),[l,a]}function fe(e,t,i){if(e&&t)switch(e.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":{const o=e.symbolLayers;if(!o)return;for(const e of o)switch(ue(e,t,i),e.type){case"CIMPictureFill":case"CIMHatchFill":case"CIMGradientFill":case"CIMPictureStroke":case"CIMGradientStroke":case"CIMCharacterMarker":case"CIMPictureMarker":"url"in e&&e.url&&i.push(t.fetchResource(e.url,null));break;case"CIMVectorMarker":{const o=e.markerGraphics;if(!o)continue;for(const e of o)if(e){const o=e.symbol;o&&fe(o,t,i)}}}}}}const me=e=>e&&2===e.length&&e[0].enable&&e[1].enable&&"CIMSolidStroke"===e[0].type&&"CIMSolidFill"===e[1].type&&!e[0].effects&&!e[1].effects;let pe;function ue(e,t,i){if(!e.effects||o(t.geometryEngine))return;if(pe)return void i.push(pe);b(e.effects)&&(pe=O(),i.push(pe),pe.then((e=>t.geometryEngine=e)))}export{se as analyzeCIMResource,Y as analyzeCIMSymbol};