ue-too
Version:
pan, zoom, and rotate your html canvas
3 lines (2 loc) • 5.71 kB
JavaScript
class Observable{constructor(){this.observers=[]}subscribe(observer,options){if(this.observers.push(observer),null==options?void 0:options.signal){if(options.signal.aborted)return this.observers=this.observers.filter((o=>o!==observer)),()=>{};const abortHandler=()=>{var _a;this.observers=this.observers.filter((o=>o!==observer)),null===(_a=options.signal)||void 0===_a||_a.removeEventListener("abort",abortHandler)};options.signal.addEventListener("abort",abortHandler)}return()=>{this.observers=this.observers.filter((o=>o!==observer))}}notify(...data){this.observers.forEach((observer=>queueMicrotask((()=>observer(...data)))))}}class CameraPositionUpdateBatcher{constructor(){this.nextPosition=null,this.delta={x:0,y:0},this.queuePositionUpdateCount=0,this.queuePositionUpdateToCount=0,this.queuePositionUpdateByCount=0,this.lastUpdateCount=0,this.observable=new Observable}queuePositionUpdate(x,y){this.queuePositionUpdateCount++,this.queuePositionUpdateTo({x:x,y:y})}queuePositionUpdateTo(destination){this.queuePositionUpdateToCount++,this.nextPosition=Object.assign({},destination),this.delta={x:0,y:0}}queuePositionUpdateBy(delta){this.queuePositionUpdateByCount++,null===this.nextPosition?this.delta={x:this.delta.x+delta.x,y:this.delta.y+delta.y}:this.nextPosition={x:this.nextPosition.x+delta.x,y:this.nextPosition.y+delta.y}}processQueuedUpdates(){if(this.lastUpdateCount=this.queuePositionUpdateCount+this.queuePositionUpdateToCount+this.queuePositionUpdateByCount,this.queuePositionUpdateCount=0,this.queuePositionUpdateToCount=0,this.queuePositionUpdateByCount=0,null!==this.nextPosition){const update=Object.assign(Object.assign({},this.nextPosition),{type:"destination"});return this.nextPosition=null,this.delta={x:0,y:0},this.observable.notify(update),update}if(0!==this.delta.x||0!==this.delta.y){const update=Object.assign(Object.assign({},this.delta),{type:"delta"});return this.delta={x:0,y:0},this.observable.notify(update),update}return null}subscribe(observer,options){return this.observable.subscribe(observer,options)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queuePositionUpdateCalls:this.queuePositionUpdateCount,queuePositionUpdateToCalls:this.queuePositionUpdateToCount,queuePositionUpdateByCalls:this.queuePositionUpdateByCount}}}class CameraRotationUpdateBatcher{constructor(){this.nextRotation=null,this.delta=0,this.queueRotationUpdateCount=0,this.queueRotationUpdateToCount=0,this.queueRotationUpdateByCount=0,this.lastUpdateCount=0,this.observable=new Observable}queueRotationUpdate(rotation){this.queueRotationUpdateCount++,this.queueRotationUpdateTo(rotation)}queueRotationUpdateTo(destination){this.queueRotationUpdateToCount++,this.nextRotation=destination,this.delta=0}queueRotationUpdateBy(delta){this.queueRotationUpdateByCount++,null===this.nextRotation?this.delta=this.delta+delta:this.nextRotation=this.nextRotation+delta}processQueuedUpdates(){if(this.lastUpdateCount=this.queueRotationUpdateCount+this.queueRotationUpdateToCount+this.queueRotationUpdateByCount,this.queueRotationUpdateCount=0,this.queueRotationUpdateToCount=0,this.queueRotationUpdateByCount=0,null!==this.nextRotation){const update={destination:this.nextRotation,type:"destination"};return this.nextRotation=null,this.delta=0,this.observable.notify(update),update}if(0!==this.delta){const update={delta:this.delta,type:"delta"};return this.delta=0,this.observable.notify(update),update}return null}subscribe(observer,options){return this.observable.subscribe(observer,options)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queueRotationUpdateCalls:this.queueRotationUpdateCount,queueRotationUpdateToCalls:this.queueRotationUpdateToCount,queueRotationUpdateByCalls:this.queueRotationUpdateByCount}}}class CameraZoomUpdateBatcher{constructor(){this.nextZoom=null,this.anchor=null,this.delta=0,this.anchorCoordinateSystem="viewport",this.queueZoomUpdateCount=0,this.queueZoomUpdateToCount=0,this.lastUpdateCount=0,this.observable=new Observable}queueZoomUpdateTo(destination,anchor){"world"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="viewport",this.nextZoom=null,this.delta=0),this.anchor=anchor,this.nextZoom=destination,0!==this.delta&&(this.delta=0)}queueZoomUpdateBy(delta,anchor){"world"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="viewport",this.nextZoom=null,this.delta=0),null===this.nextZoom?this.delta+=delta:this.nextZoom+=delta,this.anchor=anchor}queueZoomByAtWorld(delta,worldAnchor){"viewport"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="world",this.nextZoom=null,this.delta=0),this.anchor=worldAnchor,null===this.nextZoom?this.delta+=delta:this.nextZoom+=delta}queueZoomToAtWorld(destination,worldAnchor){"viewport"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="world",this.nextZoom=null,this.delta=0),this.anchor=worldAnchor,this.nextZoom=destination,0!==this.delta&&(this.delta=0)}processQueuedUpdates(){if(null===this.nextZoom&&0===this.delta)return null;const delta=this.delta,nextZoom=this.nextZoom,anchor=this.anchor;return this.delta=0,this.nextZoom=null,this.anchor=null,0!==delta?{anchorCoordinateSystem:this.anchorCoordinateSystem,update:{type:"delta",delta:delta,anchor:anchor}}:{anchorCoordinateSystem:this.anchorCoordinateSystem,update:{type:"destination",destination:nextZoom,anchor:anchor}}}subscribe(observer,options){return this.observable.subscribe(observer,options)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queueZoomUpdateCalls:this.queueZoomUpdateCount,queueZoomUpdateToCalls:this.queueZoomUpdateToCount}}}export{CameraPositionUpdateBatcher,CameraRotationUpdateBatcher,CameraZoomUpdateBatcher};
//# sourceMappingURL=index.js.map