@arcgis/core 5.2.0-next.60 → 5.2.0-next.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/applications/Components/imageryUtils.d.ts +10 -0
  2. package/applications/Components/imageryUtils.js +1 -1
  3. package/arcgisGlobal.d.ts +2 -0
  4. package/assets/esri/core/workers/RemoteClient.js +1 -1
  5. package/assets/esri/core/workers/chunks/{3abc12d2407e4214963d.js → 13033178de9f637a2356.js} +1 -1
  6. package/assets/esri/core/workers/chunks/{d205edd949f3e6e24eb9.js → 147a89553188cc6aabf4.js} +1 -1
  7. package/assets/esri/core/workers/chunks/{3157f85bb319294878ca.js → 1b68b1b724ad30396723.js} +2 -2
  8. package/assets/esri/core/workers/chunks/{127b111ee53e4b9184f8.js → 4dcd4a052b40047a9230.js} +1 -1
  9. package/assets/esri/core/workers/chunks/{aaa66a04b882b0ba2961.js → 5600fc334d20c4f0c83d.js} +1 -1
  10. package/assets/esri/core/workers/chunks/{14c066c31fe37b7f6e63.js → 638ed1297efdb24f4711.js} +1 -1
  11. package/assets/esri/core/workers/chunks/{42692a4ce3fb364e321e.js → 763cbb6716e398436a6d.js} +1 -1
  12. package/assets/esri/core/workers/chunks/{d6aad815fc0ee8e24bb5.js → 7ce52b850dd785bfa33f.js} +1 -1
  13. package/assets/esri/core/workers/chunks/{81659d121ed732bda907.js → a12803108c3b12808698.js} +2 -2
  14. package/assets/esri/core/workers/chunks/{5527b2da4abe0faa98bb.js → a494abeb026d536d9fae.js} +1 -1
  15. package/assets/esri/core/workers/chunks/{498d29e8c8be4a12ba12.js → b958f87f23f984131d09.js} +1 -1
  16. package/assets/esri/core/workers/chunks/{4e2f3dd158a5228c87ba.js → c85ba0700eafdc8d6f9e.js} +1 -1
  17. package/assets/esri/core/workers/chunks/{edf87407dd20685c82ab.js → e287113777a94ded8de6.js} +1 -1
  18. package/assets/esri/core/workers/chunks/{a615a644086e98a90579.js → f4891345507df63cff3c.js} +2 -2
  19. package/assets/esri/core/workers/chunks/{4fb549f11e176fc2f24a.js → f7fa932ade85cb2847b6.js} +1 -1
  20. package/config.js +1 -1
  21. package/core/screenUtils.js +1 -1
  22. package/geometry/support/intersectsBase.js +1 -1
  23. package/interfaces.d.ts +14 -0
  24. package/kernel.js +1 -1
  25. package/package.json +3 -3
  26. package/popup/FeatureContent.d.ts +311 -0
  27. package/popup/FeatureContent.js +2 -0
  28. package/popup/FeatureContentCollection.d.ts +569 -0
  29. package/popup/FeatureContentCollection.js +2 -0
  30. package/support/revision.js +1 -1
  31. package/symbols/cim/CIMSymbolDrawHelper.js +1 -1
  32. package/views/2d/layers/BaseLayerView2D.d.ts +2 -2
  33. package/views/2d/layers/BaseLayerViewGL2D.d.ts +2 -2
  34. package/views/2d/layers/graphics/GraphicStore.js +1 -1
  35. package/views/2d/support/hitTestUtils.js +1 -1
  36. package/views/3d/layers/FlowSubView3D.js +1 -1
  37. package/views/3d/layers/I3SMeshView3D.js +1 -1
  38. package/views/3d/layers/MediaLayerView3D.js +1 -1
  39. package/views/3d/layers/PointCloudLayerView3D.js +1 -1
  40. package/views/3d/layers/graphics/Deconflictor.js +1 -1
  41. package/views/3d/layers/graphics/Graphics3DCore.js +1 -1
  42. package/views/3d/layers/support/FeatureTileFetcher3D.js +1 -1
  43. package/views/3d/layers/support/HeatmapFeatureProcessor.js +1 -1
  44. package/views/3d/state/controllers/ZoomStepControllerGlobal.js +1 -1
  45. package/views/3d/state/controllers/ZoomStepControllerLocal.js +1 -1
  46. package/views/3d/support/buffer/glUtil.js +1 -1
  47. package/views/3d/support/flow/FlowSubViewTiles3D.js +1 -1
  48. package/views/3d/support/gaussianSplatting/GaussianSplatFadeHelper.js +1 -1
  49. package/views/3d/support/gaussianSplatting/GaussianSplatFadeTexture.js +1 -1
  50. package/views/3d/support/gaussianSplatting/GaussianSplatOrderTexture.js +1 -1
  51. package/views/3d/webgl-engine/core/FBOCache.js +1 -1
  52. package/views/3d/webgl-engine/core/FBOCacheUsage.js +1 -1
  53. package/views/3d/webgl-engine/core/shaderLibrary/TextureBackedBufferFields.glsl.js +11 -11
  54. package/views/3d/webgl-engine/lib/PathGeometry.js +1 -1
  55. package/views/3d/webgl-engine/lib/ShadowAccumulator.js +1 -1
  56. package/views/3d/webgl-engine/lib/TextureBackedBuffer/TextureBackedBuffer.js +1 -1
  57. package/views/3d/webgl-engine/lib/TextureBackedBuffer/TextureBackedBufferFieldCreation.js +1 -1
  58. package/views/3d/webgl-engine/lib/ViewshedShadowMap.js +1 -1
  59. package/views/3d/webgl-engine/lib/lodRendering/LodResources.js +1 -1
  60. package/views/3d/webgl-engine/lib/screenPolygonTriangleIntersections.js +1 -1
  61. package/views/3d/webgl-engine/materials/PathMaterial.js +1 -1
  62. package/views/View2D.d.ts +2 -2
  63. package/views/interactive/snapping/featureSources/WorkerTileTreeDebugger.js +1 -1
  64. package/views/webgl/FramebufferObject.js +1 -1
  65. package/widgets/Legend/support/heatmapRampUtils.js +1 -1
  66. /package/assets/esri/core/workers/chunks/{81659d121ed732bda907.js.LICENSE.txt → a12803108c3b12808698.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import{defaultFontFamily as t}from"../../core/fontUtils.js";import has from"../../core/has.js";import{clone as e}from"../../core/lang.js";import i from"../../core/Logger.js";import{deg2rad as s}from"../../core/mathUtils.js";import r from"../../core/ObjectPool.js";import{px2pt as a,pt2px as n}from"../../core/screenUtils.js";import{GeometryCursor as o}from"../../geometry/GeometryCursor.js";import{fromValues as l,empty as h,expandPointInPlace as c,center as m,width as f,height as u,diagonal as d,create as p}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as g}from"../../geometry/support/boundsUtils.js";import{polygonCentroid as _}from"../../geometry/support/centroid.js";import{targetIntersectsPolygon as y,pointInPolygon as P,nearLine as x}from"../../geometry/support/intersectsBase.js";import{isPolygon as S,isPolyline as w,isExtent as M,isMultipoint as b,isPoint as T}from"../../geometry/support/jsonTypeUtils.js";import{SimpleEffectCursor as k}from"./CIMEffects.js";import C from"./CIMImageColorSubstitutionHelper.js";import{getEffectOperator as v,getPlacementOperator as I}from"./CIMOperators.js";import{Placement as R}from"./CIMPlacements.js";import{defaultCIMValues as z}from"./defaultCIMValues.js";import{getFirstFrame as L}from"./imageUtils.js";import{rotate as U}from"./mathUtils.js";import{addColorStops as F}from"./rasterizingUtils.js";import A from"./Rect.js";import{parseRichTextRuns as j,hasRichTextFormattingTags as D}from"./richTextUtils.js";import G from"./TextRasterizer.js";import{getNumericValue as H,isSVGImage as E,getRelativeGradientSize as B,getEffectsInflateSize as X,fromCIMFontDecoration as J,fromCIMFontStyle as N,fromCIMHorizontalAlignment as O,fromCIMVerticalAlignment as q,getFillColor as V,getStrokeColor as Y,getStrokeWidth as W,getFontWeight as K,getFontStyle as $,isCIMFill as Q,getSize as Z}from"./utils.js";import{destroyHiddenSvg as tt,createHiddenSvg as et,createSvgElement as it}from"../../views/2d/engine/svgUtils.js";import{magicLabelLineHeight as st,glyphSize as rt,hittestToleranceSmallSymbol as at,hittestSmallSymbolThreshold as nt}from"../../views/2d/engine/webgl/definitions.js";import{shapeTextResource as ot}from"../../views/2d/engine/webgl/mesh/templates/shapingUtils.js";import{roundPtToWholePixel as lt,getLineWidth as ht}from"../../views/2d/layers/graphics/graphicsUtils.js";const ct=Math.PI/180,mt=.5,ft=()=>i.getLogger("esri.symbols.cim.CIMSymbolDrawHelper");class ut{constructor(t){this._t=t}static createIdentity(){return new ut([1,0,0,0,1,0])}clone(){const t=this._t;return new ut(t.slice())}transform(t){const e=this._t;return[e[0]*t[0]+e[1]*t[1]+e[2],e[3]*t[0]+e[4]*t[1]+e[5]]}static createScale(t,e){return new ut([t,0,0,0,e,0])}scale(t,e){const i=this._t;return i[0]*=t,i[1]*=t,i[2]*=t,i[3]*=e,i[4]*=e,i[5]*=e,this}scaleRatio(){return Math.sqrt(this._t[0]*this._t[0]+this._t[1]*this._t[1])}static createTranslate(t,e){return new ut([0,0,t,0,0,e])}translate(t,e){const i=this._t;return i[2]+=t,i[5]+=e,this}static createRotate(t){const e=Math.cos(t),i=Math.sin(t);return new ut([e,-i,0,i,e,0])}rotate(t){return ut.multiply(this,ut.createRotate(t),this)}angle(){const t=this._t[0],e=this._t[3],i=Math.sqrt(t*t+e*e);return[t/i,e/i]}static multiply(t,e,i){const s=t._t,r=e._t,a=s[0]*r[0]+s[3]*r[1],n=s[1]*r[0]+s[4]*r[1],o=s[2]*r[0]+s[5]*r[1]+r[2],l=s[0]*r[3]+s[3]*r[4],h=s[1]*r[3]+s[4]*r[4],c=s[2]*r[3]+s[5]*r[4]+r[5],m=i._t;return m[0]=a,m[1]=n,m[2]=o,m[3]=l,m[4]=h,m[5]=c,i}invert(){const t=this._t;let e=t[0]*t[4]-t[1]*t[3];if(0===e)return new ut([0,0,0,0,0,0]);e=1/e;const i=(t[1]*t[5]-t[2]*t[4])*e,s=(t[2]*t[3]-t[0]*t[5])*e,r=t[4]*e,a=-t[1]*e,n=-t[3]*e,o=t[0]*e;return new ut([r,a,i,n,o,s])}}class dt{constructor(t,e){this._resourceManager=t,this._transfos=[],this._sizeTransfos=[],this._textScaling=[],this._geomUnitsPerPoint=1,this._placementPool=new r(()=>new R,void 0,void 0,100),this._earlyReturn=!1,this._mapRotation=0,this._transfos.push(e||ut.createIdentity()),this._sizeTransfos.push(e?e.scaleRatio():1),this._textScaling.push(1)}setTransform(t,e){this._transfos=[t||ut.createIdentity()],this._sizeTransfos=[e||(t?t.scaleRatio():1)],this._textScaling=[1]}setGeomUnitsPerPoint(t){this._geomUnitsPerPoint=t}transformPt(t){return this._transfos[this._transfos.length-1].transform(t)}transformSize(t){return t*this._sizeTransfos[this._sizeTransfos.length-1]}scaleText(t){return t*this._textScaling[this._textScaling.length-1]}reverseTransformPt(t){return this._transfos[this._transfos.length-1].invert().transform(t)}reverseTransformSize(t){return t/this._sizeTransfos[this._sizeTransfos.length-1]}reverseTransformScalar(t){return t/this._transfos[this._transfos.length-1].scaleRatio()}reverseScaleText(t){return t/this._textScaling[this._textScaling.length-1]}getTransformAngle(){return this._transfos[this._transfos.length-1].angle()}geomUnitsPerPoint(){return this.isEmbedded()?1:this._geomUnitsPerPoint}prevGeomUnitsPerPoint(){return this._transfos.length>2?1:this._geomUnitsPerPoint}isEmbedded(){return this._transfos.length>1}back(){return this._transfos[this._transfos.length-1]}push(t,e=!1,i=1){const s=e?t.scaleRatio():1;ut.multiply(t,this.back(),t),this._transfos.push(t),this._sizeTransfos.push(this._sizeTransfos[this._sizeTransfos.length-1]*s),this._textScaling.push(this._textScaling[this._textScaling.length-1]*i)}pop(){this._transfos.splice(-1,1),this._sizeTransfos.splice(-1,1),this._textScaling.splice(-1,1)}drawSymbol(t,e,i){if(t)switch(t.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this.drawMultiLayerSymbol(t,e);break;case"CIMTextSymbol":this.drawTextSymbol(t,e,i)}}drawMultiLayerSymbol(t,e){if(!t||!e)return;const i=t.symbolLayers;if(!i)return;const s=t.effects;if(s&&s.length>0){const t=this.executeEffects(s,e);if(t){let e=t.next();for(;e;)this.drawSymbolLayers(i,e.asJSON()),e=t.next()}}else this.drawSymbolLayers(i,e)}executeEffects(t,e){const i=this.geomUnitsPerPoint(),s=null,r=X(t),a=!1;let n=new k(o.fromJSONCIM(e));for(const o of t){const t=v(o);t&&(n=t.execute(n,o,{geomUnitsPerPoint:i,tileKey:s,maxInflateSize:r,scale:null,spatialReference:e.spatialReference,preventClipping:a}))}return n}drawSymbolLayers(t,e){let i=t.length;for(;i--;){const s=t[i];if(!s||!1===s.enable)continue;const r=s.effects;if(r&&r.length>0){const t=this.executeEffects(r,e);if(t){let e=null;for(;(e=t.next())&&(this.drawSymbolLayer(s,e.asJSON()),!this._earlyReturn););}}else this.drawSymbolLayer(s,e);if(this._earlyReturn)return}}drawSymbolLayer(t,e){switch(t.type){case"CIMSolidFill":this.drawSolidFill(e,t.color,t.path);break;case"CIMHatchFill":this.drawHatchFill(e,t);break;case"CIMPictureFill":this.drawPictureFill(e,t);break;case"CIMGradientFill":this.drawGradientFill(e,t);break;case"CIMSolidStroke":this.drawSolidStroke(e,t.color,t.width,t.capStyle,t.joinStyle,t.miterLimit,t.path);break;case"CIMPictureStroke":this.drawPictureStroke(e,t);break;case"CIMGradientStroke":this.drawGradientStroke(e,t);break;case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":this.drawMarkerLayer(t,e)}}drawHatchFill(t,e){const i=yt(e,t,this.geomUnitsPerPoint());i&&(this.pushClipPath(t),this.drawMultiLayerSymbol(e.lineSymbol,i),this.popClipPath())}drawPictureFill(t,e){}drawGradientFill(t,e){}drawPictureStroke(t,e){}drawGradientStroke(t,e){}drawMarkerLayer(t,e){const i=t.markerPlacement;if(i){const s=I(i);if(s){const r="CIMMarkerPlacementInsidePolygon"===i.type||"CIMMarkerPlacementPolygonCenter"===i.type&&i.clipAtBoundary;r&&this.pushClipPath(e);const a=s.execute(o.fromJSONCIM(e),i,this.geomUnitsPerPoint(),null);if(a){let e=null;for(;(e=a.next())&&(this.drawMarker(t,e),!this._earlyReturn););}r&&this.popClipPath()}}else{const i=this._placementPool.acquire();if(T(e))i.tx=e.x,i.ty=e.y,this.drawMarker(t,i);else if(S(e)){const s=_(e);s&&([i.tx,i.ty]=s,this.drawMarker(t,i))}else if(w(e)){for(const s of e.paths)for(const e of s)if(i.tx=e[0],i.ty=e[1],this.drawMarker(t,i),this._earlyReturn)break}else for(const s of e.points)if(i.tx=s[0],i.ty=s[1],this.drawMarker(t,i),this._earlyReturn)break;this._placementPool.release(i)}}drawMarker(t,e){switch(t.type){case"CIMCharacterMarker":case"CIMPictureMarker":this.drawPictureMarker(t,e);break;case"CIMVectorMarker":this.drawVectorMarker(t,e)}}drawPictureMarker(t,e){if(!t)return;const i=this._resourceManager.getResource(t.url),s=H(t.size,z.CIMPictureMarker.size);if(null==i||s<=0)return;const r=i.width,a=i.height;if(!r||!a)return;const n=r/a,o=H(t.scaleX,1),l=ut.createIdentity(),h=t.anchorPoint;if(h){let e=h.x,i=h.y;"Absolute"!==t.anchorPointUnits&&(e*=s*n*o,i*=s),l.translate(-e,-i)}let c=H(t.rotation);t.rotateClockwise&&(c=-c),this._mapRotation&&(c+=this._mapRotation),c&&l.rotate(c*ct);let m=H(t.offsetX),f=H(t.offsetY);if(m||f){if(this._mapRotation){const t=ct*this._mapRotation,e=Math.cos(t),i=Math.sin(t),s=m*i+f*e;m=m*e-f*i,f=s}l.translate(m,f)}const u=this.geomUnitsPerPoint();1!==u&&l.scale(u,u);const d=e.getAngle();d&&l.rotate(d),l.translate(e.tx,e.ty),this.push(l),this.drawImage(t,s),this.pop()}drawVectorMarker(t,e){if(!t)return;const i=t.markerGraphics;if(!i)return;const s=H(t.size,z.CIMVectorMarker.size),r=t.frame,a=r?r.ymax-r.ymin:0,n=s&&a?s/a:1,o=ut.createIdentity();r&&o.translate(.5*-(r.xmax+r.xmin),.5*-(r.ymax+r.ymin));const l=t.anchorPoint;if(l){let e=l.x,i=l.y;"Absolute"!==t.anchorPointUnits?r&&(e*=r.xmax-r.xmin,i*=r.ymax-r.ymin):(e/=n,i/=n),o.translate(-e,-i)}1!==n&&o.scale(n,n);let h=H(t.rotation);t.rotateClockwise&&(h=-h),this._mapRotation&&(h+=this._mapRotation),h&&o.rotate(h*ct);let c=H(t.offsetX),m=H(t.offsetY);if(c||m){if(this._mapRotation){const t=ct*this._mapRotation,e=Math.cos(t),i=Math.sin(t),s=c*i+m*e;c=c*e-m*i,m=s}o.translate(c,m)}const f=this.geomUnitsPerPoint();1!==f&&o.scale(f,f);const u=e.getAngle();u&&o.rotate(u),o.translate(e.tx,e.ty);const d=t.scaleSymbolsProportionally?1:n;this.push(o,t.scaleSymbolsProportionally,d);for(const p of i){p?.symbol&&p.geometry||ft().error("Invalid marker graphic",p);let t=p.textString;if("number"==typeof t&&(t=t.toString()),this.drawSymbol(p.symbol,p.geometry,t),this._earlyReturn)break}this.pop()}drawTextSymbol(t,e,i){if(!t)return;if(!T(e))return;if(H(t.height,z.CIMTextSymbol.height)<=0)return;const s=ut.createIdentity();let r=H(t.angle);r=-r,r&&s.rotate(r*ct);const a=H(t.offsetX),n=H(t.offsetY);(a||n)&&s.translate(a,n);const o=this.geomUnitsPerPoint();1!==o&&s.scale(o,o),s.translate(e.x,e.y),this.push(s),this.drawText(t,i),this.pop()}}class pt extends dt{constructor(t,e){super(t,e),this.reset()}reset(){this._xmin=this._ymin=1/0,this._xmax=this._ymax=-1/0,this._clipCount=0}envelope(){return new A(this._xmin,this._ymin,this._xmax-this._xmin,this._ymax-this._ymin)}bounds(){return l(this._xmin,this._ymin,this._xmax,this._ymax)}drawSolidFill(t){if(t&&!(this._clipCount>0))if(S(t))this._processPath(t.rings,0);else if(w(t))this._processPath(t.paths,0);else if(M(t)){const e=xt(t);e&&this._processPath(e.rings,0)}else console.error("drawSolidFill Unexpected geometry type!")}drawSolidStroke(t,e,i){if(!t||this._clipCount>0||null==i||i<=0)return;const s=Math.max(.5*this.transformSize(H(i,z.CIMSolidStroke.width)),.5*mt);if(S(t))this._processPath(t.rings,s);else if(w(t))this._processPath(t.paths,s);else if(M(t)){const e=xt(t);e&&this._processPath(e.rings,s)}else console.error("drawSolidStroke unexpected geometry type!")}drawMarkerLayer(t,e){S(e)&&t.markerPlacement&&("CIMMarkerPlacementInsidePolygon"===t.markerPlacement.type||"CIMMarkerPlacementPolygonCenter"===t.markerPlacement.type&&t.markerPlacement.clipAtBoundary)?this._processPath(e.rings,0):super.drawMarkerLayer(t,e)}drawHatchFill(t,e){this.drawSolidFill(t)}drawPictureFill(t,e){this.drawSolidFill(t)}drawGradientFill(t,e){this.drawSolidFill(t)}drawPictureStroke(t,e){this.drawSolidStroke(t,null,e.width)}drawGradientStroke(t,e){this.drawSolidStroke(t,null,e.width)}pushClipPath(t){this.drawSolidFill(t),this._clipCount++}popClipPath(){this._clipCount--}drawImage(t,e){const{url:i}=t,s=H(t.scaleX,1);let r=s*e,a=e;const n=this._resourceManager.getResource(i);if(null!=n){const t=n.height/n.width;r=s*(e?t>1?e:e/t:n.width),a=e?t>1?e*t:e:n.height}this._merge(this.transformPt([-r/2,-a/2]),0),this._merge(this.transformPt([-r/2,a/2]),0),this._merge(this.transformPt([r/2,-a/2]),0),this._merge(this.transformPt([r/2,a/2]),0)}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new G);const i=wt(t),s=j({textString:e,font:i.font,symbol:t,supportsRichText:D(e)});let[r,n]=s?this._textRasterizer.computeRichTextSize(s,i):this._textRasterizer.computeTextSize(e,i);r=a(r),n=a(n);const o=this.transformSize(1)*this.reverseTransformScalar(1);r*=o,n*=o;const l=t.horizontalAlignment??z.CIMTextSymbol.horizontalalignment,h=t.verticalAlignment??z.CIMTextSymbol.verticalalignment;let c=0;switch(l){case"Left":c=r/2;break;case"Right":c=-r/2}let m=0;switch(h){case"Bottom":m=n/2;break;case"Top":m=-n/2;break;case"Baseline":m=n/6}this._merge(this.transformPt([-r/2+c,-n/2+m]),0),this._merge(this.transformPt([-r/2+c,n/2+m]),0),this._merge(this.transformPt([r/2+c,-n/2+m]),0),this._merge(this.transformPt([r/2+c,n/2+m]),0)}_processPath(t,e){if(t)for(const i of t){const t=i?i.length:0;if(t>1){this._merge(this.transformPt(i[0]),e);for(let s=1;s<t;s++)this._merge(this.transformPt(i[s]),e)}}}_merge(t,e){t[0]-e<this._xmin&&(this._xmin=t[0]-e),t[0]+e>this._xmax&&(this._xmax=t[0]+e),t[1]-e<this._ymin&&(this._ymin=t[1]-e),t[1]+e>this._ymax&&(this._ymax=t[1]+e)}}class gt extends dt{constructor(){super(...arguments),this._hittestType="point",this._searchTarget=[],this._searchDistPoint=0,this._textInfo=null,this._svg=null,this._path=null,this._canvas=null}destroy(){this._svg=tt(this._svg),this._path=null,this._canvas=null}hitTest(t,e,i,s){const{textInfo:r,mapRotation:o,resolution:l,searchDist:h,hittestType:c,isScreenAligned:m}=s;this._resetHittest();const f=l*n(1);switch(this.setGeomUnitsPerPoint(f),c){case"point":if(1!==t.length)return ft().error("Unexpected hittest area",t),!1;this._hittestType="point",this._searchDistPoint=h/2/f,this._searchTarget=[[t[0].x,t[0].y]];break;case"rect":if(4!==t.length)return ft().error("Unexpected hittest area",t),!1;this._hittestType="rect",this._searchDistPoint=0,this._searchTarget=t.map(t=>[t.x,t.y])}if(this._textInfo=r,this._mapRotation=m?o:0,!has("esri-mobile")){const t=a(at*window.devicePixelRatio),i=a(nt);!(("CIMLineSymbol"===e?.type||"CIMPolygonSymbol"===e?.type)&&e.symbolLayers?.some(Q))&&"CIMMeshSymbol"!==e?.type&&(Z(e)??0)<i&&(this._searchDistPoint=t)}return this._earlyReturn=!1,this.drawSymbol(e,i),this._earlyReturn}executeEffects(t,e){return"CIMGeometricEffectDashes"===t.at(-1)?.type&&(t=t.slice(0,-1)),super.executeEffects(t,e)}drawSolidFill(t,e,i){null!=i?this._hittestSvgPath(t,i,!0):this._hitTestFill(t)}drawHatchFill(t,e){this._hitTestFill(t)}drawPictureFill(t,e){this._hitTestFill(t)}drawGradientFill(t,e){this._hitTestFill(t)}drawSolidStroke(t,e,i,s,r,a,n){null!=n?this._hittestSvgPath(t,n,!1,i):this._hitTestStroke(t,i)}drawPictureStroke(t,e){this._hitTestStroke(t,e.width)}drawGradientStroke(t,e){this._hitTestStroke(t,e.width)}drawMarkerLayer(t,e){t.markerPlacement&&("CIMMarkerPlacementInsidePolygon"===t.markerPlacement.type||"CIMMarkerPlacementPolygonCenter"===t.markerPlacement.type&&t.markerPlacement.clipAtBoundary)?this._hitTestFill(e):super.drawMarkerLayer(t,e)}drawTextSymbol(t,e,i){if(!t||!T(e))return;if(H(t.height,z.CIMTextSymbol.height)<=0)return;const s=ut.createIdentity(),r=this.geomUnitsPerPoint();1!==r&&s.scale(r,r),s.translate(e.x,e.y),this.push(s),this.drawText(t,i),this.pop()}pushClipPath(t){}popClipPath(){}drawImage(t,e){const{url:i}=t,s=H(t.scaleX,1),r=this._resourceManager.getResource(i);if(null==r||0===r.height||0===e)return;const a=e*this.geomUnitsPerPoint(),n=a*s*(r.width/r.height);if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]),e=this._searchDistPoint;Math.abs(t[0])<n/2+e&&Math.abs(t[1])<a/2+e&&(this._earlyReturn=!0)}else{const t=n/2,e=a/2,i=[[-t,e],[t,e],[t,-e],[-t,-e],[-t,e]],s=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(s,[i])&&(this._earlyReturn=!0)}}drawText(t,e){const i=this._textInfo;if(!i)return;const s=i.get(t);if(!s)return;if(!u(s.glyphMosaicItems))return;const r=lt(H(t.height,z.CIMTextSymbol.height)),{lineGapType:a,lineGap:n}=t,o=a?St(a,H(n),r):0,l=t.horizontalAlignment??z.CIMTextSymbol.horizontalalignment,h=t.verticalAlignment??z.CIMTextSymbol.verticalalignment,c="CIMBackgroundCallout"===t.callout?.type,m=ot(s.glyphMosaicItems,{scale:r/rt,angle:H(t.angle),xOffset:H(t.offsetX),yOffset:H(t.offsetY),horizontalAlignment:l,verticalAlignment:h,maxLineWidth:ht(t.lineWidth),lineHeight:st*Math.max(.25,Math.min(o||1,4)),decoration:t.font.decoration||"none",useCIMAngleBehavior:!1,hasBackground:c}),f=this.reverseScaleText(1);for(const d of m.glyphs){const t=d.offsets,e=[[t.topLeft[0]*f,-t.topLeft[1]*f],[t.topRight[0]*f,-t.topRight[1]*f],[t.bottomRight[0]*f,-t.bottomRight[1]*f],[t.bottomLeft[0]*f,-t.bottomLeft[1]*f],[t.topLeft[0]*f,-t.topLeft[1]*f]];if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]);P(t,[e])&&(this._earlyReturn=!0)}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,[e])&&(this._earlyReturn=!0)}}function u(t){return"glyphs"===t.type?t.glyphs.length>0:t.runs.some(t=>t.glyphs.glyphs.length>0)}}_hitTestFill(t){let e=null;if(M(t)){const i=t;e=[[[i.xmin,i.ymin],[i.xmin,i.ymax],[i.xmax,i.ymax],[i.xmax,i.ymin],[i.xmin,i.ymin]]]}else if(S(t))e=t.rings;else{if(!w(t))return;e=t.paths}if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]);if(P(t,e)&&(this._earlyReturn=!0),!this._earlyReturn){const i=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint();x(t,e,i)&&(this._earlyReturn=!0)}}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,e)&&(this._earlyReturn=!0)}}_getSvgPath(){return null!=this._svg&&null!=this._path||(this._svg??=et(),this._path??=it("path"),this._svg.appendChild(this._path)),this._path}_getCanvasContext(t,e){return this._canvas??=document.createElement("canvas"),this._canvas.width=t,this._canvas.height=e,this._canvas.getContext("2d",{willReadFrequently:!0})}_hittestSvgPath(t,e,i,s=0){const r=p();g(r,t);const a={x:r[0],y:r[1],width:r[2]-r[0],height:r[3]-r[1]},n=this._getSvgPath();n.setAttribute("d",e);const o=n.getBBox();if("point"===this._hittestType){const t=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint(),r=this.reverseTransformPt(this._searchTarget[0]);let n=Math.max(o.width/a.width,o.height/a.height),l=1;const h=2*t*n;h<1&&(l=2/h,n*=l,o.x*=l,o.y*=l,o.width*=l,o.height*=l);const c=1+s*n/2,m=this._getCanvasContext(o.width+2*c,o.height+2*c);m.setTransform(l,0,0,l,-o.x+c,-o.y+c);const f=new Path2D(e);i?m.fill(f):(m.lineWidth=s*(n/l),m.stroke(f));const u=(a.width*n-o.width)/2,d=(a.height*n-o.height)/2,p=Math.floor((r[0]-a.x-t)*n-u+c),g=Math.floor((a.height-(r[1]-a.y)-t)*n+d+c),_=Math.ceil(2*t*n),y=Math.ceil(2*t*n),P=m.getImageData(p,g,_,y).data;for(let e=3;e<P.length;e+=4)if(P[e]>127.5)return void(this._earlyReturn=!0)}else{const t=[[a.x,a.y],[a.x,a.y+a.height],[a.x+a.width,a.y+a.height],[a.x+a.width,a.y],[a.x,a.y]],e=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;if(y(e,[t]))return void(this._earlyReturn=!0)}}_hitTestStroke(t,e){let i=null;if(M(t)){const e=t;i=[[[e.xmin,e.ymin],[e.xmin,e.ymax],[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin]]]}else if(S(t))i=t.rings;else{if(!w(t))return;i=t.paths}if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]),s=H(e,z.CIMSolidStroke.width)*this.geomUnitsPerPoint(),r=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint();x(t,i,s/2+r)&&(this._earlyReturn=!0)}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,i)&&(this._earlyReturn=!0)}}_resetHittest(){this.setTransform(),this._hittestType="point",this._searchTarget=[],this._searchDistPoint=0,this._textInfo=null}}class _t extends dt{constructor(t,e,i,s){super(e,i),this._applyAdditionalRenderProps=s,this._colorSubstitutionHelper=new C,this._ctx=t}drawSolidFill(t,e){if(!t)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else if(M(t))this._buildPath(xt(t).rings,!0);else{if(!b(t))return;console.log("CanvasDrawHelper.drawSolidFill - No implementation!")}const i=this._ctx;i.fillStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",i.fill("evenodd")}drawSolidStroke(t,e,i,s,r,a){if(!t||!e||0===i)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!1);else{if(!M(t))return void console.log("CanvasDrawHelper.drawSolidStroke isn't implemented!");this._buildPath(xt(t).rings,!0)}const n=this._ctx;n.strokeStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",n.lineWidth=Math.max(this.transformSize(i),mt),this._setCapStyle(s),this._setJoinStyle(r),n.miterLimit=a,n.stroke()}pushClipPath(t){if(this._ctx.save(),S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else{if(!M(t))return;this._buildPath(xt(t).rings,!0)}this._ctx.clip("evenodd")}popClipPath(){this._ctx.restore()}drawImage(t,e){const{colorSubstitutions:i,url:s,tintColor:r}=t,a=H(t.scaleX,1),n=this._resourceManager.getResource(s);if(null==n)return;let o=e*(n.width/n.height),l=e;e||(o=n.width,l=n.height);const h=E(s)||"src"in n&&E(n.src);let c="getFrame"in n?L(n):n;i&&(c=this._colorSubstitutionHelper.applyColorSubstitution(c,i)),this._applyAdditionalRenderProps&&!h&&r&&(c=this._colorSubstitutionHelper.tintImageData(c,r));const m=this.transformPt([0,0]),[f,u]=this.getTransformAngle(),d=this.transformSize(1),p=this._ctx;p.save(),p.setTransform({m11:a*d*f,m12:a*d*u,m21:-d*u,m22:d*f,m41:m[0],m42:m[1]}),p.drawImage(c,-o/2,-l/2,o,l),p.restore()}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new G);const i=wt(t,this.transformSize(a(1))),s=j({textString:e,font:i.font,symbol:t,supportsRichText:D(e)}),r=s?this._textRasterizer.rasterizeRichText(s,i):this._textRasterizer.rasterizeText(e,i);if(!r)return;const{size:n,anchorX:o,anchorY:l,canvas:h}=r,c=n[0]*(o+.5),m=n[1]*(l-.5),f=this._ctx,u=this.transformPt([0,0]),[d,p]=this.getTransformAngle(),g=1;f.save(),f.setTransform({m11:g*d,m12:g*p,m21:-g*p,m22:g*d,m41:u[0]-g*c,m42:u[1]+g*m}),f.drawImage(h,0,0),f.restore()}drawPictureFill(t,e){if(!t)return;let{colorSubstitutions:i,height:s,offsetX:r,offsetY:a,rotation:n,scaleX:o,tintColor:l,url:h}=e;const c=this._resourceManager.getResource(h);if(null==c)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else if(M(t))this._buildPath(xt(t).rings,!0);else{if(!b(t))return;console.log("CanvasDrawHelper.drawPictureFill - No implementation!")}const m=this._ctx,f=E(h)||"src"in c&&E(c.src);let u,d="getFrame"in c?L(c):c;if(i&&(d=this._colorSubstitutionHelper.applyColorSubstitution(d,i)),this._applyAdditionalRenderProps){f||l&&(d=this._colorSubstitutionHelper.tintImageData(d,l)),u=m.createPattern(d,"repeat");const t=this.transformSize(1);n||(n=0),r?r*=t:r=0,a?a*=t:a=0,s&&(s*=t);const e=s?s/c.height:1,i=o&&s?o*s/c.width:1;if(0!==n||1!==e||1!==i||0!==r||0!==a){const t=new DOMMatrix;t.rotateSelf(0,0,-n).translateSelf(r,a).scaleSelf(i,e,1),u.setTransform(t)}}else u=m.createPattern(d,"repeat");m.save(),m.fillStyle=u,m.fill("evenodd"),m.restore()}drawPictureStroke(t,i){if(!t)return;let{colorSubstitutions:s,capStyle:r,joinStyle:a,miterLimit:o,tintColor:l,url:h,width:c}=i;const m=this._resourceManager.getResource(h);if(null==m)return;let f;if(S(t))f=t.rings;else if(w(t))f=t.paths;else{if(!M(t))return b(t)?void console.log("CanvasDrawHelper.drawPictureStroke - No implementation!"):void 0;f=xt(t).rings}c||(c=m.width);const u=E(h)||"src"in m&&E(m.src);let d="getFrame"in m?L(m):m;s&&(d=this._colorSubstitutionHelper.applyColorSubstitution(d,s)),this._applyAdditionalRenderProps&&(u||l&&(d=this._colorSubstitutionHelper.tintImageData(d,l)));const p=Math.max(this.transformSize(n(c)),.5),g=p/d.width,_=this._ctx,y=_.createPattern(d,"repeat-y");let P,x;_.save(),this._setCapStyle(r),this._setJoinStyle(a),void 0!==o&&(_.miterLimit=o),_.lineWidth=p;for(let n of f)if(n=e(n),bt(n),n&&!(n.length<=1)){P=this.transformPt(n[0]);for(let t=1;t<n.length;t++){x=this.transformPt(n[t]);const e=Pt(P,x),i=new DOMMatrix;i.translateSelf(0,P[1]-p/2).scaleSelf(g,g,1).rotateSelf(0,0,90-e),y.setTransform(i),_.strokeStyle=y,_.beginPath(),_.moveTo(P[0],P[1]),_.lineTo(x[0],x[1]),_.stroke(),P=x}}_.restore()}drawGradientFill(t,e){if(!t)return;let i;if(S(t))i=t.rings;else if(w(t))i=t.paths;else{if(!M(t))return void ft().error("Unable to draw gradient fill");i=xt(t).rings}this._buildPath(i,!0);const{angle:r,gradientMethod:a,gradientSize:o,gradientSizeUnits:l}=e,p=z.CIMGradientFill,g=e.gradientType??p.gradientType,_=-s(r??0),y=h();for(const s of i){const t=s?s.length:0;if(t>1)for(let e=0;e<t;e++){let t=this.transformPt(s[e]);"Linear"!==a&&"Rectangular"!==a||(t=U(t,-_)),c(y,t)}}const[P,x,b,T]=y,k=this._ctx;switch(k.save(),a){case"Buffered":ft().error(`Gradient method "${a}" currently unsupported.`);break;case"Linear":{const t=(x+T)/2,i="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(b-P),[s,r]="Discrete"===g?[b,b-i]:[P+i,P],a=U([s,t],_),h=U([r,t],_),c=k.createLinearGradient(a[0],a[1],h[0],h[1]);F(c,e),k.fillStyle=c,k.fill("evenodd");break}case"Circular":{const t=m(y),i=d(y)/2,s="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*i,[r,a]="Discrete"===g?[i,i-s]:[s,0],h=k.createRadialGradient(t[0],t[1],r,t[0],t[1],a);F(h,e),k.fillStyle=h,k.fill("evenodd");break}case"Rectangular":{const i=m(y),s=i[0],r=i[1],a=U(i,_),h=(i,s,r,n,o,l,h,c)=>{k.save(),this.pushClipPath(t);const m=U([o,l],_),f=U([h,c],_);k.beginPath(),k.moveTo(a[0],a[1]),k.lineTo(m[0],m[1]),k.lineTo(f[0],f[1]),k.lineTo(a[0],a[1]),k.clip();const u=U([i,s],_),d=U([r,n],_),p=k.createLinearGradient(u[0],u[1],d[0],d[1]);F(p,e),k.fillStyle=p,k.fill("evenodd"),k.restore()};let c="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(f(y)/2),[d,S]="Discrete"===g?[b,b-c]:[s+c,s];h(d,r,S,r,b,x,b,T),[d,S]="Discrete"===g?[P,P+c]:[s-c,s],h(d,r,S,r,P,T,P,x),c="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(u(y)/2);let[w,M]="Discrete"===g?[T,T-c]:[r+c,r];h(s,w,s,M,b,T,P,T),[w,M]="Discrete"===g?[x,x+c]:[r-c,r],h(s,w,s,M,P,x,b,x);break}}k.restore()}drawGradientStroke(t,i){const{capStyle:s,gradientMethod:r,gradientSize:a,gradientSizeUnits:o,joinStyle:l,miterLimit:h,width:c}=i;if(!t||0===c)return;let m;if(S(t))m=t.rings;else if(w(t))m=t.paths;else{if(!M(t))return void ft().error("Unable to draw gradient stroke");m=xt(t).rings}const f=i.gradientType??z.CIMGradientStroke.gradientType,u=Math.max(this.transformSize(n(c)),.5),d=this._ctx;let p,g;d.save(),this._setCapStyle(s),this._setJoinStyle(l),void 0!==h&&(d.miterLimit=h),d.lineWidth=u;for(let _ of m){if(_=e(_),bt(_),!_||_.length<=1)continue;let t=0;p=this.transformPt(_[0]);for(let e=1;e<_.length;e++){g=this.transformPt(_[e]);const i=g[0]-p[0],s=g[1]-p[1];t+=Math.sqrt(i*i+s*s),p=g}const s="Absolute"===o?this.transformSize(n(a)):B(a,z.CIMGradientStroke.gradientSize)*("AcrossLine"===r?u:t);let l=0;p=this.transformPt(_[0]);for(let e=1;e<_.length;e++){g=this.transformPt(_[e]);const a=g[0]-p[0],n=g[1]-p[1],o=Math.sqrt(a*a+n*n);let h,c,m,y;switch(r){case"AcrossLine":{const[t,e]=U([a/o,n/o],-Math.PI/2),i=u/2,r="Discrete"===f?i:s-i;h=(p[0]+g[0])/2+t*r,c=(p[1]+g[1])/2+e*r,m=h-t*s,y=c-e*s;break}case"AlongLine":{const e=a/o,i=n/o;"Discrete"===f?(h=p[0]-e*l,c=p[1]-i*l,m=h+e*s,y=c+i*s):(m=p[0]+e*(t-l),y=p[1]+i*(t-l),h=m-e*s,c=y-i*s);break}default:return ft().error("Unrecognized gradient method:",r),void d.restore()}const P=d.createLinearGradient(h,c,m,y);F(P,i),d.strokeStyle=P,d.beginPath(),d.moveTo(p[0],p[1]),d.lineTo(g[0],g[1]),d.stroke(),l+=o,p=g}}d.restore()}_buildPath(t,e){const i=this._ctx;if(i.beginPath(),t)for(const s of t){const t=s?s.length:0;if(t>1){let r=this.transformPt(s[0]);i.moveTo(r[0],r[1]);for(let e=1;e<t;e++)r=this.transformPt(s[e]),i.lineTo(r[0],r[1]);e&&i.closePath()}}}_setCapStyle(t){switch(t){case"Butt":this._ctx.lineCap="butt";break;case"Round":this._ctx.lineCap="round";break;case"Square":this._ctx.lineCap="square"}}_setJoinStyle(t){switch(t){case"Bevel":this._ctx.lineJoin="bevel";break;case"Round":this._ctx.lineJoin="round";break;case"Miter":this._ctx.lineJoin="miter"}}}function yt(t,e,i){let s=H(t.separation,z.CIMHatchFill.separation)*i,r=H(t.rotation);if(0===s)return null;s<0&&(s=-s);let a=0;const n=.5*s;for(;a>n;)a-=s;for(;a<-n;)a+=s;const o=p();g(o,e),o[0]-=n,o[1]-=n,o[2]+=n,o[3]+=n;const l=[[o[0],o[1]],[o[0],o[3]],[o[2],o[3]],[o[2],o[1]]];for(;r>180;)r-=180;for(;r<0;)r+=180;const h=Math.cos(r*ct),c=Math.sin(r*ct),m=-s*c,f=s*h;let u,d,_,y;a=H(t.offsetX)*i*c-H(t.offsetY)*i*h,u=_=Number.MAX_VALUE,d=y=-Number.MAX_VALUE;for(const p of l){const t=p[0],e=p[1],i=h*t+c*e,s=-c*t+h*e;u=Math.min(u,i),_=Math.min(_,s),d=Math.max(d,i),y=Math.max(y,s)}_=Math.floor(_/s)*s;let P=h*u-c*_-m*a/s,x=c*u+h*_-f*a/s,S=h*d-c*_-m*a/s,w=c*d+h*_-f*a/s;const M=1+Math.round((y-_)/s),b=[];for(let p=0;p<M;p++)P+=m,x+=f,S+=m,w+=f,b.push([[P,x],[S,w]]);return{paths:b}}function Pt(t,e){const i=e[0]-t[0],s=e[1]-t[1];return 180/Math.PI*Math.atan2(s,i)}const xt=t=>t?{spatialReference:t.spatialReference,rings:[[[t.xmin,t.ymin],[t.xmin,t.ymax],[t.xmax,t.ymax],[t.xmax,t.ymin],[t.xmin,t.ymin]]]}:null,St=(t,e,i)=>{switch(t){case"ExtraLeading":return 1+e/i;case"Multiple":return e;case"Exact":return e/i}};function wt(e,i=1){const s=J(e),r=N(e.fontStyleName),a=e.fontFamilyName??t,{weight:n,style:o}=r,l=i*(e.height||5),h=O(e.horizontalAlignment),c=q(e.verticalAlignment),m=V(e),f=V(e.haloSymbol),u=null!=f?i*(e.haloSize??0):0,d=Y(e.symbol),p=i*(W(e.symbol)||0),g="CIMBackgroundCallout"===e.callout?.type?e.callout.backgroundSymbol:null,_=V(g),y=W(g),P=Y(g);return{color:m,size:l,horizontalAlignment:h,verticalAlignment:c,font:{family:a,style:$(o),weight:K(n),decoration:s},outline:{size:p||0,color:d},halo:{size:u||0,color:f,style:o},backgroundColor:_,borderLine:null!=y&&null!=P?{size:y,color:P}:null,pixelRatio:1,premultiplyColors:!0}}const Mt=1e-4;function bt(t){let e,i,s,r,a,n=t[0],o=1;for(;o<t.length;)e=t[o][0]-n[0],i=t[o][1]-n[1],r=0!==e?i/e:Math.PI/2,void 0!==s&&Math.abs(r-s)<=Mt?(t.splice(o-1,1),n=a):(a=n,n=t[o],o++),s=r}export{dt as CIMSymbolDrawHelper,_t as CanvasDrawHelper,pt as EnvDrawHelper,gt as HittestDrawHelper,ut as Transformation,ct as cDegToRad,St as lineGapType2LineHeight};
2
+ import{defaultFontFamily as t}from"../../core/fontUtils.js";import has from"../../core/has.js";import{clone as e}from"../../core/lang.js";import i from"../../core/Logger.js";import{deg2rad as s}from"../../core/mathUtils.js";import r from"../../core/ObjectPool.js";import{px2pt as a,pt2px as n}from"../../core/screenUtils.js";import{GeometryCursor as o}from"../../geometry/GeometryCursor.js";import{fromValues as l,empty as h,expandPointInPlace as c,center as m,width as f,height as u,diagonal as d,create as p}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as g}from"../../geometry/support/boundsUtils.js";import{polygonCentroid as _}from"../../geometry/support/centroid.js";import{targetIntersectsPolygon as y,pointInPolygon as P,nearLine as x}from"../../geometry/support/intersectsBase.js";import{isPolygon as S,isPolyline as w,isExtent as M,isMultipoint as b,isPoint as T}from"../../geometry/support/jsonTypeUtils.js";import{SimpleEffectCursor as k}from"./CIMEffects.js";import C from"./CIMImageColorSubstitutionHelper.js";import{getEffectOperator as v,getPlacementOperator as I}from"./CIMOperators.js";import{Placement as R}from"./CIMPlacements.js";import{defaultCIMValues as z}from"./defaultCIMValues.js";import{getFirstFrame as L}from"./imageUtils.js";import{rotate as U}from"./mathUtils.js";import{addColorStops as F}from"./rasterizingUtils.js";import A from"./Rect.js";import{parseRichTextRuns as j,hasRichTextFormattingTags as D}from"./richTextUtils.js";import G from"./TextRasterizer.js";import{getNumericValue as H,isSVGImage as E,getRelativeGradientSize as B,getEffectsInflateSize as X,fromCIMFontDecoration as J,fromCIMFontStyle as N,fromCIMHorizontalAlignment as O,fromCIMVerticalAlignment as q,getFillColor as V,getStrokeColor as Y,getStrokeWidth as W,getFontWeight as K,getFontStyle as $,isCIMFill as Q,getSize as Z}from"./utils.js";import{destroyHiddenSvg as tt,createHiddenSvg as et,createSvgElement as it}from"../../views/2d/engine/svgUtils.js";import{magicLabelLineHeight as st,glyphSize as rt,hittestToleranceSmallSymbol as at,hittestSmallSymbolThreshold as nt}from"../../views/2d/engine/webgl/definitions.js";import{shapeTextResource as ot}from"../../views/2d/engine/webgl/mesh/templates/shapingUtils.js";import{roundPtToWholePixel as lt,getLineWidth as ht}from"../../views/2d/layers/graphics/graphicsUtils.js";const ct=Math.PI/180,mt=.5,ft=()=>i.getLogger("esri.symbols.cim.CIMSymbolDrawHelper");class ut{constructor(t){this._t=t}static createIdentity(){return new ut([1,0,0,0,1,0])}clone(){const t=this._t;return new ut(t.slice())}transform(t){const e=this._t;return[e[0]*t[0]+e[1]*t[1]+e[2],e[3]*t[0]+e[4]*t[1]+e[5]]}static createScale(t,e){return new ut([t,0,0,0,e,0])}scale(t,e){const i=this._t;return i[0]*=t,i[1]*=t,i[2]*=t,i[3]*=e,i[4]*=e,i[5]*=e,this}scaleRatio(){return Math.sqrt(this._t[0]*this._t[0]+this._t[1]*this._t[1])}static createTranslate(t,e){return new ut([0,0,t,0,0,e])}translate(t,e){const i=this._t;return i[2]+=t,i[5]+=e,this}static createRotate(t){const e=Math.cos(t),i=Math.sin(t);return new ut([e,-i,0,i,e,0])}rotate(t){return ut.multiply(this,ut.createRotate(t),this)}angle(){const t=this._t[0],e=this._t[3],i=Math.sqrt(t*t+e*e);return[t/i,e/i]}static multiply(t,e,i){const s=t._t,r=e._t,a=s[0]*r[0]+s[3]*r[1],n=s[1]*r[0]+s[4]*r[1],o=s[2]*r[0]+s[5]*r[1]+r[2],l=s[0]*r[3]+s[3]*r[4],h=s[1]*r[3]+s[4]*r[4],c=s[2]*r[3]+s[5]*r[4]+r[5],m=i._t;return m[0]=a,m[1]=n,m[2]=o,m[3]=l,m[4]=h,m[5]=c,i}invert(){const t=this._t;let e=t[0]*t[4]-t[1]*t[3];if(0===e)return new ut([0,0,0,0,0,0]);e=1/e;const i=(t[1]*t[5]-t[2]*t[4])*e,s=(t[2]*t[3]-t[0]*t[5])*e,r=t[4]*e,a=-t[1]*e,n=-t[3]*e,o=t[0]*e;return new ut([r,a,i,n,o,s])}}class dt{constructor(t,e){this._resourceManager=t,this._transfos=[],this._sizeTransfos=[],this._textScaling=[],this._geomUnitsPerPoint=1,this._placementPool=new r(()=>new R,void 0,void 0,100),this._earlyReturn=!1,this._mapRotation=0,this._transfos.push(e||ut.createIdentity()),this._sizeTransfos.push(e?e.scaleRatio():1),this._textScaling.push(1)}setTransform(t,e){this._transfos=[t||ut.createIdentity()],this._sizeTransfos=[e||(t?t.scaleRatio():1)],this._textScaling=[1]}setGeomUnitsPerPoint(t){this._geomUnitsPerPoint=t}transformPt(t){return this._transfos[this._transfos.length-1].transform(t)}transformSize(t){return t*this._sizeTransfos[this._sizeTransfos.length-1]}scaleText(t){return t*this._textScaling[this._textScaling.length-1]}reverseTransformPt(t){return this._transfos[this._transfos.length-1].invert().transform(t)}reverseTransformSize(t){return t/this._sizeTransfos[this._sizeTransfos.length-1]}reverseTransformScalar(t){return t/this._transfos[this._transfos.length-1].scaleRatio()}reverseScaleText(t){return t/this._textScaling[this._textScaling.length-1]}getTransformAngle(){return this._transfos[this._transfos.length-1].angle()}geomUnitsPerPoint(){return this.isEmbedded()?1:this._geomUnitsPerPoint}prevGeomUnitsPerPoint(){return this._transfos.length>2?1:this._geomUnitsPerPoint}isEmbedded(){return this._transfos.length>1}back(){return this._transfos[this._transfos.length-1]}push(t,e=!1,i=1){const s=e?t.scaleRatio():1;ut.multiply(t,this.back(),t),this._transfos.push(t),this._sizeTransfos.push(this._sizeTransfos[this._sizeTransfos.length-1]*s),this._textScaling.push(this._textScaling[this._textScaling.length-1]*i)}pop(){this._transfos.splice(-1,1),this._sizeTransfos.splice(-1,1),this._textScaling.splice(-1,1)}drawSymbol(t,e,i){if(t)switch(t.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this.drawMultiLayerSymbol(t,e);break;case"CIMTextSymbol":this.drawTextSymbol(t,e,i)}}drawMultiLayerSymbol(t,e){if(!t||!e)return;const i=t.symbolLayers;if(!i)return;const s=t.effects;if(s&&s.length>0){const t=this.executeEffects(s,e);if(t){let e=t.next();for(;e;)this.drawSymbolLayers(i,e.asJSON()),e=t.next()}}else this.drawSymbolLayers(i,e)}executeEffects(t,e){const i=this.geomUnitsPerPoint(),s=null,r=X(t),a=!1;let n=new k(o.fromJSONCIM(e));for(const o of t){const t=v(o);t&&(n=t.execute(n,o,{geomUnitsPerPoint:i,tileKey:s,maxInflateSize:r,scale:null,spatialReference:e.spatialReference,preventClipping:a}))}return n}drawSymbolLayers(t,e){let i=t.length;for(;i--;){const s=t[i];if(!s||!1===s.enable)continue;const r=s.effects;if(r&&r.length>0){const t=this.executeEffects(r,e);if(t){let e=null;for(;(e=t.next())&&(this.drawSymbolLayer(s,e.asJSON()),!this._earlyReturn););}}else this.drawSymbolLayer(s,e);if(this._earlyReturn)return}}drawSymbolLayer(t,e){switch(t.type){case"CIMSolidFill":this.drawSolidFill(e,t.color,t.path);break;case"CIMHatchFill":this.drawHatchFill(e,t);break;case"CIMPictureFill":this.drawPictureFill(e,t);break;case"CIMGradientFill":this.drawGradientFill(e,t);break;case"CIMSolidStroke":this.drawSolidStroke(e,t.color,t.width,t.capStyle,t.joinStyle,t.miterLimit,t.path);break;case"CIMPictureStroke":this.drawPictureStroke(e,t);break;case"CIMGradientStroke":this.drawGradientStroke(e,t);break;case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":this.drawMarkerLayer(t,e)}}drawHatchFill(t,e){const i=yt(e,t,this.geomUnitsPerPoint());i&&(this.pushClipPath(t),this.drawMultiLayerSymbol(e.lineSymbol,i),this.popClipPath())}drawPictureFill(t,e){}drawGradientFill(t,e){}drawPictureStroke(t,e){}drawGradientStroke(t,e){}drawMarkerLayer(t,e){const i=t.markerPlacement;if(i){const s=I(i);if(s){const r="CIMMarkerPlacementInsidePolygon"===i.type||"CIMMarkerPlacementPolygonCenter"===i.type&&i.clipAtBoundary;r&&this.pushClipPath(e);const a=s.execute(o.fromJSONCIM(e),i,this.geomUnitsPerPoint(),null);if(a){let e=null;for(;(e=a.next())&&(this.drawMarker(t,e),!this._earlyReturn););}r&&this.popClipPath()}}else{const i=this._placementPool.acquire();if(T(e))i.tx=e.x,i.ty=e.y,this.drawMarker(t,i);else if(S(e)){const s=_(e);s&&([i.tx,i.ty]=s,this.drawMarker(t,i))}else if(w(e)){for(const s of e.paths)for(const e of s)if(i.tx=e[0],i.ty=e[1],this.drawMarker(t,i),this._earlyReturn)break}else for(const s of e.points)if(i.tx=s[0],i.ty=s[1],this.drawMarker(t,i),this._earlyReturn)break;this._placementPool.release(i)}}drawMarker(t,e){switch(t.type){case"CIMCharacterMarker":case"CIMPictureMarker":this.drawPictureMarker(t,e);break;case"CIMVectorMarker":this.drawVectorMarker(t,e)}}drawPictureMarker(t,e){if(!t)return;const i=this._resourceManager.getResource(t.url),s=H(t.size,z.CIMPictureMarker.size);if(null==i||s<=0)return;const r=i.width,a=i.height;if(!r||!a)return;const n=r/a,o=H(t.scaleX,1),l=ut.createIdentity(),h=t.anchorPoint;if(h){let e=h.x,i=h.y;"Absolute"!==t.anchorPointUnits&&(e*=s*n*o,i*=s),l.translate(-e,-i)}let c=H(t.rotation);t.rotateClockwise&&(c=-c),this._mapRotation&&(c+=this._mapRotation),c&&l.rotate(c*ct);let m=H(t.offsetX),f=H(t.offsetY);if(m||f){if(this._mapRotation){const t=ct*this._mapRotation,e=Math.cos(t),i=Math.sin(t),s=m*i+f*e;m=m*e-f*i,f=s}l.translate(m,f)}const u=this.geomUnitsPerPoint();1!==u&&l.scale(u,u);const d=e.getAngle();d&&l.rotate(d),l.translate(e.tx,e.ty),this.push(l),this.drawImage(t,s),this.pop()}drawVectorMarker(t,e){if(!t)return;const i=t.markerGraphics;if(!i)return;const s=H(t.size,z.CIMVectorMarker.size),r=t.frame,a=r?r.ymax-r.ymin:0,n=s&&a?s/a:1,o=ut.createIdentity();r&&o.translate(.5*-(r.xmax+r.xmin),.5*-(r.ymax+r.ymin));const l=t.anchorPoint;if(l){let e=l.x,i=l.y;"Absolute"!==t.anchorPointUnits?r&&(e*=r.xmax-r.xmin,i*=r.ymax-r.ymin):(e/=n,i/=n),o.translate(-e,-i)}1!==n&&o.scale(n,n);let h=H(t.rotation);t.rotateClockwise&&(h=-h),this._mapRotation&&(h+=this._mapRotation),h&&o.rotate(h*ct);let c=H(t.offsetX),m=H(t.offsetY);if(c||m){if(this._mapRotation){const t=ct*this._mapRotation,e=Math.cos(t),i=Math.sin(t),s=c*i+m*e;c=c*e-m*i,m=s}o.translate(c,m)}const f=this.geomUnitsPerPoint();1!==f&&o.scale(f,f);const u=e.getAngle();u&&o.rotate(u),o.translate(e.tx,e.ty);const d=t.scaleSymbolsProportionally?1:n;this.push(o,t.scaleSymbolsProportionally,d);for(const p of i){p?.symbol&&p.geometry||ft().error("Invalid marker graphic",p);let t=p.textString;if("number"==typeof t&&(t=t.toString()),this.drawSymbol(p.symbol,p.geometry,t),this._earlyReturn)break}this.pop()}drawTextSymbol(t,e,i){if(!t)return;if(!T(e))return;if(H(t.height,z.CIMTextSymbol.height)<=0)return;const s=ut.createIdentity();let r=H(t.angle);r=-r,r&&s.rotate(r*ct);const a=H(t.offsetX),n=H(t.offsetY);(a||n)&&s.translate(a,n);const o=this.geomUnitsPerPoint();1!==o&&s.scale(o,o),s.translate(e.x,e.y),this.push(s),this.drawText(t,i),this.pop()}}class pt extends dt{constructor(t,e){super(t,e),this.reset()}reset(){this._xmin=this._ymin=1/0,this._xmax=this._ymax=-1/0,this._clipCount=0}envelope(){return new A(this._xmin,this._ymin,this._xmax-this._xmin,this._ymax-this._ymin)}bounds(){return l(this._xmin,this._ymin,this._xmax,this._ymax)}drawSolidFill(t){if(t&&!(this._clipCount>0))if(S(t))this._processPath(t.rings,0);else if(w(t))this._processPath(t.paths,0);else if(M(t)){const e=xt(t);e&&this._processPath(e.rings,0)}else console.error("drawSolidFill Unexpected geometry type!")}drawSolidStroke(t,e,i){if(!t||this._clipCount>0||null==i||i<=0)return;const s=Math.max(.5*this.transformSize(H(i,z.CIMSolidStroke.width)),.5*mt);if(S(t))this._processPath(t.rings,s);else if(w(t))this._processPath(t.paths,s);else if(M(t)){const e=xt(t);e&&this._processPath(e.rings,s)}else console.error("drawSolidStroke unexpected geometry type!")}drawMarkerLayer(t,e){S(e)&&t.markerPlacement&&("CIMMarkerPlacementInsidePolygon"===t.markerPlacement.type||"CIMMarkerPlacementPolygonCenter"===t.markerPlacement.type&&t.markerPlacement.clipAtBoundary)?this._processPath(e.rings,0):super.drawMarkerLayer(t,e)}drawHatchFill(t,e){this.drawSolidFill(t)}drawPictureFill(t,e){this.drawSolidFill(t)}drawGradientFill(t,e){this.drawSolidFill(t)}drawPictureStroke(t,e){this.drawSolidStroke(t,null,e.width)}drawGradientStroke(t,e){this.drawSolidStroke(t,null,e.width)}pushClipPath(t){this.drawSolidFill(t),this._clipCount++}popClipPath(){this._clipCount--}drawImage(t,e){const{url:i}=t,s=H(t.scaleX,1);let r=s*e,a=e;const n=this._resourceManager.getResource(i);if(null!=n){const t=n.height/n.width;r=s*(e?t>1?e:e/t:n.width),a=e?t>1?e*t:e:n.height}this._merge(this.transformPt([-r/2,-a/2]),0),this._merge(this.transformPt([-r/2,a/2]),0),this._merge(this.transformPt([r/2,-a/2]),0),this._merge(this.transformPt([r/2,a/2]),0)}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new G);const i=wt(t),s=j({textString:e,font:i.font,symbol:t,supportsRichText:D(e)});let[r,n]=s?this._textRasterizer.computeRichTextSize(s,i):this._textRasterizer.computeTextSize(e,i);r=a(r),n=a(n);const o=this.transformSize(1)*this.reverseTransformScalar(1);r*=o,n*=o;const l=t.horizontalAlignment??z.CIMTextSymbol.horizontalalignment,h=t.verticalAlignment??z.CIMTextSymbol.verticalalignment;let c=0;switch(l){case"Left":c=r/2;break;case"Right":c=-r/2}let m=0;switch(h){case"Bottom":m=n/2;break;case"Top":m=-n/2;break;case"Baseline":m=n/6}this._merge(this.transformPt([-r/2+c,-n/2+m]),0),this._merge(this.transformPt([-r/2+c,n/2+m]),0),this._merge(this.transformPt([r/2+c,-n/2+m]),0),this._merge(this.transformPt([r/2+c,n/2+m]),0)}_processPath(t,e){if(t)for(const i of t){const t=i?i.length:0;if(t>1){this._merge(this.transformPt(i[0]),e);for(let s=1;s<t;s++)this._merge(this.transformPt(i[s]),e)}}}_merge(t,e){t[0]-e<this._xmin&&(this._xmin=t[0]-e),t[0]+e>this._xmax&&(this._xmax=t[0]+e),t[1]-e<this._ymin&&(this._ymin=t[1]-e),t[1]+e>this._ymax&&(this._ymax=t[1]+e)}}class gt extends dt{constructor(){super(...arguments),this._hittestType="point",this._searchTarget=[],this._searchDistPoint=0,this._textInfo=null,this._svg=null,this._path=null,this._canvas=null}destroy(){this._svg=tt(this._svg),this._path=null,this._canvas=null}hitTest(t,e,i,s){const{textInfo:r,mapRotation:o,resolution:l,searchDist:h,hittestType:c,isScreenAligned:m}=s;this._resetHittest();const f=l*n(1);switch(this.setGeomUnitsPerPoint(f),c){case"point":if(1!==t.length)return ft().error("Unexpected hittest area",t),!1;this._hittestType="point",this._searchDistPoint=h/2/f,this._searchTarget=[[t[0].x,t[0].y]];break;case"rect":if(4!==t.length)return ft().error("Unexpected hittest area",t),!1;this._hittestType="rect",this._searchDistPoint=0,this._searchTarget=t.map(t=>[t.x,t.y]);break;case"polygon":this._hittestType="polygon",this._searchDistPoint=0,this._searchTarget=t.map(t=>[t.x,t.y])}if(this._textInfo=r,this._mapRotation=m?o:0,!has("esri-mobile")){const t=a(at*window.devicePixelRatio),i=a(nt);!(("CIMLineSymbol"===e?.type||"CIMPolygonSymbol"===e?.type)&&e.symbolLayers?.some(Q))&&"CIMMeshSymbol"!==e?.type&&(Z(e)??0)<i&&(this._searchDistPoint=t)}return this._earlyReturn=!1,this.drawSymbol(e,i),this._earlyReturn}executeEffects(t,e){return"CIMGeometricEffectDashes"===t.at(-1)?.type&&(t=t.slice(0,-1)),super.executeEffects(t,e)}drawSolidFill(t,e,i){null!=i?this._hittestSvgPath(t,i,!0):this._hitTestFill(t)}drawHatchFill(t,e){this._hitTestFill(t)}drawPictureFill(t,e){this._hitTestFill(t)}drawGradientFill(t,e){this._hitTestFill(t)}drawSolidStroke(t,e,i,s,r,a,n){null!=n?this._hittestSvgPath(t,n,!1,i):this._hitTestStroke(t,i)}drawPictureStroke(t,e){this._hitTestStroke(t,e.width)}drawGradientStroke(t,e){this._hitTestStroke(t,e.width)}drawMarkerLayer(t,e){t.markerPlacement&&("CIMMarkerPlacementInsidePolygon"===t.markerPlacement.type||"CIMMarkerPlacementPolygonCenter"===t.markerPlacement.type&&t.markerPlacement.clipAtBoundary)?this._hitTestFill(e):super.drawMarkerLayer(t,e)}drawTextSymbol(t,e,i){if(!t||!T(e))return;if(H(t.height,z.CIMTextSymbol.height)<=0)return;const s=ut.createIdentity(),r=this.geomUnitsPerPoint();1!==r&&s.scale(r,r),s.translate(e.x,e.y),this.push(s),this.drawText(t,i),this.pop()}pushClipPath(t){}popClipPath(){}drawImage(t,e){const{url:i}=t,s=H(t.scaleX,1),r=this._resourceManager.getResource(i);if(null==r||0===r.height||0===e)return;const a=e*this.geomUnitsPerPoint(),n=a*s*(r.width/r.height);if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]),e=this._searchDistPoint;Math.abs(t[0])<n/2+e&&Math.abs(t[1])<a/2+e&&(this._earlyReturn=!0)}else{const t=n/2,e=a/2,i=[[-t,e],[t,e],[t,-e],[-t,-e],[-t,e]],s=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(s,[i])&&(this._earlyReturn=!0)}}drawText(t,e){const i=this._textInfo;if(!i)return;const s=i.get(t);if(!s)return;if(!u(s.glyphMosaicItems))return;const r=lt(H(t.height,z.CIMTextSymbol.height)),{lineGapType:a,lineGap:n}=t,o=a?St(a,H(n),r):0,l=t.horizontalAlignment??z.CIMTextSymbol.horizontalalignment,h=t.verticalAlignment??z.CIMTextSymbol.verticalalignment,c="CIMBackgroundCallout"===t.callout?.type,m=ot(s.glyphMosaicItems,{scale:r/rt,angle:H(t.angle),xOffset:H(t.offsetX),yOffset:H(t.offsetY),horizontalAlignment:l,verticalAlignment:h,maxLineWidth:ht(t.lineWidth),lineHeight:st*Math.max(.25,Math.min(o||1,4)),decoration:t.font.decoration||"none",useCIMAngleBehavior:!1,hasBackground:c}),f=this.reverseScaleText(1);for(const d of m.glyphs){const t=d.offsets,e=[[t.topLeft[0]*f,-t.topLeft[1]*f],[t.topRight[0]*f,-t.topRight[1]*f],[t.bottomRight[0]*f,-t.bottomRight[1]*f],[t.bottomLeft[0]*f,-t.bottomLeft[1]*f],[t.topLeft[0]*f,-t.topLeft[1]*f]];if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]);P(t,[e])&&(this._earlyReturn=!0)}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,[e])&&(this._earlyReturn=!0)}}function u(t){return"glyphs"===t.type?t.glyphs.length>0:t.runs.some(t=>t.glyphs.glyphs.length>0)}}_hitTestFill(t){let e=null;if(M(t)){const i=t;e=[[[i.xmin,i.ymin],[i.xmin,i.ymax],[i.xmax,i.ymax],[i.xmax,i.ymin],[i.xmin,i.ymin]]]}else if(S(t))e=t.rings;else{if(!w(t))return;e=t.paths}if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]);if(P(t,e)&&(this._earlyReturn=!0),!this._earlyReturn){const i=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint();x(t,e,i)&&(this._earlyReturn=!0)}}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,e)&&(this._earlyReturn=!0)}}_getSvgPath(){return null!=this._svg&&null!=this._path||(this._svg??=et(),this._path??=it("path"),this._svg.appendChild(this._path)),this._path}_getCanvasContext(t,e){return this._canvas??=document.createElement("canvas"),this._canvas.width=t,this._canvas.height=e,this._canvas.getContext("2d",{willReadFrequently:!0})}_hittestSvgPath(t,e,i,s=0){const r=p();g(r,t);const a={x:r[0],y:r[1],width:r[2]-r[0],height:r[3]-r[1]},n=this._getSvgPath();n.setAttribute("d",e);const o=n.getBBox();if("point"===this._hittestType){const t=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint(),r=this.reverseTransformPt(this._searchTarget[0]);let n=Math.max(o.width/a.width,o.height/a.height),l=1;const h=2*t*n;h<1&&(l=2/h,n*=l,o.x*=l,o.y*=l,o.width*=l,o.height*=l);const c=1+s*n/2,m=this._getCanvasContext(o.width+2*c,o.height+2*c);m.setTransform(l,0,0,l,-o.x+c,-o.y+c);const f=new Path2D(e);i?m.fill(f):(m.lineWidth=s*(n/l),m.stroke(f));const u=(a.width*n-o.width)/2,d=(a.height*n-o.height)/2,p=Math.floor((r[0]-a.x-t)*n-u+c),g=Math.floor((a.height-(r[1]-a.y)-t)*n+d+c),_=Math.ceil(2*t*n),y=Math.ceil(2*t*n),P=m.getImageData(p,g,_,y).data;for(let e=3;e<P.length;e+=4)if(P[e]>127.5)return void(this._earlyReturn=!0)}else{const t=[[a.x,a.y],[a.x,a.y+a.height],[a.x+a.width,a.y+a.height],[a.x+a.width,a.y],[a.x,a.y]],e=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;if(y(e,[t]))return void(this._earlyReturn=!0)}}_hitTestStroke(t,e){let i=null;if(M(t)){const e=t;i=[[[e.xmin,e.ymin],[e.xmin,e.ymax],[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin]]]}else if(S(t))i=t.rings;else{if(!w(t))return;i=t.paths}if("point"===this._hittestType){const t=this.reverseTransformPt(this._searchTarget[0]),s=H(e,z.CIMSolidStroke.width)*this.geomUnitsPerPoint(),r=this.reverseTransformScalar(this._searchDistPoint)*this.prevGeomUnitsPerPoint();x(t,i,s/2+r)&&(this._earlyReturn=!0)}else{const t=this.isEmbedded()?this._searchTarget.map(t=>this.reverseTransformPt(t)):this._searchTarget;y(t,i)&&(this._earlyReturn=!0)}}_resetHittest(){this.setTransform(),this._hittestType="point",this._searchTarget=[],this._searchDistPoint=0,this._textInfo=null}}class _t extends dt{constructor(t,e,i,s){super(e,i),this._applyAdditionalRenderProps=s,this._colorSubstitutionHelper=new C,this._ctx=t}drawSolidFill(t,e){if(!t)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else if(M(t))this._buildPath(xt(t).rings,!0);else{if(!b(t))return;console.log("CanvasDrawHelper.drawSolidFill - No implementation!")}const i=this._ctx;i.fillStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",i.fill("evenodd")}drawSolidStroke(t,e,i,s,r,a){if(!t||!e||0===i)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!1);else{if(!M(t))return void console.log("CanvasDrawHelper.drawSolidStroke isn't implemented!");this._buildPath(xt(t).rings,!0)}const n=this._ctx;n.strokeStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",n.lineWidth=Math.max(this.transformSize(i),mt),this._setCapStyle(s),this._setJoinStyle(r),n.miterLimit=a,n.stroke()}pushClipPath(t){if(this._ctx.save(),S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else{if(!M(t))return;this._buildPath(xt(t).rings,!0)}this._ctx.clip("evenodd")}popClipPath(){this._ctx.restore()}drawImage(t,e){const{colorSubstitutions:i,url:s,tintColor:r}=t,a=H(t.scaleX,1),n=this._resourceManager.getResource(s);if(null==n)return;let o=e*(n.width/n.height),l=e;e||(o=n.width,l=n.height);const h=E(s)||"src"in n&&E(n.src);let c="getFrame"in n?L(n):n;i&&(c=this._colorSubstitutionHelper.applyColorSubstitution(c,i)),this._applyAdditionalRenderProps&&!h&&r&&(c=this._colorSubstitutionHelper.tintImageData(c,r));const m=this.transformPt([0,0]),[f,u]=this.getTransformAngle(),d=this.transformSize(1),p=this._ctx;p.save(),p.setTransform({m11:a*d*f,m12:a*d*u,m21:-d*u,m22:d*f,m41:m[0],m42:m[1]}),p.drawImage(c,-o/2,-l/2,o,l),p.restore()}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new G);const i=wt(t,this.transformSize(a(1))),s=j({textString:e,font:i.font,symbol:t,supportsRichText:D(e)}),r=s?this._textRasterizer.rasterizeRichText(s,i):this._textRasterizer.rasterizeText(e,i);if(!r)return;const{size:n,anchorX:o,anchorY:l,canvas:h}=r,c=n[0]*(o+.5),m=n[1]*(l-.5),f=this._ctx,u=this.transformPt([0,0]),[d,p]=this.getTransformAngle(),g=1;f.save(),f.setTransform({m11:g*d,m12:g*p,m21:-g*p,m22:g*d,m41:u[0]-g*c,m42:u[1]+g*m}),f.drawImage(h,0,0),f.restore()}drawPictureFill(t,e){if(!t)return;let{colorSubstitutions:i,height:s,offsetX:r,offsetY:a,rotation:n,scaleX:o,tintColor:l,url:h}=e;const c=this._resourceManager.getResource(h);if(null==c)return;if(S(t))this._buildPath(t.rings,!0);else if(w(t))this._buildPath(t.paths,!0);else if(M(t))this._buildPath(xt(t).rings,!0);else{if(!b(t))return;console.log("CanvasDrawHelper.drawPictureFill - No implementation!")}const m=this._ctx,f=E(h)||"src"in c&&E(c.src);let u,d="getFrame"in c?L(c):c;if(i&&(d=this._colorSubstitutionHelper.applyColorSubstitution(d,i)),this._applyAdditionalRenderProps){f||l&&(d=this._colorSubstitutionHelper.tintImageData(d,l)),u=m.createPattern(d,"repeat");const t=this.transformSize(1);n||(n=0),r?r*=t:r=0,a?a*=t:a=0,s&&(s*=t);const e=s?s/c.height:1,i=o&&s?o*s/c.width:1;if(0!==n||1!==e||1!==i||0!==r||0!==a){const t=new DOMMatrix;t.rotateSelf(0,0,-n).translateSelf(r,a).scaleSelf(i,e,1),u.setTransform(t)}}else u=m.createPattern(d,"repeat");m.save(),m.fillStyle=u,m.fill("evenodd"),m.restore()}drawPictureStroke(t,i){if(!t)return;let{colorSubstitutions:s,capStyle:r,joinStyle:a,miterLimit:o,tintColor:l,url:h,width:c}=i;const m=this._resourceManager.getResource(h);if(null==m)return;let f;if(S(t))f=t.rings;else if(w(t))f=t.paths;else{if(!M(t))return b(t)?void console.log("CanvasDrawHelper.drawPictureStroke - No implementation!"):void 0;f=xt(t).rings}c||(c=m.width);const u=E(h)||"src"in m&&E(m.src);let d="getFrame"in m?L(m):m;s&&(d=this._colorSubstitutionHelper.applyColorSubstitution(d,s)),this._applyAdditionalRenderProps&&(u||l&&(d=this._colorSubstitutionHelper.tintImageData(d,l)));const p=Math.max(this.transformSize(n(c)),.5),g=p/d.width,_=this._ctx,y=_.createPattern(d,"repeat-y");let P,x;_.save(),this._setCapStyle(r),this._setJoinStyle(a),void 0!==o&&(_.miterLimit=o),_.lineWidth=p;for(let n of f)if(n=e(n),bt(n),n&&!(n.length<=1)){P=this.transformPt(n[0]);for(let t=1;t<n.length;t++){x=this.transformPt(n[t]);const e=Pt(P,x),i=new DOMMatrix;i.translateSelf(0,P[1]-p/2).scaleSelf(g,g,1).rotateSelf(0,0,90-e),y.setTransform(i),_.strokeStyle=y,_.beginPath(),_.moveTo(P[0],P[1]),_.lineTo(x[0],x[1]),_.stroke(),P=x}}_.restore()}drawGradientFill(t,e){if(!t)return;let i;if(S(t))i=t.rings;else if(w(t))i=t.paths;else{if(!M(t))return void ft().error("Unable to draw gradient fill");i=xt(t).rings}this._buildPath(i,!0);const{angle:r,gradientMethod:a,gradientSize:o,gradientSizeUnits:l}=e,p=z.CIMGradientFill,g=e.gradientType??p.gradientType,_=-s(r??0),y=h();for(const s of i){const t=s?s.length:0;if(t>1)for(let e=0;e<t;e++){let t=this.transformPt(s[e]);"Linear"!==a&&"Rectangular"!==a||(t=U(t,-_)),c(y,t)}}const[P,x,b,T]=y,k=this._ctx;switch(k.save(),a){case"Buffered":ft().error(`Gradient method "${a}" currently unsupported.`);break;case"Linear":{const t=(x+T)/2,i="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(b-P),[s,r]="Discrete"===g?[b,b-i]:[P+i,P],a=U([s,t],_),h=U([r,t],_),c=k.createLinearGradient(a[0],a[1],h[0],h[1]);F(c,e),k.fillStyle=c,k.fill("evenodd");break}case"Circular":{const t=m(y),i=d(y)/2,s="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*i,[r,a]="Discrete"===g?[i,i-s]:[s,0],h=k.createRadialGradient(t[0],t[1],r,t[0],t[1],a);F(h,e),k.fillStyle=h,k.fill("evenodd");break}case"Rectangular":{const i=m(y),s=i[0],r=i[1],a=U(i,_),h=(i,s,r,n,o,l,h,c)=>{k.save(),this.pushClipPath(t);const m=U([o,l],_),f=U([h,c],_);k.beginPath(),k.moveTo(a[0],a[1]),k.lineTo(m[0],m[1]),k.lineTo(f[0],f[1]),k.lineTo(a[0],a[1]),k.clip();const u=U([i,s],_),d=U([r,n],_),p=k.createLinearGradient(u[0],u[1],d[0],d[1]);F(p,e),k.fillStyle=p,k.fill("evenodd"),k.restore()};let c="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(f(y)/2),[d,S]="Discrete"===g?[b,b-c]:[s+c,s];h(d,r,S,r,b,x,b,T),[d,S]="Discrete"===g?[P,P+c]:[s-c,s],h(d,r,S,r,P,T,P,x),c="Absolute"===l?this.transformSize(n(o)):B(o,p.gradientSize)*(u(y)/2);let[w,M]="Discrete"===g?[T,T-c]:[r+c,r];h(s,w,s,M,b,T,P,T),[w,M]="Discrete"===g?[x,x+c]:[r-c,r],h(s,w,s,M,P,x,b,x);break}}k.restore()}drawGradientStroke(t,i){const{capStyle:s,gradientMethod:r,gradientSize:a,gradientSizeUnits:o,joinStyle:l,miterLimit:h,width:c}=i;if(!t||0===c)return;let m;if(S(t))m=t.rings;else if(w(t))m=t.paths;else{if(!M(t))return void ft().error("Unable to draw gradient stroke");m=xt(t).rings}const f=i.gradientType??z.CIMGradientStroke.gradientType,u=Math.max(this.transformSize(n(c)),.5),d=this._ctx;let p,g;d.save(),this._setCapStyle(s),this._setJoinStyle(l),void 0!==h&&(d.miterLimit=h),d.lineWidth=u;for(let _ of m){if(_=e(_),bt(_),!_||_.length<=1)continue;let t=0;p=this.transformPt(_[0]);for(let e=1;e<_.length;e++){g=this.transformPt(_[e]);const i=g[0]-p[0],s=g[1]-p[1];t+=Math.sqrt(i*i+s*s),p=g}const s="Absolute"===o?this.transformSize(n(a)):B(a,z.CIMGradientStroke.gradientSize)*("AcrossLine"===r?u:t);let l=0;p=this.transformPt(_[0]);for(let e=1;e<_.length;e++){g=this.transformPt(_[e]);const a=g[0]-p[0],n=g[1]-p[1],o=Math.sqrt(a*a+n*n);let h,c,m,y;switch(r){case"AcrossLine":{const[t,e]=U([a/o,n/o],-Math.PI/2),i=u/2,r="Discrete"===f?i:s-i;h=(p[0]+g[0])/2+t*r,c=(p[1]+g[1])/2+e*r,m=h-t*s,y=c-e*s;break}case"AlongLine":{const e=a/o,i=n/o;"Discrete"===f?(h=p[0]-e*l,c=p[1]-i*l,m=h+e*s,y=c+i*s):(m=p[0]+e*(t-l),y=p[1]+i*(t-l),h=m-e*s,c=y-i*s);break}default:return ft().error("Unrecognized gradient method:",r),void d.restore()}const P=d.createLinearGradient(h,c,m,y);F(P,i),d.strokeStyle=P,d.beginPath(),d.moveTo(p[0],p[1]),d.lineTo(g[0],g[1]),d.stroke(),l+=o,p=g}}d.restore()}_buildPath(t,e){const i=this._ctx;if(i.beginPath(),t)for(const s of t){const t=s?s.length:0;if(t>1){let r=this.transformPt(s[0]);i.moveTo(r[0],r[1]);for(let e=1;e<t;e++)r=this.transformPt(s[e]),i.lineTo(r[0],r[1]);e&&i.closePath()}}}_setCapStyle(t){switch(t){case"Butt":this._ctx.lineCap="butt";break;case"Round":this._ctx.lineCap="round";break;case"Square":this._ctx.lineCap="square"}}_setJoinStyle(t){switch(t){case"Bevel":this._ctx.lineJoin="bevel";break;case"Round":this._ctx.lineJoin="round";break;case"Miter":this._ctx.lineJoin="miter"}}}function yt(t,e,i){let s=H(t.separation,z.CIMHatchFill.separation)*i,r=H(t.rotation);if(0===s)return null;s<0&&(s=-s);let a=0;const n=.5*s;for(;a>n;)a-=s;for(;a<-n;)a+=s;const o=p();g(o,e),o[0]-=n,o[1]-=n,o[2]+=n,o[3]+=n;const l=[[o[0],o[1]],[o[0],o[3]],[o[2],o[3]],[o[2],o[1]]];for(;r>180;)r-=180;for(;r<0;)r+=180;const h=Math.cos(r*ct),c=Math.sin(r*ct),m=-s*c,f=s*h;let u,d,_,y;a=H(t.offsetX)*i*c-H(t.offsetY)*i*h,u=_=Number.MAX_VALUE,d=y=-Number.MAX_VALUE;for(const p of l){const t=p[0],e=p[1],i=h*t+c*e,s=-c*t+h*e;u=Math.min(u,i),_=Math.min(_,s),d=Math.max(d,i),y=Math.max(y,s)}_=Math.floor(_/s)*s;let P=h*u-c*_-m*a/s,x=c*u+h*_-f*a/s,S=h*d-c*_-m*a/s,w=c*d+h*_-f*a/s;const M=1+Math.round((y-_)/s),b=[];for(let p=0;p<M;p++)P+=m,x+=f,S+=m,w+=f,b.push([[P,x],[S,w]]);return{paths:b}}function Pt(t,e){const i=e[0]-t[0],s=e[1]-t[1];return 180/Math.PI*Math.atan2(s,i)}const xt=t=>t?{spatialReference:t.spatialReference,rings:[[[t.xmin,t.ymin],[t.xmin,t.ymax],[t.xmax,t.ymax],[t.xmax,t.ymin],[t.xmin,t.ymin]]]}:null,St=(t,e,i)=>{switch(t){case"ExtraLeading":return 1+e/i;case"Multiple":return e;case"Exact":return e/i}};function wt(e,i=1){const s=J(e),r=N(e.fontStyleName),a=e.fontFamilyName??t,{weight:n,style:o}=r,l=i*(e.height||5),h=O(e.horizontalAlignment),c=q(e.verticalAlignment),m=V(e),f=V(e.haloSymbol),u=null!=f?i*(e.haloSize??0):0,d=Y(e.symbol),p=i*(W(e.symbol)||0),g="CIMBackgroundCallout"===e.callout?.type?e.callout.backgroundSymbol:null,_=V(g),y=W(g),P=Y(g);return{color:m,size:l,horizontalAlignment:h,verticalAlignment:c,font:{family:a,style:$(o),weight:K(n),decoration:s},outline:{size:p||0,color:d},halo:{size:u||0,color:f,style:o},backgroundColor:_,borderLine:null!=y&&null!=P?{size:y,color:P}:null,pixelRatio:1,premultiplyColors:!0}}const Mt=1e-4;function bt(t){let e,i,s,r,a,n=t[0],o=1;for(;o<t.length;)e=t[o][0]-n[0],i=t[o][1]-n[1],r=0!==e?i/e:Math.PI/2,void 0!==s&&Math.abs(r-s)<=Mt?(t.splice(o-1,1),n=a):(a=n,n=t[o],o++),s=r}export{dt as CIMSymbolDrawHelper,_t as CanvasDrawHelper,pt as EnvDrawHelper,gt as HittestDrawHelper,ut as Transformation,ct as cDegToRad,St as lineGapType2LineHeight};
@@ -3,7 +3,7 @@ import type Layer from "../../../layers/Layer.js";
3
3
  import type MapView from "../../MapView.js";
