@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.1 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{GeometryCursor as t}from"../../../geometry/GeometryCursor.js";import{collectPath as e}from"../../../geometry/geometryCursorCollectUtils.js";import{PathEffectCursor as s}from"../CIMCursor.js";import{LineDashEnding as i}from"../enums.js";import{GeometryWalker as r,DashPattern as a}from"../GeometryWalker.js";import{normalizeDashEffectTemplate as n}from"../utils.js";class h{static{this.instance=null}static local(){return null===h.instance&&(h.instance=new h),h.instance}execute(t,e,s,i,r){return new l(t,e,s)}}class l extends s{constructor(t,e,s){super(t,!0,!0),this._firstCurve=null,this._walker=new r,this._walker.updateTolerance(s),this._endings=e.lineDashEnding,this._customDashPos=-(e.offsetAlongLine??0)*s,this._offsetAtEnd=(e.customEndingOffset??0)*s;let i=n(e).dashTemplate;null==i&&(i=[]),i.length%2&&(i=[...i,...i]),this._pattern=new a,this._pattern.init(i,!0),this._pattern.scale(s)}processPath(s){if(0===this._pattern.length()){this.iteratePath=!1;const i=e(s);return t.fromJSONCIM({paths:[i]})}if(!this.iteratePath){let r=!0;switch(this._endings){case i.HalfPattern:case i.HalfGap:default:this._pattern.extPtGap=0;break;case i.FullPattern:this.isClosed||(this._pattern.extPtGap=.5*this._pattern.firstValue());break;case i.FullGap:this.isClosed||(this._pattern.extPtGap=.5*this._pattern.lastValue());break;case i.NoConstraint:this.isClosed||(r=!1);break;case i.Custom:this.isClosed||(this._pattern.extPtGap=.5*this._offsetAtEnd)}const a=s.pathLength();if(this._pattern.isEmpty()||a<.1*this._pattern.length()){const i=e(s);return t.fromJSONCIM({paths:[i]})}if(!this._walker.init(s,this._pattern,r)){const i=e(s);return t.fromJSONCIM({paths:[i]})}}let r;if(this.iteratePath)r=this._pattern.nextValue();else{let t;switch(this._endings){case i.HalfPattern:default:t=.5*this._pattern.firstValue();break;case i.HalfGap:t=.5*-this._pattern.lastValue();break;case i.FullGap:t=-this._pattern.lastValue();break;case i.FullPattern:t=0;break;case i.NoConstraint:case i.Custom:t=-this._customDashPos}let e=t/this._pattern.length();e-=Math.floor(e),t=e*this._pattern.length(),this._pattern.reset(),r=this._pattern.nextValue();let s=!1;for(;t>=r;)t-=r,r=this._pattern.nextValue(),s=!s;r-=t,s?(this._walker.nextPosition(r),r=this._pattern.nextValue()):this.isClosed&&(this._firstCurve=this._walker.nextCurve(r),r=this._pattern.nextValue(),this._walker.nextPosition(r),r=this._pattern.nextValue())}let a=this._walker.nextCurve(r);if(a)if(this._walker.isPathEnd()){if(this.iteratePath=!1,this._firstCurve){for(this._firstCurve.nextPath();this._firstCurve.nextPoint();)a.pushXY(this._firstCurve.x,this._firstCurve.y);this._firstCurve=null}}else r=this._pattern.nextValue(),!this._walker.nextPosition(r)||this._walker.isPathEnd()?(this.iteratePath=!1,this._firstCurve&&(a.pushCursor(this._firstCurve),this._firstCurve=null)):this.iteratePath=!0;else this.iteratePath=!1,a=this._firstCurve,this._firstCurve=null;return a?.reset(),a}}export{h as EffectDashes};