@arcgis/core 4.28.0-next.20230720 → 4.28.0-next.20230721
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.
- package/Color.js +1 -1
- package/analysis/AreaMeasurementAnalysis.js +1 -1
- package/arcade/arcadeCompiler.js +1 -1
- package/arcade/featureSetUtils.js +1 -1
- package/arcade/featureset/actions/Top.js +1 -1
- package/arcade/featureset/sources/FeatureLayerDynamic.js +1 -1
- package/arcade/featureset/support/FeatureSet.js +1 -1
- package/arcade/featureset/support/FeatureSetIterator.js +1 -1
- package/arcade/functions/convertdirection.js +1 -1
- package/arcade/functions/featuresetbase.js +1 -1
- package/arcade/functions/geomasync.js +1 -1
- package/arcade/functions/geomsync.js +1 -1
- package/arcade/lib/comment-handler.js +1 -1
- package/arcade/lib/parser.js +1 -1
- package/arcade/lib/scanner.js +1 -1
- package/assets/esri/core/workers/RemoteClient.js +1 -1
- package/assets/esri/core/workers/chunks/{75c28da8d0b02d612d69.js → 040b3fc9c9c0736dd893.js} +1 -1
- package/assets/esri/core/workers/chunks/0652f6a8d5221e978033.js +1 -0
- package/assets/esri/core/workers/chunks/{c13b332afdb3f6be1ec9.js → 092fda62b6f62c2e4869.js} +1 -1
- package/assets/esri/core/workers/chunks/{57e0ad037188bd2997e7.js → 0af18a96cbd4e2d35436.js} +1 -1
- package/assets/esri/core/workers/chunks/0b5eeec0f66c87a46a0c.js +1 -0
- package/assets/esri/core/workers/chunks/{68e568b67b6fb34393db.js → 0cad2b991d0d0fd07846.js} +1 -1
- package/assets/esri/core/workers/chunks/0dccbc6c2559fdc0c2ad.js +1 -0
- package/assets/esri/core/workers/chunks/256a82f6f6e1405fbcc6.js +1 -0
- package/assets/esri/core/workers/chunks/{bb9213899049e1db90da.js → 2c57c9bd71637c5bed8a.js} +1 -1
- package/assets/esri/core/workers/chunks/2cdbabcbfe32286ec78d.js +1 -0
- package/assets/esri/core/workers/chunks/{2b1c83453a862e01954b.js → 2d9d80b2d0042a9c09fb.js} +1 -1
- package/assets/esri/core/workers/chunks/2f9aec2238ff6cb99e09.js +1 -0
- package/assets/esri/core/workers/chunks/{7dbd3e6406fb3e3a1a8f.js → 3cf748c025f3936c1cb2.js} +1 -1
- package/assets/esri/core/workers/chunks/4481d1103363434f16da.js +1 -0
- package/assets/esri/core/workers/chunks/5ae325e6a795c72eac6c.js +1 -0
- package/assets/esri/core/workers/chunks/5e4dde2886a1027b4b96.js +1 -0
- package/assets/esri/core/workers/chunks/730eb7e5f617fdab4f10.js +1 -0
- package/assets/esri/core/workers/chunks/{5a2e6bed9431cf4f42b1.js → 740dc67038f554431f1b.js} +1 -1
- package/assets/esri/core/workers/chunks/{09178454bda15bb7929a.js → 7fbdfd1527582c52f9b6.js} +1 -1
- package/assets/esri/core/workers/chunks/{1c026947505a9ff94a53.js → 807742f38885fa90b4fe.js} +1 -1
- package/assets/esri/core/workers/chunks/82dfbc175b52c7a10475.js +1 -0
- package/assets/esri/core/workers/chunks/870a05451e074b58f19a.js +1 -0
- package/assets/esri/core/workers/chunks/8c5a8c1dfb086069bb06.js +1 -0
- package/assets/esri/core/workers/chunks/99a5a434e0bad48c7a5c.js +1 -0
- package/assets/esri/core/workers/chunks/9a5916c66dad91d01d5b.js +1 -0
- package/assets/esri/core/workers/chunks/9c133fd8c1fbd0295b86.js +1 -0
- package/assets/esri/core/workers/chunks/9cddb504079d396779ea.js +1 -0
- package/assets/esri/core/workers/chunks/a3a1d4f32e518e97d071.js +1 -0
- package/assets/esri/core/workers/chunks/{9548aa449fe3a300c015.js → a4fa40dc77e116c954ac.js} +1 -1
- package/assets/esri/core/workers/chunks/a54ec9929a7db879d5db.js +1 -0
- package/assets/esri/core/workers/chunks/afc5b84693757fda2bc8.js +1 -0
- package/assets/esri/core/workers/chunks/{591b5c277cfd3a4101a4.js → b08f2a4aa94087c6c367.js} +1 -1
- package/assets/esri/core/workers/chunks/c0e12f6a7bb2360e4c21.js +1 -0
- package/assets/esri/core/workers/chunks/c8e656cd470a17f538e9.js +1 -0
- package/assets/esri/core/workers/chunks/d0e203405f95e14b1399.js +1 -0
- package/assets/esri/core/workers/chunks/{ec72f492f24e67e008ae.js → d8e58dc14d3495f0830c.js} +1 -1
- package/assets/esri/core/workers/chunks/ddc393a012588f799f42.js +1 -0
- package/assets/esri/core/workers/chunks/de3baa85b1639c25458d.js +1 -0
- package/assets/esri/core/workers/chunks/e66cea26064ba8353af0.js +1 -0
- package/assets/esri/core/workers/chunks/ea478f2f4a19463e13fd.js +1 -0
- package/assets/esri/core/workers/chunks/eba197e45507f56f3ed0.js +1 -0
- package/assets/esri/core/workers/chunks/ebd006fcd568a7731115.js +1 -0
- package/assets/esri/core/workers/chunks/ef9a9a7d66d818720e20.js +1 -0
- package/assets/esri/core/workers/chunks/f3b458f55236566c940b.js +1 -0
- package/assets/esri/core/workers/chunks/fd0a91b9e0216cc269c3.js +1 -0
- package/assets/esri/core/workers/chunks/{a4fe220a912b1f428e49.js → fdd6403a8390d629392b.js} +1 -1
- package/assets/esri/themes/base/widgets/_Directions.scss +13 -7
- package/assets/esri/themes/dark/main.css +1 -1
- package/assets/esri/themes/light/main.css +1 -1
- package/assets/esri/themes/light/view.css +1 -1
- package/chunks/array.js +1 -1
- package/core/Collection.js +1 -1
- package/core/accessorSupport/decorators/subclass.js +1 -1
- package/core/accessorSupport/ensureType.js +1 -1
- package/core/accessorSupport/get.js +1 -1
- package/core/accessorSupport/tracking.js +1 -1
- package/core/accessorSupport/utils.js +1 -1
- package/core/libs/rbush/PooledRBush.js +1 -1
- package/core/urlUtils.js +1 -1
- package/geometry/GeometryCursor.js +1 -1
- package/geometry/support/TileClipper.js +1 -1
- package/geometry/support/geodesicUtils.js +1 -1
- package/interfaces.d.ts +7 -1
- package/layers/LinkChartLayer.js +1 -1
- package/layers/VectorTileLayer.js +1 -1
- package/layers/VoxelLayer.js +1 -1
- package/layers/WCSLayer.js +1 -1
- package/layers/effects/EffectView.js +1 -1
- package/layers/graphics/sources/geojson/geojson.js +1 -1
- package/layers/knowledgeGraph/KnowledgeGraphLayerDataManager.js +1 -1
- package/layers/mixins/ArcGISCachedService.js +1 -1
- package/layers/support/ElevationQuery.js +1 -1
- package/layers/support/MultidimensionalSubset.js +1 -1
- package/layers/support/TileInfo.js +1 -1
- package/layers/support/TileInfoTilemapCache.js +1 -1
- package/layers/support/TilemapCache.js +1 -1
- package/layers/support/rasterDatasets/multidimensionalUtils.js +1 -1
- package/layers/support/rasterDatasets/pamParser.js +1 -1
- package/layers/support/rasterDatasets/wcsCoverageParser.js +1 -1
- package/layers/support/rasterFormats/Raw.js +1 -1
- package/layers/support/rasterFormats/TiffDecoder.js +1 -1
- package/layers/support/rasterFunctions/ExtractBandFunction.js +1 -1
- package/layers/support/rasterFunctions/colormaps.js +1 -1
- package/layers/support/rasterFunctions/pixelUtils.js +1 -1
- package/layers/support/rasterFunctions/rasterProjectionHelper.js +1 -1
- package/layers/video/VideoController.js +1 -1
- package/layers/voxel/VoxelDimension.js +1 -1
- package/layers/voxel/VoxelTransferFunctionStyle.js +1 -1
- package/layers/voxel/VoxelVolume.js +1 -1
- package/package.json +1 -1
- package/renderers/support/RasterSymbolizer.js +1 -1
- package/renderers/support/colorRampUtils.js +1 -1
- package/renderers/visualVariables/support/visualVariableUtils.js +1 -1
- package/rest/query/operations/pbfDehydratedFeatureSet.js +1 -1
- package/rest/query/operations/pbfJSONFeatureSet.js +1 -1
- package/rest/support/generateRendererUtils.js +1 -1
- package/smartMapping/raster/renderers/classBreaks.js +1 -1
- package/smartMapping/renderers/color.js +1 -1
- package/smartMapping/renderers/support/utils.js +1 -1
- package/smartMapping/renderers/type.js +1 -1
- package/smartMapping/renderers/univariateColorSize.js +1 -1
- package/smartMapping/support/adapters/support/utils.js +1 -1
- package/statistics/utils.js +1 -1
- package/support/revision.js +1 -1
- package/symbols/cim/CIMSymbolDrawHelper.js +1 -1
- package/symbols/cim/GeometryWalker.js +1 -1
- package/symbols/cim/cimAnalyzer.js +1 -1
- package/symbols/cim/effects/EffectArrow.js +1 -1
- package/symbols/cim/effects/EffectControlMeasureLine.js +1 -1
- package/symbols/support/symbolUtils.js +1 -1
- package/views/2d/constraints/ZoomConstraint.js +1 -1
- package/views/2d/engine/flow/dataUtils.js +1 -1
- package/views/2d/engine/flow/utils.js +1 -1
- package/views/2d/engine/vectorTiles/VectorTile.js +1 -1
- package/views/2d/engine/vectorTiles/VectorTileContainer.js +1 -1
- package/views/2d/engine/vectorTiles/expression/expression.js +1 -1
- package/views/2d/engine/vectorTiles/style/VectorTileSource.js +1 -1
- package/views/2d/engine/vectorTiles/tileInfoUtils.js +1 -1
- package/views/2d/engine/webgl/TurboLine.js +1 -1
- package/views/2d/engine/webgl/mesh/MeshData.js +1 -1
- package/views/2d/engine/webgl/mesh/templates/shapingUtils.js +1 -1
- package/views/2d/interactive/editingTools/ControlPointsTransformTool.js +1 -1
- package/views/2d/interactive/editingTools/draw/DrawGraphicTool2D.js +1 -1
- package/views/2d/layers/BaseLayerView2D.js +1 -1
- package/views/2d/layers/BaseLayerViewGL2D.js +1 -1
- package/views/2d/layers/BitmapTileLayerView2D.js +1 -1
- package/views/2d/layers/MediaLayerView2D.js +1 -1
- package/views/2d/layers/TileLayerView2D.js +1 -1
- package/views/2d/layers/VectorTileLayerView2D.js +1 -1
- package/views/2d/layers/WMTSLayerView2D.js +1 -1
- package/views/2d/layers/features/support/rendererUtils.js +1 -1
- package/views/2d/layers/imagery/BaseImageryTileSubView2D.js +1 -1
- package/views/2d/layers/support/vectorTileDebugUtils.js +5 -0
- package/views/2d/tiling/TileInfoView.js +1 -1
- package/views/2d/tiling/TileInfoViewPOT.js +1 -1
- package/views/2d/tiling/TileQueue.js +1 -1
- package/views/2d/tiling.js +1 -1
- package/views/3d/analysis/Slice/sliceToolUtils.js +1 -1
- package/views/3d/environment/ChapmanAtmosphere.js +1 -1
- package/views/3d/interactive/editingTools/moveGraphic/GraphicMoveTool.js +1 -1
- package/views/3d/layers/ImageryTileLayerView3D.js +1 -1
- package/views/3d/layers/TiledLayerView3D.js +1 -1
- package/views/3d/layers/VectorTileLayerView3D.js +1 -1
- package/views/3d/layers/graphics/Deconflictor.js +1 -1
- package/views/3d/layers/support/FeatureTileFetcher3D.js +1 -1
- package/views/3d/layers/support/featureReference.js +1 -1
- package/views/3d/support/LaserLineRenderer.js +1 -1
- package/views/3d/terrain/Overlay.js +1 -1
- package/views/3d/terrain/OverlayFramebufferObject.js +1 -1
- package/views/3d/terrain/OverlayRenderTarget.js +1 -1
- package/views/3d/terrain/OverlayRenderer.js +1 -1
- package/views/3d/terrain/TerrainRenderer.js +1 -1
- package/views/3d/terrain/TileCompositor.js +1 -1
- package/views/3d/terrain/TileRenderer.js +1 -1
- package/views/3d/terrain/TilingScheme.js +1 -1
- package/views/3d/webgl-engine/collections/Component/ComponentData.js +1 -1
- package/views/3d/webgl-engine/core/shaderModules/interfaces.js +1 -1
- package/views/3d/webgl-engine/effects/ScreenSpaceGeometry.js +1 -1
- package/views/3d/webgl-engine/effects/SmaaRenderPass.js +1 -1
- package/views/3d/webgl-engine/lib/CompositingHelper.js +1 -1
- package/views/3d/webgl-engine/lib/GeometryUtil.js +1 -1
- package/views/3d/webgl-engine/lib/PathBuilder.js +1 -1
- package/views/3d/webgl-engine/lib/Renderer.js +1 -1
- package/views/3d/webgl-engine/lib/RenderingContext.js +1 -1
- package/views/3d/webgl-engine/lib/SortedRenderGeometryRenderer.js +1 -1
- package/views/3d/webgl-engine/lib/WebGLLayer.js +1 -1
- package/views/3d/webgl-engine/lib/lodRendering/LodRenderer.js +1 -1
- package/views/3d/webgl-engine/parts/RenderView.js +1 -1
- package/views/3d/webgl-engine/parts/requireUtils.js +1 -1
- package/views/MapView.js +1 -1
- package/views/animation/pointToPoint/Path.js +1 -1
- package/views/draw/DrawOperation.js +1 -1
- package/views/draw/support/Reshape.js +1 -1
- package/views/draw/support/createUtils.js +1 -1
- package/views/interactive/SegmentLabels.js +1 -1
- package/views/interactive/editGeometry/EditGeometry.js +1 -1
- package/views/interactive/editGeometry/EditGeometryOperations.js +1 -1
- package/views/interactive/editGeometry/operations/UndoGroup.js +1 -1
- package/views/layers/GroupLayerView.js +1 -1
- package/views/webgl/ProgramCache.js +1 -1
- package/webscene/spec-certification/api.js +1 -1
- package/webscene/spec-certification/spec.js +1 -1
- package/webscene/spec-certification/utils.js +1 -1
- package/widgets/BuildingExplorer/BuildingNumericFilterViewModel.js +1 -1
- package/widgets/BuildingExplorer/BuildingPhase.js +1 -1
- package/widgets/BuildingExplorer/support/validation.js +1 -1
- package/widgets/Directions/support/resources.js +1 -1
- package/widgets/Directions.js +1 -1
- package/widgets/Editor/UpdateRecordWorkflow.js +1 -1
- package/widgets/FeatureForm/FeatureFormViewModel.js +1 -1
- package/widgets/FeatureForm/FieldInput.js +1 -1
- package/widgets/FeatureForm/FormExpressionsManager.js +1 -1
- package/widgets/FeatureForm.js +1 -1
- package/widgets/Features.js +1 -1
- package/widgets/Histogram/HistogramViewModel.js +1 -1
- package/widgets/HistogramRangeSlider/HistogramRangeSliderViewModel.js +1 -1
- package/widgets/Legend/styles/Card.js +1 -1
- package/widgets/Legend/styles/support/univariateUtils.js +1 -1
- package/widgets/Legend/support/ActiveLayerInfo.js +1 -1
- package/widgets/Legend/support/colorRampUtils.js +1 -1
- package/widgets/Legend/support/sizeRampUtils.js +1 -1
- package/widgets/Legend/support/utils.js +1 -1
- package/widgets/Popup.js +1 -1
- package/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel.js +1 -1
- package/widgets/ScaleRangeSlider/ScaleRanges.js +1 -1
- package/widgets/ValuePicker/ValuePickerSlider.js +1 -1
- package/widgets/smartMapping/ClassedSizeSlider.js +1 -1
- package/widgets/smartMapping/ColorSizeSlider.js +1 -1
- package/widgets/smartMapping/HeatmapSlider/HeatmapSliderViewModel.js +1 -1
- package/widgets/smartMapping/SizeSlider.js +1 -1
- package/widgets/smartMapping/SmartMappingPrimaryHandleSliderViewModel.js +1 -1
- package/widgets/smartMapping/SmartMappingSliderViewModel.js +1 -1
- package/assets/esri/core/workers/chunks/0210f4c2e1f3ed13041b.js +0 -1
- package/assets/esri/core/workers/chunks/07bb40162d97d098bc19.js +0 -1
- package/assets/esri/core/workers/chunks/0a18317566c1fcb68422.js +0 -1
- package/assets/esri/core/workers/chunks/0de65e03db8c611af9fb.js +0 -1
- package/assets/esri/core/workers/chunks/1a60d23a92bcf91dbb22.js +0 -1
- package/assets/esri/core/workers/chunks/205a0b34b698d5329854.js +0 -1
- package/assets/esri/core/workers/chunks/25211d5904ee9d5f4a9d.js +0 -1
- package/assets/esri/core/workers/chunks/26b12d1ea713c1e07701.js +0 -1
- package/assets/esri/core/workers/chunks/2bfa7ee324c32a56b0d3.js +0 -1
- package/assets/esri/core/workers/chunks/4510a17839405146130b.js +0 -1
- package/assets/esri/core/workers/chunks/524156c3f5383c2dd0e3.js +0 -1
- package/assets/esri/core/workers/chunks/59666ecb7c2c1f5a13b2.js +0 -1
- package/assets/esri/core/workers/chunks/5c005c9514354c77ec27.js +0 -1
- package/assets/esri/core/workers/chunks/620ec5c75561183d3d73.js +0 -1
- package/assets/esri/core/workers/chunks/68512670816f59c0e6a5.js +0 -1
- package/assets/esri/core/workers/chunks/6c7374ebc18b46b3480a.js +0 -1
- package/assets/esri/core/workers/chunks/75ba2af92da232067adb.js +0 -1
- package/assets/esri/core/workers/chunks/7c1f0598a016516dcec3.js +0 -1
- package/assets/esri/core/workers/chunks/8dcec8d1b670d2b7ea2b.js +0 -1
- package/assets/esri/core/workers/chunks/8e07dfb6fc2673b640cb.js +0 -1
- package/assets/esri/core/workers/chunks/9050b167355588b7003d.js +0 -1
- package/assets/esri/core/workers/chunks/9230d68799f0b0b9ef36.js +0 -1
- package/assets/esri/core/workers/chunks/af4083f2aad5f5d49dde.js +0 -1
- package/assets/esri/core/workers/chunks/b0a57718a0765d1c8df0.js +0 -1
- package/assets/esri/core/workers/chunks/b431b81a7bf45dd527da.js +0 -1
- package/assets/esri/core/workers/chunks/bda311ad48efdb265939.js +0 -1
- package/assets/esri/core/workers/chunks/d5cce09fbe16cbb8fee4.js +0 -1
- package/assets/esri/core/workers/chunks/da547c3cabe4a89c3ce6.js +0 -1
- package/assets/esri/core/workers/chunks/dd295fa57b45b7ec4ec5.js +0 -1
- package/assets/esri/core/workers/chunks/f553b464e969d45bf451.js +0 -1
- package/assets/esri/core/workers/chunks/f5865294983eb160de8c.js +0 -1
- package/assets/esri/core/workers/chunks/fdb7b1fbdb6fe091ad83.js +0 -1
- package/views/2d/tiling/PagedTileQueue.js +0 -5
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import"../../renderers/PointCloudClassBreaksRenderer.js";import"../../renderers/PointCloudRenderer.js";import"../../renderers/PointCloudRGBRenderer.js";import"../../renderers/PointCloudStretchRenderer.js";import e from"../../renderers/PointCloudUniqueValueRenderer.js";import"../../renderers/ClassBreaksRenderer.js";import"../../renderers/DictionaryRenderer.js";import"../../renderers/DotDensityRenderer.js";import"../../renderers/HeatmapRenderer.js";import"../../renderers/PieChartRenderer.js";import"../../renderers/Renderer.js";import"../../renderers/SimpleRenderer.js";import r from"../../renderers/UniqueValueRenderer.js";import"../../renderers/support/jsonUtils.js";import"../../core/Logger.js";import
|
|
5
|
+
import"../../renderers/PointCloudClassBreaksRenderer.js";import"../../renderers/PointCloudRenderer.js";import"../../renderers/PointCloudRGBRenderer.js";import"../../renderers/PointCloudStretchRenderer.js";import e from"../../renderers/PointCloudUniqueValueRenderer.js";import"../../renderers/ClassBreaksRenderer.js";import"../../renderers/DictionaryRenderer.js";import"../../renderers/DotDensityRenderer.js";import"../../renderers/HeatmapRenderer.js";import"../../renderers/PieChartRenderer.js";import"../../renderers/Renderer.js";import"../../renderers/SimpleRenderer.js";import r from"../../renderers/UniqueValueRenderer.js";import"../../renderers/support/jsonUtils.js";import"../../core/Logger.js";import l from"../../core/Error.js";import{clone as i}from"../../core/lang.js";import{fetchMessageBundle as s}from"../../intl/messages.js";import{LegendOptions as o}from"../../renderers/support/LegendOptions.js";import{createUniqueValueLabel as n,calculateDateFormatInterval as t}from"../../renderers/support/utils.js";import a from"../heuristics/outline.js";import p from"../heuristics/sizeRange.js";import{errorCallback as u,getPointSizeAlgorithm as d,verifyBasicFieldValidity as m,isValidPointSize as c,createColors as y,getSymbolSizeFromScheme as f,getSymbolOutlineFromScheme as b,createSymbol as h,getBasemapInfo as v}from"./support/utils.js";import g from"../statistics/uniqueValues.js";import{verifyBinningParams as w}from"../support/binningUtils.js";import{getFieldsList as T,FIELD_DELIMITER as j}from"../support/utils.js";import{binningCapableLayerTypes as E,featureCapableLayerTypes as x,createLayerAdapter as V,getLayerTypeLabels as z,LayerType as I}from"../support/adapters/support/layerUtils.js";import{cloneScheme as M,getSchemes as S}from"../symbology/type.js";const R="date";async function C(e){if(!e||!e.layer||!e.field&&!e.valueExpression)throw new l("type-renderer:missing-parameters","'layer' and 'field' or 'valueExpression' parameters are required");if(e.valueExpression&&!e.view)throw new l("type-renderer:missing-parameters","View is required when 'valueExpression' is specified");e.forBinning&&w(e,"type-renderer");const r={...e,layer:e.layer};r.symbolType=r.symbolType||"2d",r.numTypes=null==r.numTypes?10:r.numTypes,r.defaultSymbolEnabled??=!0,r.sortBy??="count",r.sortEnabled??=!0,r.statistics=i(r.statistics);const s=e.forBinning?E:x,o=V(r.layer,s,e.forBinning);if(!o)throw new l("type-renderer:invalid-parameters","'layer' must be one of these types: "+z(s).join(", "));r.layer=o;const n=null!=r.signal?{signal:r.signal}:null;await o.load(n);const t=o.geometryType;if(r.outlineOptimizationEnabled="polygon"===t&&r.outlineOptimizationEnabled,r.sizeOptimizationEnabled=("point"===t||"multipoint"===t||"polyline"===t)&&r.sizeOptimizationEnabled,"mesh"===t)r.symbolType="3d-volumetric",r.colorMixMode=r.colorMixMode||"replace",r.edgesType=r.edgesType||"none";else{if("3d-volumetric-uniform"===r.symbolType&&"point"!==t)throw new l("type-renderer:not-supported","3d-volumetric-uniform symbols are supported for point layers only");if(r.symbolType.includes("3d-volumetric")&&(!r.view||"3d"!==r.view.type))throw new l("type-renderer:invalid-parameters","'view' parameter should be an instance of SceneView when 'symbolType' parameter is '3d-volumetric' or '3d-volumetric-uniform'")}const a=await T({field:r.field,field2:r.field2,field3:r.field3,valueExpression:r.valueExpression}),p=m(o,a,"type-renderer:invalid-parameters");if(p)throw p;return r}async function q(e){if(!(e&&e.layer&&e.field))throw new l("type-point-cloud-class-renderer:missing-parameters","'layer' and 'field' parameters are required");const r={...e,layer:e.layer};r.statistics=i(r.statistics);const s=[I.PointCloudLayer],o=V(r.layer,s);if(!o)throw new l("type-point-cloud-class-renderer:invalid-parameters","'layer' must be one of these types: "+z(s).join(", "));if(r.layer=o,r.density=r.density||25,r.size=r.size||"100%",!c(r.size))throw new l("type-point-cloud-class-renderer:invalid-parameters","Invalid 'size' parameter. It should be a string of the form '100%'");const n=null!=r.signal?{signal:r.signal}:null;await o.load(n);const t=await T({field:r.field}),a=m(o,t,"type-point-cloud-class-renderer:invalid-parameters");if(a)throw a;return r}async function O(e){let r=e.typeScheme,l=null,i=null;const s=await v(e.basemap,e.view);if(l=null!=s.basemapId?s.basemapId:null,i=null!=s.basemapTheme?s.basemapTheme:null,r)return{scheme:M(r),basemapId:l,basemapTheme:i};const o=S({basemapTheme:i,geometryType:e.geometryType,theme:e.theme,worldScale:e.worldScale,view:e.view});return o&&(r=o.primaryScheme,l=o.basemapId,i=o.basemapTheme),{scheme:r,basemapId:l,basemapTheme:i}}function P(e,r){let l;return l=e.label<r.label?-1:e.label>r.label?1:0,l}function B(e,r){let l;return l=e.value<r.value?-1:e.value>r.value?1:0,l}function U(e,r){let l=r.count-e.count;return 0===l&&(l=P(e,r)),l}function D(e,r){let l=r.count-e.count;return 0===l&&(l=B(e,r)),l}function L(e,r,l){let i;"count"===r?(i=D,l&&"codedValues"in l&&l.codedValues&&(i=U)):"value"===r&&(i=B,l&&"codedValues"in l&&l.codedValues&&(i=P)),i&&e.sort(i)}async function A(e,l,i,a){const p=await s("esri/smartMapping/t9n/smartMapping"),{field:u,field2:d,field3:m}=l,c=e.uniqueValueInfos,v=l.layer,g=u?v.getField(u):null,w=g?v.getFieldDomain(g.name):null,T=-1===l.numTypes?c.length:l.numTypes,E=v.geometryType,x=await O({basemap:l.basemap,geometryType:E,typeScheme:l.typeScheme,worldScale:!!l.symbolType?.includes("3d-volumetric"),view:l.view}),V=x.scheme,z=new r({field:u,field2:d,field3:m,fieldDelimiter:u&&d?j:null}),I=[],S=[],C={value:null,domain:w,fieldInfo:g};c.forEach(((e,r)=>{C.value=e.value,e.label=n(C);const l=e.value;(null===l||"string"==typeof l&&l.toLowerCase().includes("<null>"))&&I.unshift(r)}));for(const r of I)S.unshift(c.splice(r,1)[0]);if(!1!==l.sortEnabled&&L(c,l.sortBy,w),g?.type===R){const e=c.filter(((e,r)=>r<T)).map((e=>e.value));C.dateFormatInterval=t(e)}const q=i&&i.opacity;let P=y(V.colors,c.length);const B=f(V,E),U=b(V,E,q);c.forEach(((e,r)=>{C.value=e.value,e.label=n(C),e.symbol=h(E,{type:l.symbolType,color:P[r],size:B,outline:U,meshInfo:{colorMixMode:l.colorMixMode,edgesType:l.edgesType}})})),l.valueExpression&&(z.valueExpression=l.valueExpression,z.valueExpressionTitle=l.valueExpressionTitle),l.legendOptions&&(z.legendOptions=new o(l.legendOptions)),P=y(V.colors,T);for(let r=0;r<T;r++){const e=c[r];e&&z.addUniqueValueInfo({value:e.value,label:e.label,symbol:h(E,{type:l.symbolType,color:P[r],size:B,outline:U,meshInfo:{colorMixMode:l.colorMixMode,edgesType:l.edgesType}})})}l.defaultSymbolEnabled&&(z.defaultSymbol=h(E,{type:l.symbolType,color:V.noDataColor,size:B,outline:U,meshInfo:{colorMixMode:l.colorMixMode,edgesType:l.edgesType}}),z.defaultLabel=p.other);for(const r of S)r.symbol=h(E,{type:l.symbolType,color:V.noDataColor,size:B,outline:U,meshInfo:{colorMixMode:l.colorMixMode,edgesType:l.edgesType}}),c.push(r);const D=[],A=z.uniqueValueInfos?.length??0,F=A===c.length?-1:A;if(F>-1)for(let r=F;r<c.length;r++)D.push({...c[r]});return i&&i.visualVariables&&i.visualVariables.length&&(z.visualVariables=i.visualVariables.map((e=>e.clone()))),a&&a.minSize&&(z.visualVariables?z.visualVariables.push(a.minSize):z.visualVariables=[a.minSize]),{renderer:z,uniqueValueInfos:c,excludedUniqueValueInfos:D,typeScheme:M(V),basemapId:x.basemapId,basemapTheme:x.basemapTheme}}async function F(e,r){const l=e.uniqueValueInfos,i=await O({basemap:"gray",theme:"point-cloud-class",geometryType:"point",typeScheme:r}),s=i&&i.scheme,o="point-cloud-class"===s?.theme,n=o?s.colors:y(s?.colors??[],l.length);return L(l,"value"),l.map(((e,r)=>{const l=e.value;let i=null;return o?(i=n[l],i||(i=n[n.length-1])):i=n[r],{values:[l],color:i,label:e.label}}))}async function k(e){const r=await C(e),{layer:l,view:i,signal:s}=r,o={layer:l,field:r.field,field2:r.field2,field3:r.field3,valueExpression:r.valueExpression,returnAllCodedValues:r.returnAllCodedValues,view:i,signal:s},[n,t,d]=await Promise.all([null!=r.statistics?r.statistics:g(o),r.outlineOptimizationEnabled?a({layer:l,view:i,signal:s}).catch(u):null,r.sizeOptimizationEnabled?p({layer:l,view:i,signal:s}).catch(u):null]);return A(n,r,t,d)}async function G(r){const l=await q(r),i=null!=l.statistics?l.statistics:await g({layer:l.layer,field:l.field,signal:l.signal});return{renderer:new e({field:l.field,pointsPerInch:l.density,pointSizeAlgorithm:d(l.size),colorUniqueValueInfos:await F(i,l.typeScheme)})}}export{G as createPCClassRenderer,k as createRenderer};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import e from"../../core/Error.js";import i from"../../renderers/support/AuthoringInfo.js";import
|
|
5
|
+
import e from"../../core/Error.js";import i from"../../renderers/support/AuthoringInfo.js";import o from"../../renderers/support/ClassBreakInfo.js";import a from"../../renderers/visualVariables/support/SizeStop.js";import{getSize as s}from"../../renderers/visualVariables/support/visualVariableUtils.js";import{createVisualVariable as n}from"./color.js";import{createVisualVariables as l,createContinuousRenderer as t}from"./size.js";import{verifyBasicFieldValidity as r,createStopValuesForAboveBelow as u,clampAboveAndBelowStopValues as p,createDefaultStopValues as m}from"./support/utils.js";import{verifyBinningParams as c}from"../support/binningUtils.js";import{getFieldsList as d}from"../support/utils.js";import{binningCapableLayerTypes as v,featureCapableLayerTypes as f,createLayerAdapter as b,getLayerTypeLabels as y}from"../support/adapters/support/layerUtils.js";import{getAboveAndBelowSymbols as w}from"../symbology/support/aboveAndBelowUtils.js";import{applyCIMSymbolColor as h}from"../../symbols/support/cimSymbolUtils.js";import{Symbol3DMaterial as z}from"../../symbols/support/Symbol3DMaterial.js";const g=2**53-1,V="date";async function O(i){if(!(i&&i.layer&&(i.field||i.valueExpression||i.sqlExpression)))throw new e("univariate-colorsize-visual-variables:missing-parameters","'layer' and 'field', 'valueExpression' or 'sqlExpression' parameters are required");if(i.valueExpression&&!i.sqlExpression&&!i.view)throw new e("univariate-colorsize-visual-variables:missing-parameters","View is required when 'valueExpression' is specified");if("above-and-below"===i.theme&&i.sizeOptions?.sizeOptimizationEnabled)throw new e("univariate-colorsize-visual-variables:invalid-parameters","sizeOptimizationEnabled cannot be true for 'above-and-below' theme");i.forBinning&&c(i,"univariate-colorsize-visual-variables");const o={...i,layer:i.layer},a=i.forBinning?v:f,s=b(o.layer,a,i.forBinning);if(!s)throw new e("univariate-colorsize-visual-variables:invalid-parameters","'layer' must be one of these types: "+y(a).join(", "));if(o.layer=s,o.theme=o.theme||o.colorOptions?.theme?o.theme:"high-to-low","90-10"===o.theme)throw new e("univariate-colorsize-visual-variables:not-supported","Only 'high-to-low', 'above-and-below', 'above', 'below' themes are supported.");const n=null!=o.signal?{signal:o.signal}:null;await s.load(n);const l=await d({field:o.field,normalizationField:o.normalizationField,valueExpression:o.valueExpression}),t=r(s,l,"univariate-colorsize-visual-variables:invalid-parameters");if(t)throw t;return o}function x(e,i){const o={...e},{sizeOptions:a,theme:s}=o,n=o.legendOptions||o.sizeOptions?.legendOptions;return delete o.sizeOptions,delete o.colorOptions,{...o,...a,statistics:i||o.statistics,theme:"above-and-below"===s?null:s,legendOptions:n}}function E(e,i){const o={...e},a=o.colorOptions,s=o.theme||a?.theme,n=o.legendOptions||o.colorOptions?.legendOptions;return delete o.sizeOptions,delete o.colorOptions,{...o,...a,statistics:i||o.statistics,theme:s,legendOptions:n}}async function S(i){if(!(i&&i.layer&&(i.field||i.valueExpression||i.sqlExpression)))throw new e("univariate-colorsize-continuous-renderer:missing-parameters","'layer' and 'field', 'valueExpression' or 'sqlExpression' parameters are required");if(i.valueExpression&&!i.sqlExpression&&!i.view)throw new e("univariate-colorsize-continuous-renderer:missing-parameters","View is required when 'valueExpression' is specified");i.forBinning&&c(i,"univariate-colorsize-continuous-renderer");const o={...i,layer:i.layer};o.symbolType=o.symbolType||"2d",o.colorOptions||(o.colorOptions={}),o.colorOptions.isContinuous=o.colorOptions.isContinuous??!1;const a=i.forBinning?v:f,s=b(o.layer,a,i.forBinning);if(!s)throw new e("univariate-colorsize-continuous-renderer:invalid-parameters","'layer' must be one of these types: "+y(a).join(", "));o.layer=s;const n=null!=o.signal?{signal:o.signal}:null;if(await s.load(n),"above-and-below"===o.theme&&o.symbolOptions){if(o.symbolType.includes("3d-volumetric"))throw new e("univariate-colorsize-continuous-renderer:invalid-parameters","'symbolOptions' is applicable for '2d' and '3d-flat' 'symbolType' only");if("point"!==s.geometryType&&"polygon"!==s.geometryType)throw new e("univariate-colorsize-continuous-renderer:invalid-parameters","'symbolOptions' only apply to layers with 'point' or 'polygon' geometryType")}const l=await d({field:o.field,normalizationField:o.normalizationField,valueExpression:o.valueExpression}),t=r(s,l,"univariate-colorsize-continuous-renderer:invalid-parameters");if(t)throw t;return o}function j(e){const i={...e},o={...i.sizeOptions};return delete i.sizeOptions,delete i.colorOptions,delete o.sizeOptimizationEnabled,{...i,...o}}function I(e,i){if("type"in e&&"cim"===e.type)h(e,i);else if("type"in e&&e.type.includes("3d")){e.symbolLayers.forEach((e=>{"material"in e&&null!=e.material&&"color"in e.material&&(e.material?e.material.color=i:e.material=new z({color:i}))}))}else"color"in e&&(e.color=i)}function T(e,i,o){if((i?.symbolStyle||i?.symbols)&&("point"===o||"polygon"===o))return i.symbols||w(i.symbolStyle);const a=e.classBreakInfos[0].symbol;return{above:a.clone(),below:a.clone()}}function q(e,i,a){const s=a.symbolOptions,n=a.layer,l=s?.symbols?"custom":s?.symbolStyle,t=a.colorOptions?.isContinuous;if(B(e,i,t),l||!t){const a=i.size.visualVariables[0].stops,{above:r,below:u}=T(e,s,n.geometryType);if(!t){const e=i.color.colorScheme.colors,o=e[0];I(r,e[e.length-1]),I(u,o)}e.classBreakInfos=[new o({minValue:-g,maxValue:a[2].value,symbol:u}),new o({minValue:a[2].value,maxValue:g,symbol:r})],l&&e.authoringInfo&&(e.authoringInfo.univariateSymbolStyle=l)}}function B(e,i,o=!0){const a=i?.authoringInfo?.clone(),s=i.size.visualVariables.map((e=>e.clone()));o?s.push(i.color.visualVariable.clone()):a.visualVariables=a.visualVariables?.filter((e=>"size"===e.type)),s.push(...e.visualVariables.filter((e=>"target"in e&&"outline"===e.target)).map((e=>e.clone()))),e.authoringInfo=a,e.visualVariables=s}function D(e){const i={...e},o=i.symbolType,a=!!o?.includes("3d-volumetric");delete i.symbolType,delete i.defaultSymbolEnabled;const s=i;return s.worldScale=a,a&&(s.sizeOptions={...s.sizeOptions},s.sizeOptions.axis="3d-volumetric-uniform"===o?"all":"height"),s}async function U(e,i,o,n){const l=i[0],t=i[1],r=Math.round((t-l)/2)+l,u=e.clone();u.stops=[new a({value:o[0],size:t}),new a({value:o[1],size:r}),new a({value:o[2],size:l}),new a({value:o[3],size:r}),new a({value:o[4],size:t})],e.stops=[new a({value:n[0],size:s(u,n[0])}),new a({value:n[1],size:s(u,n[1])}),new a({value:n[2],size:s(u,n[2])}),new a({value:n[3],size:s(u,n[3])}),new a({value:n[4],size:s(u,n[4])})]}async function C(e,i,o,a,s){const n=e.find((e=>"width-and-depth"!==e.axis&&!e.target)),l="number"==typeof n?.minSize?n?.minSize:null,t="number"==typeof n?.maxSize?n?.maxSize:null;if(null!=n?.minDataValue&&null!=l&&null!=t)if(a)if("above-and-below"===a){n.minDataValue=null,n.maxDataValue=null,n.minSize=null,n.maxSize=null;const e=u(o,s),a=p(e,o);await U(n,[l,t],e,a),i.stops.forEach(((e,i)=>e.value=a[i]))}else{const{minDataValue:e,maxDataValue:o}=n,a=m(e,o,5);i.stops.forEach(((e,i)=>e.value=a[i])),n.minDataValue=a[0],n.maxDataValue=a[a.length-1]}else n.minDataValue=i.stops[0].value,n.maxDataValue=i.stops[i.stops.length-1].value}function F(e,o,a){const{theme:s,minValue:n,maxValue:l}=e,t=o.authoringInfo.visualVariables[0].clone(),r=a.authoringInfo.visualVariables[0].clone();if("above-and-below"===s){const e=o.visualVariable.stops;t.minSliderValue=r.minSliderValue=n??e[0].value,t.maxSliderValue=r.maxSliderValue=l??e[e.length-1].value,r.theme="above-and-below"}return new i({type:"univariate-color-size",univariateTheme:s,visualVariables:[t,r]})}async function k(e){const i=await O(e),o=await n(E(i)),{visualVariable:a,statistics:s}=o,t=await l(x(i,s)),r=t.visualVariables,u=e.layer,p=e.field?u.getField(e.field):null,m=p?.type===V;return await C(r,a,s,i.theme,!!m),{basemapId:t.basemapId,basemapTheme:t.basemapTheme,statistics:s,defaultValuesUsed:o.defaultValuesUsed,color:{visualVariable:a,colorScheme:o.colorScheme},size:{visualVariables:r,sizeScheme:t.sizeScheme},authoringInfo:F(i,o,t)}}async function A(e){return M(e)}async function M(e){const i=await S(e),{renderer:o,statistics:a,defaultValuesUsed:s}=await t(j(i)),n=D(i);n.statistics=a;const l=await k(n);return"above-and-below"===i.theme?q(o,l,i):B(o,l),{renderer:o,statistics:a,defaultValuesUsed:s,color:i.colorOptions?.isContinuous||"above-and-below"!==i.theme?l.color:null,size:l.size,basemapId:l.basemapId,basemapTheme:l.basemapTheme}}export{A as createContinuousRenderer,M as createRenderer,k as createVisualVariables};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import{isSome as e}from"../../../../core/arrayUtils.js";import{throwIfAborted as t}from"../../../../core/promiseUtils.js";import"../../../../core/has.js";import n from"../../../../layers/support/CodedValueDomain.js";import"../../../../layers/support/Domain.js";import"../../../../layers/support/InheritedDomain.js";import"../../../../layers/support/RangeDomain.js";import l from"../../../../layers/support/Field.js";import{isStringField as i}from"../../../../layers/support/fieldUtils.js";import o from"../../../../rest/support/StatisticDefinition.js";import{noDominantCategoryField as a}from"../../../statistics/support/predominanceUtils.js";import{getRangeExpr as r,getSQLFilterForNormalization as s,mergeWhereClauses as u}from"../../../statistics/support/utils.js";import{isIntegerField as c,getDateDiffSQL as m,castIntegerFieldToFloat as f}from"../../utils.js";import{getEqualIntervalBins as p,isNullCountSupported as d,statisticTypes as y,processNullValue as g}from"../../../../statistics/utils.js";const v=/_value$/i,x=Math.LOG10E,h=10;function F(e){return e.map((e=>e.toJSON()))}function w(e,t){const n=[],l=e.layer,i="featureReduction"in l?l.featureReduction:null,o="binning"===i?.type,a=null!=i&&"fields"in i?i.fields?.map((e=>e.name?.toLowerCase())).filter(Boolean):[];if(!o||!t)return n;for(const r of t)a.includes(r.toLowerCase())||n.push(r);return n}function E(e,t,n){const l=[];if(t)for(const i of t){const t=e.getField(i);t&&n&&"availableFields"in n&&!n.availableFields?.includes(t.name)&&l.push(t.name)}return l}function S(e,t){const n=e&&e.features;if(0===n?.length)return{avg:null,count:0,max:null,median:null,min:null,nullcount:0,stddev:null,sum:null,variance:null};const l=n?.[0]?.attributes,i={};for(const o in l)i[o.replace(v,"").toLowerCase()]=l[o];return null!=i.totalcount&&i.totalcount>=i.count&&(i.nullcount=i.totalcount-i.count),delete i.totalcount,i.min===i.max&&null!=i.min&&null==i.stddev&&(i.stddev=i.variance=0),t&&(["min","max","avg","stddev","sum","variance"].forEach((e=>{null!=i[e]&&(i[e]=Math.ceil(i[e]))})),i.min===i.max&&null!=i.min&&(i.avg=i.min,i.stddev=i.variance=0)),i}function V(e){const t=[],n=e.classBreaks,l=n[0].minValue,i=n.
|
|
5
|
+
import{isSome as e}from"../../../../core/arrayUtils.js";import{throwIfAborted as t}from"../../../../core/promiseUtils.js";import"../../../../core/has.js";import n from"../../../../layers/support/CodedValueDomain.js";import"../../../../layers/support/Domain.js";import"../../../../layers/support/InheritedDomain.js";import"../../../../layers/support/RangeDomain.js";import l from"../../../../layers/support/Field.js";import{isStringField as i}from"../../../../layers/support/fieldUtils.js";import o from"../../../../rest/support/StatisticDefinition.js";import{noDominantCategoryField as a}from"../../../statistics/support/predominanceUtils.js";import{getRangeExpr as r,getSQLFilterForNormalization as s,mergeWhereClauses as u}from"../../../statistics/support/utils.js";import{isIntegerField as c,getDateDiffSQL as m,castIntegerFieldToFloat as f}from"../../utils.js";import{getEqualIntervalBins as p,isNullCountSupported as d,statisticTypes as y,processNullValue as g}from"../../../../statistics/utils.js";const v=/_value$/i,x=Math.LOG10E,h=10;function F(e){return e.map((e=>e.toJSON()))}function w(e,t){const n=[],l=e.layer,i="featureReduction"in l?l.featureReduction:null,o="binning"===i?.type,a=null!=i&&"fields"in i?i.fields?.map((e=>e.name?.toLowerCase())).filter(Boolean):[];if(!o||!t)return n;for(const r of t)a.includes(r.toLowerCase())||n.push(r);return n}function E(e,t,n){const l=[];if(t)for(const i of t){const t=e.getField(i);t&&n&&"availableFields"in n&&!n.availableFields?.includes(t.name)&&l.push(t.name)}return l}function S(e,t){const n=e&&e.features;if(0===n?.length)return{avg:null,count:0,max:null,median:null,min:null,nullcount:0,stddev:null,sum:null,variance:null};const l=n?.[0]?.attributes,i={};for(const o in l)i[o.replace(v,"").toLowerCase()]=l[o];return null!=i.totalcount&&i.totalcount>=i.count&&(i.nullcount=i.totalcount-i.count),delete i.totalcount,i.min===i.max&&null!=i.min&&null==i.stddev&&(i.stddev=i.variance=0),t&&(["min","max","avg","stddev","sum","variance"].forEach((e=>{null!=i[e]&&(i[e]=Math.ceil(i[e]))})),i.min===i.max&&null!=i.min&&(i.avg=i.min,i.stddev=i.variance=0)),i}function V(e){const t=[],n=e.classBreaks,l=n[0].minValue,i=n[n.length-1].maxValue;n.forEach((e=>{t.push([e.minValue,e.maxValue])}));const o={field:e.field,normalizationType:e.normalizationType,normalizationField:e.normalizationField,normalizationTotal:e.normalizationTotal,layer:e.layer};return{min:l,max:i,intervals:t,sqlExpr:z(o),excludeZerosExpr:e.where,normTotal:e.normalizationTotal}}function z(e){const{field:t,normalizationType:n,normalizationField:l,normalizationTotal:i,layer:o}=e,a=c(o,t);let r=t;return"percent-of-total"===n?r=`((${a?f(t):t} / ${i}) * 100)`:"log"===n?r=`(log(${t}) * ${x})`:"field"===n?r=`(${a?f(t):t} / ${l})`:"natural-log"===n?r=`(log(${a?f(t):t}))`:"square-root"===n&&(r=`(power(${a?f(t):t}, 0.5))`),r}function T(e,t){let n;if(t=t.toLowerCase(),e)for(const l in e)if(l.toLowerCase()!==t){n=e[l];break}return n}function q(e,t){let n;if(t=t.toLowerCase(),e)for(const l in e)if(l.toLowerCase()===t){n=e[l];break}return n}function $(e,t,n,l,i){const o={},a="countOFExpr";e&&e.features&&e.features.forEach((e=>{const t=e.attributes,n=T(t,a),l=q(t,a);null!=n&&null!=l&&0!==n&&(o[n]=l)}));const r=[];return p(t,n,l).forEach(((e,t)=>{const n=(t+1).toString();r.push({minValue:e[0],maxValue:e[1],count:o.hasOwnProperty(n)?o[n]:0})})),{bins:r,minValue:t,maxValue:n,normalizationTotal:i}}function b(e,n){const l=e&&e.features,{field:i,field2:o,field3:a,fieldDelimiter:r,layer:s,view:u,signal:c,labels:m}=n,f=`countOF${!(!i||!o)?"Expr":i||"Expr"}`,p={};let d=!1;if(l.forEach((e=>{const t=e.attributes,n=q(t,f);let l=i?q(t,i):T(t,f),s=o?q(t,o):null,u=a?q(t,a):null;null===l&&0===n&&(d=!0),(null==l||"string"==typeof l&&""===l.trim())&&(l=null),o&&(null==s||"string"==typeof s&&""===s.trim())&&(s=null),a&&(null==u||"string"==typeof u&&""===u.trim())&&(u=null);let c=l;o&&(c=`${g(c)}${r}${g(s)}`,a&&(c=`${c}${r}${g(u)}`)),null==p[c]?p[c]={count:n,data:c}:p[c].count=p[c].count+n})),i&&d){const e=i+" is NULL";return s.queryFeatureCount({whereClause:e,view:u,signal:c}).then((e=>(e=e||0,p.null.count=p.null.count+e,j(p,m)))).catch((()=>(t(c),j(p,m))))}return Promise.resolve(j(p,m))}function j(e,t){if(t)for(const n in e)e[n].label=t[n];return{count:e}}async function C(e,t,l){const i=e?l.getField(e):null,o=i?l.getFieldDomain(i.name):null;if(o)return o;const{uniqueValueInfos:a}=await l.uniqueValues({field:e,sqlWhere:t.sqlWhere,features:t.features,useFeaturesInView:t.useFeaturesInView,view:t.view,signal:t.signal}),r=a.map((e=>({code:e.value})));return new n({codedValues:r})}async function L(e,t){if(!e.returnAllCodedValues)return[];const{field:n,field2:l,field3:i}=e;if(n&&!l){const e=n?t.getField(n):null,l=e?t.getFieldDomain(e.name):null;return l?[l]:[]}const o=[];return n&&(o.push(C(n,e,t)),l&&(o.push(C(l,e,t)),i&&o.push(C(i,e,t)))),Promise.all(o)}function D(e,t){return m(e,new Date(0),t,"milliseconds").sqlExpression}function O(e){return{viewingMode:"2d"===e.type?"map":e.viewingMode,scale:e.scale,spatialReference:e.spatialReference?.toJSON()}}function R(e,t){const n=e.map((e=>e.value)),l=t.filter((e=>!n.includes(e)));for(const i of l)e.push({value:i,count:0});e.sort(((e,n)=>t.indexOf(e.value)-t.indexOf(n.value)));for(const i of e)i.value===a&&(i.value=null);return{predominantCategoryInfos:e}}function I(t){const n="featureReduction"in t?t.featureReduction:null;return((null!=n&&"fields"in n?n.fields:null)??[]).map((e=>{const n=B(e,t.fieldsIndex);return n?new l({type:n,name:e.name,alias:e.alias}):null})).filter(e)}function B(e,t){switch(e.statisticType){case"avg":case"avg_angle":return"double";case"count":return"integer";case"min":case"max":case"sum":return e.onStatisticField?t.get(e.onStatisticField)?.type??null:e.onStatisticExpression?"string"===e.onStatisticExpression.returnType?null:"double":null;case"mode":return e.onStatisticField?t.get(e.onStatisticField)?.type??null:e.onStatisticExpression?"string"===e.onStatisticExpression.returnType?"string":"double":null;default:return null}}function N(e,t,n){const{field:l,normalizationType:a,normalizationField:c,normalizationTotal:m,minValue:f,maxValue:p,filter:g}=t,v=e.supportsSQLExpression&&n?D(e,l):t.sqlExpression,x=z({field:l,normalizationType:a,normalizationField:c,normalizationTotal:m,layer:e}),h=v||x,F=h?r(h,f,p):null,w=s({field:l,normalizationField:c,normalizationType:a}),E=u(t.sqlWhere,w),S=u(E,F),V=d({normalizationField:c,normalizationType:a,sqlExpression:v,supportsSQLExpression:e.supportsSQLExpression,minValue:f,maxValue:p}),T=i(e.getField(l??void 0)),q=y.filter((e=>"nullcount"===e?V:!T||"count"===e)),$=e.createQuery();return $.where=u($.where,S),$.sqlFormat=v?"standard":null,$.outStatistics=q.map((t=>{const n=new o;let l=null,i=null,a=`${t}_value`;return"variance"===t?(l="var",i=h):"nullcount"===t?(l="count",i=e.objectIdField,a="totalcount_value"):"median"===t?(l="percentile-continuous",i=h,n.statisticParameters={value:.5}):(l=t,i=h),n.statisticType=l,n.onStatisticField=i,n.outStatisticFieldName=a,n})),P($,g),$}function P(e,t){t&&(e.geometry=t.geometry,e.spatialRelationship=t.spatialRelationship)}function Q(e,t){const{field:n,field2:l,field3:i,sqlExpression:o}=t,a=!(!n||!l),r=e.createQuery();return r.where=u(r.where,t.sqlWhere),r.sqlFormat=o?"standard":null,r.outStatistics=[U(a?null:n,a?"1":o)].filter(Boolean),r.groupByFieldsForStatistics=[n||o,l,i].filter(Boolean),P(r,t.filter),r}function U(e,t){const n="countOF"+(e||"Expr"),l=new o;return l.statisticType="count",l.onStatisticField=t?"1":e,l.outStatisticFieldName=n,l}function M(e,t,n,l=h,i,o,a){const{min:r,max:s,normTotal:u,excludeZerosExpr:c}=t,m=t.intervals||p(r,s,l),f=t.sqlExpr||n;return W(e,m,f,c,i,o,a).then((e=>({bins:e.map(((e,t)=>({minValue:m[t][0],maxValue:m[t][1],count:"fulfilled"===e.status?e.value:0}))),minValue:r,maxValue:s,normalizationTotal:u})))}function W(e,t,n,l,i,o,a){const r=[],s=t.length;for(let c=0;c<s;c++){const e=u(l,u(n+" >= "+t[c][0],null!==t[c][1]?n+(c===s-1?" <= ":" < ")+t[c][1]:""));r.push(e)}return Promise.allSettled(r.map((t=>e.queryFeatureCount({whereClause:t,view:i,filter:o,signal:a}))))}export{h as defaultNumBins,F as ensureFeaturesJSON,V as generateBinParams,B as getAggregateFieldType,M as getBins,L as getDomainsForFields,I as getFeatureReductionFields,z as getFieldExpr,$ as getHistogramFromFeatureSet,E as getMissingFields,w as getMissingFieldsForBinning,R as getPredominantCategoriesFromUVInfos,S as getSummaryStatisticsFromFeatureSet,N as getSummaryStatsQuery,Q as getUVQuery,b as getUniqueValuesFromFeatureSet,O as getViewInfoParams,D as msSinceUnixEpochSQL,P as updateQueryWithFeatureFilter};
|
package/statistics/utils.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import n from"../rest/support/ClassBreaksDefinition.js";import{createGenerateRendererClassBreaks as e}from"../rest/support/generateRendererUtils.js";const t="<Null>",l="equal-interval",i=1,a=5,r=10,o=/\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*/gi,u=new Set(["esriFieldTypeInteger","esriFieldTypeSmallInteger","esriFieldTypeSingle","esriFieldTypeDouble"]),s=["min","max","avg","stddev","count","sum","variance","nullcount","median"];function c(n){return null==n||"string"==typeof n&&!n?t:n}function m(n){const e=null!=n.normalizationField||null!=n.normalizationType,t=null!=n.minValue||null!=n.maxValue,l=!!n.sqlExpression&&n.supportsSQLExpression;return!e&&!t&&!l}function f(n){const e=n.returnDistinct?[...new Set(n.values)]:n.values,t=e.filter((n=>null!=n)).sort(),l=t.length,i={count:l,min:t[0],max:t[l-1]};return n.supportsNullCount&&(i.nullcount=e.length-l),n.percentileParams&&(i.median=p(e,n.percentileParams)),i}function d(n){const{values:e,useSampleStdDev:t,supportsNullCount:l}=n;let i=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,r=null,o=null,u=null,s=null,c=0;const m=null==n.minValue?-1/0:n.minValue,f=null==n.maxValue?1/0:n.maxValue;for(const p of e)Number.isFinite(p)?p>=m&&p<=f&&(r=null===r?p:r+p,i=Math.min(i,p),a=Math.max(a,p),c++):"string"==typeof p&&c++;if(c&&null!=r){o=r/c;let n=0;for(const t of e)Number.isFinite(t)&&t>=m&&t<=f&&(n+=(t-o)**2);s=t?c>1?n/(c-1):0:c>0?n/c:0,u=Math.sqrt(s)}else i=null,a=null;const d={avg:o,count:c,max:a,min:i,stddev:u,sum:r,variance:s};return l&&(d.nullcount=e.length-c),n.percentileParams&&(d.median=p(e,n.percentileParams)),d}function p(n,e){const{fieldType:t,value:l,orderBy:i,isDiscrete:a}=e,r=v(t,"desc"===i);if(0===(n=[...n].filter((n=>null!=n)).sort(((n,e)=>r(n,e)))).length)return null;if(l<=0)return n[0];if(l>=1)return n.
|
|
5
|
+
import n from"../rest/support/ClassBreaksDefinition.js";import{createGenerateRendererClassBreaks as e}from"../rest/support/generateRendererUtils.js";const t="<Null>",l="equal-interval",i=1,a=5,r=10,o=/\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*/gi,u=new Set(["esriFieldTypeInteger","esriFieldTypeSmallInteger","esriFieldTypeSingle","esriFieldTypeDouble"]),s=["min","max","avg","stddev","count","sum","variance","nullcount","median"];function c(n){return null==n||"string"==typeof n&&!n?t:n}function m(n){const e=null!=n.normalizationField||null!=n.normalizationType,t=null!=n.minValue||null!=n.maxValue,l=!!n.sqlExpression&&n.supportsSQLExpression;return!e&&!t&&!l}function f(n){const e=n.returnDistinct?[...new Set(n.values)]:n.values,t=e.filter((n=>null!=n)).sort(),l=t.length,i={count:l,min:t[0],max:t[l-1]};return n.supportsNullCount&&(i.nullcount=e.length-l),n.percentileParams&&(i.median=p(e,n.percentileParams)),i}function d(n){const{values:e,useSampleStdDev:t,supportsNullCount:l}=n;let i=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,r=null,o=null,u=null,s=null,c=0;const m=null==n.minValue?-1/0:n.minValue,f=null==n.maxValue?1/0:n.maxValue;for(const p of e)Number.isFinite(p)?p>=m&&p<=f&&(r=null===r?p:r+p,i=Math.min(i,p),a=Math.max(a,p),c++):"string"==typeof p&&c++;if(c&&null!=r){o=r/c;let n=0;for(const t of e)Number.isFinite(t)&&t>=m&&t<=f&&(n+=(t-o)**2);s=t?c>1?n/(c-1):0:c>0?n/c:0,u=Math.sqrt(s)}else i=null,a=null;const d={avg:o,count:c,max:a,min:i,stddev:u,sum:r,variance:s};return l&&(d.nullcount=e.length-c),n.percentileParams&&(d.median=p(e,n.percentileParams)),d}function p(n,e){const{fieldType:t,value:l,orderBy:i,isDiscrete:a}=e,r=v(t,"desc"===i);if(0===(n=[...n].filter((n=>null!=n)).sort(((n,e)=>r(n,e)))).length)return null;if(l<=0)return n[0];if(l>=1)return n[n.length-1];const o=(n.length-1)*l,u=Math.floor(o),s=u+1,c=o%1,m=n[u],f=n[s];return s>=n.length||a||"string"==typeof m||"string"==typeof f?m:m*(1-c)+f*c}function v(n,e){const t=e?1:-1,l=h(e),i=V(e);if(!(!!n&&["esriFieldTypeDate","esriFieldTypeString","esriFieldTypeGUID","esriFieldTypeGlobalID",...u].includes(n)))return(n,e)=>"number"==typeof n&&"number"==typeof e?l(n,e):"string"==typeof n&&"string"==typeof e?i(n,e):t;if("esriFieldTypeDate"===n)return(n,e)=>{const i=new Date(n).getTime(),a=new Date(e).getTime();return isNaN(i)||isNaN(a)?t:l(i,a)};if(u.has(n))return(n,e)=>l(n,e);if("esriFieldTypeString"===n)return(n,e)=>i(n,e);if("esriFieldTypeGUID"===n||"esriFieldTypeGlobalID"===n){const n=V(e);return(e,t)=>n(T(e),T(t))}return e?(n,e)=>1:(n,e)=>-1}function b(n,e,t){if(t){if(null==n)return null==e?0:1;if(null==e)return-1}else{if(null==n)return null==e?0:-1;if(null==e)return 1}return null}function V(n){return n?(n,e)=>{const t=b(n,e,!0);return null!=t?t:(n=n.toUpperCase())>(e=e.toUpperCase())?-1:n<e?1:0}:(n,e)=>{const t=b(n,e,!1);return null!=t?t:(n=n.toUpperCase())<(e=e.toUpperCase())?-1:n>e?1:0}}function h(n){return n?(n,e)=>{const t=b(n,e,!0);return null!=t?t:e-n}:(n,e)=>{const t=b(n,e,!1);return null!=t?t:n-e}}function T(n){return n.substr(24,12)+n.substr(19,4)+n.substr(16,2)+n.substr(14,2)+n.substr(11,2)+n.substr(9,2)+n.substr(6,2)+n.substr(4,2)+n.substr(2,2)+n.substr(0,2)}function g(n,e){let t;for(t in n)s.includes(t)&&(Number.isFinite(n[t])||(n[t]=null));return e?(["avg","stddev","variance"].forEach((e=>{null!=n[e]&&(n[e]=Math.ceil(n[e]??0))})),n):n}function x(n){const e={};for(let t of n)(null==t||"string"==typeof t&&""===t.trim())&&(t=null),null==e[t]?e[t]={count:1,data:t}:e[t].count++;return{count:e}}function y(n){return"coded-value"!==n?.type?[]:n.codedValues.map((n=>n.code))}function F(n,e,t,l){const i=n.count,a=[];if(t&&e){const n=[],t=y(e[0]);for(const i of t)if(e[1]){const t=y(e[1]);for(const a of t)if(e[2]){const t=y(e[2]);for(const e of t)n.push(`${c(i)}${l}${c(a)}${l}${c(e)}`)}else n.push(`${c(i)}${l}${c(a)}`)}else n.push(i);for(const e of n)i.hasOwnProperty(e)||(i[e]={data:e,count:0})}for(const r in i){const n=i[r];a.push({value:n.data,count:n.count,label:n.label})}return{uniqueValueInfos:a}}function z(n,e,t,l){let i=null;switch(e){case"log":0!==n&&(i=Math.log(n)*Math.LOG10E);break;case"percent-of-total":Number.isFinite(l)&&0!==l&&(i=n/l*100);break;case"field":Number.isFinite(t)&&0!==t&&(i=n/t);break;case"natural-log":n>0&&(i=Math.log(n));break;case"square-root":n>0&&(i=n**.5)}return i}function D(n,t){const l=N({field:t.field,normalizationType:t.normalizationType,normalizationField:t.normalizationField,classificationMethod:t.classificationMethod,standardDeviationInterval:t.standardDeviationInterval,breakCount:t.numClasses||a});return n=I(n,t.minValue,t.maxValue),e({definition:l,values:n,normalizationTotal:t.normalizationTotal})}function I(n,e,t){const l=e??-1/0,i=t??1/0;return n.filter((n=>Number.isFinite(n)&&n>=l&&n<=i))}function N(e){const{breakCount:t,field:a,normalizationField:r,normalizationType:o}=e,u=e.classificationMethod||l,s="standard-deviation"===u?e.standardDeviationInterval||i:void 0;return new n({breakCount:t,classificationField:a,classificationMethod:u,normalizationField:"field"===o?r:void 0,normalizationType:o,standardDeviationInterval:s})}function S(n,e){let t=n.classBreaks;const l=t.length,i=t[0]?.minValue,a=t[l-1]?.maxValue,r="standard-deviation"===e,u=o;return t=t.map((n=>{const e=n.label,t={minValue:n.minValue,maxValue:n.maxValue,label:e};if(r&&e){const n=e.match(u),l=n?.map((n=>+n.trim()))??[];2===l.length?(t.minStdDev=l[0],t.maxStdDev=l[1],l[0]<0&&l[1]>0&&(t.hasAvg=!0)):1===l.length&&(e.includes("<")?(t.minStdDev=null,t.maxStdDev=l[0]):e.includes(">")&&(t.minStdDev=l[0],t.maxStdDev=null))}return t})),{minValue:i,maxValue:a,classBreakInfos:t,normalizationTotal:n.normalizationTotal}}function M(n,e){const t=C(n,e);if(null==t.min&&null==t.max)return{bins:[],minValue:t.min,maxValue:t.max,normalizationTotal:e.normalizationTotal};const l=t.intervals,i=t.min??0,a=t.max??0,r=l.map(((n,e)=>({minValue:l[e][0],maxValue:l[e][1],count:0})));for(const o of n)if(null!=o&&o>=i&&o<=a){const n=k(l,o);n>-1&&r[n].count++}return{bins:r,minValue:i,maxValue:a,normalizationTotal:e.normalizationTotal}}function C(n,e){const{field:t,classificationMethod:l,standardDeviationInterval:i,normalizationType:a,normalizationField:o,normalizationTotal:u,minValue:s,maxValue:c}=e,f=e.numBins||r;let p=null,v=null,b=null;if((!l||"equal-interval"===l)&&!a){if(null!=s&&null!=c)p=s,v=c;else{const e=d({values:n,minValue:s,maxValue:c,useSampleStdDev:!a,supportsNullCount:m({normalizationType:a,normalizationField:o,minValue:s,maxValue:c})});p=e.min??null,v=e.max??null}b=$(p??0,v??0,f)}else{const{classBreaks:e}=D(n,{field:t,normalizationType:a,normalizationField:o,normalizationTotal:u,classificationMethod:l,standardDeviationInterval:i,minValue:s,maxValue:c,numClasses:f});p=e[0].minValue,v=e[e.length-1].maxValue,b=e.map((n=>[n.minValue,n.maxValue]))}return{min:p,max:v,intervals:b}}function k(n,e){let t=-1;for(let l=n.length-1;l>=0;l--){if(e>=n[l][0]){t=l;break}}return t}function $(n,e,t){const l=(e-n)/t,i=[];let a,r=n;for(let o=1;o<=t;o++)a=r+l,a=Number(a.toFixed(16)),i.push([r,o===t?e:a]),r=a;return i}export{D as calculateClassBreaks,M as calculateHistogram,p as calculatePercentile,d as calculateStatistics,f as calculateStringStatistics,x as calculateUniqueValuesCount,N as createClassBreaksDefinition,F as createUVResult,v as getAttributeComparator,$ as getEqualIntervalBins,z as getNormalizedValue,m as isNullCountSupported,c as processNullValue,g as processSummaryStatisticsResult,S as resolveCBResult,s as statisticTypes};
|
package/support/revision.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
const
|
|
5
|
+
const a="20230721",c="a4e92705f4bad5264352c8d8caa33f00252a6002";export{a as buildDate,c as commitHash};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import{bidiText as t}from"../../core/BidiText.js";import{DEFAULT_FONT_FAMILY as e}from"../../core/fontUtils.js";import{clone as r}from"../../core/lang.js";import i from"../../core/Logger.js";import s from"../../core/ObjectPool.js";import{px2pt as o,pt2px as n}from"../../core/screenUtils.js";import{GeometryCursor as a}from"../../geometry/GeometryCursor.js";import{create as l,fromValues as h}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as c}from"../../geometry/support/boundsUtils.js";import{polygonCentroid as m}from"../../geometry/support/centroid.js";import{isPoint as u,isPolygon as f,isPolyline as d,isExtent as p,isMultipoint as _}from"../../geometry/support/jsonUtils.js";import{SimpleEffectCursor as g}from"./CIMEffects.js";import y from"./CIMImageColorSubstitutionHelper.js";import{getEffectOperator as P,getPlacementOperator as w}from"./CIMOperators.js";import{Placement as x}from"./CIMPlacements.js";import{LineCapStyle as S,LineJoinStyle as M}from"./enums.js";import{getFirstFrame as b}from"./imageUtils.js";import k from"./Rect.js";import C from"./TextRasterizer.js";import{getValue as I,isSVGImage as R,fromCIMFontDecoration as T,fromCIMFontStyle as v,fromCIMHorizontalAlignment as z,fromCIMVerticalAlignment as F,getFillColor as L,getStrokeWidth as A,getStrokeColor as j,getFontStyle as U,getFontWeight as H}from"./utils.js";import{HAlign as B,VAlign as G}from"../../views/2d/engine/webgl/alignmentUtils.js";import{GLYPH_SIZE as D,MAGIC_LABEL_LINE_HEIGHT as X}from"../../views/2d/engine/webgl/definitions.js";import{shapeGlyphs as E}from"../../views/2d/engine/webgl/mesh/templates/shapingUtils.js";const J=Math.PI/180,N=i.getLogger("esri.symbols.cim.CIMSymbolDrawHelper"),O=4,q=10,V=10,Y=4,W=10,K=1;class Q{constructor(t){this._t=t}static createIdentity(){return new Q([1,0,0,0,1,0])}clone(){const t=this._t;return new Q(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 Q([t,0,0,0,e,0])}scale(t,e){const r=this._t;return r[0]*=t,r[1]*=t,r[2]*=t,r[3]*=e,r[4]*=e,r[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 Q([0,0,t,0,0,e])}translate(t,e){const r=this._t;return r[2]+=t,r[5]+=e,this}static createRotate(t){const e=Math.cos(t),r=Math.sin(t);return new Q([e,-r,0,r,e,0])}rotate(t){return Q.multiply(this,Q.createRotate(t),this)}angle(){const t=this._t[0],e=this._t[3],r=Math.sqrt(t*t+e*e);return[t/r,e/r]}static multiply(t,e,r){const i=t._t,s=e._t,o=i[0]*s[0]+i[3]*s[1],n=i[1]*s[0]+i[4]*s[1],a=i[2]*s[0]+i[5]*s[1]+s[2],l=i[0]*s[3]+i[3]*s[4],h=i[1]*s[3]+i[4]*s[4],c=i[2]*s[3]+i[5]*s[4]+s[5],m=r._t;return m[0]=o,m[1]=n,m[2]=a,m[3]=l,m[4]=h,m[5]=c,r}invert(){const t=this._t;let e=t[0]*t[4]-t[1]*t[3];if(0===e)return new Q([0,0,0,0,0,0]);e=1/e;const r=(t[1]*t[5]-t[2]*t[4])*e,i=(t[2]*t[3]-t[0]*t[5])*e,s=t[4]*e,o=-t[1]*e,n=-t[3]*e,a=t[0]*e;return new Q([s,o,r,n,a,i])}}class Z{constructor(t,e){this._resourceManager=t,this._transfos=[],this._sizeTransfos=[],this._geomUnitsPerPoint=1,this._placementPool=new s(x,void 0,void 0,100),this._earlyReturn=!1,this._mapRotation=0,this._transfos.push(e||Q.createIdentity()),this._sizeTransfos.push(e?e.scaleRatio():1)}setTransform(t,e){this._transfos=[t||Q.createIdentity()],this._sizeTransfos=[e||(t?t.scaleRatio():1)]}setGeomUnitsPerPoint(t){this._geomUnitsPerPoint=t}transformPt(t){return this._transfos.at(-1).transform(t)}transformSize(t){return t*this._sizeTransfos.at(-1)}reverseTransformPt(t){return this._transfos.at(-1).invert().transform(t)}reverseTransformSize(t){return t/this._sizeTransfos.at(-1)}getTransformAngle(){return this._transfos.at(-1).angle()}geomUnitsPerPoint(){return this.isEmbedded()?1:this._geomUnitsPerPoint}isEmbedded(){return this._transfos.length>1}back(){return this._transfos.at(-1)}push(t,e){const r=e?t.scaleRatio():1;Q.multiply(t,this.back(),t),this._transfos.push(t),this._sizeTransfos.push(this._sizeTransfos.at(-1)*r)}pop(){this._transfos.splice(-1,1),this._sizeTransfos.splice(-1,1)}drawSymbol(t,e,r){if(t)switch(t.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this.drawMultiLayerSymbol(t,e);break;case"CIMTextSymbol":this.drawTextSymbol(t,e,r)}}drawMultiLayerSymbol(t,e){if(!t||!e)return;const r=t.symbolLayers;if(!r)return;const i=t.effects;if(i&&i.length>0){const t=this.executeEffects(i,e);if(t){let e=t.next();for(;e;)this.drawSymbolLayers(r,e.asJSON()),e=t.next()}}else this.drawSymbolLayers(r,e)}executeEffects(t,e){const r=this._resourceManager.geometryEngine;let i=new g(a.fromJSONCIM(e));for(const s of t){const t=P(s);t&&(i=t.execute(i,s,this.geomUnitsPerPoint(),null,r))}return i}drawSymbolLayers(t,e){let r=t.length;for(;r--;){const i=t[r];if(!i||!1===i.enable)continue;const s=i.effects;if(s&&s.length>0){const t=this.executeEffects(s,e);if(t){let e=null;for(;(e=t.next())&&(this.drawSymbolLayer(i,e.asJSON()),!this._earlyReturn););}}else this.drawSymbolLayer(i,e);if(this._earlyReturn)return}}drawSymbolLayer(t,e){switch(t.type){case"CIMSolidFill":this.drawSolidFill(e,t.color);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);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 r=this._buildHatchPolyline(e,t,this.geomUnitsPerPoint());r&&(this.pushClipPath(t),this.drawMultiLayerSymbol(e.lineSymbol,r),this.popClipPath())}drawPictureFill(t,e){}drawGradientFill(t,e){}drawPictureStroke(t,e){}drawGradientStroke(t,e){}drawMarkerLayer(t,e){const r=t.markerPlacement;if(r){const i=w(r);if(i){const s="CIMMarkerPlacementInsidePolygon"===r.type||"CIMMarkerPlacementPolygonCenter"===r.type&&r.clipAtBoundary;s&&this.pushClipPath(e);const o=i.execute(a.fromJSONCIM(e),r,this.geomUnitsPerPoint(),null,this._resourceManager.geometryEngine);if(o){let e=null;for(;(e=o.next())&&(this.drawMarker(t,e),!this._earlyReturn););}s&&this.popClipPath()}}else{const r=this._placementPool.acquire();if(u(e))r.tx=e.x,r.ty=e.y,this.drawMarker(t,r);else if(f(e)){const i=m(e);i&&([r.tx,r.ty]=i,this.drawMarker(t,r))}else for(const i of e.points)if(r.tx=i[0],r.ty=i[1],this.drawMarker(t,r),this._earlyReturn)break;this._placementPool.release(r)}}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 r=this._resourceManager.getResource(t.url),i=I(t.size,q);if(null==r||i<=0)return;const s=r.width,o=r.height;if(!s||!o)return;const n=s/o,a=I(t.scaleX,1),l=Q.createIdentity(),h=t.anchorPoint;if(h){let e=h.x,r=h.y;"Absolute"!==t.anchorPointUnits&&(e*=i*n*a,r*=i),l.translate(-e,-r)}let c=I(t.rotation);t.rotateClockwise&&(c=-c),this._mapRotation&&(c+=this._mapRotation),c&&l.rotate(c*J);let m=I(t.offsetX),u=I(t.offsetY);if(m||u){if(this._mapRotation){const t=J*this._mapRotation,e=Math.cos(t),r=Math.sin(t),i=m*r+u*e;m=m*e-u*r,u=i}l.translate(m,u)}const f=this.geomUnitsPerPoint();1!==f&&l.scale(f,f);const d=e.getAngle();d&&l.rotate(d),l.translate(e.tx,e.ty),this.push(l,!1),this.drawImage(t,i),this.pop()}drawVectorMarker(t,e){if(!t)return;const r=t.markerGraphics;if(!r)return;const i=I(t.size,q),s=t.frame,o=s?s.ymax-s.ymin:0,n=i&&o?i/o:1,a=Q.createIdentity();s&&a.translate(.5*-(s.xmax+s.xmin),.5*-(s.ymax+s.ymin));const l=t.anchorPoint;if(l){let e=l.x,r=l.y;"Absolute"!==t.anchorPointUnits?s&&(e*=s.xmax-s.xmin,r*=s.ymax-s.ymin):(e/=n,r/=n),a.translate(-e,-r)}1!==n&&a.scale(n,n);let h=I(t.rotation);t.rotateClockwise&&(h=-h),this._mapRotation&&(h+=this._mapRotation),h&&a.rotate(h*J);let c=I(t.offsetX),m=I(t.offsetY);if(c||m){if(this._mapRotation){const t=J*this._mapRotation,e=Math.cos(t),r=Math.sin(t),i=c*r+m*e;c=c*e-m*r,m=i}a.translate(c,m)}const u=this.geomUnitsPerPoint();1!==u&&a.scale(u,u);const f=e.getAngle();f&&a.rotate(f),a.translate(e.tx,e.ty),this.push(a,t.scaleSymbolsProportionally);for(const d of r)if(d&&d.symbol&&d.geometry||N.error("Invalid marker graphic",d),this.drawSymbol(d.symbol,d.geometry,d.textString),this._earlyReturn)break;this.pop()}drawTextSymbol(t,e,r){if(!t)return;if(!u(e))return;if(I(t.height,W)<=0)return;const i=Q.createIdentity();let s=I(t.angle);s=-s,s&&i.rotate(s*J);const o=I(t.offsetX),n=I(t.offsetY);(o||n)&&i.translate(o,n);const a=this.geomUnitsPerPoint();1!==a&&i.scale(a,a),i.translate(e.x,e.y),this.push(i,!1),this.drawText(t,r),this.pop()}_buildHatchPolyline(t,e,r){let i=I(t.separation,Y)*r,s=I(t.rotation);if(0===i)return null;i<0&&(i=-i);let o=0;const n=.5*i;for(;o>n;)o-=i;for(;o<-n;)o+=i;const a=l();c(a,e),a[0]-=n,a[1]-=n,a[2]+=n,a[3]+=n;const h=[[a[0],a[1]],[a[0],a[3]],[a[2],a[3]],[a[2],a[1]]];for(;s>180;)s-=180;for(;s<0;)s+=180;const m=Math.cos(s*J),u=Math.sin(s*J),f=-i*u,d=i*m;let p,_,g,y;o=I(t.offsetX)*r*u-I(t.offsetY)*r*m,p=g=Number.MAX_VALUE,_=y=-Number.MAX_VALUE;for(const l of h){const t=l[0],e=l[1],r=m*t+u*e,i=-u*t+m*e;p=Math.min(p,r),g=Math.min(g,i),_=Math.max(_,r),y=Math.max(y,i)}g=Math.floor(g/i)*i;let P=m*p-u*g-f*o/i,w=u*p+m*g-d*o/i,x=m*_-u*g-f*o/i,S=u*_+m*g-d*o/i;const M=1+Math.round((y-g)/i),b=[];for(let l=0;l<M;l++)P+=f,w+=d,x+=f,S+=d,b.push([[P,w],[x,S]]);return{paths:b}}}class $ extends Z{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 k(this._xmin,this._ymin,this._xmax-this._xmin,this._ymax-this._ymin)}bounds(){return h(this._xmin,this._ymin,this._xmax,this._ymax)}drawSolidFill(t){if(t&&!(this._clipCount>0))if(f(t))this._processPath(t.rings,0);else if(d(t))this._processPath(t.paths,0);else if(p(t)){const e=it(t);e&&this._processPath(e.rings,0)}else console.error("drawSolidFill Unexpected geometry type!")}drawSolidStroke(t,e,r){if(!t||this._clipCount>0)return;const i=.5*this.transformSize(I(r,O));if(f(t))this._processPath(t.rings,i);else if(d(t))this._processPath(t.paths,i);else if(p(t)){const e=it(t);e&&this._processPath(e.rings,i)}else console.error("drawSolidStroke unexpected geometry type!")}drawMarkerLayer(t,e){f(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:r}=t,i=I(t.scaleX,1);let s=i*e,o=e;const n=this._resourceManager.getResource(r);e||null==n||(s=i*n.width,o=n.height),this._merge(this.transformPt([-s/2,-o/2]),0),this._merge(this.transformPt([-s/2,o/2]),0),this._merge(this.transformPt([s/2,-o/2]),0),this._merge(this.transformPt([s/2,o/2]),0)}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new C);const r=at(t),[i,s]=this._textRasterizer.computeTextSize(e,r);let o=0;switch(t.horizontalAlignment){case"Left":o=i/2;break;case"Right":o=-i/2}let n=0;switch(t.verticalAlignment){case"Bottom":n=s/2;break;case"Top":n=-s/2;break;case"Baseline":n=s/6}this._merge(this.transformPt([-i/2+o,-s/2+n]),0),this._merge(this.transformPt([-i/2+o,s/2+n]),0),this._merge(this.transformPt([i/2+o,-s/2+n]),0),this._merge(this.transformPt([i/2+o,s/2+n]),0)}_processPath(t,e){if(t)for(const r of t){const t=r?r.length:0;if(t>1){this._merge(this.transformPt(r[0]),e);for(let i=1;i<t;i++)this._merge(this.transformPt(r[i]),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 tt extends Z{constructor(){super(...arguments),this._searchPoint=[0,0],this._searchDistPoint=0,this._textInfo=null}hitTest(t,e,r,i,s,o){const a=o*n(1);this.setTransform(),this.setGeomUnitsPerPoint(a),this._searchPoint=[(t[0]+t[2])/2,(t[1]+t[3])/2],this._searchDistPoint=(t[2]-t[0])/2/a,this._textInfo=i;const l=e&&("CIMPointSymbol"===e.type&&"Map"!==e.angleAlignment||"CIMTextSymbol"===e.type);return this._mapRotation=l?s:0,this._earlyReturn=!1,this.drawSymbol(e,r),this._earlyReturn}drawSolidFill(t,e){this._hitTestFill(t)}drawHatchFill(t,e){this._hitTestFill(t)}drawPictureFill(t,e){this._hitTestFill(t)}drawGradientFill(t,e){this._hitTestFill(t)}drawSolidStroke(t,e,r,i,s,o){this._hitTestStroke(t,r)}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)}pushClipPath(t){}popClipPath(){}drawImage(t,e){const{url:r}=t,i=I(t.scaleX,1),s=this._resourceManager.getResource(r);if(null==s||0===s.height||0===e)return;const o=e*this.geomUnitsPerPoint(),n=o*i*(s.width/s.height),a=this.reverseTransformPt(this._searchPoint),l=this._searchDistPoint;Math.abs(a[0])<n/2+l&&Math.abs(a[1])<o/2+l&&(this._earlyReturn=!0)}drawText(e,r){const i=this._textInfo;if(!i)return;const s=i.get(e);if(!s)return;const{text:o,mosaicItem:n}=s;if(!n?.glyphMosaicItems?.length)return;const a=I(e.height,W),{lineGapType:l,lineGap:h}=e,c=l?nt(l,I(h),a):0,m=t(o)[1],u=n.glyphMosaicItems,f="CIMBackgroundCallout"===e.callout?.type,d=E(u,m,{scale:a/D,angle:0,xOffset:0,yOffset:0,hAlign:st(e.horizontalAlignment),vAlign:ot(e.verticalAlignment),maxLineWidth:512,lineHeight:X*Math.max(.25,Math.min(c||1,4)),decoration:e.font.decoration||"none",isCIM:!0,hasBackground:f}),p=this.reverseTransformPt(this._searchPoint),_=p[0],g=p[1];for(const t of d.glyphs)if(_>t.xTopLeft&&_<t.xBottomRight&&g>-t.yBottomRight&&g<-t.yTopLeft){this._earlyReturn=!0;break}}_hitTestFill(t){let e=null;if(p(t)){const r=t;e=[[[r.xmin,r.ymin],[r.xmin,r.ymax],[r.xmax,r.ymax],[r.xmax,r.ymin],[r.xmin,r.ymin]]]}else if(f(t))e=t.rings;else{if(!d(t))return;e=t.paths}const r=this.reverseTransformPt(this._searchPoint);if(this._pointInPolygon(r,e)&&(this._earlyReturn=!0),!this._earlyReturn){const t=this.reverseTransformSize(this._searchDistPoint)*this.geomUnitsPerPoint();this._nearLine(r,e,t)&&(this._earlyReturn=!0)}}_hitTestStroke(t,e){let r=null;if(p(t)){const e=t;r=[[[e.xmin,e.ymin],[e.xmin,e.ymax],[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin]]]}else if(f(t))r=t.rings;else{if(!d(t))return;r=t.paths}const i=this.reverseTransformPt(this._searchPoint),s=I(e,O)*this.geomUnitsPerPoint(),o=this.reverseTransformSize(this._searchDistPoint)*this.geomUnitsPerPoint();this._nearLine(i,r,s/2+o)&&(this._earlyReturn=!0)}_pointInPolygon(t,e){let r=0;for(const i of e){const e=i.length;for(let s=1;s<e;s++){const e=i[s-1],o=i[s];if(e[1]>t[1]==o[1]>t[1])continue;(o[0]-e[0])*(t[1]-e[1])-(o[1]-e[1])*(t[0]-e[0])>0?r++:r--}}return 0!==r}_nearLine(t,e,r){for(const i of e){const e=i.length;for(let s=1;s<e;s++){const e=i[s-1],o=i[s];let n=(o[0]-e[0])*(o[0]-e[0])+(o[1]-e[1])*(o[1]-e[1]);if(0===n)continue;n=Math.sqrt(n);const a=((o[0]-e[0])*(t[1]-e[1])-(o[1]-e[1])*(t[0]-e[0]))/n;if(Math.abs(a)<r){const i=((o[0]-e[0])*(t[0]-e[0])+(o[1]-e[1])*(t[1]-e[1]))/n;if(i>-r&&i<n+r)return!0}}}return!1}}class et extends Z{constructor(t,e,r,i){super(e,r),this._applyAdditionalRenderProps=i,this._colorSubstitutionHelper=new y,this._ctx=t}drawSolidFill(t,e){if(!t)return;if(f(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else if(p(t))this._buildPath(it(t).rings,!0);else{if(!_(t))return;console.log("CanvasDrawHelper.drawSolidFill - No implementation!")}const r=this._ctx;r.fillStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",r.fill("evenodd")}drawSolidStroke(t,e,r,i,s,o){if(!t||!e||0===r)return;if(f(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!1);else{if(!p(t))return void console.log("CanvasDrawHelper.drawSolidStroke isn't implemented!");this._buildPath(it(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(r),.5),this._setCapStyle(i),this._setJoinStyle(s),n.miterLimit=o,n.stroke()}pushClipPath(t){if(this._ctx.save(),f(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else{if(!p(t))return;this._buildPath(it(t).rings,!0)}this._ctx.clip("evenodd")}popClipPath(){this._ctx.restore()}drawImage(t,e){const{colorSubstitutions:r,url:i,tintColor:s}=t,o=I(t.scaleX,1),n=this._resourceManager.getResource(i);if(null==n)return;let a=e*(n.width/n.height),l=e;e||(a=n.width,l=n.height);const h=R(i)||"src"in n&&R(n.src);let c="getFrame"in n?b(n):n;r&&(c=this._colorSubstitutionHelper.applyColorSubstituition(c,r)),this._applyAdditionalRenderProps&&!h&&s&&(c=this._colorSubstitutionHelper.tintImageData(c,s));const m=this.transformPt([0,0]),[u,f]=this.getTransformAngle(),d=this.transformSize(1),p=this._ctx;p.save(),p.setTransform({m11:o*d*u,m12:o*d*f,m21:-d*f,m22:d*u,m41:m[0],m42:m[1]}),p.drawImage(c,-a/2,-l/2,a,l),p.restore()}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new C);const r=at(t);r.size*=this.transformSize(o(1));const i=this._textRasterizer.rasterizeText(e,r);if(!i)return;const{size:s,anchorX:n,anchorY:a,canvas:l}=i,h=s[0]*(n+.5),c=s[1]*(a-.5),m=this._ctx,u=this.transformPt([0,0]),[f,d]=this.getTransformAngle(),p=1;m.save(),m.setTransform({m11:p*f,m12:p*d,m21:-p*d,m22:p*f,m41:u[0]-p*h,m42:u[1]+p*c}),m.drawImage(l,0,0),m.restore()}drawPictureFill(t,e){if(!t)return;let{colorSubstitutions:r,height:i,offsetX:s,offsetY:o,rotation:n,scaleX:a,tintColor:l,url:h}=e;const c=this._resourceManager.getResource(h);if(null==c)return;if(f(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else if(p(t))this._buildPath(it(t).rings,!0);else{if(!_(t))return;console.log("CanvasDrawHelper.drawPictureFill - No implementation!")}const m=this._ctx,u=R(h)||"src"in c&&R(c.src);let g,y="getFrame"in c?b(c):c;if(r&&(y=this._colorSubstitutionHelper.applyColorSubstituition(y,r)),this._applyAdditionalRenderProps){u||l&&(y=this._colorSubstitutionHelper.tintImageData(y,l)),g=m.createPattern(y,"repeat");const t=this.transformSize(1);n||(n=0),s?s*=t:s=0,o?o*=t:o=0,i&&(i*=t);const e=i?i/c.height:1,r=a&&i?a*i/c.width:1;if(0!==n||1!==e||1!==r||0!==s||0!==o){const t=new DOMMatrix;t.rotateSelf(0,0,-n).translateSelf(s,o).scaleSelf(r,e,1),g.setTransform(t)}}else g=m.createPattern(y,"repeat");m.save(),m.fillStyle=g,m.fill("evenodd"),m.restore()}drawPictureStroke(t,e){if(!t)return;let{colorSubstitutions:i,capStyle:s,joinStyle:o,miterLimit:a,tintColor:l,url:h,width:c}=e;const m=this._resourceManager.getResource(h);if(null==m)return;let u;if(f(t))u=t.rings;else if(d(t))u=t.paths;else{if(!p(t))return _(t)?void console.log("CanvasDrawHelper.drawPictureStroke - No implementation!"):void 0;u=it(t).rings}c||(c=m.width);const g=R(h)||"src"in m&&R(m.src);let y="getFrame"in m?b(m):m;i&&(y=this._colorSubstitutionHelper.applyColorSubstituition(y,i)),this._applyAdditionalRenderProps&&(g||l&&(y=this._colorSubstitutionHelper.tintImageData(y,l)));const P=Math.max(this.transformSize(n(c)),.5),w=P/y.width,x=this._ctx,S=x.createPattern(y,"repeat-y");let M,k;x.save(),this._setCapStyle(s),this._setJoinStyle(o),void 0!==a&&(x.miterLimit=a),x.lineWidth=P;for(let n of u)if(n=r(n),ht(n),n&&!(n.length<=1)){M=this.transformPt(n[0]);for(let t=1;t<n.length;t++){k=this.transformPt(n[t]);const e=rt(M,k),r=new DOMMatrix;r.translateSelf(0,M[1]-P/2).scaleSelf(w,w,1).rotateSelf(0,0,90-e),S.setTransform(r),x.strokeStyle=S,x.beginPath(),x.moveTo(M[0],M[1]),x.lineTo(k[0],k[1]),x.stroke(),M=k}}x.restore()}_buildPath(t,e){const r=this._ctx;if(r.beginPath(),t)for(const i of t){const t=i?i.length:0;if(t>1){let s=this.transformPt(i[0]);r.moveTo(s[0],s[1]);for(let e=1;e<t;e++)s=this.transformPt(i[e]),r.lineTo(s[0],s[1]);e&&r.closePath()}}}_setCapStyle(t){switch(t){case S.Butt:this._ctx.lineCap="butt";break;case S.Round:this._ctx.lineCap="round";break;case S.Square:this._ctx.lineCap="square"}}_setJoinStyle(t){switch(t){case M.Bevel:this._ctx.lineJoin="bevel";break;case M.Round:this._ctx.lineJoin="round";break;case M.Miter:this._ctx.lineJoin="miter"}}}function rt(t,e){const r=e[0]-t[0],i=e[1]-t[1];return 180/Math.PI*Math.atan2(i,r)}const it=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=>{switch(t){case"Left":return B.Left;case"Right":return B.Right;case"Center":return B.Center;case"Justify":return N.warnOnce("Horizontal alignment 'justify' is not implemented. Falling back to 'center'."),B.Center}},ot=t=>{switch(t){case"Top":return G.Top;case"Center":return G.Center;case"Bottom":return G.Bottom;case"Baseline":return G.Baseline}},nt=(t,e,r)=>{switch(t){case"ExtraLeading":return 1+e/r;case"Multiple":return e;case"Exact":return e/r}};function at(t,r=1){const i=T(t),s=v(t.fontStyleName),o=t.fontFamilyName??e,{weight:n,style:a}=s,l=r*(t.height||5),h=z(t.horizontalAlignment),c=F(t.verticalAlignment),m=L(t),u=L(t.haloSymbol),f=u?r*(0|t.haloSize):0,d="CIMBackgroundCallout"===t.callout?.type?t.callout.backgroundSymbol:null,p=L(d),_=A(d),g=j(d);return{color:m,size:l,horizontalAlignment:h,verticalAlignment:c,font:{family:o,style:U(a),weight:H(n),decoration:i},halo:{size:f||0,color:u,style:a},backgroundColor:p,borderLine:null!=_&&null!=g?{size:_,color:g}:null,pixelRatio:1,premultiplyColors:!0}}const lt=1e-4;function ht(t){let e,r,i,s,o,n=t[0],a=1;for(;a<t.length;)e=t[a][0]-n[0],r=t[a][1]-n[1],s=0!==e?r/e:Math.PI/2,void 0!==i&&s-i<=lt?(t.splice(a-1,1),n=o):(o=n,n=t[a],a++),i=s}export{Z as CIMSymbolDrawHelper,J as C_DEG_TO_RAD,et as CanvasDrawHelper,Y as DEFAULT_HATCH_FILL_SEPARATION,q as DEFAULT_MARKER_SIZE,V as DEFAULT_PICTURE_FILL_HEIGHT,O as DEFAULT_STROKE_WIDTH,K as DEFAULT_TEXT_HALO_SIZE,W as DEFAULT_TEXT_HEIGHT,$ as EnvDrawHelper,tt as HittestDrawHelper,Q as Transformation,st as horizontalAlignment2HAlign,nt as lineGapType2LineHeight,ot as verticalAlignment2VAlign};
|
|
5
|
+
import{bidiText as t}from"../../core/BidiText.js";import{DEFAULT_FONT_FAMILY as e}from"../../core/fontUtils.js";import{clone as r}from"../../core/lang.js";import i from"../../core/Logger.js";import s from"../../core/ObjectPool.js";import{px2pt as o,pt2px as n}from"../../core/screenUtils.js";import{GeometryCursor as a}from"../../geometry/GeometryCursor.js";import{create as l,fromValues as h}from"../../geometry/support/aaBoundingRect.js";import{getBoundsXY as c}from"../../geometry/support/boundsUtils.js";import{polygonCentroid as m}from"../../geometry/support/centroid.js";import{isPoint as f,isPolygon as u,isPolyline as d,isExtent as p,isMultipoint as _}from"../../geometry/support/jsonUtils.js";import{SimpleEffectCursor as g}from"./CIMEffects.js";import y from"./CIMImageColorSubstitutionHelper.js";import{getEffectOperator as P,getPlacementOperator as w}from"./CIMOperators.js";import{Placement as x}from"./CIMPlacements.js";import{LineCapStyle as S,LineJoinStyle as M}from"./enums.js";import{getFirstFrame as b}from"./imageUtils.js";import k from"./Rect.js";import C from"./TextRasterizer.js";import{getValue as I,isSVGImage as T,fromCIMFontDecoration as R,fromCIMFontStyle as v,fromCIMHorizontalAlignment as z,fromCIMVerticalAlignment as F,getFillColor as L,getStrokeWidth as A,getStrokeColor as j,getFontStyle as U,getFontWeight as H}from"./utils.js";import{HAlign as B,VAlign as G}from"../../views/2d/engine/webgl/alignmentUtils.js";import{GLYPH_SIZE as D,MAGIC_LABEL_LINE_HEIGHT as X}from"../../views/2d/engine/webgl/definitions.js";import{shapeGlyphs as E}from"../../views/2d/engine/webgl/mesh/templates/shapingUtils.js";const J=Math.PI/180,N=i.getLogger("esri.symbols.cim.CIMSymbolDrawHelper"),O=4,q=10,V=10,Y=4,W=10,K=1;class Q{constructor(t){this._t=t}static createIdentity(){return new Q([1,0,0,0,1,0])}clone(){const t=this._t;return new Q(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 Q([t,0,0,0,e,0])}scale(t,e){const r=this._t;return r[0]*=t,r[1]*=t,r[2]*=t,r[3]*=e,r[4]*=e,r[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 Q([0,0,t,0,0,e])}translate(t,e){const r=this._t;return r[2]+=t,r[5]+=e,this}static createRotate(t){const e=Math.cos(t),r=Math.sin(t);return new Q([e,-r,0,r,e,0])}rotate(t){return Q.multiply(this,Q.createRotate(t),this)}angle(){const t=this._t[0],e=this._t[3],r=Math.sqrt(t*t+e*e);return[t/r,e/r]}static multiply(t,e,r){const i=t._t,s=e._t,o=i[0]*s[0]+i[3]*s[1],n=i[1]*s[0]+i[4]*s[1],a=i[2]*s[0]+i[5]*s[1]+s[2],l=i[0]*s[3]+i[3]*s[4],h=i[1]*s[3]+i[4]*s[4],c=i[2]*s[3]+i[5]*s[4]+s[5],m=r._t;return m[0]=o,m[1]=n,m[2]=a,m[3]=l,m[4]=h,m[5]=c,r}invert(){const t=this._t;let e=t[0]*t[4]-t[1]*t[3];if(0===e)return new Q([0,0,0,0,0,0]);e=1/e;const r=(t[1]*t[5]-t[2]*t[4])*e,i=(t[2]*t[3]-t[0]*t[5])*e,s=t[4]*e,o=-t[1]*e,n=-t[3]*e,a=t[0]*e;return new Q([s,o,r,n,a,i])}}class Z{constructor(t,e){this._resourceManager=t,this._transfos=[],this._sizeTransfos=[],this._geomUnitsPerPoint=1,this._placementPool=new s(x,void 0,void 0,100),this._earlyReturn=!1,this._mapRotation=0,this._transfos.push(e||Q.createIdentity()),this._sizeTransfos.push(e?e.scaleRatio():1)}setTransform(t,e){this._transfos=[t||Q.createIdentity()],this._sizeTransfos=[e||(t?t.scaleRatio():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]}reverseTransformPt(t){return this._transfos[this._transfos.length-1].invert().transform(t)}reverseTransformSize(t){return t/this._sizeTransfos[this._sizeTransfos.length-1]}getTransformAngle(){return this._transfos[this._transfos.length-1].angle()}geomUnitsPerPoint(){return this.isEmbedded()?1:this._geomUnitsPerPoint}isEmbedded(){return this._transfos.length>1}back(){return this._transfos[this._transfos.length-1]}push(t,e){const r=e?t.scaleRatio():1;Q.multiply(t,this.back(),t),this._transfos.push(t),this._sizeTransfos.push(this._sizeTransfos[this._sizeTransfos.length-1]*r)}pop(){this._transfos.splice(-1,1),this._sizeTransfos.splice(-1,1)}drawSymbol(t,e,r){if(t)switch(t.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this.drawMultiLayerSymbol(t,e);break;case"CIMTextSymbol":this.drawTextSymbol(t,e,r)}}drawMultiLayerSymbol(t,e){if(!t||!e)return;const r=t.symbolLayers;if(!r)return;const i=t.effects;if(i&&i.length>0){const t=this.executeEffects(i,e);if(t){let e=t.next();for(;e;)this.drawSymbolLayers(r,e.asJSON()),e=t.next()}}else this.drawSymbolLayers(r,e)}executeEffects(t,e){const r=this._resourceManager.geometryEngine;let i=new g(a.fromJSONCIM(e));for(const s of t){const t=P(s);t&&(i=t.execute(i,s,this.geomUnitsPerPoint(),null,r))}return i}drawSymbolLayers(t,e){let r=t.length;for(;r--;){const i=t[r];if(!i||!1===i.enable)continue;const s=i.effects;if(s&&s.length>0){const t=this.executeEffects(s,e);if(t){let e=null;for(;(e=t.next())&&(this.drawSymbolLayer(i,e.asJSON()),!this._earlyReturn););}}else this.drawSymbolLayer(i,e);if(this._earlyReturn)return}}drawSymbolLayer(t,e){switch(t.type){case"CIMSolidFill":this.drawSolidFill(e,t.color);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);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 r=this._buildHatchPolyline(e,t,this.geomUnitsPerPoint());r&&(this.pushClipPath(t),this.drawMultiLayerSymbol(e.lineSymbol,r),this.popClipPath())}drawPictureFill(t,e){}drawGradientFill(t,e){}drawPictureStroke(t,e){}drawGradientStroke(t,e){}drawMarkerLayer(t,e){const r=t.markerPlacement;if(r){const i=w(r);if(i){const s="CIMMarkerPlacementInsidePolygon"===r.type||"CIMMarkerPlacementPolygonCenter"===r.type&&r.clipAtBoundary;s&&this.pushClipPath(e);const o=i.execute(a.fromJSONCIM(e),r,this.geomUnitsPerPoint(),null,this._resourceManager.geometryEngine);if(o){let e=null;for(;(e=o.next())&&(this.drawMarker(t,e),!this._earlyReturn););}s&&this.popClipPath()}}else{const r=this._placementPool.acquire();if(f(e))r.tx=e.x,r.ty=e.y,this.drawMarker(t,r);else if(u(e)){const i=m(e);i&&([r.tx,r.ty]=i,this.drawMarker(t,r))}else for(const i of e.points)if(r.tx=i[0],r.ty=i[1],this.drawMarker(t,r),this._earlyReturn)break;this._placementPool.release(r)}}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 r=this._resourceManager.getResource(t.url),i=I(t.size,q);if(null==r||i<=0)return;const s=r.width,o=r.height;if(!s||!o)return;const n=s/o,a=I(t.scaleX,1),l=Q.createIdentity(),h=t.anchorPoint;if(h){let e=h.x,r=h.y;"Absolute"!==t.anchorPointUnits&&(e*=i*n*a,r*=i),l.translate(-e,-r)}let c=I(t.rotation);t.rotateClockwise&&(c=-c),this._mapRotation&&(c+=this._mapRotation),c&&l.rotate(c*J);let m=I(t.offsetX),f=I(t.offsetY);if(m||f){if(this._mapRotation){const t=J*this._mapRotation,e=Math.cos(t),r=Math.sin(t),i=m*r+f*e;m=m*e-f*r,f=i}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,!1),this.drawImage(t,i),this.pop()}drawVectorMarker(t,e){if(!t)return;const r=t.markerGraphics;if(!r)return;const i=I(t.size,q),s=t.frame,o=s?s.ymax-s.ymin:0,n=i&&o?i/o:1,a=Q.createIdentity();s&&a.translate(.5*-(s.xmax+s.xmin),.5*-(s.ymax+s.ymin));const l=t.anchorPoint;if(l){let e=l.x,r=l.y;"Absolute"!==t.anchorPointUnits?s&&(e*=s.xmax-s.xmin,r*=s.ymax-s.ymin):(e/=n,r/=n),a.translate(-e,-r)}1!==n&&a.scale(n,n);let h=I(t.rotation);t.rotateClockwise&&(h=-h),this._mapRotation&&(h+=this._mapRotation),h&&a.rotate(h*J);let c=I(t.offsetX),m=I(t.offsetY);if(c||m){if(this._mapRotation){const t=J*this._mapRotation,e=Math.cos(t),r=Math.sin(t),i=c*r+m*e;c=c*e-m*r,m=i}a.translate(c,m)}const f=this.geomUnitsPerPoint();1!==f&&a.scale(f,f);const u=e.getAngle();u&&a.rotate(u),a.translate(e.tx,e.ty),this.push(a,t.scaleSymbolsProportionally);for(const d of r)if(d&&d.symbol&&d.geometry||N.error("Invalid marker graphic",d),this.drawSymbol(d.symbol,d.geometry,d.textString),this._earlyReturn)break;this.pop()}drawTextSymbol(t,e,r){if(!t)return;if(!f(e))return;if(I(t.height,W)<=0)return;const i=Q.createIdentity();let s=I(t.angle);s=-s,s&&i.rotate(s*J);const o=I(t.offsetX),n=I(t.offsetY);(o||n)&&i.translate(o,n);const a=this.geomUnitsPerPoint();1!==a&&i.scale(a,a),i.translate(e.x,e.y),this.push(i,!1),this.drawText(t,r),this.pop()}_buildHatchPolyline(t,e,r){let i=I(t.separation,Y)*r,s=I(t.rotation);if(0===i)return null;i<0&&(i=-i);let o=0;const n=.5*i;for(;o>n;)o-=i;for(;o<-n;)o+=i;const a=l();c(a,e),a[0]-=n,a[1]-=n,a[2]+=n,a[3]+=n;const h=[[a[0],a[1]],[a[0],a[3]],[a[2],a[3]],[a[2],a[1]]];for(;s>180;)s-=180;for(;s<0;)s+=180;const m=Math.cos(s*J),f=Math.sin(s*J),u=-i*f,d=i*m;let p,_,g,y;o=I(t.offsetX)*r*f-I(t.offsetY)*r*m,p=g=Number.MAX_VALUE,_=y=-Number.MAX_VALUE;for(const l of h){const t=l[0],e=l[1],r=m*t+f*e,i=-f*t+m*e;p=Math.min(p,r),g=Math.min(g,i),_=Math.max(_,r),y=Math.max(y,i)}g=Math.floor(g/i)*i;let P=m*p-f*g-u*o/i,w=f*p+m*g-d*o/i,x=m*_-f*g-u*o/i,S=f*_+m*g-d*o/i;const M=1+Math.round((y-g)/i),b=[];for(let l=0;l<M;l++)P+=u,w+=d,x+=u,S+=d,b.push([[P,w],[x,S]]);return{paths:b}}}class $ extends Z{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 k(this._xmin,this._ymin,this._xmax-this._xmin,this._ymax-this._ymin)}bounds(){return h(this._xmin,this._ymin,this._xmax,this._ymax)}drawSolidFill(t){if(t&&!(this._clipCount>0))if(u(t))this._processPath(t.rings,0);else if(d(t))this._processPath(t.paths,0);else if(p(t)){const e=it(t);e&&this._processPath(e.rings,0)}else console.error("drawSolidFill Unexpected geometry type!")}drawSolidStroke(t,e,r){if(!t||this._clipCount>0)return;const i=.5*this.transformSize(I(r,O));if(u(t))this._processPath(t.rings,i);else if(d(t))this._processPath(t.paths,i);else if(p(t)){const e=it(t);e&&this._processPath(e.rings,i)}else console.error("drawSolidStroke unexpected geometry type!")}drawMarkerLayer(t,e){u(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:r}=t,i=I(t.scaleX,1);let s=i*e,o=e;const n=this._resourceManager.getResource(r);e||null==n||(s=i*n.width,o=n.height),this._merge(this.transformPt([-s/2,-o/2]),0),this._merge(this.transformPt([-s/2,o/2]),0),this._merge(this.transformPt([s/2,-o/2]),0),this._merge(this.transformPt([s/2,o/2]),0)}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new C);const r=at(t),[i,s]=this._textRasterizer.computeTextSize(e,r);let o=0;switch(t.horizontalAlignment){case"Left":o=i/2;break;case"Right":o=-i/2}let n=0;switch(t.verticalAlignment){case"Bottom":n=s/2;break;case"Top":n=-s/2;break;case"Baseline":n=s/6}this._merge(this.transformPt([-i/2+o,-s/2+n]),0),this._merge(this.transformPt([-i/2+o,s/2+n]),0),this._merge(this.transformPt([i/2+o,-s/2+n]),0),this._merge(this.transformPt([i/2+o,s/2+n]),0)}_processPath(t,e){if(t)for(const r of t){const t=r?r.length:0;if(t>1){this._merge(this.transformPt(r[0]),e);for(let i=1;i<t;i++)this._merge(this.transformPt(r[i]),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 tt extends Z{constructor(){super(...arguments),this._searchPoint=[0,0],this._searchDistPoint=0,this._textInfo=null}hitTest(t,e,r,i,s,o){const a=o*n(1);this.setTransform(),this.setGeomUnitsPerPoint(a),this._searchPoint=[(t[0]+t[2])/2,(t[1]+t[3])/2],this._searchDistPoint=(t[2]-t[0])/2/a,this._textInfo=i;const l=e&&("CIMPointSymbol"===e.type&&"Map"!==e.angleAlignment||"CIMTextSymbol"===e.type);return this._mapRotation=l?s:0,this._earlyReturn=!1,this.drawSymbol(e,r),this._earlyReturn}drawSolidFill(t,e){this._hitTestFill(t)}drawHatchFill(t,e){this._hitTestFill(t)}drawPictureFill(t,e){this._hitTestFill(t)}drawGradientFill(t,e){this._hitTestFill(t)}drawSolidStroke(t,e,r,i,s,o){this._hitTestStroke(t,r)}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)}pushClipPath(t){}popClipPath(){}drawImage(t,e){const{url:r}=t,i=I(t.scaleX,1),s=this._resourceManager.getResource(r);if(null==s||0===s.height||0===e)return;const o=e*this.geomUnitsPerPoint(),n=o*i*(s.width/s.height),a=this.reverseTransformPt(this._searchPoint),l=this._searchDistPoint;Math.abs(a[0])<n/2+l&&Math.abs(a[1])<o/2+l&&(this._earlyReturn=!0)}drawText(e,r){const i=this._textInfo;if(!i)return;const s=i.get(e);if(!s)return;const{text:o,mosaicItem:n}=s;if(!n?.glyphMosaicItems?.length)return;const a=I(e.height,W),{lineGapType:l,lineGap:h}=e,c=l?nt(l,I(h),a):0,m=t(o)[1],f=n.glyphMosaicItems,u="CIMBackgroundCallout"===e.callout?.type,d=E(f,m,{scale:a/D,angle:0,xOffset:0,yOffset:0,hAlign:st(e.horizontalAlignment),vAlign:ot(e.verticalAlignment),maxLineWidth:512,lineHeight:X*Math.max(.25,Math.min(c||1,4)),decoration:e.font.decoration||"none",isCIM:!0,hasBackground:u}),p=this.reverseTransformPt(this._searchPoint),_=p[0],g=p[1];for(const t of d.glyphs)if(_>t.xTopLeft&&_<t.xBottomRight&&g>-t.yBottomRight&&g<-t.yTopLeft){this._earlyReturn=!0;break}}_hitTestFill(t){let e=null;if(p(t)){const r=t;e=[[[r.xmin,r.ymin],[r.xmin,r.ymax],[r.xmax,r.ymax],[r.xmax,r.ymin],[r.xmin,r.ymin]]]}else if(u(t))e=t.rings;else{if(!d(t))return;e=t.paths}const r=this.reverseTransformPt(this._searchPoint);if(this._pointInPolygon(r,e)&&(this._earlyReturn=!0),!this._earlyReturn){const t=this.reverseTransformSize(this._searchDistPoint)*this.geomUnitsPerPoint();this._nearLine(r,e,t)&&(this._earlyReturn=!0)}}_hitTestStroke(t,e){let r=null;if(p(t)){const e=t;r=[[[e.xmin,e.ymin],[e.xmin,e.ymax],[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin]]]}else if(u(t))r=t.rings;else{if(!d(t))return;r=t.paths}const i=this.reverseTransformPt(this._searchPoint),s=I(e,O)*this.geomUnitsPerPoint(),o=this.reverseTransformSize(this._searchDistPoint)*this.geomUnitsPerPoint();this._nearLine(i,r,s/2+o)&&(this._earlyReturn=!0)}_pointInPolygon(t,e){let r=0;for(const i of e){const e=i.length;for(let s=1;s<e;s++){const e=i[s-1],o=i[s];if(e[1]>t[1]==o[1]>t[1])continue;(o[0]-e[0])*(t[1]-e[1])-(o[1]-e[1])*(t[0]-e[0])>0?r++:r--}}return 0!==r}_nearLine(t,e,r){for(const i of e){const e=i.length;for(let s=1;s<e;s++){const e=i[s-1],o=i[s];let n=(o[0]-e[0])*(o[0]-e[0])+(o[1]-e[1])*(o[1]-e[1]);if(0===n)continue;n=Math.sqrt(n);const a=((o[0]-e[0])*(t[1]-e[1])-(o[1]-e[1])*(t[0]-e[0]))/n;if(Math.abs(a)<r){const i=((o[0]-e[0])*(t[0]-e[0])+(o[1]-e[1])*(t[1]-e[1]))/n;if(i>-r&&i<n+r)return!0}}}return!1}}class et extends Z{constructor(t,e,r,i){super(e,r),this._applyAdditionalRenderProps=i,this._colorSubstitutionHelper=new y,this._ctx=t}drawSolidFill(t,e){if(!t)return;if(u(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else if(p(t))this._buildPath(it(t).rings,!0);else{if(!_(t))return;console.log("CanvasDrawHelper.drawSolidFill - No implementation!")}const r=this._ctx;r.fillStyle="string"==typeof e?e:"rgba("+Math.round(e[0])+","+Math.round(e[1])+","+Math.round(e[2])+","+(e[3]??255)/255+")",r.fill("evenodd")}drawSolidStroke(t,e,r,i,s,o){if(!t||!e||0===r)return;if(u(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!1);else{if(!p(t))return void console.log("CanvasDrawHelper.drawSolidStroke isn't implemented!");this._buildPath(it(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(r),.5),this._setCapStyle(i),this._setJoinStyle(s),n.miterLimit=o,n.stroke()}pushClipPath(t){if(this._ctx.save(),u(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else{if(!p(t))return;this._buildPath(it(t).rings,!0)}this._ctx.clip("evenodd")}popClipPath(){this._ctx.restore()}drawImage(t,e){const{colorSubstitutions:r,url:i,tintColor:s}=t,o=I(t.scaleX,1),n=this._resourceManager.getResource(i);if(null==n)return;let a=e*(n.width/n.height),l=e;e||(a=n.width,l=n.height);const h=T(i)||"src"in n&&T(n.src);let c="getFrame"in n?b(n):n;r&&(c=this._colorSubstitutionHelper.applyColorSubstituition(c,r)),this._applyAdditionalRenderProps&&!h&&s&&(c=this._colorSubstitutionHelper.tintImageData(c,s));const m=this.transformPt([0,0]),[f,u]=this.getTransformAngle(),d=this.transformSize(1),p=this._ctx;p.save(),p.setTransform({m11:o*d*f,m12:o*d*u,m21:-d*u,m22:d*f,m41:m[0],m42:m[1]}),p.drawImage(c,-a/2,-l/2,a,l),p.restore()}drawText(t,e){if(!e||0===e.length)return;this._textRasterizer||(this._textRasterizer=new C);const r=at(t);r.size*=this.transformSize(o(1));const i=this._textRasterizer.rasterizeText(e,r);if(!i)return;const{size:s,anchorX:n,anchorY:a,canvas:l}=i,h=s[0]*(n+.5),c=s[1]*(a-.5),m=this._ctx,f=this.transformPt([0,0]),[u,d]=this.getTransformAngle(),p=1;m.save(),m.setTransform({m11:p*u,m12:p*d,m21:-p*d,m22:p*u,m41:f[0]-p*h,m42:f[1]+p*c}),m.drawImage(l,0,0),m.restore()}drawPictureFill(t,e){if(!t)return;let{colorSubstitutions:r,height:i,offsetX:s,offsetY:o,rotation:n,scaleX:a,tintColor:l,url:h}=e;const c=this._resourceManager.getResource(h);if(null==c)return;if(u(t))this._buildPath(t.rings,!0);else if(d(t))this._buildPath(t.paths,!0);else if(p(t))this._buildPath(it(t).rings,!0);else{if(!_(t))return;console.log("CanvasDrawHelper.drawPictureFill - No implementation!")}const m=this._ctx,f=T(h)||"src"in c&&T(c.src);let g,y="getFrame"in c?b(c):c;if(r&&(y=this._colorSubstitutionHelper.applyColorSubstituition(y,r)),this._applyAdditionalRenderProps){f||l&&(y=this._colorSubstitutionHelper.tintImageData(y,l)),g=m.createPattern(y,"repeat");const t=this.transformSize(1);n||(n=0),s?s*=t:s=0,o?o*=t:o=0,i&&(i*=t);const e=i?i/c.height:1,r=a&&i?a*i/c.width:1;if(0!==n||1!==e||1!==r||0!==s||0!==o){const t=new DOMMatrix;t.rotateSelf(0,0,-n).translateSelf(s,o).scaleSelf(r,e,1),g.setTransform(t)}}else g=m.createPattern(y,"repeat");m.save(),m.fillStyle=g,m.fill("evenodd"),m.restore()}drawPictureStroke(t,e){if(!t)return;let{colorSubstitutions:i,capStyle:s,joinStyle:o,miterLimit:a,tintColor:l,url:h,width:c}=e;const m=this._resourceManager.getResource(h);if(null==m)return;let f;if(u(t))f=t.rings;else if(d(t))f=t.paths;else{if(!p(t))return _(t)?void console.log("CanvasDrawHelper.drawPictureStroke - No implementation!"):void 0;f=it(t).rings}c||(c=m.width);const g=T(h)||"src"in m&&T(m.src);let y="getFrame"in m?b(m):m;i&&(y=this._colorSubstitutionHelper.applyColorSubstituition(y,i)),this._applyAdditionalRenderProps&&(g||l&&(y=this._colorSubstitutionHelper.tintImageData(y,l)));const P=Math.max(this.transformSize(n(c)),.5),w=P/y.width,x=this._ctx,S=x.createPattern(y,"repeat-y");let M,k;x.save(),this._setCapStyle(s),this._setJoinStyle(o),void 0!==a&&(x.miterLimit=a),x.lineWidth=P;for(let n of f)if(n=r(n),ht(n),n&&!(n.length<=1)){M=this.transformPt(n[0]);for(let t=1;t<n.length;t++){k=this.transformPt(n[t]);const e=rt(M,k),r=new DOMMatrix;r.translateSelf(0,M[1]-P/2).scaleSelf(w,w,1).rotateSelf(0,0,90-e),S.setTransform(r),x.strokeStyle=S,x.beginPath(),x.moveTo(M[0],M[1]),x.lineTo(k[0],k[1]),x.stroke(),M=k}}x.restore()}_buildPath(t,e){const r=this._ctx;if(r.beginPath(),t)for(const i of t){const t=i?i.length:0;if(t>1){let s=this.transformPt(i[0]);r.moveTo(s[0],s[1]);for(let e=1;e<t;e++)s=this.transformPt(i[e]),r.lineTo(s[0],s[1]);e&&r.closePath()}}}_setCapStyle(t){switch(t){case S.Butt:this._ctx.lineCap="butt";break;case S.Round:this._ctx.lineCap="round";break;case S.Square:this._ctx.lineCap="square"}}_setJoinStyle(t){switch(t){case M.Bevel:this._ctx.lineJoin="bevel";break;case M.Round:this._ctx.lineJoin="round";break;case M.Miter:this._ctx.lineJoin="miter"}}}function rt(t,e){const r=e[0]-t[0],i=e[1]-t[1];return 180/Math.PI*Math.atan2(i,r)}const it=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=>{switch(t){case"Left":return B.Left;case"Right":return B.Right;case"Center":return B.Center;case"Justify":return N.warnOnce("Horizontal alignment 'justify' is not implemented. Falling back to 'center'."),B.Center}},ot=t=>{switch(t){case"Top":return G.Top;case"Center":return G.Center;case"Bottom":return G.Bottom;case"Baseline":return G.Baseline}},nt=(t,e,r)=>{switch(t){case"ExtraLeading":return 1+e/r;case"Multiple":return e;case"Exact":return e/r}};function at(t,r=1){const i=R(t),s=v(t.fontStyleName),o=t.fontFamilyName??e,{weight:n,style:a}=s,l=r*(t.height||5),h=z(t.horizontalAlignment),c=F(t.verticalAlignment),m=L(t),f=L(t.haloSymbol),u=f?r*(0|t.haloSize):0,d="CIMBackgroundCallout"===t.callout?.type?t.callout.backgroundSymbol:null,p=L(d),_=A(d),g=j(d);return{color:m,size:l,horizontalAlignment:h,verticalAlignment:c,font:{family:o,style:U(a),weight:H(n),decoration:i},halo:{size:u||0,color:f,style:a},backgroundColor:p,borderLine:null!=_&&null!=g?{size:_,color:g}:null,pixelRatio:1,premultiplyColors:!0}}const lt=1e-4;function ht(t){let e,r,i,s,o,n=t[0],a=1;for(;a<t.length;)e=t[a][0]-n[0],r=t[a][1]-n[1],s=0!==e?r/e:Math.PI/2,void 0!==i&&s-i<=lt?(t.splice(a-1,1),n=o):(o=n,n=t[a],a++),i=s}export{Z as CIMSymbolDrawHelper,J as C_DEG_TO_RAD,et as CanvasDrawHelper,Y as DEFAULT_HATCH_FILL_SEPARATION,q as DEFAULT_MARKER_SIZE,V as DEFAULT_PICTURE_FILL_HEIGHT,O as DEFAULT_STROKE_WIDTH,K as DEFAULT_TEXT_HALO_SIZE,W as DEFAULT_TEXT_HEIGHT,$ as EnvDrawHelper,tt as HittestDrawHelper,Q as Transformation,st as horizontalAlignment2HAlign,nt as lineGapType2LineHeight,ot as verticalAlignment2VAlign};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import{GeometryCursor as t}from"../../geometry/GeometryCursor.js";import{CurveHelper as s,PIXEL_TOLERANCE as e}from"./CurveHelper.js";const n=1e-7;class i{constructor(){this._values=[],this.extPtGap=0,this.ctrlPtGap=0,this._length=0,this._currentValue=0}isEmpty(){return 0===this._values.length}size(){return this._values.length}init(t,s,e=!0){if(this._setEmpty(),!t||0===t.length)return!1;for(let i=0;i<t.length;i++){let s=Math.abs(t[i]);e&&s<n&&(s=n),this._values.push(s),this._length+=s}return s&&1&t.length&&(this._length*=2),0!==this._length&&(this.ctrlPtGap=this.extPtGap=0,this._currentValue=-1,!0)}scale(t){const s=this._values?this._values.length:0;for(let e=0;e<s;++e)this._values[e]*=t;this._length*=t,this.extPtGap*=t,this.ctrlPtGap*=t}addValue(t){this._length+=t,this._values.push(t)}firstValue(){return this._values[0]}lastValue(){return this._values.
|
|
5
|
+
import{GeometryCursor as t}from"../../geometry/GeometryCursor.js";import{CurveHelper as s,PIXEL_TOLERANCE as e}from"./CurveHelper.js";const n=1e-7;class i{constructor(){this._values=[],this.extPtGap=0,this.ctrlPtGap=0,this._length=0,this._currentValue=0}isEmpty(){return 0===this._values.length}size(){return this._values.length}init(t,s,e=!0){if(this._setEmpty(),!t||0===t.length)return!1;for(let i=0;i<t.length;i++){let s=Math.abs(t[i]);e&&s<n&&(s=n),this._values.push(s),this._length+=s}return s&&1&t.length&&(this._length*=2),0!==this._length&&(this.ctrlPtGap=this.extPtGap=0,this._currentValue=-1,!0)}scale(t){const s=this._values?this._values.length:0;for(let e=0;e<s;++e)this._values[e]*=t;this._length*=t,this.extPtGap*=t,this.ctrlPtGap*=t}addValue(t){this._length+=t,this._values.push(t)}firstValue(){return this._values[0]}lastValue(){return this._values[this._values.length-1]}nextValue(){return this._currentValue++,this._currentValue===this._values.length&&(this._currentValue=0),this._values[this._currentValue]}reset(){this._currentValue=-1}length(){return this._length}_setEmpty(){this.extPtGap=this.ctrlPtGap=this._length=0,this._currentValue=-1,this._values.length=0}}class h{constructor(){this.pt=null,this.ca=0,this.sa=0}}var r;!function(t){t[t.FAIL=0]="FAIL",t[t.END=1]="END",t[t.CONTINUE=2]="CONTINUE"}(r||(r={}));class a{constructor(){this.reset()}reset(){this.segment=null,this.segmentLength=0,this.abscissa=0,this.isPathEnd=!1,this.isPartEnd=!1}isValid(){return null!==this.segment}copyTo(t){t.segment=this.segment,t.segmentLength=this.segmentLength,t.abscissa=this.abscissa,t.isPathEnd=this.isPathEnd,t.isPartEnd=this.isPartEnd}}class o extends s{constructor(t=0,s=!1){super(t,s),this._tolerance=e,this._currentPosition=new a}updateTolerance(t){this._tolerance=e*t}init(t,s,e=!0){return e?(this._patternLength=s.length(),this._partExtPtGap=s.extPtGap,this._partCtrlPtGap=s.ctrlPtGap):(this._patternLength=0,this._partExtPtGap=0,this._partCtrlPtGap=0),this._currentPosition.reset(),this._partSegCount=0,this._pathCursor=t,this._seg=-1,this._setPosAtNextPart()}curPositionIsValid(){return this._currentPosition.isValid()}nextPosition(t,s=r.FAIL){const e=new a;return!!this._nextPosition(t,e,null,s)&&(e.copyTo(this._currentPosition),!0)}curPointAndAngle(t){t.pt=this._getPoint(this._currentPosition);const[s,e]=this._getAngleCS(this._currentPosition);t.ca=s,t.sa=e}nextPointAndAngle(t,s,e=r.FAIL){const n=new a;if(!this._nextPosition(t,n,null,e))return!1;n.copyTo(this._currentPosition),s.pt=this._getPoint(n);const[i,h]=this._getAngleCS(n);return s.ca=i,s.sa=h,!0}nextCurve(s){if(0===s)return null;const e=t.createEmptyOptimizedCIM("esriGeometryPolyline");e.startPath(),e.nextPath();const n=new a;return this._nextPosition(s,n,e,r.END)?(n.copyTo(this._currentPosition),e):null}isPathEnd(){return this._currentPosition.isPathEnd}getPathEnd(){return this._currentPosition.segment[1]}getPt(t){return this._pathCursor.seekInPath(t),[this._pathCursor.x,this._pathCursor.y]}getSeg(t){return[this.getPt(t),this.getPt(t+1)]}_nextPosition(t,s,e,n){if(this._currentPosition.isPathEnd)return!1;let i=this._currentPosition.abscissa;for(this._currentPosition.segmentLength>0&&(i/=this._currentPosition.segmentLength),this._currentPosition.copyTo(s);s.abscissa+t*this._partLengthRatio>s.segmentLength+this._tolerance;){if(e){if(0===e.numPoints)if(0===i){const t=s.segment[0];e.pushXY(t[0],t[1])}else e.pushPoint(this.getSegCoord2D(s.segment,i));const t=s.segment[1];e.pushXY(t[0],t[1])}if(i=0,t-=(s.segmentLength-s.abscissa)/this._partLengthRatio,this._partSegCount)s.segment=this._nextSegment(),s.segmentLength=this.getSegLength(s.segment),s.abscissa=0,this._partSegCount--;else{if(!this._setPosAtNextPart())return n!==r.FAIL&&(s.segmentLength=this.getSegLength(s.segment),s.isPartEnd=!0,n===r.END?(s.abscissa=s.segmentLength,s.isPathEnd=!0):s.abscissa=s.segmentLength+t,!0);this._currentPosition.copyTo(s)}}if(s.abscissa+=t*this._partLengthRatio,e){0===e.numPoints&&(0===i?e.pushPoint(s.segment[0]):e.pushPoint(this.getSegCoord2D(s.segment,i)));const t=s.abscissa/s.segmentLength;1===t?e.pushPoint(s.segment[1]):e.pushPoint(this.getSegCoord2D(s.segment,t))}return this._partSegCount||Math.abs(s.abscissa-s.segmentLength)<this._tolerance&&(s.isPathEnd=this._partIsLast,s.isPartEnd=!0),!0}_getPoint(t){const s=t.segmentLength<=0?0:t.abscissa/t.segmentLength;return this.getSegCoord2D(this._currentPosition.segment,s)}_getAngleCS(t){const s=t.segmentLength<=0?0:t.abscissa/t.segmentLength;return this.getSegAngleCS(this._currentPosition.segment,s)}_setPosAtNextPart(){for(;this._partSegCount;)this._hasNextSegment()&&this._nextSegment(),this._partSegCount--;if(!this._hasNextSegment())return!1;for(this._partLength=0,this._partIsLast=!0,this._partSegCount=0;this._hasNextSegment();)if(this._partLength+=this.getSegLength(this._nextSegment()),this._partSegCount++,this._pathCursor.getControlPointAt(this._getEndPointIndex())){this._partIsLast=!this._hasNextSegment();break}let t=this._partSegCount;for(;t;)this._previousSegment(),--t;this._currentPosition.segment=this._nextSegment(),this._currentPosition.segmentLength=this.getSegLength(this._currentPosition.segment),this._currentPosition.abscissa=0,this._currentPosition.isPathEnd=this._currentPosition.isPartEnd=!1,--this._partSegCount;const s=this._getStartPointIndex();this._ctrlPtBegin=this._pathCursor.getControlPointAt(s);let e=s+this._partSegCount+1;if(e>=this._pathCursor.numPoints&&(e=0),this._ctrlPtEnd=this._pathCursor.getControlPointAt(e),this._patternLength>0){const t=this._ctrlPtBegin?this._partCtrlPtGap:this._partExtPtGap,s=this._ctrlPtEnd?this._partCtrlPtGap:this._partExtPtGap;let e=Math.round((this._partLength-(t+s))/this._patternLength);e<=0&&(e=t+s>0?0:1),this._partLengthRatio=this._partLength/(t+s+e*this._patternLength),this._partLengthRatio<.01&&(this._partLengthRatio=1)}else this._partLengthRatio=1;return!0}_hasNextSegment(){return this._seg<this._pathCursor.numPoints-2}_previousSegment(){return this.getSeg(--this._seg)}_nextSegment(){return this.getSeg(++this._seg)}_getStartPointIndex(){return this._seg}_getEndPointIndex(){return this._seg+1}}export{i as DashPattern,r as EndType,o as GeometryWalker,h as Pos};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import e from"../../Color.js";import{getFontFamily as t}from"../../core/fontUtils.js";import{clone as i}from"../../core/lang.js";import r from"../../core/Logger.js";import{pt2px as o,px2pt as n}from"../../core/screenUtils.js";import{numericHash as a}from"../../core/string.js";import{createRendererExpression as s,ArcadeExpression as l}from"../../support/arcadeOnDemand.js";import{DEFAULT_PICTURE_FILL_HEIGHT as c,DEFAULT_HATCH_FILL_SEPARATION as m,DEFAULT_STROKE_WIDTH as f,DEFAULT_MARKER_SIZE as h,DEFAULT_TEXT_HEIGHT as u}from"./CIMSymbolDrawHelper.js";import{CIMSymbolHelper as p,OverrideHelper as y}from"./CIMSymbolHelper.js";import{Alignment as d,CapType as v,JoinType as _}from"./enums.js";import{quantizeIfNeeded as O}from"./quantizeTime.js";import{getExtent as S,getSDFMetrics as g}from"./SDFHelper.js";import{fromCIMColor as M,getTintColor as k,getValue as b,getFillColor as N,getStrokeColor as P,getStrokeWidth as z,isFeatureValueFn as L,fromCIMFontDecoration as C,fromCIMFontStyle as F,adjustTextCase as I,createLabelOverrideFunction as w,evaluateValueOrFunction as x,fromCIMHorizontalAlignment as A,fromCIMVerticalAlignment as R}from"./utils.js";import{CIMEffectHelper as X}from"./effects/CIMEffectHelper.js";import H from"../../views/2d/arcade/callExpressionWithFeature.js";import{RANDOM_INSIDE_POLYGON_TEXTURE_SIZE as J}from"../../views/2d/engine/webgl/definitions.js";import{getMaterialGroup as Y}from"../../views/2d/engine/webgl/grouping.js";const E=r.getLogger("esri.symbols.cim.cimAnalyzer");function T(e){switch(e){case"Butt":return v.BUTT;case"Square":return v.SQUARE;default:return v.ROUND}}function $(e){switch(e){case"Bevel":return _.BEVEL;case"Miter":return _.MITER;default:return _.ROUND}}function j(e){const t=e.markerPlacement;return t&&t.angleToLine?d.MAP:d.SCREEN}class G{constructor(e,t){this._cimLayers=[],this._poMap={},this._primitiveOverrides=[],this._resourceManager=e,this._info=t}async analyzeSymbolReference(e,t,i){if(this._cimLayers=i??[],!e)return this._cimLayers;if(e.primitiveOverrides){this._primitiveOverrides=e.primitiveOverrides,this._poMap={};const t=[],i=this._info;for(const e of this._primitiveOverrides){const r=e.valueExpressionInfo;if(r&&i){const o=r.expression,n=s(o,i.spatialReference,i.fields).then((t=>{null!=t&&this._setPoMap(e.primitiveName,e.propertyName,t)}));t.push(n)}else null!=e.value&&this._setPoMap(e.primitiveName,e.propertyName,e.value);t.length>0&&await Promise.all(t)}}const r=e.symbol,o=[];return p.fetchResources(r,this._resourceManager,o),o.length>0&&await Promise.all(o),this._analyzeSymbol(r,t),this._cimLayers}_analyzeSymbol(e,t){switch(e?.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this._analyzeMultiLayerSymbol(e,t,1,0,0,0)}}_analyzeMultiLayerSymbol(e,t,i,r,o,n){const a=e?.symbolLayers;if(!a)return;const s=e.effects;let l=d.SCREEN;const c=p.getSize(e)??0;"CIMPointSymbol"===e.type&&"Map"===e.angleAlignment&&(l=d.MAP);const m="CIMPolygonSymbol"===e.type;let f=a.length;for(;f--;){const h=a[f];if(!h||!1===h.enable)continue;let u;s&&s.length&&(u=[...s]);const p=h.effects;p&&p.length&&(s?u.push(...p):u=[...p]);const d=[];let v;y.findEffectOverrides(u,this._primitiveOverrides,d),v=d.length>0?this._createEffectsOverrideFunction(u,d):u;const _=[];switch(y.findApplicableOverrides(h,this._primitiveOverrides,_),h.type){case"CIMSolidFill":this._analyzeSolidFill(h,v);break;case"CIMPictureFill":this._analyzePictureFill(h,v);break;case"CIMHatchFill":this._analyzeHatchFill(h,v);break;case"CIMGradientFill":this._analyzeGradientFill(h,v);break;case"CIMSolidStroke":this._analyzeSolidStroke(h,v,m,c);break;case"CIMPictureStroke":this._analyzePictureStroke(h,v,m,c);break;case"CIMGradientStroke":this._analyzeGradientStroke(h,v,m,c);break;case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":{"CIMLineSymbol"===e.type&&(l=j(h));const a=[],s=h.primitiveName;s&&a.push(s),this._analyzeMarker(h,v,null,a,l,c,1,t,i,r,o,n);break}default:E.error("Cannot analyze CIM layer",h.type)}}}_analyzeSolidFill(e,t){const i=e.primitiveName,r=M(e.color),[o,n]=this._analyzePrimitiveOverrides(i,t,null,null),s=a(JSON.stringify(e)+n).toString();this._cimLayers.push({type:"fill",templateHash:s,materialHash:o?()=>s:s,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,color:this._createOverrideFunction(i,"Color",r,U),height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,effects:t,applyRandomOffset:!1,sampleAlphaOnly:!0})}_analyzePictureFill(e,t){const i=e.primitiveName,r=k(e),[o,n]=this._analyzePrimitiveOverrides(i,t,null,null),s=a(JSON.stringify(e)+n).toString(),l=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),m=b(e.height,c);let f=b(e.scaleX,1);if("width"in e&&"number"==typeof e.width){const t=e.width;let i=1;const r=this._resourceManager.getResource(e.url);null!=r&&(i=r.width/r.height),f/=i*(m/t)}this._cimLayers.push({type:"fill",templateHash:s,materialHash:o?()=>l:l,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(i,"TintColor",r,U),height:this._createOverrideFunction(i,"Height",m),scaleX:this._createOverrideFunction(i,"ScaleX",f),angle:this._createOverrideFunction(i,"Rotation",b(e.rotation)),offsetX:this._createOverrideFunction(i,"OffsetX",b(e.offsetX)),offsetY:this._createOverrideFunction(i,"OffsetY",b(e.offsetY)),url:e.url,applyRandomOffset:!1,sampleAlphaOnly:!1})}_analyzeHatchFill(e,t){const i=e.primitiveName,r=this._analyzeMaterialOverrides(i,["Rotation","OffsetX","OffsetY"]);let[o,n]=this._analyzePrimitiveOverrides(i,t,null,null);const s=a(JSON.stringify(e)+n).toString(),l=a(`${e.separation}${JSON.stringify(e.lineSymbol)}`).toString();let c={r:255,g:255,b:255,a:1},f=!1;const h=e.lineSymbol?.symbolLayers?.find((e=>"CIMSolidStroke"===e.type&&null!=this._poMap[e.primitiveName]?.Color));if(h){c=M(h.color),c=this._createOverrideFunction(h.primitiveName,"Color",c,U);const e="function"==typeof c;o=o||e,f=null!=h.color||e}this._cimLayers.push({type:"fill",templateHash:s,materialHash:o&&r?this._createMaterialHashFunction(l,r):l,cim:e,materialOverrides:r,colorLocked:!!e.colorLocked,effects:t,color:c,height:this._createOverrideFunction(i,"Separation",b(e.separation,m)),scaleX:1,angle:this._createOverrideFunction(i,"Rotation",b(e.rotation)),offsetX:this._createOverrideFunction(i,"OffsetX",b(e.offsetX)),offsetY:this._createOverrideFunction(i,"OffsetY",b(e.offsetY)),applyRandomOffset:!1,sampleAlphaOnly:!0,hasUnresolvedReplacementColor:!f})}_analyzeGradientFill(e,t){const i=e.primitiveName,[r,o]=this._analyzePrimitiveOverrides(i,t,null,null),n=a(JSON.stringify(e)+o).toString();this._cimLayers.push({type:"fill",templateHash:n,materialHash:r?()=>n:n,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,applyRandomOffset:!1,sampleAlphaOnly:!1})}_analyzeSolidStroke(e,t,i,r){const o=e.primitiveName,n=M(e.color),s=b(e.width,f),l=T(e.capStyle),c=$(e.joinStyle),m=e.miterLimit,[h,u]=this._analyzePrimitiveOverrides(o,t,null,null),p=a(JSON.stringify(e)+u).toString();let y,d;if(t&&t instanceof Array&&t.length>0){const e=t.at(-1);if("CIMGeometricEffectDashes"===e.type&&"NoConstraint"===e.lineDashEnding&&null===e.offsetAlongLine){const e=(t=[...t]).pop();y=e.dashTemplate,d=e.scaleDash}}this._cimLayers.push({type:"line",templateHash:p,materialHash:h?()=>p:p,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(o,"Color",n,U),width:this._createOverrideFunction(o,"Width",s),cap:this._createOverrideFunction(o,"CapStyle",l),join:this._createOverrideFunction(o,"JoinStyle",c),miterLimit:m&&this._createOverrideFunction(o,"MiterLimit",m),referenceWidth:r,zOrder:D(e.name),dashTemplate:y,scaleDash:d,sampleAlphaOnly:!0})}_analyzePictureStroke(e,t,i,r){const o=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),n=e.primitiveName,s=k(e),l=b(e.width,f),c=T(e.capStyle),m=$(e.joinStyle),h=e.miterLimit,[u,p]=this._analyzePrimitiveOverrides(n,t,null,null),y=a(JSON.stringify(e)+p).toString();this._cimLayers.push({type:"line",templateHash:y,materialHash:u?()=>o:o,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(n,"TintColor",s,U),width:this._createOverrideFunction(n,"Width",l),cap:this._createOverrideFunction(n,"CapStyle",c),join:this._createOverrideFunction(n,"JoinStyle",m),miterLimit:h&&this._createOverrideFunction(n,"MiterLimit",h),referenceWidth:r,zOrder:D(e.name),dashTemplate:null,scaleDash:!1,url:e.url,sampleAlphaOnly:!1})}_analyzeGradientStroke(e,t,i,r){const o=e.primitiveName,n=b(e.width,f),s=T(e.capStyle),l=$(e.joinStyle),c=e.miterLimit,[m,h]=this._analyzePrimitiveOverrides(o,t,null,null),u=a(JSON.stringify(e)+h).toString();this._cimLayers.push({type:"line",templateHash:u,materialHash:m?()=>u:u,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},width:this._createOverrideFunction(o,"Width",n),cap:this._createOverrideFunction(o,"CapStyle",s),join:this._createOverrideFunction(o,"JoinStyle",l),miterLimit:c&&this._createOverrideFunction(o,"MiterLimit",c),referenceWidth:r,zOrder:D(e.name),dashTemplate:null,scaleDash:!1,sampleAlphaOnly:!1})}_analyzeMarker(e,t,i,r,o,n,a,s,l,c,m,f,u=!1){if(this._analyzeMarkerInsidePolygon(e,t))return;const p=b(e.size,h),y=b(e.rotation),d=b(e.offsetX),v=b(e.offsetY);let _=this._createOverrideFunction(e.primitiveName,"Size",p),O=this._createOverrideFunction(e.primitiveName,"Rotation",y),S=this._createOverrideFunction(e.primitiveName,"OffsetX",d),g=this._createOverrideFunction(e.primitiveName,"OffsetY",v);_=this._transformSize(_,a),O=this._transformRotation(O,!!e.rotateClockwise,c);const M=this._transformOffsetX(S,g,c,a,m),k=this._transformOffsetY(S,g,c,a,f);switch(S=M,g=k,e.type){case"CIMPictureMarker":this._analyzePictureMarker(e,t,i,r,o,n,_,O,S,g,e.colorLocked||u);break;case"CIMVectorMarker":this._analyzeVectorMarker(e,t,i,r,o,n,a,s,_,O,S,g,e.colorLocked||u)}}_analyzeMarkerInsidePolygon(e,t){const{markerPlacement:i,type:r}=e;if(!i||"CIMMarkerPlacementInsidePolygon"!==i.type)return!1;if("CIMVectorMarker"===r||"CIMPictureMarker"===r){const o=e.primitiveName;if(o){const[e,i]=this._analyzePrimitiveOverrides([o],t,null,null);if(e)return!1}const n=i.primitiveName;if(n){const[e,i]=this._analyzePrimitiveOverrides([n],t,null,null);if(e)return!1}if("CIMVectorMarker"===r){const{markerGraphics:t}=e;if(t)for(const e of t){const{symbol:t}=e;if("CIMPolygonSymbol"===t?.type&&t.symbolLayers){const{symbolLayers:e}=t;for(const t of e)if("CIMSolidStroke"===t.type)return!1}}}else{const{animatedSymbolProperties:t}=e;if(t)return!1}}const o=i,s=Math.abs(o.stepX),l=Math.abs(o.stepY);if(0===s||0===l)return!0;const c=["Rotation","OffsetX","OffsetY"],m=this._primitiveOverrides.filter((t=>t.primitiveName!==e.primitiveName||!c.includes(t.propertyName))),f="url"in e&&"string"==typeof e.url?e.url:void 0,h=a(JSON.stringify(e)).toString();let u,p,y=null;if("Random"===i.gridType){const e=n(J),t=Math.max(Math.floor(e/s),1),i=Math.max(Math.floor(e/l),1);u=l*i,y=e=>e?e*i:0;p=t*s/u}else i.shiftOddRows?(u=2*l,y=e=>e?2*e:0,p=s/l*.5):(u=l,y=null,p=s/l);const d=k(e);return this._cimLayers.push({type:"fill",templateHash:h,materialHash:h,cim:e,materialOverrides:m,colorLocked:!!e.colorLocked,effects:t,color:d,height:this._createOverrideFunction(o.primitiveName,"StepY",u,y),scaleX:p,angle:o.gridAngle,offsetX:b(o.offsetX),offsetY:b(o.offsetY),url:f,applyRandomOffset:"Random"===i.gridType,sampleAlphaOnly:!f,hasUnresolvedReplacementColor:!0}),!0}_analyzePictureMarker(e,t,i,r,o,n,s,l,c,m,f){let h=b(e.scaleX,1);const u=k(e),p=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}${JSON.stringify(e.animatedSymbolProperties)}`).toString();i||(i=this._createMarkerPlacementOverrideFunction(e.markerPlacement));const y=this._createAnimatedSymbolPropertiesOverrideFunction(e.animatedSymbolProperties),[d,v]=this._analyzePrimitiveOverrides(r,t,i,y),_=a(JSON.stringify(e)+v).toString(),O=e.anchorPoint??{x:0,y:0};if("width"in e&&"number"==typeof e.width){const t=e.width;let i=1;const r=this._resourceManager.getResource(e.url);null!=r&&(i=r.width/r.height);h/=i*(b(e.size)/t)}function S(e,t){return null!=y?x(y,e,t):null}const g=e.animatedSymbolProperties&&!0===e.animatedSymbolProperties.randomizeStartTime?(e,t,i,r)=>{const o=Y(r??0),n=S(e,t);return p+`-MATERIALGROUP(${o})`+`-ASP(${JSON.stringify(n)})`}:d?(e,t)=>{const i=S(e,t);return p+`-ASP(${JSON.stringify(i)})`}:p;this._cimLayers.push({type:"marker",templateHash:_,materialHash:g,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked||!!f,effects:t,scaleSymbolsProportionally:!1,alignment:o,size:s,scaleX:this._createOverrideFunction(e.primitiveName,"ScaleX",h),rotation:l,offsetX:c,offsetY:m,color:this._createOverrideFunction(e.primitiveName,"TintColor",u,U),anchorPoint:{x:O.x,y:O.y},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,frameHeight:0,rotateClockwise:!1,referenceSize:n,sizeRatio:1,markerPlacement:i,url:e.url,animatedSymbolProperties:y})}_analyzeVectorMarker(e,t,i,r,o,n,a,s,l,c,m,f,h){const u=e.markerGraphics;if(!u)return;const p=e.frame;let y=0,d=1;e.scaleSymbolsProportionally&&p&&(y=p.ymax-p.ymin,d=this._transformSize(l,1/y)),d=this._transformSize(d,a),i||(i=this._createMarkerPlacementOverrideFunction(e.markerPlacement));for(const v of u)if(v){const a=v.symbol;if(!a)continue;const u=v.primitiveName;u&&r.push(u);let _=m,O=f;if(("CIMPointSymbol"===a.type||"CIMTextSymbol"===a.type)&&p){let t=0,i=0;const r=v.geometry;"x"in r&&"y"in r&&(t+=r.x-.5*(p.xmin+p.xmax),i+=r.y-.5*(p.ymin+p.ymax));const o=e.anchorPoint;o&&("Absolute"===e.anchorPointUnits?(t-=o.x,i-=o.y):p&&(t-=(p.xmax-p.xmin)*o.x,i-=(p.ymax-p.ymin)*o.y)),_=this._transformOffsetX(t,i,c,d,m),O=this._transformOffsetY(t,i,c,d,f)}switch(a.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":s?this._analyzeMultiLayerGraphicNonSDF(e,t,i,null,v,r,o,n,y,!!h||!!e.colorLocked):this._analyzeMultiLayerGraphic(e,t,i,null,v,r,o,n,y,d,l,c,_,O,!!h||!!e.colorLocked);break;case"CIMTextSymbol":this._analyzeTextGraphic(e,t,i,v,r,o,n,y,d,l,c,_,O,!!h||!!e.colorLocked)}u&&r.pop()}}_analyzeMultiLayerGraphic(e,t,i,r,o,n,s,l,c,m,f,h,u,p,y){const d=o.symbol,v=d.symbolLayers;if(!v)return;let _=v.length;if(B(v))return void this._analyzeCompositeMarkerGraphic(e,t,i,r,o,v,n,s,l,c,f,h,u,p,!!y||!!e.colorLocked);const O=this._resourceManager.geometryEngine,k=X.applyEffects(d.effects,o.geometry,O);if(k)for(;_--;){const d=v[_];if(!d||!1===d.enable)continue;const b=d.primitiveName;switch(b&&n.push(b),d.type){case"CIMSolidFill":case"CIMSolidStroke":{const m=X.applyEffects(d.effects,k,O),v=S(m);if(!v)continue;const _="Relative"!==e.anchorPointUnits,[C,F,I]=g(v,e.frame,e.size,e.anchorPoint,_),w="CIMSolidFill"===d.type,x={type:"sdf",geom:m,asFill:w},A=d.path,R=M(w?N(d):P(d)),H=w?{r:0,g:0,b:0,a:0}:M(P(d)),J=z(d)??0;if(!w&&!J)break;const Y=o.primitiveName;let E=null;w&&!d.colorLocked&&(E=this._createOverrideFunction(Y,"FillColor",R,U));let T=null;w||d.colorLocked||(T=this._createOverrideFunction(Y,"StrokeColor",H,U));const $=this._createOverrideFunction(Y,"StrokeWidth",J);let j=!1,G="";for(const e of this._primitiveOverrides)n.includes(e.primitiveName)&&(null!=e.value?G+=`-${e.primitiveName}-${e.propertyName}-${JSON.stringify(e.value)}`:e.valueExpressionInfo&&(j=!0));(null!=t&&"function"==typeof t||null!=i&&"function"==typeof i)&&(j=!0),(L(f)||L(h)||L(u)||L(p))&&(j=!0);const D=JSON.stringify({...e,markerGraphics:null}),W=a(JSON.stringify(x)+A).toString(),V=a(JSON.stringify(o)+JSON.stringify(d)+D+G).toString();this._cimLayers.push({type:"marker",templateHash:V,materialHash:j?()=>W:W,cim:x,materialOverrides:null,colorLocked:!!d.colorLocked||!!y,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:s,anchorPoint:{x:F,y:I},isAbsoluteAnchorPoint:_,size:f,rotation:h,offsetX:u,offsetY:p,scaleX:1,frameHeight:c,rotateClockwise:!1,referenceSize:l,sizeRatio:C,color:L(E)?E:this._createOverrideFunction(b,"Color",R,U),outlineColor:L(T)?T:this._createOverrideFunction(b,"Color",H,U),outlineWidth:L($)?$:this._createOverrideFunction(b,"Width",J),markerPlacement:i,animatedSymbolProperties:r,path:A});break}case"CIMVectorMarker":d.markerPlacement?this._analyzeMultiLayerGraphicNonSDF(e,t,i,r,o,n,s,l,c,!!y||!!d.colorLocked):this._analyzeMarker(d,t,i,n,s,l,m,!1,f,h,u,p,!!y||!!e.colorLocked);break;default:this._analyzeMultiLayerGraphicNonSDF(e,t,i,r,o,n,s,l,c,!!y||!!e.colorLocked)}b&&n.pop()}}_analyzeTextGraphic(e,i,r,o,n,s,l,c,m,h,p,d,v,_){const O=[];y.findApplicableOverrides(o,this._primitiveOverrides,O);const S=o.geometry;if(!("x"in S)||!("y"in S))return;const g=o.symbol,k=C(g),X=F(g.fontStyleName),H=t(g.fontFamilyName);g.font={family:H,decoration:k,...X};let J=b(g.height,u),Y=b(g.angle),E=b(g.offsetX),T=b(g.offsetY);J=this._transformSize(J,m),Y=this._transformRotation(Y,!1,p);const $=this._transformOffsetX(E,T,p,m,d),j=this._transformOffsetY(E,T,p,m,v);E=$,T=j;const G=M(N(g));let D=M(P(g)),W=z(g)??0;W||(D=M(N(g.haloSymbol)),W=b(g.haloSize)),W=this._transformSize(W,m);let V=!1;if(g.symbol?.symbolLayers)for(const t of g.symbol.symbolLayers){null!=N(t)&&(V=!!t.colorLocked)}const B=o.primitiveName;let q=null;V||(q=this._createOverrideFunction(B,"Color",G,U));let K=null,Q=null,Z=0;if(g.callout&&"CIMBackgroundCallout"===g.callout.type){const e=g.callout;if(e.backgroundSymbol){const t=e.backgroundSymbol.symbolLayers;if(t)for(const e of t)"CIMSolidFill"===e.type?K=M(e.color):"CIMSolidStroke"===e.type&&(Q=M(e.color),Z=b(e.width,f))}}const[ee,te]=this._analyzePrimitiveOverrides(n,i,r,null),ie=JSON.stringify(e.effects)+Number(e.colorLocked||_).toString()+JSON.stringify(e.anchorPoint)+e.anchorPointUnits+JSON.stringify(e.markerPlacement)+e.size.toString(),re=a(JSON.stringify(o)+ie+te).toString();let oe=this._createOverrideFunction(o.primitiveName,"TextString",o.textString??"",I,g.textCase);if(null==oe)return;const{fontStyleName:ne}=g,ae=H+(ne?"-"+ne.toLowerCase():"-regular"),se=ae;"string"==typeof oe&&oe.includes("[")&&g.fieldMap&&(oe=w(g.fieldMap,oe,g.textCase)),this._cimLayers.push({type:"text",templateHash:re,materialHash:ee||"function"==typeof oe||/\[(.*?)\]/.test(oe)?(e,t,i)=>se+"-"+x(oe,e,t,i):se+"-"+a(oe),cim:g,materialOverrides:null,colorLocked:!!_||!!V,effects:i,alignment:s,anchorPoint:{x:0,y:0},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,fontName:ae,decoration:k,weight:X.weight,style:X.style,size:J,angle:Y,offsetX:E,offsetY:T,horizontalAlignment:A(g.horizontalAlignment),verticalAlignment:R(g.verticalAlignment),text:oe,color:L(q)?q:G,outlineColor:D,outlineSize:W,backgroundColor:K,borderLineColor:Q,borderLineWidth:Z,referenceSize:l,sizeRatio:1,markerPlacement:r})}_analyzeMultiLayerGraphicNonSDF(e,t,i,r,n,s,l,c,m,f){const u=this._buildSimpleMarker(e,n),y=e.primitiveName,d=this._analyzeMaterialOverrides(y,["Rotation","OffsetX","OffsetY"]),[v,_]=this._analyzePrimitiveOverrides(s,null,null,null),[O,S,g]=p.getTextureAnchor(u,this._resourceManager),M=b(e.rotation),k=b(e.offsetX),N=b(e.offsetY),P=a(JSON.stringify(u)+_).toString(),z=d&&d.length>0||null!=t&&"function"==typeof t;this._cimLayers.push({type:"marker",templateHash:P,materialHash:z&&d?this._createMaterialHashFunction(P,d):P,cim:u,materialOverrides:d,colorLocked:!!e.colorLocked||!!f,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:l,anchorPoint:{x:O,y:S},isAbsoluteAnchorPoint:!1,size:b(e.size,h),rotation:this._createOverrideFunction(y,"Rotation",M),offsetX:this._createOverrideFunction(y,"OffsetX",k),offsetY:this._createOverrideFunction(y,"OffsetY",N),color:{r:255,g:255,b:255,a:1},outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,scaleX:1,frameHeight:m,rotateClockwise:!!e.rotateClockwise,referenceSize:c,sizeRatio:g/o(e.size),markerPlacement:i,animatedSymbolProperties:r,avoidSDFRasterization:!0})}_buildSimpleMarker(e,t){return{type:e.type,enable:!0,name:e.name,colorLocked:e.colorLocked,primitiveName:e.primitiveName,anchorPoint:e.anchorPoint,anchorPointUnits:e.anchorPointUnits,offsetX:0,offsetY:0,rotateClockwise:e.rotateClockwise,rotation:0,size:e.size,billboardMode3D:e.billboardMode3D,depth3D:e.depth3D,frame:e.frame,markerGraphics:[t],scaleSymbolsProportionally:e.scaleSymbolsProportionally,respectFrame:e.respectFrame,clippingPath:e.clippingPath}}_analyzeCompositeMarkerGraphic(e,t,i,r,o,n,s,l,c,m,h,u,p,y,d){const v=o.geometry,_=n[0],O=n[1],k=S(v);if(!k)return;const N="Relative"!==e.anchorPointUnits,[P,z,C]=g(k,e.frame,e.size,e.anchorPoint,N),F={type:"sdf",geom:v,asFill:!0},I=O.path,w=O.primitiveName,x=_.primitiveName,A=M(O.color),R=M(_.color),X=b(_.width,f),H=o.primitiveName;let J=null;O.colorLocked||d||(J=this._createOverrideFunction(H,"FillColor",A,U));let Y=null;_.colorLocked||d||(Y=this._createOverrideFunction(H,"StrokeColor",R,U));const E=this._createOverrideFunction(H,"StrokeWidth",X);let T=!1,$="";for(const a of this._primitiveOverrides)(a.primitiveName===w||a.primitiveName===x||s.includes(a.primitiveName))&&(null!=a.value?$+=`-${a.primitiveName}-${a.propertyName}-${JSON.stringify(a.value)}`:a.valueExpressionInfo&&(T=!0));null!=i&&"function"==typeof i&&(T=!0),(L(h)||L(u)||L(p)||L(y))&&(T=!0);const j=JSON.stringify({...e,markerGraphics:null}),G=a(JSON.stringify(F)+I).toString(),D=a(JSON.stringify(o)+JSON.stringify(O)+JSON.stringify(_)+j+$).toString();this._cimLayers.push({type:"marker",templateHash:D,materialHash:T?()=>G:G,cim:F,materialOverrides:null,colorLocked:!!d,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:l,anchorPoint:{x:z,y:C},isAbsoluteAnchorPoint:N,size:h,rotation:u,offsetX:p,offsetY:y,scaleX:1,frameHeight:m,rotateClockwise:!1,referenceSize:c,sizeRatio:P,color:L(J)?J:this._createOverrideFunction(w,"Color",A,U),outlineColor:L(Y)?Y:this._createOverrideFunction(x,"Color",R,U),outlineWidth:L(E)?E:this._createOverrideFunction(x,"Width",X),markerPlacement:i,path:I,animatedSymbolProperties:r})}_createMaterialHashFunction(e,t){const i=this._info?.geometryType;if(i){const e=this._poMap;for(const r of t){if(r.valueExpressionInfo){const t=e[r.primitiveName]&&e[r.primitiveName][r.propertyName];t instanceof l&&(r.fn=(e,r,o)=>H(t,e,{$view:o},i,r))}}}return(i,r,o)=>{for(const e of t)e.fn&&(e.value=e.fn(i,r,o));return a(e+y.buildOverrideKey(t)).toString()}}_setPoMap(e,t,i){let r;this._poMap[e]?r=this._poMap[e]:(r={},this._poMap[e]=r),r[t]=i}_createOverrideFunction(e,t,i,r,o){if(null==e)return i;const n=this._poMap[e];if(null==n)return i;const a=n[t];if("string"==typeof a||"number"==typeof a||a instanceof Array)return r?r.call(null,a,o):a;const s=this._info?.geometryType;return null!=a&&a instanceof l&&null!=s?(e,t,n)=>{let l=H(a,e,{$view:n},s,t);return null!==l&&r&&(l=r.call(null,l,o)),null!==l?l:i}:i}_createEffectsOverrideFunction(e,t){const r=this._poMap,o=this._info?.geometryType;for(const i of t){if(i.valueExpressionInfo&&o){const e=r[i.primitiveName]&&r[i.primitiveName][i.propertyName];e instanceof l&&(i.fn=(t,i,r)=>H(e,t,{$view:r},o,i))}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=[];for(let s of e){const e=s?.primitiveName;if(e){let r=!1;for(const o of t)if(o.primitiveName===e){const e=W(o.propertyName);null!=o.value&&o.value!==s[e]&&(r||(s=i(s),r=!0),s[e]=o.value)}}a.push(s)}return a}}_createMarkerPlacementOverrideFunction(e){const t=[];if(y.findApplicableOverrides(e,this._primitiveOverrides,t),null==e||0===t.length)return e;const r=this._poMap,o=this._info?.geometryType;for(const i of t){if(i.valueExpressionInfo&&o){const e=r[i.primitiveName]&&r[i.primitiveName][i.propertyName];e instanceof l&&(i.fn=(t,i,r)=>H(e,t,{$view:r},o,i))}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=i(e),s=e.primitiveName;for(const e of t)if(e.primitiveName===s){const t=W(e.propertyName);null!=e.value&&e.value!==a[t]&&(a[t]=e.value)}return a}}_createAnimatedSymbolPropertiesOverrideFunction(e){const t=[];if(y.findApplicableOverrides(e,this._primitiveOverrides,t),null==e||0===t.length)return e;const r=this._info?.geometryType;if(r){const e=this._poMap;for(const i of t){if(i.valueExpressionInfo){const t=e[i.primitiveName]&&e[i.primitiveName][i.propertyName];t instanceof l&&(i.fn=(e,i,o)=>H(t,e,{$view:o},r,i))}}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=i(e),s=e.primitiveName;for(const e of t)if(e.primitiveName===s){const t=W(e.propertyName);if(null!=e.value){const i=O(e.value,e.propertyName);i!==a[t]&&(a[t]=i)}}return a}}_analyzePrimitiveOverrides(e,t,i,r){let o=!1,n="";"string"==typeof e&&(e=[e]);for(const a of this._primitiveOverrides)e?.includes(a.primitiveName)&&(null!=a.value?n+=`-${a.primitiveName}-${a.propertyName}-${JSON.stringify(a.value)}`:a.valueExpressionInfo&&(o=!0));return null!=t&&"function"==typeof t&&(o=!0),null!=i&&"function"==typeof i&&(o=!0),null!=r&&"function"==typeof r&&(o=!0),[o,n]}_analyzeMaterialOverrides(e,t){return this._primitiveOverrides.filter((i=>i.primitiveName!==e||!t.includes(i.propertyName)))}_transformSize(e,t){return L(e)||L(t)?(i,r,o)=>(L(e)?e(i,r,o):e)*(L(t)?t(i,r,o):t):e*t}_transformRotation(e,t,i){return L(e)||L(i)?(r,o,n)=>{const a=L(e)?e(r,o,n):e,s=L(i)?i(r,o,n):i;return t?s-a:s+a}:t?i-e:i+e}_transformOffsetX(e,t,i,r,o){if(!(L(e)||L(t)||L(i)||L(r)||L(o))){const n=i*Math.PI/180;if(n){const i=Math.cos(n),a=Math.sin(n);return(i*e-a*t)*r+o}return e*r+o}return(n,a,s)=>{let l=L(i)?i(n,a,s):i;const c=L(r)?r(n,a,s):r,m=L(e)?e(n,a,s):e,f=L(o)?o(n,a,s):o;if(l){l*=Math.PI/180;return(Math.cos(l)*m-Math.sin(l)*(L(t)?t(n,a,s):t))*c+f}return m*c+f}}_transformOffsetY(e,t,i,r,o){if(!(L(e)||L(t)||L(i)||L(r)||L(o))){const n=i*Math.PI/180;if(n){const i=Math.cos(n);return(Math.sin(n)*e+i*t)*r+o}return t*r+o}return(n,a,s)=>{let l=L(i)?i(n,a,s):i;const c=L(r)?r(n,a,s):r,m=L(t)?t(n,a,s):t,f=L(o)?o(n,a,s):o;if(l){l*=Math.PI/180;const t=Math.cos(l);return(Math.sin(l)*(L(e)?e(n,a,s):e)+t*m)*c+f}return m*c+f}}}function D(e){if(e&&0===e.indexOf("Level_")){const t=parseInt(e.substr(6),10);if(!isNaN(t))return t}return 0}function U(t){if(!t||0===t.length)return null;const i=new e(t).toRgba();return{r:i[0],g:i[1],b:i[2],a:i[3]}}function W(e){return e?e.charAt(0).toLowerCase()+e.substr(1):e}function V(e,t){if(!t||0===t.length)return e;const r=i(e);return y.applyOverrides(r,t),r}const B=e=>e&&2===e.length&&e[0].enable&&e[1].enable&&"CIMSolidStroke"===e[0].type&&"CIMSolidFill"===e[1].type&&!e[0].effects&&!e[1].effects;export{G as CIMAnalyzer,V as analyzeCIMResource};
|
|
5
|
+
import e from"../../Color.js";import{getFontFamily as t}from"../../core/fontUtils.js";import{clone as i}from"../../core/lang.js";import r from"../../core/Logger.js";import{pt2px as o,px2pt as n}from"../../core/screenUtils.js";import{numericHash as a}from"../../core/string.js";import{createRendererExpression as s,ArcadeExpression as l}from"../../support/arcadeOnDemand.js";import{DEFAULT_PICTURE_FILL_HEIGHT as c,DEFAULT_HATCH_FILL_SEPARATION as m,DEFAULT_STROKE_WIDTH as f,DEFAULT_MARKER_SIZE as h,DEFAULT_TEXT_HEIGHT as u}from"./CIMSymbolDrawHelper.js";import{CIMSymbolHelper as p,OverrideHelper as y}from"./CIMSymbolHelper.js";import{Alignment as d,CapType as v,JoinType as _}from"./enums.js";import{quantizeIfNeeded as O}from"./quantizeTime.js";import{getExtent as S,getSDFMetrics as g}from"./SDFHelper.js";import{fromCIMColor as M,getTintColor as k,getValue as b,getFillColor as N,getStrokeColor as P,getStrokeWidth as z,isFeatureValueFn as L,fromCIMFontDecoration as C,fromCIMFontStyle as F,adjustTextCase as I,createLabelOverrideFunction as w,evaluateValueOrFunction as x,fromCIMHorizontalAlignment as A,fromCIMVerticalAlignment as R}from"./utils.js";import{CIMEffectHelper as X}from"./effects/CIMEffectHelper.js";import H from"../../views/2d/arcade/callExpressionWithFeature.js";import{RANDOM_INSIDE_POLYGON_TEXTURE_SIZE as J}from"../../views/2d/engine/webgl/definitions.js";import{getMaterialGroup as Y}from"../../views/2d/engine/webgl/grouping.js";const E=r.getLogger("esri.symbols.cim.cimAnalyzer");function T(e){switch(e){case"Butt":return v.BUTT;case"Square":return v.SQUARE;default:return v.ROUND}}function $(e){switch(e){case"Bevel":return _.BEVEL;case"Miter":return _.MITER;default:return _.ROUND}}function j(e){const t=e.markerPlacement;return t&&t.angleToLine?d.MAP:d.SCREEN}class G{constructor(e,t){this._cimLayers=[],this._poMap={},this._primitiveOverrides=[],this._resourceManager=e,this._info=t}async analyzeSymbolReference(e,t,i){if(this._cimLayers=i??[],!e)return this._cimLayers;if(e.primitiveOverrides){this._primitiveOverrides=e.primitiveOverrides,this._poMap={};const t=[],i=this._info;for(const e of this._primitiveOverrides){const r=e.valueExpressionInfo;if(r&&i){const o=r.expression,n=s(o,i.spatialReference,i.fields).then((t=>{null!=t&&this._setPoMap(e.primitiveName,e.propertyName,t)}));t.push(n)}else null!=e.value&&this._setPoMap(e.primitiveName,e.propertyName,e.value);t.length>0&&await Promise.all(t)}}const r=e.symbol,o=[];return p.fetchResources(r,this._resourceManager,o),o.length>0&&await Promise.all(o),this._analyzeSymbol(r,t),this._cimLayers}_analyzeSymbol(e,t){switch(e?.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":this._analyzeMultiLayerSymbol(e,t,1,0,0,0)}}_analyzeMultiLayerSymbol(e,t,i,r,o,n){const a=e?.symbolLayers;if(!a)return;const s=e.effects;let l=d.SCREEN;const c=p.getSize(e)??0;"CIMPointSymbol"===e.type&&"Map"===e.angleAlignment&&(l=d.MAP);const m="CIMPolygonSymbol"===e.type;let f=a.length;for(;f--;){const h=a[f];if(!h||!1===h.enable)continue;let u;s&&s.length&&(u=[...s]);const p=h.effects;p&&p.length&&(s?u.push(...p):u=[...p]);const d=[];let v;y.findEffectOverrides(u,this._primitiveOverrides,d),v=d.length>0?this._createEffectsOverrideFunction(u,d):u;const _=[];switch(y.findApplicableOverrides(h,this._primitiveOverrides,_),h.type){case"CIMSolidFill":this._analyzeSolidFill(h,v);break;case"CIMPictureFill":this._analyzePictureFill(h,v);break;case"CIMHatchFill":this._analyzeHatchFill(h,v);break;case"CIMGradientFill":this._analyzeGradientFill(h,v);break;case"CIMSolidStroke":this._analyzeSolidStroke(h,v,m,c);break;case"CIMPictureStroke":this._analyzePictureStroke(h,v,m,c);break;case"CIMGradientStroke":this._analyzeGradientStroke(h,v,m,c);break;case"CIMCharacterMarker":case"CIMPictureMarker":case"CIMVectorMarker":{"CIMLineSymbol"===e.type&&(l=j(h));const a=[],s=h.primitiveName;s&&a.push(s),this._analyzeMarker(h,v,null,a,l,c,1,t,i,r,o,n);break}default:E.error("Cannot analyze CIM layer",h.type)}}}_analyzeSolidFill(e,t){const i=e.primitiveName,r=M(e.color),[o,n]=this._analyzePrimitiveOverrides(i,t,null,null),s=a(JSON.stringify(e)+n).toString();this._cimLayers.push({type:"fill",templateHash:s,materialHash:o?()=>s:s,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,color:this._createOverrideFunction(i,"Color",r,U),height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,effects:t,applyRandomOffset:!1,sampleAlphaOnly:!0})}_analyzePictureFill(e,t){const i=e.primitiveName,r=k(e),[o,n]=this._analyzePrimitiveOverrides(i,t,null,null),s=a(JSON.stringify(e)+n).toString(),l=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),m=b(e.height,c);let f=b(e.scaleX,1);if("width"in e&&"number"==typeof e.width){const t=e.width;let i=1;const r=this._resourceManager.getResource(e.url);null!=r&&(i=r.width/r.height),f/=i*(m/t)}this._cimLayers.push({type:"fill",templateHash:s,materialHash:o?()=>l:l,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(i,"TintColor",r,U),height:this._createOverrideFunction(i,"Height",m),scaleX:this._createOverrideFunction(i,"ScaleX",f),angle:this._createOverrideFunction(i,"Rotation",b(e.rotation)),offsetX:this._createOverrideFunction(i,"OffsetX",b(e.offsetX)),offsetY:this._createOverrideFunction(i,"OffsetY",b(e.offsetY)),url:e.url,applyRandomOffset:!1,sampleAlphaOnly:!1})}_analyzeHatchFill(e,t){const i=e.primitiveName,r=this._analyzeMaterialOverrides(i,["Rotation","OffsetX","OffsetY"]);let[o,n]=this._analyzePrimitiveOverrides(i,t,null,null);const s=a(JSON.stringify(e)+n).toString(),l=a(`${e.separation}${JSON.stringify(e.lineSymbol)}`).toString();let c={r:255,g:255,b:255,a:1},f=!1;const h=e.lineSymbol?.symbolLayers?.find((e=>"CIMSolidStroke"===e.type&&null!=this._poMap[e.primitiveName]?.Color));if(h){c=M(h.color),c=this._createOverrideFunction(h.primitiveName,"Color",c,U);const e="function"==typeof c;o=o||e,f=null!=h.color||e}this._cimLayers.push({type:"fill",templateHash:s,materialHash:o&&r?this._createMaterialHashFunction(l,r):l,cim:e,materialOverrides:r,colorLocked:!!e.colorLocked,effects:t,color:c,height:this._createOverrideFunction(i,"Separation",b(e.separation,m)),scaleX:1,angle:this._createOverrideFunction(i,"Rotation",b(e.rotation)),offsetX:this._createOverrideFunction(i,"OffsetX",b(e.offsetX)),offsetY:this._createOverrideFunction(i,"OffsetY",b(e.offsetY)),applyRandomOffset:!1,sampleAlphaOnly:!0,hasUnresolvedReplacementColor:!f})}_analyzeGradientFill(e,t){const i=e.primitiveName,[r,o]=this._analyzePrimitiveOverrides(i,t,null,null),n=a(JSON.stringify(e)+o).toString();this._cimLayers.push({type:"fill",templateHash:n,materialHash:r?()=>n:n,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},height:0,angle:0,offsetX:0,offsetY:0,scaleX:1,applyRandomOffset:!1,sampleAlphaOnly:!1})}_analyzeSolidStroke(e,t,i,r){const o=e.primitiveName,n=M(e.color),s=b(e.width,f),l=T(e.capStyle),c=$(e.joinStyle),m=e.miterLimit,[h,u]=this._analyzePrimitiveOverrides(o,t,null,null),p=a(JSON.stringify(e)+u).toString();let y,d;if(t&&t instanceof Array&&t.length>0){const e=t[t.length-1];if("CIMGeometricEffectDashes"===e.type&&"NoConstraint"===e.lineDashEnding&&null===e.offsetAlongLine){const e=(t=[...t]).pop();y=e.dashTemplate,d=e.scaleDash}}this._cimLayers.push({type:"line",templateHash:p,materialHash:h?()=>p:p,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(o,"Color",n,U),width:this._createOverrideFunction(o,"Width",s),cap:this._createOverrideFunction(o,"CapStyle",l),join:this._createOverrideFunction(o,"JoinStyle",c),miterLimit:m&&this._createOverrideFunction(o,"MiterLimit",m),referenceWidth:r,zOrder:D(e.name),dashTemplate:y,scaleDash:d,sampleAlphaOnly:!0})}_analyzePictureStroke(e,t,i,r){const o=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}`).toString(),n=e.primitiveName,s=k(e),l=b(e.width,f),c=T(e.capStyle),m=$(e.joinStyle),h=e.miterLimit,[u,p]=this._analyzePrimitiveOverrides(n,t,null,null),y=a(JSON.stringify(e)+p).toString();this._cimLayers.push({type:"line",templateHash:y,materialHash:u?()=>o:o,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:this._createOverrideFunction(n,"TintColor",s,U),width:this._createOverrideFunction(n,"Width",l),cap:this._createOverrideFunction(n,"CapStyle",c),join:this._createOverrideFunction(n,"JoinStyle",m),miterLimit:h&&this._createOverrideFunction(n,"MiterLimit",h),referenceWidth:r,zOrder:D(e.name),dashTemplate:null,scaleDash:!1,url:e.url,sampleAlphaOnly:!1})}_analyzeGradientStroke(e,t,i,r){const o=e.primitiveName,n=b(e.width,f),s=T(e.capStyle),l=$(e.joinStyle),c=e.miterLimit,[m,h]=this._analyzePrimitiveOverrides(o,t,null,null),u=a(JSON.stringify(e)+h).toString();this._cimLayers.push({type:"line",templateHash:u,materialHash:m?()=>u:u,cim:e,materialOverrides:null,isOutline:i,colorLocked:!!e.colorLocked,effects:t,color:{r:128,g:128,b:128,a:1},width:this._createOverrideFunction(o,"Width",n),cap:this._createOverrideFunction(o,"CapStyle",s),join:this._createOverrideFunction(o,"JoinStyle",l),miterLimit:c&&this._createOverrideFunction(o,"MiterLimit",c),referenceWidth:r,zOrder:D(e.name),dashTemplate:null,scaleDash:!1,sampleAlphaOnly:!1})}_analyzeMarker(e,t,i,r,o,n,a,s,l,c,m,f,u=!1){if(this._analyzeMarkerInsidePolygon(e,t))return;const p=b(e.size,h),y=b(e.rotation),d=b(e.offsetX),v=b(e.offsetY);let _=this._createOverrideFunction(e.primitiveName,"Size",p),O=this._createOverrideFunction(e.primitiveName,"Rotation",y),S=this._createOverrideFunction(e.primitiveName,"OffsetX",d),g=this._createOverrideFunction(e.primitiveName,"OffsetY",v);_=this._transformSize(_,a),O=this._transformRotation(O,!!e.rotateClockwise,c);const M=this._transformOffsetX(S,g,c,a,m),k=this._transformOffsetY(S,g,c,a,f);switch(S=M,g=k,e.type){case"CIMPictureMarker":this._analyzePictureMarker(e,t,i,r,o,n,_,O,S,g,e.colorLocked||u);break;case"CIMVectorMarker":this._analyzeVectorMarker(e,t,i,r,o,n,a,s,_,O,S,g,e.colorLocked||u)}}_analyzeMarkerInsidePolygon(e,t){const{markerPlacement:i,type:r}=e;if(!i||"CIMMarkerPlacementInsidePolygon"!==i.type)return!1;if("CIMVectorMarker"===r||"CIMPictureMarker"===r){const o=e.primitiveName;if(o){const[e,i]=this._analyzePrimitiveOverrides([o],t,null,null);if(e)return!1}const n=i.primitiveName;if(n){const[e,i]=this._analyzePrimitiveOverrides([n],t,null,null);if(e)return!1}if("CIMVectorMarker"===r){const{markerGraphics:t}=e;if(t)for(const e of t){const{symbol:t}=e;if("CIMPolygonSymbol"===t?.type&&t.symbolLayers){const{symbolLayers:e}=t;for(const t of e)if("CIMSolidStroke"===t.type)return!1}}}else{const{animatedSymbolProperties:t}=e;if(t)return!1}}const o=i,s=Math.abs(o.stepX),l=Math.abs(o.stepY);if(0===s||0===l)return!0;const c=["Rotation","OffsetX","OffsetY"],m=this._primitiveOverrides.filter((t=>t.primitiveName!==e.primitiveName||!c.includes(t.propertyName))),f="url"in e&&"string"==typeof e.url?e.url:void 0,h=a(JSON.stringify(e)).toString();let u,p,y=null;if("Random"===i.gridType){const e=n(J),t=Math.max(Math.floor(e/s),1),i=Math.max(Math.floor(e/l),1);u=l*i,y=e=>e?e*i:0;p=t*s/u}else i.shiftOddRows?(u=2*l,y=e=>e?2*e:0,p=s/l*.5):(u=l,y=null,p=s/l);const d=k(e);return this._cimLayers.push({type:"fill",templateHash:h,materialHash:h,cim:e,materialOverrides:m,colorLocked:!!e.colorLocked,effects:t,color:d,height:this._createOverrideFunction(o.primitiveName,"StepY",u,y),scaleX:p,angle:o.gridAngle,offsetX:b(o.offsetX),offsetY:b(o.offsetY),url:f,applyRandomOffset:"Random"===i.gridType,sampleAlphaOnly:!f,hasUnresolvedReplacementColor:!0}),!0}_analyzePictureMarker(e,t,i,r,o,n,s,l,c,m,f){let h=b(e.scaleX,1);const u=k(e),p=a(`${e.url}${JSON.stringify(e.colorSubstitutions)}${JSON.stringify(e.animatedSymbolProperties)}`).toString();i||(i=this._createMarkerPlacementOverrideFunction(e.markerPlacement));const y=this._createAnimatedSymbolPropertiesOverrideFunction(e.animatedSymbolProperties),[d,v]=this._analyzePrimitiveOverrides(r,t,i,y),_=a(JSON.stringify(e)+v).toString(),O=e.anchorPoint??{x:0,y:0};if("width"in e&&"number"==typeof e.width){const t=e.width;let i=1;const r=this._resourceManager.getResource(e.url);null!=r&&(i=r.width/r.height);h/=i*(b(e.size)/t)}function S(e,t){return null!=y?x(y,e,t):null}const g=e.animatedSymbolProperties&&!0===e.animatedSymbolProperties.randomizeStartTime?(e,t,i,r)=>{const o=Y(r??0),n=S(e,t);return p+`-MATERIALGROUP(${o})`+`-ASP(${JSON.stringify(n)})`}:d?(e,t)=>{const i=S(e,t);return p+`-ASP(${JSON.stringify(i)})`}:p;this._cimLayers.push({type:"marker",templateHash:_,materialHash:g,cim:e,materialOverrides:null,colorLocked:!!e.colorLocked||!!f,effects:t,scaleSymbolsProportionally:!1,alignment:o,size:s,scaleX:this._createOverrideFunction(e.primitiveName,"ScaleX",h),rotation:l,offsetX:c,offsetY:m,color:this._createOverrideFunction(e.primitiveName,"TintColor",u,U),anchorPoint:{x:O.x,y:O.y},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,frameHeight:0,rotateClockwise:!1,referenceSize:n,sizeRatio:1,markerPlacement:i,url:e.url,animatedSymbolProperties:y})}_analyzeVectorMarker(e,t,i,r,o,n,a,s,l,c,m,f,h){const u=e.markerGraphics;if(!u)return;const p=e.frame;let y=0,d=1;e.scaleSymbolsProportionally&&p&&(y=p.ymax-p.ymin,d=this._transformSize(l,1/y)),d=this._transformSize(d,a),i||(i=this._createMarkerPlacementOverrideFunction(e.markerPlacement));for(const v of u)if(v){const a=v.symbol;if(!a)continue;const u=v.primitiveName;u&&r.push(u);let _=m,O=f;if(("CIMPointSymbol"===a.type||"CIMTextSymbol"===a.type)&&p){let t=0,i=0;const r=v.geometry;"x"in r&&"y"in r&&(t+=r.x-.5*(p.xmin+p.xmax),i+=r.y-.5*(p.ymin+p.ymax));const o=e.anchorPoint;o&&("Absolute"===e.anchorPointUnits?(t-=o.x,i-=o.y):p&&(t-=(p.xmax-p.xmin)*o.x,i-=(p.ymax-p.ymin)*o.y)),_=this._transformOffsetX(t,i,c,d,m),O=this._transformOffsetY(t,i,c,d,f)}switch(a.type){case"CIMPointSymbol":case"CIMLineSymbol":case"CIMPolygonSymbol":s?this._analyzeMultiLayerGraphicNonSDF(e,t,i,null,v,r,o,n,y,!!h||!!e.colorLocked):this._analyzeMultiLayerGraphic(e,t,i,null,v,r,o,n,y,d,l,c,_,O,!!h||!!e.colorLocked);break;case"CIMTextSymbol":this._analyzeTextGraphic(e,t,i,v,r,o,n,y,d,l,c,_,O,!!h||!!e.colorLocked)}u&&r.pop()}}_analyzeMultiLayerGraphic(e,t,i,r,o,n,s,l,c,m,f,h,u,p,y){const d=o.symbol,v=d.symbolLayers;if(!v)return;let _=v.length;if(B(v))return void this._analyzeCompositeMarkerGraphic(e,t,i,r,o,v,n,s,l,c,f,h,u,p,!!y||!!e.colorLocked);const O=this._resourceManager.geometryEngine,k=X.applyEffects(d.effects,o.geometry,O);if(k)for(;_--;){const d=v[_];if(!d||!1===d.enable)continue;const b=d.primitiveName;switch(b&&n.push(b),d.type){case"CIMSolidFill":case"CIMSolidStroke":{const m=X.applyEffects(d.effects,k,O),v=S(m);if(!v)continue;const _="Relative"!==e.anchorPointUnits,[C,F,I]=g(v,e.frame,e.size,e.anchorPoint,_),w="CIMSolidFill"===d.type,x={type:"sdf",geom:m,asFill:w},A=d.path,R=M(w?N(d):P(d)),H=w?{r:0,g:0,b:0,a:0}:M(P(d)),J=z(d)??0;if(!w&&!J)break;const Y=o.primitiveName;let E=null;w&&!d.colorLocked&&(E=this._createOverrideFunction(Y,"FillColor",R,U));let T=null;w||d.colorLocked||(T=this._createOverrideFunction(Y,"StrokeColor",H,U));const $=this._createOverrideFunction(Y,"StrokeWidth",J);let j=!1,G="";for(const e of this._primitiveOverrides)n.includes(e.primitiveName)&&(null!=e.value?G+=`-${e.primitiveName}-${e.propertyName}-${JSON.stringify(e.value)}`:e.valueExpressionInfo&&(j=!0));(null!=t&&"function"==typeof t||null!=i&&"function"==typeof i)&&(j=!0),(L(f)||L(h)||L(u)||L(p))&&(j=!0);const D=JSON.stringify({...e,markerGraphics:null}),W=a(JSON.stringify(x)+A).toString(),V=a(JSON.stringify(o)+JSON.stringify(d)+D+G).toString();this._cimLayers.push({type:"marker",templateHash:V,materialHash:j?()=>W:W,cim:x,materialOverrides:null,colorLocked:!!d.colorLocked||!!y,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:s,anchorPoint:{x:F,y:I},isAbsoluteAnchorPoint:_,size:f,rotation:h,offsetX:u,offsetY:p,scaleX:1,frameHeight:c,rotateClockwise:!1,referenceSize:l,sizeRatio:C,color:L(E)?E:this._createOverrideFunction(b,"Color",R,U),outlineColor:L(T)?T:this._createOverrideFunction(b,"Color",H,U),outlineWidth:L($)?$:this._createOverrideFunction(b,"Width",J),markerPlacement:i,animatedSymbolProperties:r,path:A});break}case"CIMVectorMarker":d.markerPlacement?this._analyzeMultiLayerGraphicNonSDF(e,t,i,r,o,n,s,l,c,!!y||!!d.colorLocked):this._analyzeMarker(d,t,i,n,s,l,m,!1,f,h,u,p,!!y||!!e.colorLocked);break;default:this._analyzeMultiLayerGraphicNonSDF(e,t,i,r,o,n,s,l,c,!!y||!!e.colorLocked)}b&&n.pop()}}_analyzeTextGraphic(e,i,r,o,n,s,l,c,m,h,p,d,v,_){const O=[];y.findApplicableOverrides(o,this._primitiveOverrides,O);const S=o.geometry;if(!("x"in S)||!("y"in S))return;const g=o.symbol,k=C(g),X=F(g.fontStyleName),H=t(g.fontFamilyName);g.font={family:H,decoration:k,...X};let J=b(g.height,u),Y=b(g.angle),E=b(g.offsetX),T=b(g.offsetY);J=this._transformSize(J,m),Y=this._transformRotation(Y,!1,p);const $=this._transformOffsetX(E,T,p,m,d),j=this._transformOffsetY(E,T,p,m,v);E=$,T=j;const G=M(N(g));let D=M(P(g)),W=z(g)??0;W||(D=M(N(g.haloSymbol)),W=b(g.haloSize)),W=this._transformSize(W,m);let V=!1;if(g.symbol?.symbolLayers)for(const t of g.symbol.symbolLayers){null!=N(t)&&(V=!!t.colorLocked)}const B=o.primitiveName;let q=null;V||(q=this._createOverrideFunction(B,"Color",G,U));let K=null,Q=null,Z=0;if(g.callout&&"CIMBackgroundCallout"===g.callout.type){const e=g.callout;if(e.backgroundSymbol){const t=e.backgroundSymbol.symbolLayers;if(t)for(const e of t)"CIMSolidFill"===e.type?K=M(e.color):"CIMSolidStroke"===e.type&&(Q=M(e.color),Z=b(e.width,f))}}const[ee,te]=this._analyzePrimitiveOverrides(n,i,r,null),ie=JSON.stringify(e.effects)+Number(e.colorLocked||_).toString()+JSON.stringify(e.anchorPoint)+e.anchorPointUnits+JSON.stringify(e.markerPlacement)+e.size.toString(),re=a(JSON.stringify(o)+ie+te).toString();let oe=this._createOverrideFunction(o.primitiveName,"TextString",o.textString??"",I,g.textCase);if(null==oe)return;const{fontStyleName:ne}=g,ae=H+(ne?"-"+ne.toLowerCase():"-regular"),se=ae;"string"==typeof oe&&oe.includes("[")&&g.fieldMap&&(oe=w(g.fieldMap,oe,g.textCase)),this._cimLayers.push({type:"text",templateHash:re,materialHash:ee||"function"==typeof oe||/\[(.*?)\]/.test(oe)?(e,t,i)=>se+"-"+x(oe,e,t,i):se+"-"+a(oe),cim:g,materialOverrides:null,colorLocked:!!_||!!V,effects:i,alignment:s,anchorPoint:{x:0,y:0},isAbsoluteAnchorPoint:"Relative"!==e.anchorPointUnits,fontName:ae,decoration:k,weight:X.weight,style:X.style,size:J,angle:Y,offsetX:E,offsetY:T,horizontalAlignment:A(g.horizontalAlignment),verticalAlignment:R(g.verticalAlignment),text:oe,color:L(q)?q:G,outlineColor:D,outlineSize:W,backgroundColor:K,borderLineColor:Q,borderLineWidth:Z,referenceSize:l,sizeRatio:1,markerPlacement:r})}_analyzeMultiLayerGraphicNonSDF(e,t,i,r,n,s,l,c,m,f){const u=this._buildSimpleMarker(e,n),y=e.primitiveName,d=this._analyzeMaterialOverrides(y,["Rotation","OffsetX","OffsetY"]),[v,_]=this._analyzePrimitiveOverrides(s,null,null,null),[O,S,g]=p.getTextureAnchor(u,this._resourceManager),M=b(e.rotation),k=b(e.offsetX),N=b(e.offsetY),P=a(JSON.stringify(u)+_).toString(),z=d&&d.length>0||null!=t&&"function"==typeof t;this._cimLayers.push({type:"marker",templateHash:P,materialHash:z&&d?this._createMaterialHashFunction(P,d):P,cim:u,materialOverrides:d,colorLocked:!!e.colorLocked||!!f,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:l,anchorPoint:{x:O,y:S},isAbsoluteAnchorPoint:!1,size:b(e.size,h),rotation:this._createOverrideFunction(y,"Rotation",M),offsetX:this._createOverrideFunction(y,"OffsetX",k),offsetY:this._createOverrideFunction(y,"OffsetY",N),color:{r:255,g:255,b:255,a:1},outlineColor:{r:0,g:0,b:0,a:0},outlineWidth:0,scaleX:1,frameHeight:m,rotateClockwise:!!e.rotateClockwise,referenceSize:c,sizeRatio:g/o(e.size),markerPlacement:i,animatedSymbolProperties:r,avoidSDFRasterization:!0})}_buildSimpleMarker(e,t){return{type:e.type,enable:!0,name:e.name,colorLocked:e.colorLocked,primitiveName:e.primitiveName,anchorPoint:e.anchorPoint,anchorPointUnits:e.anchorPointUnits,offsetX:0,offsetY:0,rotateClockwise:e.rotateClockwise,rotation:0,size:e.size,billboardMode3D:e.billboardMode3D,depth3D:e.depth3D,frame:e.frame,markerGraphics:[t],scaleSymbolsProportionally:e.scaleSymbolsProportionally,respectFrame:e.respectFrame,clippingPath:e.clippingPath}}_analyzeCompositeMarkerGraphic(e,t,i,r,o,n,s,l,c,m,h,u,p,y,d){const v=o.geometry,_=n[0],O=n[1],k=S(v);if(!k)return;const N="Relative"!==e.anchorPointUnits,[P,z,C]=g(k,e.frame,e.size,e.anchorPoint,N),F={type:"sdf",geom:v,asFill:!0},I=O.path,w=O.primitiveName,x=_.primitiveName,A=M(O.color),R=M(_.color),X=b(_.width,f),H=o.primitiveName;let J=null;O.colorLocked||d||(J=this._createOverrideFunction(H,"FillColor",A,U));let Y=null;_.colorLocked||d||(Y=this._createOverrideFunction(H,"StrokeColor",R,U));const E=this._createOverrideFunction(H,"StrokeWidth",X);let T=!1,$="";for(const a of this._primitiveOverrides)(a.primitiveName===w||a.primitiveName===x||s.includes(a.primitiveName))&&(null!=a.value?$+=`-${a.primitiveName}-${a.propertyName}-${JSON.stringify(a.value)}`:a.valueExpressionInfo&&(T=!0));null!=i&&"function"==typeof i&&(T=!0),(L(h)||L(u)||L(p)||L(y))&&(T=!0);const j=JSON.stringify({...e,markerGraphics:null}),G=a(JSON.stringify(F)+I).toString(),D=a(JSON.stringify(o)+JSON.stringify(O)+JSON.stringify(_)+j+$).toString();this._cimLayers.push({type:"marker",templateHash:D,materialHash:T?()=>G:G,cim:F,materialOverrides:null,colorLocked:!!d,effects:t,scaleSymbolsProportionally:!!e.scaleSymbolsProportionally,alignment:l,anchorPoint:{x:z,y:C},isAbsoluteAnchorPoint:N,size:h,rotation:u,offsetX:p,offsetY:y,scaleX:1,frameHeight:m,rotateClockwise:!1,referenceSize:c,sizeRatio:P,color:L(J)?J:this._createOverrideFunction(w,"Color",A,U),outlineColor:L(Y)?Y:this._createOverrideFunction(x,"Color",R,U),outlineWidth:L(E)?E:this._createOverrideFunction(x,"Width",X),markerPlacement:i,path:I,animatedSymbolProperties:r})}_createMaterialHashFunction(e,t){const i=this._info?.geometryType;if(i){const e=this._poMap;for(const r of t){if(r.valueExpressionInfo){const t=e[r.primitiveName]&&e[r.primitiveName][r.propertyName];t instanceof l&&(r.fn=(e,r,o)=>H(t,e,{$view:o},i,r))}}}return(i,r,o)=>{for(const e of t)e.fn&&(e.value=e.fn(i,r,o));return a(e+y.buildOverrideKey(t)).toString()}}_setPoMap(e,t,i){let r;this._poMap[e]?r=this._poMap[e]:(r={},this._poMap[e]=r),r[t]=i}_createOverrideFunction(e,t,i,r,o){if(null==e)return i;const n=this._poMap[e];if(null==n)return i;const a=n[t];if("string"==typeof a||"number"==typeof a||a instanceof Array)return r?r.call(null,a,o):a;const s=this._info?.geometryType;return null!=a&&a instanceof l&&null!=s?(e,t,n)=>{let l=H(a,e,{$view:n},s,t);return null!==l&&r&&(l=r.call(null,l,o)),null!==l?l:i}:i}_createEffectsOverrideFunction(e,t){const r=this._poMap,o=this._info?.geometryType;for(const i of t){if(i.valueExpressionInfo&&o){const e=r[i.primitiveName]&&r[i.primitiveName][i.propertyName];e instanceof l&&(i.fn=(t,i,r)=>H(e,t,{$view:r},o,i))}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=[];for(let s of e){const e=s?.primitiveName;if(e){let r=!1;for(const o of t)if(o.primitiveName===e){const e=W(o.propertyName);null!=o.value&&o.value!==s[e]&&(r||(s=i(s),r=!0),s[e]=o.value)}}a.push(s)}return a}}_createMarkerPlacementOverrideFunction(e){const t=[];if(y.findApplicableOverrides(e,this._primitiveOverrides,t),null==e||0===t.length)return e;const r=this._poMap,o=this._info?.geometryType;for(const i of t){if(i.valueExpressionInfo&&o){const e=r[i.primitiveName]&&r[i.primitiveName][i.propertyName];e instanceof l&&(i.fn=(t,i,r)=>H(e,t,{$view:r},o,i))}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=i(e),s=e.primitiveName;for(const e of t)if(e.primitiveName===s){const t=W(e.propertyName);null!=e.value&&e.value!==a[t]&&(a[t]=e.value)}return a}}_createAnimatedSymbolPropertiesOverrideFunction(e){const t=[];if(y.findApplicableOverrides(e,this._primitiveOverrides,t),null==e||0===t.length)return e;const r=this._info?.geometryType;if(r){const e=this._poMap;for(const i of t){if(i.valueExpressionInfo){const t=e[i.primitiveName]&&e[i.primitiveName][i.propertyName];t instanceof l&&(i.fn=(e,i,o)=>H(t,e,{$view:o},r,i))}}}return(r,o,n)=>{for(const e of t)e.fn&&(e.value=e.fn(r,o,n));const a=i(e),s=e.primitiveName;for(const e of t)if(e.primitiveName===s){const t=W(e.propertyName);if(null!=e.value){const i=O(e.value,e.propertyName);i!==a[t]&&(a[t]=i)}}return a}}_analyzePrimitiveOverrides(e,t,i,r){let o=!1,n="";"string"==typeof e&&(e=[e]);for(const a of this._primitiveOverrides)e?.includes(a.primitiveName)&&(null!=a.value?n+=`-${a.primitiveName}-${a.propertyName}-${JSON.stringify(a.value)}`:a.valueExpressionInfo&&(o=!0));return null!=t&&"function"==typeof t&&(o=!0),null!=i&&"function"==typeof i&&(o=!0),null!=r&&"function"==typeof r&&(o=!0),[o,n]}_analyzeMaterialOverrides(e,t){return this._primitiveOverrides.filter((i=>i.primitiveName!==e||!t.includes(i.propertyName)))}_transformSize(e,t){return L(e)||L(t)?(i,r,o)=>(L(e)?e(i,r,o):e)*(L(t)?t(i,r,o):t):e*t}_transformRotation(e,t,i){return L(e)||L(i)?(r,o,n)=>{const a=L(e)?e(r,o,n):e,s=L(i)?i(r,o,n):i;return t?s-a:s+a}:t?i-e:i+e}_transformOffsetX(e,t,i,r,o){if(!(L(e)||L(t)||L(i)||L(r)||L(o))){const n=i*Math.PI/180;if(n){const i=Math.cos(n),a=Math.sin(n);return(i*e-a*t)*r+o}return e*r+o}return(n,a,s)=>{let l=L(i)?i(n,a,s):i;const c=L(r)?r(n,a,s):r,m=L(e)?e(n,a,s):e,f=L(o)?o(n,a,s):o;if(l){l*=Math.PI/180;return(Math.cos(l)*m-Math.sin(l)*(L(t)?t(n,a,s):t))*c+f}return m*c+f}}_transformOffsetY(e,t,i,r,o){if(!(L(e)||L(t)||L(i)||L(r)||L(o))){const n=i*Math.PI/180;if(n){const i=Math.cos(n);return(Math.sin(n)*e+i*t)*r+o}return t*r+o}return(n,a,s)=>{let l=L(i)?i(n,a,s):i;const c=L(r)?r(n,a,s):r,m=L(t)?t(n,a,s):t,f=L(o)?o(n,a,s):o;if(l){l*=Math.PI/180;const t=Math.cos(l);return(Math.sin(l)*(L(e)?e(n,a,s):e)+t*m)*c+f}return m*c+f}}}function D(e){if(e&&0===e.indexOf("Level_")){const t=parseInt(e.substr(6),10);if(!isNaN(t))return t}return 0}function U(t){if(!t||0===t.length)return null;const i=new e(t).toRgba();return{r:i[0],g:i[1],b:i[2],a:i[3]}}function W(e){return e?e.charAt(0).toLowerCase()+e.substr(1):e}function V(e,t){if(!t||0===t.length)return e;const r=i(e);return y.applyOverrides(r,t),r}const B=e=>e&&2===e.length&&e[0].enable&&e[1].enable&&"CIMSolidStroke"===e[0].type&&"CIMSolidFill"===e[1].type&&!e[0].effects&&!e[1].effects;export{G as CIMAnalyzer,V as analyzeCIMResource};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
|
|
3
3
|
See https://js.arcgis.com/4.28/esri/copyright.txt for details.
|
|
4
4
|
*/
|
|
5
|
-
import{GeometryCursor as t}from"../../../geometry/GeometryCursor.js";import{collectPath as e}from"../../../geometry/geometryCursorCollectUtils.js";import{PathEffectCursor as r}from"../CIMCursor.js";import{CurveHelper as n,PIXEL_TOLERANCE as o}from"../CurveHelper.js";import{GeometricEffectArrowType as s,GeometricEffectOffsetMethod as i}from"../enums.js";const c=1.7320508075688772,u=5,h=s.OpenEnded;class P{static local(){return null===P.instance&&(P.instance=new P),P.instance}execute(t,e,r,n,o){return new
|
|
5
|
+
import{GeometryCursor as t}from"../../../geometry/GeometryCursor.js";import{collectPath as e}from"../../../geometry/geometryCursorCollectUtils.js";import{PathEffectCursor as r}from"../CIMCursor.js";import{CurveHelper as n,PIXEL_TOLERANCE as o}from"../CurveHelper.js";import{GeometricEffectArrowType as s,GeometricEffectOffsetMethod as i}from"../enums.js";const c=1.7320508075688772,u=5,h=s.OpenEnded;class P{static local(){return null===P.instance&&(P.instance=new P),P.instance}execute(t,e,r,n,o){return new l(t,e,r)}}P.instance=null;class l extends r{constructor(t,e,r){super(t,!1,!0),this._curveHelper=new n,this._width=(void 0!==e.width?e.width:u)*r,this._arrowType=void 0!==e.geometricEffectArrowType?e.geometricEffectArrowType:void 0!==e.arrowType?e.arrowType:h,this._offsetFlattenError=o*r}processPath(e){const r=t.createEmptyOptimizedCIM(e.geometryType);switch(this._arrowType){case s.OpenEnded:default:this._constructSimpleArrow(r,e,!0);break;case s.Block:this._constructSimpleArrow(r,e,!1);break;case s.Crossed:this._constructCrossedArrow(r,e)}return r}_constructSimpleArrow(t,r,n){const o=r.pathLength();let s=this._width;o<2*s&&(s=o/2);const i=this._curveHelper.getSubCurve(r,0,o-s);if(!i||!i.nextPath())return;i.seekPathStart();const c=s/2;if(this._curveHelper.isEmpty(i))return;const u=e(i),h=this._constructOffset(u,-c);if(!h)return;const P=this._constructOffset(u,c);if(!P)return;const l=this._constructArrowBasePoint(h,-c/2);if(!l)return;const p=this._constructArrowBasePoint(P,c/2);if(!p)return;r.seekInPath(r.numPoints-1);const f=[r.x,r.y];t.pushPath(P),t.nextPath(),t.nextPoint(),t.setControlPoint(),t.pushPoint(p),t.nextPoint(),t.setControlPoint(),t.pushPoint(f),t.nextPoint(),t.setControlPoint(),t.pushPoint(l),t.nextPoint(),t.setControlPoint(),t.pushPoints(h.reverse()),t.setControlPoint(),n||(t.setControlPointAt(0),t.setControlPointAt(t.numPoints-1),t.pushPoint(P[0])),t.reset()}_constructCrossedArrow(t,r){const n=r.pathLength();let o=this._width;n<o*(1+c+1)&&(o=n/(1+c+1)),r.seekPathStart();const s=this._curveHelper.getSubCurve(r,0,n-o*(1+c));if(!s)return;s.nextPath();const i=o/2;if(this._curveHelper.isEmpty(s))return;const u=e(s),h=this._constructOffset(u,i);if(!h)return;const P=this._constructOffset(u,-i);if(!P)return;const l=this._curveHelper.getSubCurve(r,0,n-o);if(!l)return;if(l.nextPath(),this._curveHelper.isEmpty(l))return;const p=e(l),f=this._constructOffset(p,i);if(!f)return;const a=this._constructOffset(p,-i);if(!a)return;const _=f[f.length-1],m=this._constructArrowBasePoint(f,i/2);if(!m)return;const C=a[a.length-1],w=this._constructArrowBasePoint(a,-i/2);if(!w)return;r.seekInPath(r.numPoints-1);const x=[r.x,r.y];t.pushPath(h),t.nextPath(),t.nextPoint(),t.setControlPoint(),t.pushPoint(C),t.nextPoint(),t.setControlPoint(),t.pushPoint(w),t.nextPoint(),t.setControlPoint(),t.pushPoint(x),t.nextPoint(),t.setControlPoint(),t.pushPoint(m),t.nextPoint(),t.setControlPoint(),t.pushPoint(_),t.nextPoint(),t.setControlPoint(),t.pushPoints(P.reverse()),t.nextPoint(),t.setControlPoint(),t.reset()}_constructOffset(t,e){return this._curveHelper.offset(t,e,i.Rounded,4,this._offsetFlattenError)}_constructArrowBasePoint(t,e){if(!t||t.length<2)return null;const r=t[t.length-2],n=t[t.length-1],o=[n[0]-r[0],n[1]-r[1]];return this._curveHelper.normalize(o),[n[0]+o[1]*e,n[1]-o[0]*e]}}export{P as EffectArrow};
|