4
4
  import type ViewState from "../ViewState.js";
5
5
  import type LayerView from "../../layers/LayerView.js";
6
- import type { ScreenPoint, ScreenRect } from "../../../core/types.js";
6
+ import type { ScreenPoint, ScreenPolygon, ScreenRect } from "../../../core/types.js";
7
7
  import type { ViewHit } from "../../types.js";
8
8
  import type { LayerViewProperties } from "../../layers/LayerView.js";
9
9
 
@@ -187,7 +187,7 @@ export default abstract class BaseLayerView2D extends LayerView {
187
187
  * @param hitTarget - The point in screen coordinates.
188
188
  * @returns A Promise that resolves to an array of hits.
189
189
  */
190
- hitTest(mapPoint: Point, hitTarget: ScreenPoint | ScreenRect): Promise<ViewHit[] | null | undefined>;
190
+ hitTest(mapPoint: Point, hitTarget: ScreenPoint | ScreenRect | ScreenPolygon): Promise<ViewHit[] | null | undefined>;
191
191
  /**
192
192
  * The method to implement that is responsible of drawing the content of the layer.
193
193
  * This method is called every time the MapView's state changes, or if [requestRender()](https://developers.arcgis.com/javascript/latest/references/core/views/2d/layers/BaseLayerView2D/#requestRender) has been called.
@@ -7,7 +7,7 @@ import type Layer from "../../../layers/Layer.js";
7
7
  import type MapView from "../../MapView.js";
8
8
  import type ViewState from "../ViewState.js";
9
9
  import type LayerView from "../../layers/LayerView.js";
10
- import type { ScreenPoint, ScreenRect } from "../../../core/types.js";
10
+ import type { ScreenPoint, ScreenPolygon, ScreenRect } from "../../../core/types.js";
11
11
  import type { ViewHit } from "../../types.js";
12
12
  import type { TessellatedMesh } from "../types.js";
13
13
  import type { LayerViewProperties } from "../../layers/LayerView.js";
@@ -313,7 +313,7 @@ export default abstract class BaseLayerViewGL2D extends LayerView {
313
313
  * @param hitTarget - The point in screen coordinates.
314
314
  * @returns A Promise that resolves to an array of graphics.
315
315
  */
316
- hitTest(mapPoint: Point, hitTarget: ScreenPoint | ScreenRect): Promise<ViewHit[] | null | undefined>;
316
+ hitTest(mapPoint: Point, hitTarget: ScreenPoint | ScreenRect | ScreenPolygon): Promise<ViewHit[] | null | undefined>;
317
317
  /**
318
318
  * The method to implement that is responsible of drawing the content of the layer.
319
319
  * This method is called every time the MapView's state changes, or if [requestRender()](https://developers.arcgis.com/javascript/latest/references/core/views/2d/layers/BaseLayerViewGL2D/#requestRender) has been called.
@@ -1,2 +1,2 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import has from"../../../../core/has.js";import{pt2px as t}from"../../../../core/screenUtils.js";import{r as e}from"../../../../chunks/rbush.js";import s from"../../../../geometry/Point.js";import{create as i,intersects as o,copy as n}from"../../../../geometry/support/aaBoundingRect.js";import{normalizeMapX as r}from"../../../../geometry/support/normalizeUtils.js";import{getInfo as m}from"../../../../geometry/support/spatialReferenceUtils.js";import{HittestDrawHelper as a}from"../../../../symbols/cim/CIMSymbolDrawHelper.js";import{CIMSymbolInflatedSizeHelper as l}from"../../../../symbols/cim/CIMSymbolHelper.js";import{hittestToleranceSmallSymbol as h,hittestToleranceMobile as c,hittestToleranceDesktop as u}from"../../engine/webgl/definitions.js";import{GraphicStoreItem as p}from"./GraphicStoreItem.js";import{pixelBuffer as d}from"./graphicsUtils.js";import{GraphicUpdateMessage as f}from"./GraphicUpdateMessage.js";import{getMapPointsFromScreen as _,createHittestQuery as y}from"../../support/hitTestUtils.js";const b=1e-5;function I(t,e){return e.zOrder-t.zOrder}class g{constructor(t,e,s,i,o){this._items=new Map,this._boundsDirty=!1,this._outSpatialReference=t,this._cimResourceManager=e,this._hittestDrawHelper=new a(e),this._tileInfoView=s,this._store=o;const n=s.getClosestInfoForScale(i);this._resolution=this._tileInfoView.getTileResolution(n.level)}destroy(){this._hittestDrawHelper.destroy()}items(){return this._items.values()}getItem(t){return this._items.get(t)}async update(t,e,s){const i=[],o=[],n=[],r=new Set,m=[];let a=0;const l=new Set;for(const h of t.items){const t=h.uid;if(l.has(t))continue;l.add(t),a++;const n=this._items.get(t),c=e(h);if(r.add(t),n){const t=n.update(h,c,a),e=n.updateDensificationResolution(this._resolution);t&&m.push(this._updateItem(n,s)),(t||e)&&o.push(n);continue}const u=this._store.createDisplayIdForObjectId(t),d=p.fromGraphic(h,c,a,u);d.updateDensificationResolution(this._resolution),m.push(this._updateItem(d,s)),this._items.set(d.objectId,d),i.push(d)}for(const[h,c]of this._items.entries())r.has(h)||(this._store.releaseDisplayIdForObjectId(h),this._items.delete(h),n.push(c));return await Promise.all(m),this._index=null,new f(i,o,n)}updateLevel(t){if(this._resolution===t)return!1;this._index=null,this._boundsDirty=!0,this._resolution=t;for(const e of this.items())if(e.hasCurvedGeoemtry)return!0;return!1}hitTest(t,e,n,m){const a=i();let l=i();const p=y(e);if(!p)return console.warn("Unexpected hittest input:",e),[];let f=0,b=_(t,p.input);if(b=b.map(t=>new s(r(t.x,this._tileInfoView.spatialReference),t.y,this._tileInfoView.spatialReference)),"rect"===p.hittestType){const t=Math.min(...b.map(t=>t.x)),e=Math.min(...b.map(t=>t.y)),s=Math.max(...b.map(t=>t.x)),i=Math.max(...b.map(t=>t.y));a[0]=t,a[1]=e,a[2]=s,a[3]=i,l=a}else if("point"===p.hittestType){const t=has("esri-mobile"),e=t?c:u,s=e+(t?0:h),o=b[0].x,r=b[0].y,m=n*window.devicePixelRatio*s;a[0]=o-m,a[1]=r-m,a[2]=o+m,a[3]=r+m;const p=n*window.devicePixelRatio*e,_=i();_[0]=o-p,_[1]=r-p,_[2]=o+p,_[3]=r+p;const y=.5*n*(s+d);l[0]=o-y,l[1]=r-y,l[2]=o+y,l[3]=r+y,f=_[2]-_[0]}const g=this._searchIndex(l[0],l[1],l[2],l[3]);if(!g||0===g.length)return[];const x=[],w=i(),j=i();for(const s of g){if(!s.visible)continue;const{geometryBounds:t,symbolResource:e}=s;this._getSymbolBounds(w,e,t,j,m),j[3]=j[2]=j[1]=j[0]=0,o(w,a)&&x.push(s)}if(0===x.length)return[];const R=this._hittestDrawHelper,S=[];for(const s of x){const{projectedGeometry:t,symbolResource:e}=s;if(!e)continue;const{textInfo:i,symbolInfo:o}=e,r=o.cimSymbol,a=o.linearCIM.some(t=>"alignment"in t&&0===t.alignment),l={hittestType:p.hittestType,textInfo:i,mapRotation:m,resolution:n,searchDist:f,isScreenAligned:a};R.hitTest(b,r.symbol,t,l)&&S.push(s)}return S.sort(I),S.map(t=>t.objectId)}queryItems(t){return 0===this._items.size?[]:this._searchForItems(t)}clear(){this._items.clear(),this._index=null}async _updateItem(t,e){await t.projectAndNormalize(this._outSpatialReference),await e(t);const{size:s}=t;s[0]=s[1]=s[2]=s[3]=0,this._getSymbolBounds(t.symbolBounds,t.symbolResource,t.geometryBounds,t.size,0)}_searchIndex(t,s,i,o){return this._boundsDirty&&(this._items.forEach(t=>this._getSymbolBounds(t.symbolBounds,t.symbolResource,t.geometryBounds,t.size,0)),this._boundsDirty=!1),this._index||(this._index=e(9,t=>({minX:t.symbolBounds[0],minY:t.symbolBounds[1],maxX:t.symbolBounds[2],maxY:t.symbolBounds[3]})),this._index.load(Array.from(this._items.values()))),this._index.search({minX:t,minY:s,maxX:i,maxY:o})}_searchForItems(t){const e=this._tileInfoView.spatialReference,s=t.bounds,o=m(e);if(o&&e.isWrappable){const[e,n]=o.valid,r=Math.abs(s[2]-n)<b,m=Math.abs(s[0]-e)<b;if((!r||!m)&&(r||m)){const o=t.resolution;let m;m=i(r?[e,s[1],e+o*d,s[3]]:[n-o*d,s[1],n,s[3]]);const a=this._searchIndex(s[0],s[1],s[2],s[3]),l=this._searchIndex(m[0],m[1],m[2],m[3]);return[...new Set([...a,...l])]}}return this._searchIndex(s[0],s[1],s[2],s[3])}_getSymbolBounds(e,s,o,r,m){if(!s||!s.symbolInfo.linearCIM)return null;if(e||(e=i()),n(e,o),!r||0===r[0]&&0===r[1]&&0===r[2]&&0===r[3]){const{textInfo:e,symbolInfo:i}=s,o=i.cimSymbol;r||(r=[0,0,0,0]);const n=l.getSymbolInflateSize(r,o.symbol,this._cimResourceManager,m,e);r[0]=t(n[0]),r[1]=t(n[1]),r[2]=t(n[2]),r[3]=t(n[3])}const a=this._resolution,h=l.safeSize(r);return e[0]-=h*a,e[1]-=h*a,e[2]+=h*a,e[3]+=h*a,e}}export{g as default};
2
+ import has from"../../../../core/has.js";import{pt2px as t}from"../../../../core/screenUtils.js";import{r as e}from"../../../../chunks/rbush.js";import s from"../../../../geometry/Point.js";import{create as i,intersects as o,copy as n}from"../../../../geometry/support/aaBoundingRect.js";import{normalizeMapX as r}from"../../../../geometry/support/normalizeUtils.js";import{getInfo as m}from"../../../../geometry/support/spatialReferenceUtils.js";import{HittestDrawHelper as a}from"../../../../symbols/cim/CIMSymbolDrawHelper.js";import{CIMSymbolInflatedSizeHelper as l}from"../../../../symbols/cim/CIMSymbolHelper.js";import{hittestToleranceSmallSymbol as h,hittestToleranceMobile as c,hittestToleranceDesktop as u}from"../../engine/webgl/definitions.js";import{GraphicStoreItem as p}from"./GraphicStoreItem.js";import{pixelBuffer as d}from"./graphicsUtils.js";import{GraphicUpdateMessage as f}from"./GraphicUpdateMessage.js";import{getMapPointsFromScreen as y,createHittestQuery as _}from"../../support/hitTestUtils.js";const b=1e-5;function I(t,e){return e.zOrder-t.zOrder}class g{constructor(t,e,s,i,o){this._items=new Map,this._boundsDirty=!1,this._outSpatialReference=t,this._cimResourceManager=e,this._hittestDrawHelper=new a(e),this._tileInfoView=s,this._store=o;const n=s.getClosestInfoForScale(i);this._resolution=this._tileInfoView.getTileResolution(n.level)}destroy(){this._hittestDrawHelper.destroy()}items(){return this._items.values()}getItem(t){return this._items.get(t)}async update(t,e,s){const i=[],o=[],n=[],r=new Set,m=[];let a=0;const l=new Set;for(const h of t.items){const t=h.uid;if(l.has(t))continue;l.add(t),a++;const n=this._items.get(t),c=e(h);if(r.add(t),n){const t=n.update(h,c,a),e=n.updateDensificationResolution(this._resolution);t&&m.push(this._updateItem(n,s)),(t||e)&&o.push(n);continue}const u=this._store.createDisplayIdForObjectId(t),d=p.fromGraphic(h,c,a,u);d.updateDensificationResolution(this._resolution),m.push(this._updateItem(d,s)),this._items.set(d.objectId,d),i.push(d)}for(const[h,c]of this._items.entries())r.has(h)||(this._store.releaseDisplayIdForObjectId(h),this._items.delete(h),n.push(c));return await Promise.all(m),this._index=null,new f(i,o,n)}updateLevel(t){if(this._resolution===t)return!1;this._index=null,this._boundsDirty=!0,this._resolution=t;for(const e of this.items())if(e.hasCurvedGeoemtry)return!0;return!1}hitTest(t,e,n,m){const a=i();let l=i();const p=_(e);if(!p)return console.warn("Unexpected hittest input:",e),[];let f=0,b=y(t,p.input);if(b=b.map(t=>new s(r(t.x,this._tileInfoView.spatialReference),t.y,this._tileInfoView.spatialReference)),"rect"===p.hittestType||"polygon"===p.hittestType){const t=Math.min(...b.map(t=>t.x)),e=Math.min(...b.map(t=>t.y)),s=Math.max(...b.map(t=>t.x)),i=Math.max(...b.map(t=>t.y));a[0]=t,a[1]=e,a[2]=s,a[3]=i,l=a}else if("point"===p.hittestType){const t=has("esri-mobile"),e=t?c:u,s=e+(t?0:h),o=b[0].x,r=b[0].y,m=n*window.devicePixelRatio*s;a[0]=o-m,a[1]=r-m,a[2]=o+m,a[3]=r+m;const p=n*window.devicePixelRatio*e,y=i();y[0]=o-p,y[1]=r-p,y[2]=o+p,y[3]=r+p;const _=.5*n*(s+d);l[0]=o-_,l[1]=r-_,l[2]=o+_,l[3]=r+_,f=y[2]-y[0]}const g=this._searchIndex(l[0],l[1],l[2],l[3]);if(!g||0===g.length)return[];const x=[],w=i(),j=i();for(const s of g){if(!s.visible)continue;const{geometryBounds:t,symbolResource:e}=s;this._getSymbolBounds(w,e,t,j,m),j[3]=j[2]=j[1]=j[0]=0,o(w,a)&&x.push(s)}if(0===x.length)return[];const R=this._hittestDrawHelper,S=[];for(const s of x){const{projectedGeometry:t,symbolResource:e}=s;if(!e)continue;const{textInfo:i,symbolInfo:o}=e,r=o.cimSymbol,a=o.linearCIM.some(t=>"alignment"in t&&0===t.alignment),l={hittestType:p.hittestType,textInfo:i,mapRotation:m,resolution:n,searchDist:f,isScreenAligned:a};R.hitTest(b,r.symbol,t,l)&&S.push(s)}return S.sort(I),S.map(t=>t.objectId)}queryItems(t){return 0===this._items.size?[]:this._searchForItems(t)}clear(){this._items.clear(),this._index=null}async _updateItem(t,e){await t.projectAndNormalize(this._outSpatialReference),await e(t);const{size:s}=t;s[0]=s[1]=s[2]=s[3]=0,this._getSymbolBounds(t.symbolBounds,t.symbolResource,t.geometryBounds,t.size,0)}_searchIndex(t,s,i,o){return this._boundsDirty&&(this._items.forEach(t=>this._getSymbolBounds(t.symbolBounds,t.symbolResource,t.geometryBounds,t.size,0)),this._boundsDirty=!1),this._index||(this._index=e(9,t=>({minX:t.symbolBounds[0],minY:t.symbolBounds[1],maxX:t.symbolBounds[2],maxY:t.symbolBounds[3]})),this._index.load(Array.from(this._items.values()))),this._index.search({minX:t,minY:s,maxX:i,maxY:o})}_searchForItems(t){const e=this._tileInfoView.spatialReference,s=t.bounds,o=m(e);if(o&&e.isWrappable){const[e,n]=o.valid,r=Math.abs(s[2]-n)<b,m=Math.abs(s[0]-e)<b;if((!r||!m)&&(r||m)){const o=t.resolution;let m;m=i(r?[e,s[1],e+o*d,s[3]]:[n-o*d,s[1],n,s[3]]);const a=this._searchIndex(s[0],s[1],s[2],s[3]),l=this._searchIndex(m[0],m[1],m[2],m[3]);return[...new Set([...a,...l])]}}return this._searchIndex(s[0],s[1],s[2],s[3])}_getSymbolBounds(e,s,o,r,m){if(!s||!s.symbolInfo.linearCIM)return null;if(e||(e=i()),n(e,o),!r||0===r[0]&&0===r[1]&&0===r[2]&&0===r[3]){const{textInfo:e,symbolInfo:i}=s,o=i.cimSymbol;r||(r=[0,0,0,0]);const n=l.getSymbolInflateSize(r,o.symbol,this._cimResourceManager,m,e);r[0]=t(n[0]),r[1]=t(n[1]),r[2]=t(n[2]),r[3]=t(n[3])}const a=this._resolution,h=l.safeSize(r);return e[0]-=h*a,e[1]-=h*a,e[2]+=h*a,e[3]+=h*a,e}}export{g as default};
@@ -1,2 +1,2 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import e from"../../../Graphic.js";import{isSome as t}from"../../../core/arrayUtils.js";import{isIterable as r}from"../../../core/iteratorUtils.js";import{isScreenRect as i,createScreenPoint as n,clipRectToView as s,isScreenPoint as a}from"../../../core/screenUtils.js";import{computeClippedScreenRect as l,clipContainsPoint as o,clipIntersectsScreenRect as c}from"./clippingUtils.js";import{isSupportedScreenPointEvent as p,createScreenPointFromSupportedEvent as u}from"../../support/screenUtils.js";function f(e){if(i(e)){return{hittestType:"rect",input:e}}return{hittestType:"point",input:e}}async function h(e,r,n){const a=!p(r)&&i(r),l=a?s(r,e.width,e.height):p(r)?u(e,r):r;if(!e.ready||isNaN(l.x)||isNaN(l.y))return{screenPoint:null,results:[]};let o=new Set;const c=new Set;let f=!1,h=null,V=null;n?.include?d(n.include,y(e,e=>{o.add(e),m(e,e=>c.add(e))},(e,t)=>{c.add(e),o.add(t)},e=>{h||(h=new Set),h.add(e)},e=>o.add(e),()=>f=!0)):(f=!0,o=new Set(e.allLayerViews),o.forEach(e=>{m(e,e=>c.add(e))})),n?.exclude&&d(n.exclude,y(e,e=>{o.delete(e),m(e,e=>c.delete(e))},e=>c.delete(e),e=>{V||(V=new Set),V.add(e)}));const j=M(e,l)[0],b=w(e,l,j).filter(e=>o.has(e)),L=f?e.graphicsView.hitTest(e,l).map(e=>({type:"graphic",graphic:e,layer:null,mapPoint:a?null:j})):[],S=Array.from(b).flatMap(t=>{if(a){const r=x(e,t,l);return null==r?[]:r.map(e=>t.hitTest(j,e))}return[t.hitTest(j,l)]});let T=[...L,...await Promise.all(S)].filter(t).flat().filter(t);T=T.filter(e=>"graphic"!==e.type||"subtype-group"!==e.layer?.type||c.has(e.graphic.layer));const U=new Set;return T=T.filter(e=>{if("graphic"!==e.type||!e.graphic)return!0;const t=g(e.graphic);return!U.has(t)&&(U.add(t),!0)}),h&&(T=T.filter(e=>!("graphic"in e)||!e.graphic||h?.has(g(e.graphic)))),V&&(T=T.filter(e=>!("graphic"in e)||!e.graphic||!V?.has(g(e.graphic)))),{screenPoint:a?null:l,results:T}}function y(t,r,i,n,s,a){return l=>{if(l instanceof e){if(l.layer===t)a?.();else{const e=t.allLayerViews.find(e=>e.layer===l.layer);e&&s?.(e)}n(g(l))}else if("layer"in l&&"element"in l);else if("subtype-sublayer"===l.type){const e=t.allLayerViews.find(e=>e.layer===l.parent);e&&i(l,e)}else{const e=t.allLayerViews.find(e=>e.layer===l);e&&r(e)}}}function d(e,t){if(e)if(r(e))for(const i of e)if(r(i))for(const e of i)t(e);else t(i);else t(e)}function g(e){const t=e.getObjectId();return t?`${e.layer?.uid??e.sourceLayer?.uid??"MapView"}/${t}`:`"MapView/${e.uid}`}function m(e,t){const r=e.layer;"subtype-group"===r?.type&&r.sublayers.forEach(e=>{t(e)})}function w(e,t,r){const i=a(t)?i=>o(e,i,t,r):r=>c(e,r,t);return e.allLayerViews.filter(e=>!e.suspended&&(!e.clips.length||e.clips.some(i))).reverse()}function x(e,t,r){if(!t.clips.length)return[r];const i=[];for(const n of t.clips){if("rect"!==n.type){i.push(r);continue}const t=l(e,n,r);t&&i.push(t)}return i}function M(e,t){if(i(t)){const r=t;return[e.toMap(n(r.x,r.y)),e.toMap(n(r.x,r.y+r.height)),e.toMap(n(r.x+r.width,r.y+r.height)),e.toMap(n(r.x+r.width,r.y))]}return[e.toMap(t)]}export{f as createHittestQuery,w as getHitTestLayerViews,M as getMapPointsFromScreen,h as hitTest};
2
+ import e from"../../../Graphic.js";import{isSome as t}from"../../../core/arrayUtils.js";import{isIterable as r}from"../../../core/iteratorUtils.js";import{isScreenRect as i,isScreenPolygon as n,createScreenPoint as s,clipRectToView as a,isScreenPoint as l}from"../../../core/screenUtils.js";import{computeClippedScreenRect as o,clipContainsPoint as c,clipIntersectsScreenRect as p}from"./clippingUtils.js";import{isSupportedScreenPointEvent as u,createScreenPointFromSupportedEvent as f}from"../../support/screenUtils.js";function y(e){if(i(e)){return{hittestType:"rect",input:e}}if(n(e)){return{hittestType:"polygon",input:e}}return{hittestType:"point",input:e}}function h(e,t){return i(t)?a(t,e.width,e.height):u(t)?f(e,t):t}async function d(e,r,i){const n=h(e,r),s=l(n);if(!e.ready||s&&(isNaN(n.x)||isNaN(n.y)))return{screenPoint:null,results:[]};let a=new Set;const o=new Set;let c=!1,p=null,u=null;i?.include?m(i.include,g(e,e=>{a.add(e),x(e,e=>o.add(e))},(e,t)=>{o.add(e),a.add(t)},e=>{p||(p=new Set),p.add(e)},e=>a.add(e),()=>c=!0)):(c=!0,a=new Set(e.allLayerViews),a.forEach(e=>{x(e,e=>o.add(e))})),i?.exclude&&m(i.exclude,g(e,e=>{a.delete(e),x(e,e=>o.delete(e))},e=>o.delete(e),e=>{u||(u=new Set),u.add(e)}));const f=j(e,n)[0],y=M(e,n,f).filter(e=>a.has(e)&&!e.suspended),d=c?e.graphicsView.hitTest(e,n).map(e=>({type:"graphic",graphic:e,layer:null,mapPoint:s?f:null})):[],b=Array.from(y).flatMap(t=>{if(!s){const r=V(e,t,n);return null==r?[]:r.map(e=>t.hitTest(f,e))}return[t.hitTest(f,n)]});let L=[...d,...await Promise.all(b)].filter(t).flat().filter(t);L=L.filter(e=>"graphic"!==e.type||"subtype-group"!==e.layer?.type||o.has(e.graphic.layer));const S=new Set;return L=L.filter(e=>{if("graphic"!==e.type||!e.graphic)return!0;const t=w(e.graphic);return!S.has(t)&&(S.add(t),!0)}),p&&(L=L.filter(e=>!("graphic"in e)||!e.graphic||p?.has(w(e.graphic)))),u&&(L=L.filter(e=>!("graphic"in e)||!e.graphic||!u?.has(w(e.graphic)))),{screenPoint:s?n:null,results:L}}function g(t,r,i,n,s,a){return l=>{if(l instanceof e){if(l.layer===t)a?.();else{const e=t.allLayerViews.find(e=>e.layer===l.layer);e&&s?.(e)}n(w(l))}else if("layer"in l&&"element"in l);else if("subtype-sublayer"===l.type){const e=t.allLayerViews.find(e=>e.layer===l.parent);e&&i(l,e)}else{const e=t.allLayerViews.find(e=>e.layer===l);e&&r(e)}}}function m(e,t){if(e)if(r(e))for(const i of e)if(r(i))for(const e of i)t(e);else t(i);else t(e)}function w(e){const t=e.getObjectId();return t?`${e.layer?.uid??e.sourceLayer?.uid??"MapView"}/${t}`:`"MapView/${e.uid}`}function x(e,t){const r=e.layer;"subtype-group"===r?.type&&r.sublayers.forEach(e=>{t(e)})}function M(e,t,r){const n=l(t)?i=>c(e,i,t,r):i(t)?r=>p(e,r,t):e=>!1;return e.allLayerViews.filter(e=>!e.suspended&&(!e.clips.length||e.clips.some(n))).reverse()}function V(e,t,r){if(!t.clips.length)return[r];const i=[];for(const n of t.clips){if("rect"!==n.type){i.push(r);continue}const t=o(e,n,r);t&&i.push(t)}return i}function j(e,t){if(i(t)){const r=t;return[e.toMap(s(r.x,r.y)),e.toMap(s(r.x,r.y+r.height)),e.toMap(s(r.x+r.width,r.y+r.height)),e.toMap(s(r.x+r.width,r.y))]}return n(t)?t.map(t=>e.toMap(s(t.x,t.y))):[e.toMap(t)]}export{y as createHittestQuery,M as getHitTestLayerViews,j as getMapPointsFromScreen,d as hitTest};
@@ -1,2 +1,2 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import{__decorate as e}from"tslib";import{equals as t}from"../../../core/arrayUtils.js";import"../../../core/has.js";import{removeMaybe as i,abortMaybe as s}from"../../../core/maybe.js";import{debounce as r,throwIfAborted as n,ignoreAbortErrors as l}from"../../../core/promiseUtils.js";import{watch as a,sync as o,when as u,whenOnce as d}from"../../../core/reactiveUtils.js";import{addFrameTask as h}from"../../../core/scheduling.js";import{signal as p}from"../../../core/signal.js";import{Seconds as c,secondsFromMilliseconds as m}from"../../../core/time.js";import{property as g,subclass as _}from"../../../core/accessorSupport/decorators.js";import{projectOrLoad as f}from"../../../geometry/projectionUtils.js";import y from"../../../geometry/SpatialReference.js";import{toExtent as v,fromExtent as T,intersection as w,create as b,intersects as S}from"../../../geometry/support/aaBoundingRect.js";import{getInfo as R}from"../../../geometry/support/spatialReferenceUtils.js";import x from"../../../symbols/support/ElevationInfo.js";import A from"./SubView3D.js";import{getFeatureTileId as L}from"./support/FeatureTileDescriptor.js";import{makeScheduleFunction as E}from"./support/makeScheduleFunction.js";import{debugFlags as j}from"../support/debugFlags.js";import{tileFilterDistance as M,scaleThresholdForLoadingAllTiles as O,defaultTransitionDuration as I,transitionDurationFactor as C,seamlessTransitionEnabled as P,densityFactor as U,loadAllTilesDensityFactor as D,averageLoadingTimeSmoothingFactor as W,fadeOutTime as k,fadeInTime as F,minimumTracingResolution as q}from"../support/flow/constants.js";import{isFullExtent as B,wrappedWidth as V,FlowQuery3D as G}from"../support/flow/FlowQuery3D.js";import{FlowWorkerHandle as H}from"../support/flow/FlowWorkerHandle.js";import{materialParametersFromRenderer as z,createStreamlineGeometry as N}from"../support/flow/geometryUtils.js";import{boundingRectOfTiles as Q}from"../support/flow/loadUtils.js";import{StreamlineResources3DOverlay as J}from"../support/flow/StreamlineResources3DOverlay.js";import{StreamlineResources3DShape as K}from"../support/flow/StreamlineResources3DShape.js";import{webMercatorWorldExtent as X}from"../terrain/TerrainConst.js";import{descendantsAtLevel as Y,tilesAreRelated as Z}from"../terrain/tileUtils.js";import{isScreenSizePerspectiveEnabled as $}from"../webgl-engine/lib/screenSizePerspectiveUtils.js";import{RibbonLineMaterial as ee}from"../webgl-engine/materials/RibbonLineMaterial.js";import{hasLayerBasedScaleVisibility as te,isInEffectiveScaleRange as ie}from"../../support/layerViewUtils.js";import{TaskPriority as se}from"../../support/Scheduler.js";import{simulationSettingsEqual as re,getPositions as ne,getFlowSimulationSettings as le}from"../../support/flow/utils.js";let ae=class extends A{constructor(e){super(e),this.type="flow",this.renderedTiles=null,this.tilesIntersectDataBounds=!0,this.requireLoad=!1,this.workerHandle=null,this.frameTask=null,this._averageLoadingTime=c(0),this._abortController=null,this._loadingState="ready-to-load",this._tilesUpdateIsWaiting=!1,this._debugAllowAutoLoading=p(!0),this.emissiveStrength=0,this._materialParametersOverridde=null,this._suspendedOverride=null,this._simulationSettingsOverride=null,this._seamlessTransitionEnabledOverride=null,this._updateTask=null,this._debouncedTileUpdate=r(async e=>{const{allTiles:t}=this.surface,i=this._getTileFilterFunction(),{_dataBounds:s}=this,r=new Set;let l=!1;function*a(e){for(let n=0;n<t.length;++n){const a=t.at(n),o=de(s,a.extent);i(a)&&o&&(r.add(a),l=!0),e.madeProgress(),e.done&&(e=yield)}}await this.frameTask.scheduleGenerator(a,e.signal),n(e.signal),this.tilesIntersectDataBounds=!(0!==t.length&&!this.loadAllTiles)||l,this.renderedTiles=r})}initialize(){const{surface:e,view:t}=this,{resourceController:i}=t;this.workerHandle=new H(E(i)),this.frameTask=i.scheduler.registerTask(se.FLOW_GENERATOR),this._updateTask=h({update:()=>this._update()}),this.addHandles([a(()=>this._simulationSettings,()=>this.triggerLoad(),{sync:!0,equals:(e,t)=>null==e&&null==t||null!=e&&null!=t&&re(e,t)}),this.updatingHandles.add(()=>this.suspended,e=>{e?this._suspend():this._resume()},o),a(()=>{const{elevationInfo:e}=this;return[this._clippingArea,this.visible,this._draped,this.view.state.contentPixelRatio,this.view.viewingMode,e?.mode,e?.offset,e?.unit,this._effectiveDensity]},()=>this.triggerLoad(),o),u(()=>!this._animationsEnabled,()=>{const{_resources:e,_lastResources:t}=this;null!=e&&(e.startTime=pe),null!=t&&(t.startTime=pe)},o),a(()=>this._materialParameters,e=>{this._resources?.setMaterialParameters(e),this._lastResources?.setMaterialParameters(e)}),u(()=>e.allTilesCreated,()=>this._triggerTilesUpdate(),o),t.enableFeatureTiles(),a(()=>[this._dataBounds,this._featureTilesBounds,this.loadAllTiles],()=>this._triggerTilesUpdate()),a(()=>this._flowRenderer,(e,t)=>{const i=t?.visualVariables??[],s=e?.visualVariables??[];s.length===i.length&&s.every((e,t)=>e.type===i[t].type)||this.clear()}),u(()=>!t.featureTiles?.updating,()=>{this._triggerTilesUpdate()})]),this.suspended&&this._suspend(),this._triggerTilesUpdate()}destroy(){this._updateTask=i(this._updateTask),this.abort(),this.clear(),this.notifyChange("updating")}abort(){this._abortController=s(this._abortController),this._tilesUpdateIsWaiting=!1,this.requireLoad=!1}_ensureAbortController(){return null==this._abortController&&(this._abortController=new AbortController),this._abortController}_resume(){this._updateTask.resume(),this._triggerTilesUpdate(),this.triggerLoad()}_suspend(){this._updateTask.pause(),this.abort(),this.clear()}get _animationsEnabled(){return this.view.state.animationsEnabled}get _clippingArea(){const e=f(this.view.clippingArea,this.surface.spatialReference).geometry;return null==e?null:T(e)}get _dataBounds(){const e=this._fullExtentSurfaceSpatialReference;return null==e?null:T(e)}get suspended(){return null!=this._suspendedOverride?this._suspendedOverride:this.layerView.suspended||this.view.groundView.hasTerrainReplacement}get _fullExtentSurfaceSpatialReference(){return f(this.layer.fullExtent,this.surface.spatialReference).geometry}get _draped(){return"on-the-ground"===this.elevationInfo.mode}get extent(){if(this.loadAllTiles)return ce(this._fullExtentSurfaceSpatialReference);const{spatialReference:e}=this.surface;let t=this.renderedTiles;if(null==e||null==t)return null;const i=this.view.terrainLevel;if(null!=i){const e=new Set;t.forEach(t=>{Math.abs(i-t.level)<M&&e.add(t)}),t=e}const s=Q(t,this.spatialReferenceInfo);return null==s?null:(w(s,this._clippingArea,s),ce(v(s,e)))}get loadAllTiles(){return this.view.scale>(j.FLOW_GLOBAL_SCALE_THRESHOLD??O)}get isDataGlobal(){const{extent:e,spatialReferenceInfo:t}=this;return null!=e&&B(e.xmin,e.xmax,t)}get loadAllTilesLevel(){const{tilingScheme:e}=this.surface;return Math.min(Math.ceil(e.levelAtScale(j.FLOW_GLOBAL_SCALE_THRESHOLD??O)),e.getMaxLod())}get targetTiles(){const e=new Map;if(this.loadAllTiles){const{_dataBounds:t}=this;if(null==t)return e;const i=b(),s=this.loadAllTilesLevel,r=this.surface.tilingScheme,n=r.rootTilesInExtent(t).flatMap(e=>Y(e,s));for(const l of n){const[n,a,o]=l;r.getExtent(s,a,o,i),de(t,i)&&e.set(L(s,a,o),l)}return e}const{renderedTiles:t}=this;for(const i of t??[])e.set(i.key,i.lij);return e}get _featureTilesBounds(){const e=this.view.featureTiles?.filterExtent,t=f(e,this.surface.spatialReference).geometry;return null==t?null:T(t)}get _flowRenderer(){const e=this.layer.renderer;return"flow"===e?.type?e:null}get _materialParameters(){return{...z(this._flowRenderer,this.layerView.fullOpacity,this.emissiveStrength),...this._materialParametersOverridde,hasSlicePlane:this.layerView.slicePlaneEnabled,screenSizePerspective:!this._draped&&"screenSizePerspectiveEnabled"in this.layer&&$(this.layer.screenSizePerspectiveEnabled)?this.view.screenSizePerspective.parameters:null}}get _opacity(){return this.layerView.fullOpacity}get _seamlessTransitionWaitingTime(){const{_averageLoadingTime:e}=this;return c(0===e?I:this._averageLoadingTime*C)}get _transitionEnabled(){return this.view.qualitySettings.flow.transitionEnabled}get _seamlessTransitionEnabled(){return!!this._transitionEnabled&&(null!=this._seamlessTransitionEnabledOverride?this._seamlessTransitionEnabledOverride:P)}get _tracingResolution(){const{extent:e}=this;if(!e)return[0,0];const t=V(e.xmin,e.xmax,this.spatialReferenceInfo?.valid)/(e.ymax-e.ymin),[i,s]=this.view.size;let r,n;i<s?(r=i,n=i/t):(r=s*t,n=s);const l=q,a=this.view.qualitySettings.flow.maxTracingResolution,o=Math.max(1,l/Math.min(r,n)),u=o*Math.min(1,a/Math.max(r*o,n*o));return[Math.round(r*u),Math.round(n*u)]}get visible(){const e=this._flowRenderer?.color;return this.visibleAtCurrentScale&&this.layer.effectiveVisible&&this._opacity>0&&(null==e||e.a>0)}get _effectiveDensity(){const{_simulationSettings:e}=this;if(null==e)return 0;const t=e.density*this.view.quality;return e.lineSpacing/Math.sqrt(t)<e.lineCollisionWidth?(e.lineSpacing/e.lineCollisionWidth)**2:t}get elevationInfo(){return("elevationInfo"in this.layer?this.layer.elevationInfo:void 0)??ue}startPositions(e){if(!this._seamlessTransitionEnabled)return[];const{_flowRenderer:t,_resources:i}=this;return null==t||null==i?[]:ne(i.streamlines,i.query,e,t.flowSpeed)}get needsMagnitude(){return this._flowRenderer?.hasVisualVariables()??!1}get spatialReferenceInfo(){return R(this.surface.spatialReference)}get loadingState(){return this._loadingState}get loadRequirementsMet(){return null!=this.renderedTiles&&(this.renderedTiles.size>0||this.loadAllTiles)&&null!=this.extent}hasWork(){return this.updatingHandles.updating||this.requireLoad||"before-transition"===this._loadingState}get updating(){return this._debugAllowAutoLoading.value&&this.visible&&!(this.destroyed||this.destroying)&&this.hasWork()}get visibleAtCurrentScale(){return!te()||ie(this.layer.effectiveScaleRange,this.view.scale)}get _simulationSettings(){const{_flowRenderer:e,_simulationSettingsOverride:t}=this;if(null==e)return null;let i=le(e);return i.segmentLength=i.lineCollisionWidth/2,i.onlyForwardTracing=!1,i.maxNumberOfStreamlines=this.view.qualitySettings.flow.maxTotalNumberOfStreamlines,i.density*=U,this.loadAllTiles&&this.isDataGlobal&&(i.density*=D),null!=t&&(i={...i,...t}),i}getSimulationSettings(e){const{_simulationSettings:t,spatialReferenceInfo:i}=this;if(null==t)return null;const s="global"===this.view.viewingMode&&null!=i&&B(e.extent.xmin,e.extent.xmax,i);return{...t,wrapAround:s,density:this._effectiveDensity}}get surface(){return this.view.basemapTerrain}doRefresh(){}clear(){this._resources?.detach(),this._resources=null,this._lastResources?.detach(),this._lastResources=null,this.tilesIntersectDataBounds=!0,this._loadingState="ready-to-load"}_update(){const e=this._time;this._lastResources?.hasFadedOut(e)&&this._lastResources.detach();const t=this._nextStateForTransition(e);if(!this.requireLoad||this.updatingHandles.updating||"ready-to-load"!==t||!this.loadRequirementsMet)return this._loadingState=t,void(this.tilesIntersectDataBounds||(this.requireLoad=!1));this._loadingState="loading";const i=async()=>{const t=this._time,i=this._seamlessTransitionEnabled&&null!=this._resources?c(e+this._seamlessTransitionWaitingTime):e;await this._load(i);const s=c((this._time-t)/1e3);this._updateAverageLoadingTime(s)};this.updatingHandles.consumePromise(l(i())),this.requireLoad=!1}_updateAverageLoadingTime(e){const t=W;this._averageLoadingTime=c(t*e+(1-t)*this._averageLoadingTime)}triggerLoad(){!this.suspended&&this._debugAllowAutoLoading.value&&(this.visible?this.requireLoad=!0:this.clear())}get _time(){return m(this.layerView.view.stage.renderer.renderContext.time)}async _load(e){const{extent:t,view:i}=this;if(!this.visible)return void this.clear();if(null==t)return void(this._loadingState="ready-to-load");this._transitionEnabled||(this._lastResources?.detach(),this._lastResources=null,this._resources?.detach(),this._resources=null);const s=new G(t,this.layerView.timeExtent,this._tracingResolution,i.state.contentPixelRatio,e),r=this._ensureAbortController();try{const t=await this._loadStreamlines(s,r.signal);if(n(r.signal),null!=t){this._lastResources?.detach(),this._lastResources=this._resources,this._resources=t;const i=this._getStartTime(e);null!=this._lastResources&&(this._lastResources.endTime=i),this._resources.startTime=i,this._animationsEnabled||(this._lastResources?.detach(),this._lastResources=null),await t.attach(),this.suspended&&this.clear(),n(r.signal),this._loadingState=this._seamlessTransitionEnabled?"before-transition":"transitioning"}else this._loadingState="ready-to-load"}catch(l){this._loadingState="ready-to-load"}}async _loadStreamlines(e,t){const i=await this.fetchDataAndGenerateStreamlines(e,t);if(null==i)return null;const{geometries:s,material:r}=await this._createGeometry(e,i,t);return this._draped?new J(e,i,r,s,this.layerView):new K(e,i,r,s,this.view)}async fetchDataAndGenerateStreamlines(e,t){return null}async _createGeometry(e,t,i){const s=new ee(this._materialParameters,this.view.state.isGlobal),r=new Array,{elevationInfo:l,_draped:a,view:o}=this;function*u(i){for(let n=0;n<t.length;++n)r.push(N(o,e,t[n],l,s,a)),i.madeProgress(),i.done&&(i=yield)}return await this.frameTask.scheduleGenerator(u,i),n(i),{geometries:r,material:s}}_triggerTilesUpdate(){if(this.suspended)return;if(this._tilesUpdateIsWaiting)return;this._tilesUpdateIsWaiting=!0;const e=this._ensureAbortController(),t=async()=>{try{await d(()=>this.view.stationary),n(e.signal),await this._debouncedTileUpdate(e)}finally{this._tilesUpdateIsWaiting=!1}};this.updatingHandles.consumePromise(l(t()))}_getTileFilterFunction(){const{view:e,_featureTilesBounds:i,loadAllTiles:s}=this;if(s){const{loadAllTilesLevel:e}=this;return t=>t.level===e}const r=e=>e.rendered&&e.visible,{featureTiles:n}=e;if(!n)return r;const l=n.tiles.filter(e=>e.measures.visible);return e=>r(e)&&de(i,e.extent)&&l.some(({lij:i})=>t(i,e.lij)||Z(i,e.lij))}_nextStateForTransition(e){const{_resources:t}=this;if(null==this._flowRenderer||null==t||"ready-to-load"===this._loadingState||"loading"===this._loadingState)return this._loadingState;const i=t.startTime;return e<i?"before-transition":e<i+k?"transitioning":"ready-to-load"}_getStartTime(e){if(!this._animationsEnabled)return pe;const t=this._time;return c(t>e?t:e)}get usedMemory(){return(this._lastResources?.usedMemory??0)+(this._resources?.usedMemory??0)}get test(){}};e([g()],ae.prototype,"type",void 0),e([g()],ae.prototype,"renderedTiles",void 0),e([g()],ae.prototype,"_resources",void 0),e([g()],ae.prototype,"_lastResources",void 0),e([g()],ae.prototype,"tilesIntersectDataBounds",void 0),e([g()],ae.prototype,"requireLoad",void 0),e([g()],ae.prototype,"_averageLoadingTime",void 0),e([g()],ae.prototype,"_loadingState",void 0),e([g()],ae.prototype,"emissiveStrength",void 0),e([g()],ae.prototype,"_animationsEnabled",null),e([g()],ae.prototype,"_clippingArea",null),e([g()],ae.prototype,"_dataBounds",null),e([g()],ae.prototype,"suspended",null),e([g()],ae.prototype,"_fullExtentSurfaceSpatialReference",null),e([g()],ae.prototype,"_draped",null),e([g()],ae.prototype,"extent",null),e([g()],ae.prototype,"loadAllTiles",null),e([g()],ae.prototype,"isDataGlobal",null),e([g()],ae.prototype,"loadAllTilesLevel",null),e([g()],ae.prototype,"targetTiles",null),e([g()],ae.prototype,"_featureTilesBounds",null),e([g()],ae.prototype,"_flowRenderer",null),e([g()],ae.prototype,"_materialParameters",null),e([g()],ae.prototype,"_opacity",null),e([g()],ae.prototype,"_seamlessTransitionWaitingTime",null),e([g()],ae.prototype,"_transitionEnabled",null),e([g()],ae.prototype,"_seamlessTransitionEnabled",null),e([g()],ae.prototype,"_tracingResolution",null),e([g()],ae.prototype,"visible",null),e([g()],ae.prototype,"_effectiveDensity",null),e([g()],ae.prototype,"elevationInfo",null),e([g()],ae.prototype,"needsMagnitude",null),e([g()],ae.prototype,"spatialReferenceInfo",null),e([g()],ae.prototype,"loadingState",null),e([g()],ae.prototype,"updating",null),e([g()],ae.prototype,"visibleAtCurrentScale",null),e([g()],ae.prototype,"_materialParametersOverridde",void 0),e([g()],ae.prototype,"_suspendedOverride",void 0),e([g()],ae.prototype,"_simulationSettingsOverride",void 0),e([g()],ae.prototype,"_seamlessTransitionEnabledOverride",void 0),e([g()],ae.prototype,"_simulationSettings",null),e([g()],ae.prototype,"surface",null),ae=e([_("esri.views.3d.layers.FlowSubView3D")],ae);const oe=ae,ue=new x({mode:"on-the-ground"});function de(e,t){return null==e||null==t||S(e,t)}const he=v(X,y.WebMercator),pe=c(-F);function ce(e){return null!=e&&e.spatialReference.isWebMercator?e?.intersection(he):e}export{oe as default};
2
+ import{__decorate as e}from"tslib";import{equals as t}from"../../../core/arrayUtils.js";import"../../../core/has.js";import{removeMaybe as i,abortMaybe as s}from"../../../core/maybe.js";import{debounce as r,throwIfAborted as n,ignoreAbortErrors as l}from"../../../core/promiseUtils.js";import{watch as a,sync as o,when as u,whenOnce as d}from"../../../core/reactiveUtils.js";import{addFrameTask as h}from"../../../core/scheduling.js";import{signal as p}from"../../../core/signal.js";import{Seconds as c,secondsFromMilliseconds as m}from"../../../core/time.js";import{property as g,subclass as _}from"../../../core/accessorSupport/decorators.js";import{projectOrLoad as f}from"../../../geometry/projectionUtils.js";import y from"../../../geometry/SpatialReference.js";import{toExtent as v,fromExtent as T,intersection as w,create as b,intersects as S}from"../../../geometry/support/aaBoundingRect.js";import{getInfo as R}from"../../../geometry/support/spatialReferenceUtils.js";import x from"../../../symbols/support/ElevationInfo.js";import A from"./SubView3D.js";import{getFeatureTileId as L}from"./support/FeatureTileDescriptor.js";import{makeScheduleFunction as E}from"./support/makeScheduleFunction.js";import{debugFlags as j}from"../support/debugFlags.js";import{tileFilterDistance as M,scaleThresholdForLoadingAllTiles as O,defaultTransitionDuration as I,transitionDurationFactor as C,seamlessTransitionEnabled as P,densityFactor as U,loadAllTilesDensityFactor as D,averageLoadingTimeSmoothingFactor as W,fadeOutTime as k,fadeInTime as F,minimumTracingResolution as q}from"../support/flow/constants.js";import{isFullExtent as B,wrappedWidth as V,FlowQuery3D as G}from"../support/flow/FlowQuery3D.js";import{FlowWorkerHandle as H}from"../support/flow/FlowWorkerHandle.js";import{materialParametersFromRenderer as z,createStreamlineGeometry as N}from"../support/flow/geometryUtils.js";import{boundingRectOfTiles as Q}from"../support/flow/loadUtils.js";import{StreamlineResources3DOverlay as J}from"../support/flow/StreamlineResources3DOverlay.js";import{StreamlineResources3DShape as K}from"../support/flow/StreamlineResources3DShape.js";import{webMercatorWorldExtent as X}from"../terrain/TerrainConst.js";import{descendantsAtLevel as Y,tilesAreRelated as Z}from"../terrain/tileUtils.js";import{isScreenSizePerspectiveEnabled as $}from"../webgl-engine/lib/screenSizePerspectiveUtils.js";import{RibbonLineMaterial as ee}from"../webgl-engine/materials/RibbonLineMaterial.js";import{hasLayerBasedScaleVisibility as te,isInEffectiveScaleRange as ie}from"../../support/layerViewUtils.js";import{TaskPriority as se}from"../../support/Scheduler.js";import{simulationSettingsEqual as re,getPositions as ne,getFlowSimulationSettings as le}from"../../support/flow/utils.js";let ae=class extends A{constructor(e){super(e),this.type="flow",this.renderedTiles=null,this.tilesIntersectDataBounds=!0,this.requireLoad=!1,this.workerHandle=null,this.frameTask=null,this._averageLoadingTime=c(0),this._abortController=null,this._loadingState="ready-to-load",this._tilesUpdateIsWaiting=!1,this._debugAllowAutoLoading=p(!0),this.emissiveStrength=0,this._materialParametersOverridde=null,this._suspendedOverride=null,this._simulationSettingsOverride=null,this._seamlessTransitionEnabledOverride=null,this._updateTask=null,this._debouncedTileUpdate=r(async e=>{const{allTiles:t}=this.surface,i=this._getTileFilterFunction(),{_dataBounds:s}=this,r=new Set;let l=!1;function*a(e){for(let n=0;n<t.length;++n){const a=t.at(n),o=de(s,a.extent);i(a)&&o&&(r.add(a),l=!0),e.madeProgress(),e.done&&(e=yield)}}await this.frameTask.scheduleGenerator(a,e.signal),n(e.signal),this.tilesIntersectDataBounds=!(0!==t.length&&!this.loadAllTiles)||l,this.renderedTiles=r})}initialize(){const{surface:e,view:t}=this,{resourceController:i}=t;this.workerHandle=new H(E(i)),this.frameTask=i.scheduler.registerTask(se.FLOW_GENERATOR),this._updateTask=h({update:()=>this._update()}),this.addHandles([a(()=>this._simulationSettings,()=>this.triggerLoad(),{sync:!0,equals:(e,t)=>null==e&&null==t||null!=e&&null!=t&&re(e,t)}),this.updatingHandles.add(()=>this.suspended,e=>{e?this._suspend():this._resume()},o),a(()=>{const{elevationInfo:e}=this;return[this._clippingArea,this.visible,this._draped,this.view.state.contentPixelRatio,this.view.viewingMode,e?.mode,e?.offset,e?.unit,this._effectiveDensity]},()=>this.triggerLoad(),o),u(()=>!this._animationsEnabled,()=>{const{_resources:e,_lastResources:t}=this;null!=e&&(e.startTime=pe),null!=t&&(t.startTime=pe)},o),a(()=>this._materialParameters,e=>{this._resources?.setMaterialParameters(e),this._lastResources?.setMaterialParameters(e)}),u(()=>e.allTilesCreated,()=>this._triggerTilesUpdate(),o),t.enableFeatureTiles(),a(()=>[this._dataBounds,this._featureTilesBounds,this.loadAllTiles],()=>this._triggerTilesUpdate()),a(()=>this._flowRenderer,(e,t)=>{const i=t?.visualVariables??[],s=e?.visualVariables??[];s.length===i.length&&s.every((e,t)=>e.type===i[t].type)||this.clear()}),u(()=>!t.featureTiles?.updating,()=>{this._triggerTilesUpdate()})]),this.suspended&&this._suspend(),this._triggerTilesUpdate()}destroy(){this._updateTask=i(this._updateTask),this.abort(),this.clear(),this.notifyChange("updating")}abort(){this._abortController=s(this._abortController),this._tilesUpdateIsWaiting=!1,this.requireLoad=!1}_ensureAbortController(){return null==this._abortController&&(this._abortController=new AbortController),this._abortController}_resume(){this._updateTask.resume(),this._triggerTilesUpdate(),this.triggerLoad()}_suspend(){this._updateTask.pause(),this.abort(),this.clear()}get _animationsEnabled(){return this.view.state.animationsEnabled}get _clippingArea(){const e=f(this.view.clippingArea,this.surface.spatialReference).geometry;return null==e?null:T(e)}get _dataBounds(){const e=this._fullExtentSurfaceSpatialReference;return null==e?null:T(e)}get suspended(){return null!=this._suspendedOverride?this._suspendedOverride:this.layerView.suspended||this.view.groundView.hasTerrainReplacement}get _fullExtentSurfaceSpatialReference(){return f(this.layer.fullExtent,this.surface.spatialReference).geometry}get _draped(){return"on-the-ground"===this.elevationInfo.mode}get extent(){if(this.loadAllTiles)return ce(this._fullExtentSurfaceSpatialReference);const{spatialReference:e}=this.surface;let t=this.renderedTiles;if(null==e||null==t)return null;const i=this.view.terrainLevel;if(null!=i){const e=new Set;t.forEach(t=>{Math.abs(i-t.level)<M&&e.add(t)}),t=e}const s=Q(t,this.spatialReferenceInfo);return null==s?null:(w(s,this._clippingArea,s),ce(v(s,e)))}get loadAllTiles(){return this.view.scale>(j.FLOW_GLOBAL_SCALE_THRESHOLD??O)}get isDataGlobal(){const{extent:e,spatialReferenceInfo:t}=this;return null!=e&&B(e.xmin,e.xmax,t)}get loadAllTilesLevel(){const{tilingScheme:e}=this.surface;return Math.min(Math.ceil(e.levelAtScale(j.FLOW_GLOBAL_SCALE_THRESHOLD??O)),e.getMaxLod())}get targetTiles(){const e=new Map;if(this.loadAllTiles){const{_dataBounds:t}=this;if(null==t)return e;const i=b(),s=this.loadAllTilesLevel,r=this.surface.tilingScheme,n=r.rootTilesInExtent(t).values().flatMap(e=>Y(e,s));for(const l of n){const[n,a,o]=l;r.getExtent(s,a,o,i),de(t,i)&&e.set(L(s,a,o),l)}return e}const{renderedTiles:t}=this;for(const i of t??[])e.set(i.key,i.lij);return e}get _featureTilesBounds(){const e=this.view.featureTiles?.filterExtent,t=f(e,this.surface.spatialReference).geometry;return null==t?null:T(t)}get _flowRenderer(){const e=this.layer.renderer;return"flow"===e?.type?e:null}get _materialParameters(){return{...z(this._flowRenderer,this.layerView.fullOpacity,this.emissiveStrength),...this._materialParametersOverridde,hasSlicePlane:this.layerView.slicePlaneEnabled,screenSizePerspective:!this._draped&&"screenSizePerspectiveEnabled"in this.layer&&$(this.layer.screenSizePerspectiveEnabled)?this.view.screenSizePerspective.parameters:null}}get _opacity(){return this.layerView.fullOpacity}get _seamlessTransitionWaitingTime(){const{_averageLoadingTime:e}=this;return c(0===e?I:this._averageLoadingTime*C)}get _transitionEnabled(){return this.view.qualitySettings.flow.transitionEnabled}get _seamlessTransitionEnabled(){return!!this._transitionEnabled&&(null!=this._seamlessTransitionEnabledOverride?this._seamlessTransitionEnabledOverride:P)}get _tracingResolution(){const{extent:e}=this;if(!e)return[0,0];const t=V(e.xmin,e.xmax,this.spatialReferenceInfo?.valid)/(e.ymax-e.ymin),[i,s]=this.view.size;let r,n;i<s?(r=i,n=i/t):(r=s*t,n=s);const l=q,a=this.view.qualitySettings.flow.maxTracingResolution,o=Math.max(1,l/Math.min(r,n)),u=o*Math.min(1,a/Math.max(r*o,n*o));return[Math.round(r*u),Math.round(n*u)]}get visible(){const e=this._flowRenderer?.color;return this.visibleAtCurrentScale&&this.layer.effectiveVisible&&this._opacity>0&&(null==e||e.a>0)}get _effectiveDensity(){const{_simulationSettings:e}=this;if(null==e)return 0;const t=e.density*this.view.quality;return e.lineSpacing/Math.sqrt(t)<e.lineCollisionWidth?(e.lineSpacing/e.lineCollisionWidth)**2:t}get elevationInfo(){return("elevationInfo"in this.layer?this.layer.elevationInfo:void 0)??ue}startPositions(e){if(!this._seamlessTransitionEnabled)return[];const{_flowRenderer:t,_resources:i}=this;return null==t||null==i?[]:ne(i.streamlines,i.query,e,t.flowSpeed)}get needsMagnitude(){return this._flowRenderer?.hasVisualVariables()??!1}get spatialReferenceInfo(){return R(this.surface.spatialReference)}get loadingState(){return this._loadingState}get loadRequirementsMet(){return null!=this.renderedTiles&&(this.renderedTiles.size>0||this.loadAllTiles)&&null!=this.extent}hasWork(){return this.updatingHandles.updating||this.requireLoad||"before-transition"===this._loadingState}get updating(){return this._debugAllowAutoLoading.value&&this.visible&&!(this.destroyed||this.destroying)&&this.hasWork()}get visibleAtCurrentScale(){return!te()||ie(this.layer.effectiveScaleRange,this.view.scale)}get _simulationSettings(){const{_flowRenderer:e,_simulationSettingsOverride:t}=this;if(null==e)return null;let i=le(e);return i.segmentLength=i.lineCollisionWidth/2,i.onlyForwardTracing=!1,i.maxNumberOfStreamlines=this.view.qualitySettings.flow.maxTotalNumberOfStreamlines,i.density*=U,this.loadAllTiles&&this.isDataGlobal&&(i.density*=D),null!=t&&(i={...i,...t}),i}getSimulationSettings(e){const{_simulationSettings:t,spatialReferenceInfo:i}=this;if(null==t)return null;const s="global"===this.view.viewingMode&&null!=i&&B(e.extent.xmin,e.extent.xmax,i);return{...t,wrapAround:s,density:this._effectiveDensity}}get surface(){return this.view.basemapTerrain}doRefresh(){}clear(){this._resources?.detach(),this._resources=null,this._lastResources?.detach(),this._lastResources=null,this.tilesIntersectDataBounds=!0,this._loadingState="ready-to-load"}_update(){const e=this._time;this._lastResources?.hasFadedOut(e)&&this._lastResources.detach();const t=this._nextStateForTransition(e);if(!this.requireLoad||this.updatingHandles.updating||"ready-to-load"!==t||!this.loadRequirementsMet)return this._loadingState=t,void(this.tilesIntersectDataBounds||(this.requireLoad=!1));this._loadingState="loading";const i=async()=>{const t=this._time,i=this._seamlessTransitionEnabled&&null!=this._resources?c(e+this._seamlessTransitionWaitingTime):e;await this._load(i);const s=c((this._time-t)/1e3);this._updateAverageLoadingTime(s)};this.updatingHandles.consumePromise(l(i())),this.requireLoad=!1}_updateAverageLoadingTime(e){const t=W;this._averageLoadingTime=c(t*e+(1-t)*this._averageLoadingTime)}triggerLoad(){!this.suspended&&this._debugAllowAutoLoading.value&&(this.visible?this.requireLoad=!0:this.clear())}get _time(){return m(this.layerView.view.stage.renderer.renderContext.time)}async _load(e){const{extent:t,view:i}=this;if(!this.visible)return void this.clear();if(null==t)return void(this._loadingState="ready-to-load");this._transitionEnabled||(this._lastResources?.detach(),this._lastResources=null,this._resources?.detach(),this._resources=null);const s=new G(t,this.layerView.timeExtent,this._tracingResolution,i.state.contentPixelRatio,e),r=this._ensureAbortController();try{const t=await this._loadStreamlines(s,r.signal);if(n(r.signal),null!=t){this._lastResources?.detach(),this._lastResources=this._resources,this._resources=t;const i=this._getStartTime(e);null!=this._lastResources&&(this._lastResources.endTime=i),this._resources.startTime=i,this._animationsEnabled||(this._lastResources?.detach(),this._lastResources=null),await t.attach(),this.suspended&&this.clear(),n(r.signal),this._loadingState=this._seamlessTransitionEnabled?"before-transition":"transitioning"}else this._loadingState="ready-to-load"}catch(l){this._loadingState="ready-to-load"}}async _loadStreamlines(e,t){const i=await this.fetchDataAndGenerateStreamlines(e,t);if(null==i)return null;const{geometries:s,material:r}=await this._createGeometry(e,i,t);return this._draped?new J(e,i,r,s,this.layerView):new K(e,i,r,s,this.view)}async fetchDataAndGenerateStreamlines(e,t){return null}async _createGeometry(e,t,i){const s=new ee(this._materialParameters,this.view.state.isGlobal),r=new Array,{elevationInfo:l,_draped:a,view:o}=this;function*u(i){for(let n=0;n<t.length;++n)r.push(N(o,e,t[n],l,s,a)),i.madeProgress(),i.done&&(i=yield)}return await this.frameTask.scheduleGenerator(u,i),n(i),{geometries:r,material:s}}_triggerTilesUpdate(){if(this.suspended)return;if(this._tilesUpdateIsWaiting)return;this._tilesUpdateIsWaiting=!0;const e=this._ensureAbortController(),t=async()=>{try{await d(()=>this.view.stationary),n(e.signal),await this._debouncedTileUpdate(e)}finally{this._tilesUpdateIsWaiting=!1}};this.updatingHandles.consumePromise(l(t()))}_getTileFilterFunction(){const{view:e,_featureTilesBounds:i,loadAllTiles:s}=this;if(s){const{loadAllTilesLevel:e}=this;return t=>t.level===e}const r=e=>e.rendered&&e.visible,{featureTiles:n}=e;if(!n)return r;const l=n.tiles.filter(e=>e.measures.visible);return e=>r(e)&&de(i,e.extent)&&l.some(({lij:i})=>t(i,e.lij)||Z(i,e.lij))}_nextStateForTransition(e){const{_resources:t}=this;if(null==this._flowRenderer||null==t||"ready-to-load"===this._loadingState||"loading"===this._loadingState)return this._loadingState;const i=t.startTime;return e<i?"before-transition":e<i+k?"transitioning":"ready-to-load"}_getStartTime(e){if(!this._animationsEnabled)return pe;const t=this._time;return c(t>e?t:e)}get usedMemory(){return(this._lastResources?.usedMemory??0)+(this._resources?.usedMemory??0)}get test(){}};e([g()],ae.prototype,"type",void 0),e([g()],ae.prototype,"renderedTiles",void 0),e([g()],ae.prototype,"_resources",void 0),e([g()],ae.prototype,"_lastResources",void 0),e([g()],ae.prototype,"tilesIntersectDataBounds",void 0),e([g()],ae.prototype,"requireLoad",void 0),e([g()],ae.prototype,"_averageLoadingTime",void 0),e([g()],ae.prototype,"_loadingState",void 0),e([g()],ae.prototype,"emissiveStrength",void 0),e([g()],ae.prototype,"_animationsEnabled",null),e([g()],ae.prototype,"_clippingArea",null),e([g()],ae.prototype,"_dataBounds",null),e([g()],ae.prototype,"suspended",null),e([g()],ae.prototype,"_fullExtentSurfaceSpatialReference",null),e([g()],ae.prototype,"_draped",null),e([g()],ae.prototype,"extent",null),e([g()],ae.prototype,"loadAllTiles",null),e([g()],ae.prototype,"isDataGlobal",null),e([g()],ae.prototype,"loadAllTilesLevel",null),e([g()],ae.prototype,"targetTiles",null),e([g()],ae.prototype,"_featureTilesBounds",null),e([g()],ae.prototype,"_flowRenderer",null),e([g()],ae.prototype,"_materialParameters",null),e([g()],ae.prototype,"_opacity",null),e([g()],ae.prototype,"_seamlessTransitionWaitingTime",null),e([g()],ae.prototype,"_transitionEnabled",null),e([g()],ae.prototype,"_seamlessTransitionEnabled",null),e([g()],ae.prototype,"_tracingResolution",null),e([g()],ae.prototype,"visible",null),e([g()],ae.prototype,"_effectiveDensity",null),e([g()],ae.prototype,"elevationInfo",null),e([g()],ae.prototype,"needsMagnitude",null),e([g()],ae.prototype,"spatialReferenceInfo",null),e([g()],ae.prototype,"loadingState",null),e([g()],ae.prototype,"updating",null),e([g()],ae.prototype,"visibleAtCurrentScale",null),e([g()],ae.prototype,"_materialParametersOverridde",void 0),e([g()],ae.prototype,"_suspendedOverride",void 0),e([g()],ae.prototype,"_simulationSettingsOverride",void 0),e([g()],ae.prototype,"_seamlessTransitionEnabledOverride",void 0),e([g()],ae.prototype,"_simulationSettings",null),e([g()],ae.prototype,"surface",null),ae=e([_("esri.views.3d.layers.FlowSubView3D")],ae);const oe=ae,ue=new x({mode:"on-the-ground"});function de(e,t){return null==e||null==t||S(e,t)}const he=v(X,y.WebMercator),pe=c(-F);function ce(e){return null!=e&&e.spatialReference.isWebMercator?e?.intersection(he):e}export{oe as default};