12345 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.25/esri/copyright.txt for details.
- */
- 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 f}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as m}from"../../geometry/support/boundsUtils.js";import{createRendererExpression as y}from"../../support/arcadeOnDemand.js";import{Placement as h}from"./CIMPlacements.js";import{lineGapType2LineHeight as p,horizontalAlignment2HAlign as u,verticalAlignment2VAlign as M,EnvDrawHelper as d,Transformation as S,CanvasDrawHelper as b}from"./CIMSymbolDrawHelper.js";import{LineCapStyle as C,LineJoinStyle as g,BlockProgression as I,FontEffects as k,FontEncoding as x,FontType as w,GlyphHinting as P,TextReadingDirection as v,VerticalGlyphOrientation as L,BillBoardMode as D,TextureFilter as F,ExtremityPlacement as G}from"./enums.js";import{getValue as T,isCIMMarkerStrokePlacement as z,attributesToFields as O,analyzeTextParts as A,assignTextValuesFromFeature as E,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=10,W=96/72,J=Math.PI/180,K=a.getLogger("esri.symbols.cim.CIMSymbolHelper");function Q(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":t=oe.fromSimpleMarker(e);break;case"picture-marker":t=oe.fromPictureMarker(e);break;case"simple-line":t=oe.fromSimpleLineSymbol(e);break;case"simple-fill":t=oe.fromSimpleFillSymbol(e);break;case"picture-fill":t=oe.fromPictureFillSymbol(e);break;case"text":t=oe.fromTextSymbol(e)}return{type:"CIMSymbolReference",symbol:t}}function Z(e,t,r){switch(t.type){case"CIMSymbolReference":return Z(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 h;e.drawMarker(t,r);break}}return e.envelope()}function ee(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 te(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(T(e.offsetX)),Math.abs(T(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 re(e){if(!e)return 0;let t=0;for(const r of e)t+=te(r);return t}class ae{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&&(m(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(ue(t)){const i=this._getLayersInflateSize(e,t.symbolLayers,r,a,o),s=re(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;e.capStyle===C.Square||e.joinStyle===g.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;t[0]-=r,t[1]-=a,t[2]-=r,t[3]-=a;const o=e.size/(e.frame.ymax-e.frame.ymin);t[0]*=o,t[1]*=o,t[2]*=o,t[3]*=o}}else if("CIMPictureMarker"===n.type){const a=n,i=r.getResource(a.url);let s=1;o(i)&&i.height&&(s=i.width/i.height);const l=e.size/2,c=e.size*s*a.scaleX/2;t=[-c,-l,c,l]}else{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=T(e.rotation);if(e.rotateClockwise&&(s=-s),a&&(s-=a),s){const e=J*s,r=Math.cos(e),a=Math.sin(e),o=c([V,V,-V,-V]);f(o,[t[0]*r-t[1]*a,t[0]*a+t[1]*r]),f(o,[t[0]*r-t[3]*a,t[0]*a+t[3]*r]),f(o,[t[2]*r-t[1]*a,t[2]*a+t[1]*r]),f(o,[t[2]*r-t[3]*a,t[2]*a+t[3]*r]),t=o}let l=T(e.offsetX),m=T(e.offsetY);if(a){const e=J*a,t=Math.cos(e),r=Math.sin(e),o=l*r+m*t;l=l*t-m*r,m=o}t[0]+=l,t[1]+=m,t[2]+=l,t[3]+=m;const y=ee(e.markerPlacement);y>0&&(t[0]-=y,t[1]-=y,t[2]+=y,t[3]+=y);break}}const l=re(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??q;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||0===n.glyphMosaicItems.length)return e;const l=p(r.lineGapType,r.lineGap??0,o),c=t(s)[1],f=n.glyphMosaicItems,m=H(f,c,{scale:o/B,angle:T(r.angle),xOffset:T(r.offsetX),yOffset:T(r.offsetY),hAlign:u(r.horizontalAlignment),vAlign:M(r.verticalAlignment),maxLineWidth:512,lineHeight:X*Math.max(.25,Math.min(l||1,4)),decoration:r.font.decoration||"none",isCIM:!0}).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 oe{static getEnvelope(e,t,r){const a=new d(r);if(Array.isArray(e)){let r;for(const o of e)r?r.union(Z(a,o,t)):r=Z(a,o,t);return r}return Z(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)*W,o=(r.y+.5*r.height)*W,i=r.width*W+2,s=r.height*W+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)*W,n=(i.y+.5*i.height)*W;e.width=i.width*W,e.height=i.height*W,r||(e.width+=2,e.height+=2);const l=e.getContext("2d"),c=S.createScale(W,-W);c.translate(.5*e.width-s,.5*e.height+n);const f=new b(l,a,c);switch(t.type){case"CIMPointSymbol":{const e={type:"point",x:0,y:0};f.drawSymbol(t,e);break}case"CIMVectorMarker":{const e=new h;f.drawMarker(t,e);break}}const m=l.getImageData(0,0,e.width,e.height),y=new Uint8Array(m.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:f,xoffset:m,yoffset:y}=e;let h,p,u,M,d;o&&(h=o.family,p=o.style,u=o.weight,M=o.size,d=o.decoration);let S=!1;if(c){S=t(c)[1]}return{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:h||"Arial",fontStyleName:me(p,u),fontType:w.Unspecified,haloSize:s,height:M,hinting:P.Default,horizontalAlignment:le(n??"center"),kerning:l,letterWidth:100,ligatures:!0,lineGapType:"Multiple",offsetX:T(m),offsetY:T(y),strikethrough:"line-through"===d,underline:"underline"===d,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:S?v.RTL:v.LTR,verticalAlignment:ce(f??"baseline"),verticalGlyphOrientation:L.Right,wordSpacing:100,billboardMode3D:D.FaceNearPlane},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:se(e),joinStyle:ne(t),miterLimit:a,width:o})}let f=e.url;"esriPFS"===e.type&&e.imageData&&(f=e.imageData);const m="angle"in e?e.angle:0,y=a*(i||1),h=t*(n||1);return l.push({type:"CIMPictureFill",invertBackfaceTexture:!1,scaleX:1,textureFilter:F.Picture,tintColor:null,url:f,height:h,width:y,offsetX:T(o),offsetY:T(s),rotation:T(-m),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:se(e),joinStyle:ne(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:C.Butt,joinStyle:g.Miter,width:.75}]};let o=0;const s=l(de(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=G.Both;break;case"begin":e=G.JustBegin;break;case"end":e=G.JustEnd;break;default:e=G.None}const t=oe.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:se(t),joinStyle:ne(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:T(o),offsetY:T(i),rotation:T(-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]=Me("square");return{type:"CIMPointSymbol",symbolLayers:[{type:"CIMVectorMarker",enable:!0,rotation:T(-e.angle),size:T(e.size||6),offsetX:T(e.xoffset),offsetY:T(e.yoffset),frame:r,markerGraphics:[{type:"CIMMarkerGraphic",geometry:a,symbol:{type:"CIMPolygonSymbol",symbolLayers:t}}]}]}}const[i,s]=Me(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: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:T(-e.angle),size:T(e.size||6*t),offsetX:T(e.xoffset),offsetY:T(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=4,s=r(e.lineSymbol);let n=this._getLineSymbolPeriod(s)||i;for(;n<i;)n*=2;const l=n/2,c={xmin:-l,xmax:l,ymin:-o,ymax:o},f=s.symbolLayers.find((e=>"CIMSolidStroke"===e.type));f&&(f.width*=t);return{type:"CIMVectorMarker",frame:c,markerGraphics:[{type:"CIMMarkerGraphic",geometry:{paths:[[[-l,0],[l,0]]]},symbol:s}],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(Ce(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&&oe.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:K.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={type:e.type,...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,f,m;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,f=2*c;const h=new s(t.seed),p=i*a/1.5,u=i*o/1.5;m=[];for(let t=0;t<r;t++)for(let e=0;e<y;e++){const r=t*a-n+p*(.5-h.getFloat()),i=e*o-c+u*(.5-h.getFloat());m.push({x:r,y:i}),0===t&&m.push({x:r+2*n,y:i}),0===e&&m.push({x:r,y:i+2*c})}}else!0===t.shiftOddRows?(n=a/2,c=o,f=2*o,m=[{x:-n,y:0},{x:n,y:0},{x:0,y:c},{x:0,y:-c}]):(n=a/2,c=o/2,f=o,m=[{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:m.map((e=>({type:"CIMMarkerGraphic",geometry:e,symbol:{type:"CIMPointSymbol",symbolLayers:[r]}}))),size:f}}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;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;e>t&&(t=e);break}case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":case"CIMObjectMarker3D":case"CIMglTFMarker3D":if(z(r.markerPlacement)){const e=r.size;e>t&&(t=e)}}return t}}}static getMarkerScaleRatio(e){if(e&&"CIMVectorMarker"===e.type)if(!1!==e.scaleSymbolsProportionally&&e.frame){const t=e.frame.ymax-e.frame.ymin;return e.size/t}return 1}}class ie{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)ie.findApplicableOverrides(a,t,r);if(e.symbolLayers)for(const a of e.symbolLayers)ie.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)ie.findApplicableOverrides(a,t,r);if(e.markerPlacement&&ie.findApplicableOverrides(e.markerPlacement,t,r),"CIMVectorMarker"===e.type){if(e.markerGraphics)for(const a of e.markerGraphics)ie.findApplicableOverrides(a,t,r),ie.findApplicableOverrides(a.symbol,t,r)}else"CIMCharacterMarker"===e.type?ie.findApplicableOverrides(e.symbol,t,r):"CIMHatchFill"===e.type?ie.findApplicableOverrides(e.lineSymbol,t,r):"CIMPictureMarker"===e.type&&ie.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 f=!!c;if(!f&&!o)return l;l=r(l);let m=!0;if(t||(t={attributes:{}},m=!1),f){if(m||(c=c.filter((e=>!e.valueExpressionInfo?.expression.includes("$feature")))),n||(c=c.filter((e=>!e.valueExpressionInfo?.expression.includes("$view")))),c.length>0){const e=O(t.attributes);await ie.evaluateOverrides(c,t,{spatialReference:a,fields:e,geometryType:i},s,n)}ie.applyOverrides(l,c)}return o&&ie.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){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&&ie.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&&ie.applyDictionaryTextOverrides(e,t,r)}break;case"CIMMarkerGraphic":{const o=e.textString;if(o&&o.includes("[")){const i=A(o,r);e.textString=E(t,i,a)}}}}static applyOverrides(e,t,r,a){if(e.primitiveName)for(const i of t)if(i.primitiveName===e.primitiveName){const t=Se(i.propertyName);if(a&&a.push({cim:e,nocapPropertyName:t,value:e[t]}),i.expression&&(i.value=ie.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)ie.applyOverrides(o,t,r,a);if(e.symbolLayers)for(const o of e.symbolLayers)ie.applyOverrides(o,t,r,a);break;case"CIMTextSymbol":break;case"CIMSolidStroke":case"CIMSolidFill":case"CIMVectorMarker":if(e.effects)for(const o of e.effects)ie.applyOverrides(o,t,r,a);if("CIMVectorMarker"===e.type&&e.markerGraphics)for(const o of e.markerGraphics)ie.applyOverrides(o,t,r,a),ie.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 se=e=>{if(!e)return C.Butt;switch(e){case"butt":return C.Butt;case"square":return C.Square;case"round":return C.Round}},ne=e=>{if(!e)return g.Miter;switch(e){case"miter":return g.Miter;case"round":return g.Round;case"bevel":return g.Bevel}},le=e=>{if(i(e))return"Center";switch(e){case"left":return"Left";case"right":return"Right";case"center":return"Center"}},ce=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]},me=(e,t)=>{const r=ye(t),a=he(e);return r&&a?`${r}-${a}`:`${r}${a}`},ye=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 K.error("Unexpected: style does not require rasterization"),[0,0];default:return K.error(`Tried to rasterize SLS, but found an unexpected style: ${e}!`),[0,0]}};function ue(e){return void 0!==e.symbolLayers}const Me=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]},de=e=>"vertical"===e||"horizontal"===e||"cross"===e||"esriSFSCross"===e||"esriSFSVertical"===e||"esriSFSHorizontal"===e,Se=e=>e?e.charAt(0).toLowerCase()+e.substr(1):e;let be;function Ce(e,t,r){if(!e.effects||o(t.geometryEngine))return;if(be)return void r.push(be);N(e.effects)&&(be=R(),r.push(be),be.then((e=>t.geometryEngine=e)))}export{oe as CIMSymbolHelper,ae as CIMSymbolInflatedSizeHelper,ie as OverrideHelper,pe as slsDashToTemplateArray,Q as symbolToCIM};
|