open-plant 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/assets/point-hit-index-worker-CNFA6pZm.js +2 -0
  2. package/dist/assets/point-hit-index-worker-CNFA6pZm.js.map +1 -0
  3. package/dist/assets/roi-clip-worker-BDVQwN2T.js.map +1 -1
  4. package/dist/index.cjs +17 -13
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.js +3233 -3037
  7. package/dist/index.js.map +1 -1
  8. package/dist/types/core/ortho-camera.d.ts +7 -0
  9. package/dist/types/core/ortho-camera.d.ts.map +1 -1
  10. package/dist/types/index.d.ts +2 -0
  11. package/dist/types/index.d.ts.map +1 -1
  12. package/dist/types/react/draw-layer-brush.d.ts +9 -0
  13. package/dist/types/react/draw-layer-brush.d.ts.map +1 -0
  14. package/dist/types/react/draw-layer-label.d.ts +21 -0
  15. package/dist/types/react/draw-layer-label.d.ts.map +1 -0
  16. package/dist/types/react/draw-layer-overlay.d.ts +18 -0
  17. package/dist/types/react/draw-layer-overlay.d.ts.map +1 -0
  18. package/dist/types/react/draw-layer-stamp.d.ts +24 -0
  19. package/dist/types/react/draw-layer-stamp.d.ts.map +1 -0
  20. package/dist/types/react/draw-layer-types.d.ts +243 -0
  21. package/dist/types/react/draw-layer-types.d.ts.map +1 -0
  22. package/dist/types/react/draw-layer-utils.d.ts +30 -0
  23. package/dist/types/react/draw-layer-utils.d.ts.map +1 -0
  24. package/dist/types/react/draw-layer.d.ts +4 -187
  25. package/dist/types/react/draw-layer.d.ts.map +1 -1
  26. package/dist/types/react/wsi-region-hit-utils.d.ts +21 -0
  27. package/dist/types/react/wsi-region-hit-utils.d.ts.map +1 -0
  28. package/dist/types/react/wsi-viewer-canvas.d.ts +2 -1
  29. package/dist/types/react/wsi-viewer-canvas.d.ts.map +1 -1
  30. package/dist/types/wsi/brush-stroke.d.ts.map +1 -1
  31. package/dist/types/wsi/image-info.d.ts +26 -1
  32. package/dist/types/wsi/image-info.d.ts.map +1 -1
  33. package/dist/types/wsi/point-clip-hybrid.d.ts.map +1 -1
  34. package/dist/types/wsi/point-clip-worker-client.d.ts.map +1 -1
  35. package/dist/types/wsi/point-clip.d.ts +1 -1
  36. package/dist/types/wsi/point-clip.d.ts.map +1 -1
  37. package/dist/types/wsi/point-hit-index-shared.d.ts +25 -0
  38. package/dist/types/wsi/point-hit-index-shared.d.ts.map +1 -0
  39. package/dist/types/wsi/point-hit-index-worker-client.d.ts.map +1 -1
  40. package/dist/types/wsi/roi-geometry.d.ts +3 -0
  41. package/dist/types/wsi/roi-geometry.d.ts.map +1 -1
  42. package/dist/types/wsi/roi-term-stats.d.ts.map +1 -1
  43. package/dist/types/wsi/tile-scheduler.d.ts.map +1 -1
  44. package/dist/types/wsi/utils.d.ts +3 -2
  45. package/dist/types/wsi/utils.d.ts.map +1 -1
  46. package/dist/types/wsi/worker-client.d.ts +28 -0
  47. package/dist/types/wsi/worker-client.d.ts.map +1 -0
  48. package/dist/types/wsi/wsi-canvas-lifecycle.d.ts +15 -0
  49. package/dist/types/wsi/wsi-canvas-lifecycle.d.ts.map +1 -0
  50. package/dist/types/wsi/wsi-input-handlers.d.ts +67 -0
  51. package/dist/types/wsi/wsi-input-handlers.d.ts.map +1 -0
  52. package/dist/types/wsi/wsi-interaction.d.ts +50 -0
  53. package/dist/types/wsi/wsi-interaction.d.ts.map +1 -0
  54. package/dist/types/wsi/wsi-lifecycle-ops.d.ts +38 -0
  55. package/dist/types/wsi/wsi-lifecycle-ops.d.ts.map +1 -0
  56. package/dist/types/wsi/wsi-normalize.d.ts +20 -0
  57. package/dist/types/wsi/wsi-normalize.d.ts.map +1 -0
  58. package/dist/types/wsi/wsi-point-data.d.ts +14 -0
  59. package/dist/types/wsi/wsi-point-data.d.ts.map +1 -0
  60. package/dist/types/wsi/wsi-render-pass.d.ts +40 -0
  61. package/dist/types/wsi/wsi-render-pass.d.ts.map +1 -0
  62. package/dist/types/wsi/wsi-renderer-types.d.ts +132 -0
  63. package/dist/types/wsi/wsi-renderer-types.d.ts.map +1 -0
  64. package/dist/types/wsi/wsi-shaders.d.ts +4 -0
  65. package/dist/types/wsi/wsi-shaders.d.ts.map +1 -0
  66. package/dist/types/wsi/wsi-tile-cache.d.ts +8 -0
  67. package/dist/types/wsi/wsi-tile-cache.d.ts.map +1 -0
  68. package/dist/types/wsi/wsi-tile-renderer.d.ts +11 -70
  69. package/dist/types/wsi/wsi-tile-renderer.d.ts.map +1 -1
  70. package/dist/types/wsi/wsi-tile-visibility.d.ts +22 -0
  71. package/dist/types/wsi/wsi-tile-visibility.d.ts.map +1 -0
  72. package/dist/types/wsi/wsi-view-animation.d.ts +4 -0
  73. package/dist/types/wsi/wsi-view-animation.d.ts.map +1 -0
  74. package/dist/types/wsi/wsi-view-ops.d.ts +17 -0
  75. package/dist/types/wsi/wsi-view-ops.d.ts.map +1 -0
  76. package/package.json +1 -1
  77. package/dist/assets/point-hit-index-worker-Bp1uxxyQ.js +0 -2
  78. package/dist/assets/point-hit-index-worker-Bp1uxxyQ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-render-pass.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-render-pass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,4BAA4B,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9H,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,sBAAsB,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,4BAA4B,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;IAClE,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IAC1D,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA0H1E"}
@@ -0,0 +1,132 @@
1
+ import type { ScheduledTile, TileBounds } from "./tile-scheduler";
2
+ import type { WsiImageColorSettings, WsiRenderStats, WsiViewState } from "./types";
3
+ export type Bounds = TileBounds;
4
+ export type WorldPoint = [number, number];
5
+ export interface CachedTile {
6
+ key: string;
7
+ texture: WebGLTexture;
8
+ bounds: Bounds;
9
+ tier: number;
10
+ lastUsed: number;
11
+ }
12
+ export interface TileVertexProgram {
13
+ program: WebGLProgram;
14
+ vao: WebGLVertexArrayObject;
15
+ vbo: WebGLBuffer;
16
+ uCamera: WebGLUniformLocation;
17
+ uBounds: WebGLUniformLocation;
18
+ uTexture: WebGLUniformLocation;
19
+ uBrightness: WebGLUniformLocation;
20
+ uContrast: WebGLUniformLocation;
21
+ uSaturation: WebGLUniformLocation;
22
+ }
23
+ export interface PointProgram {
24
+ program: WebGLProgram;
25
+ vao: WebGLVertexArrayObject;
26
+ posBuffer: WebGLBuffer;
27
+ termBuffer: WebGLBuffer;
28
+ fillModeBuffer: WebGLBuffer;
29
+ indexBuffer: WebGLBuffer;
30
+ paletteTexture: WebGLTexture;
31
+ uCamera: WebGLUniformLocation;
32
+ uPointSize: WebGLUniformLocation;
33
+ uPalette: WebGLUniformLocation;
34
+ uPaletteSize: WebGLUniformLocation;
35
+ uPointStrokeScale: WebGLUniformLocation;
36
+ uPointInnerFillAlpha: WebGLUniformLocation;
37
+ }
38
+ export interface PointSizeStop {
39
+ zoom: number;
40
+ size: number;
41
+ }
42
+ export type PointSizeByZoom = Readonly<Record<number, number>>;
43
+ export interface WsiViewTransitionOptions {
44
+ duration?: number;
45
+ easing?: (t: number) => number;
46
+ }
47
+ export interface WsiTileSchedulerConfig {
48
+ maxConcurrency?: number;
49
+ maxRetries?: number;
50
+ retryBaseDelayMs?: number;
51
+ retryMaxDelayMs?: number;
52
+ }
53
+ export interface WsiTileErrorEvent {
54
+ tile: ScheduledTile;
55
+ error: unknown;
56
+ attemptCount: number;
57
+ }
58
+ export interface WsiTileRendererOptions {
59
+ onViewStateChange?: (next: WsiViewState) => void;
60
+ onStats?: (stats: WsiRenderStats) => void;
61
+ authToken?: string;
62
+ imageColorSettings?: WsiImageColorSettings | null;
63
+ minZoom?: number;
64
+ maxZoom?: number;
65
+ viewTransition?: WsiViewTransitionOptions;
66
+ pointSizeByZoom?: PointSizeByZoom;
67
+ pointStrokeScale?: number;
68
+ pointInnerFillOpacity?: number;
69
+ maxCacheTiles?: number;
70
+ ctrlDragRotate?: boolean;
71
+ rotationDragSensitivityDegPerPixel?: number;
72
+ tileScheduler?: WsiTileSchedulerConfig;
73
+ onTileError?: (event: WsiTileErrorEvent) => void;
74
+ onContextLost?: () => void;
75
+ onContextRestored?: () => void;
76
+ }
77
+ export interface ViewAnimationState {
78
+ startMs: number;
79
+ durationMs: number;
80
+ from: WsiViewState;
81
+ to: WsiViewState;
82
+ easing: (t: number) => number;
83
+ }
84
+ export interface NormalizedImageColorSettings {
85
+ brightness: number;
86
+ contrast: number;
87
+ saturation: number;
88
+ }
89
+ export interface InteractionState {
90
+ dragging: boolean;
91
+ mode: "none" | "pan" | "rotate";
92
+ rotateLastAngleRad: number | null;
93
+ pointerId: number | null;
94
+ lastPointerX: number;
95
+ lastPointerY: number;
96
+ }
97
+ export interface InteractionConfig {
98
+ ctrlDragRotate: boolean;
99
+ rotationDragSensitivityDegPerPixel: number;
100
+ }
101
+ export interface ViewAnimationRuntimeState {
102
+ animation: ViewAnimationState | null;
103
+ frame: number | null;
104
+ }
105
+ export interface HandleTileLoadedOptions {
106
+ gl: WebGL2RenderingContext;
107
+ cache: Map<string, CachedTile>;
108
+ tile: ScheduledTile;
109
+ bitmap: ImageBitmap;
110
+ frameSerial: number;
111
+ maxCacheTiles: number;
112
+ destroyed: boolean;
113
+ contextLost: boolean;
114
+ requestRender: () => void;
115
+ }
116
+ export interface TileCacheTrimOptions {
117
+ gl: WebGL2RenderingContext;
118
+ cache: Map<string, CachedTile>;
119
+ maxCacheTiles: number;
120
+ }
121
+ export interface ViewAnimationStartOptions {
122
+ state: ViewAnimationRuntimeState;
123
+ camera: {
124
+ getViewState: () => WsiViewState;
125
+ setViewState: (next: Partial<WsiViewState>) => void;
126
+ };
127
+ target: WsiViewState;
128
+ durationMs: number;
129
+ easing: (t: number) => number;
130
+ onUpdate: () => void;
131
+ }
132
+ //# sourceMappingURL=wsi-renderer-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-renderer-types.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-renderer-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PointProgram, TileVertexProgram } from "./wsi-renderer-types";
2
+ export declare function initTileProgram(gl: WebGL2RenderingContext): TileVertexProgram;
3
+ export declare function initPointProgram(gl: WebGL2RenderingContext): PointProgram;
4
+ //# sourceMappingURL=wsi-shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-shaders.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-shaders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,wBAAgB,eAAe,CAAC,EAAE,EAAE,sBAAsB,GAAG,iBAAiB,CA4F7E;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,sBAAsB,GAAG,YAAY,CAuIzE"}
@@ -0,0 +1,8 @@
1
+ import type { HandleTileLoadedOptions, TileCacheTrimOptions } from "./wsi-renderer-types";
2
+ export declare function trimTileCache(options: TileCacheTrimOptions): void;
3
+ export declare function createTextureFromBitmap(gl: WebGL2RenderingContext, bitmap: ImageBitmap): WebGLTexture | null;
4
+ export declare function handleTileLoaded(options: HandleTileLoadedOptions): void;
5
+ export declare function deleteCachedTextures(gl: WebGL2RenderingContext, cache: Map<string, {
6
+ texture: WebGLTexture;
7
+ }>): void;
8
+ //# sourceMappingURL=wsi-tile-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-tile-cache.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-tile-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAajE;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI,CAgB5G;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAyBvE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,GAAG,IAAI,CAIpH"}
@@ -1,41 +1,6 @@
1
- import { type ScheduledTile, type TileBounds } from "./tile-scheduler";
2
- import type { WsiImageColorSettings, WsiImageSource, WsiPointData, WsiRenderStats, WsiViewState } from "./types";
3
- type Bounds = TileBounds;
4
- type WorldPoint = [number, number];
5
- export type PointSizeByZoom = Readonly<Record<number, number>>;
6
- export interface WsiViewTransitionOptions {
7
- duration?: number;
8
- easing?: (t: number) => number;
9
- }
10
- export interface WsiTileSchedulerConfig {
11
- maxConcurrency?: number;
12
- maxRetries?: number;
13
- retryBaseDelayMs?: number;
14
- retryMaxDelayMs?: number;
15
- }
16
- export interface WsiTileRendererOptions {
17
- onViewStateChange?: (next: WsiViewState) => void;
18
- onStats?: (stats: WsiRenderStats) => void;
19
- authToken?: string;
20
- imageColorSettings?: WsiImageColorSettings | null;
21
- minZoom?: number;
22
- maxZoom?: number;
23
- viewTransition?: WsiViewTransitionOptions;
24
- pointSizeByZoom?: PointSizeByZoom;
25
- pointStrokeScale?: number;
26
- maxCacheTiles?: number;
27
- ctrlDragRotate?: boolean;
28
- rotationDragSensitivityDegPerPixel?: number;
29
- tileScheduler?: WsiTileSchedulerConfig;
30
- onTileError?: (event: WsiTileErrorEvent) => void;
31
- onContextLost?: () => void;
32
- onContextRestored?: () => void;
33
- }
34
- export interface WsiTileErrorEvent {
35
- tile: ScheduledTile;
36
- error: unknown;
37
- attemptCount: number;
38
- }
1
+ import type { WsiImageColorSettings, WsiImageSource, WsiPointData, WsiViewState } from "./types";
2
+ import type { PointSizeByZoom, WorldPoint, WsiTileRendererOptions, WsiViewTransitionOptions } from "./wsi-renderer-types";
3
+ export type { PointSizeByZoom, WsiTileErrorEvent, WsiTileRendererOptions, WsiTileSchedulerConfig, WsiViewTransitionOptions } from "./wsi-renderer-types";
39
4
  export declare class WsiTileRenderer {
40
5
  private readonly canvas;
41
6
  private readonly source;
@@ -55,12 +20,7 @@ export declare class WsiTileRenderer {
55
20
  private contextLost;
56
21
  private frame;
57
22
  private frameSerial;
58
- private dragging;
59
- private interactionMode;
60
- private rotateLastAngleRad;
61
- private pointerId;
62
- private lastPointerX;
63
- private lastPointerY;
23
+ private interactionState;
64
24
  private interactionLocked;
65
25
  private ctrlDragRotate;
66
26
  private rotationDragSensitivityDegPerPixel;
@@ -72,15 +32,14 @@ export declare class WsiTileRenderer {
72
32
  private maxZoomOverride;
73
33
  private viewTransitionDurationMs;
74
34
  private viewTransitionEasing;
75
- private viewAnimation;
76
- private viewAnimationFrame;
77
- private currentTier;
35
+ private viewAnimationState;
78
36
  private pointCount;
79
37
  private usePointIndices;
80
38
  private pointBuffersDirty;
81
39
  private pointPaletteSize;
82
40
  private pointSizeStops;
83
41
  private pointStrokeScale;
42
+ private pointInnerFillOpacity;
84
43
  private imageColorSettings;
85
44
  private lastPointData;
86
45
  private lastPointPalette;
@@ -94,12 +53,15 @@ export declare class WsiTileRenderer {
94
53
  private readonly boundContextMenu;
95
54
  private readonly boundContextLost;
96
55
  private readonly boundContextRestored;
56
+ private getCanvasHandlers;
97
57
  constructor(canvas: HTMLCanvasElement, source: WsiImageSource, options?: WsiTileRendererOptions);
98
- private resolveDefaultZoomBounds;
99
58
  private applyZoomBounds;
100
59
  private resolveTargetViewState;
101
60
  private cancelViewAnimation;
102
61
  private startViewAnimation;
62
+ private getPointBufferRuntime;
63
+ private applyPointBufferRuntime;
64
+ private applyViewStateAndRender;
103
65
  setAuthToken(token: string): void;
104
66
  setZoomRange(minZoom: number | null | undefined, maxZoom: number | null | undefined): void;
105
67
  setViewTransition(options: WsiViewTransitionOptions | null | undefined): void;
@@ -111,14 +73,12 @@ export declare class WsiTileRenderer {
111
73
  };
112
74
  setPointPalette(colors: Uint8Array | null | undefined): void;
113
75
  setPointData(points: WsiPointData | null | undefined): void;
114
- private sanitizeDrawIndices;
115
- private getZeroFillModes;
116
76
  setInteractionLock(locked: boolean): void;
117
77
  setPointSizeByZoom(pointSizeByZoom: PointSizeByZoom | null | undefined): void;
118
78
  setPointStrokeScale(scale: number | null | undefined): void;
79
+ setPointInnerFillOpacity(opacity: number | null | undefined): void;
119
80
  setImageColorSettings(settings: WsiImageColorSettings | null | undefined): void;
120
81
  cancelDrag(): void;
121
- private getPointerAngleRad;
122
82
  screenToWorld(clientX: number, clientY: number): [number, number];
123
83
  worldToScreen(worldX: number, worldY: number): [number, number];
124
84
  setViewCenter(worldX: number, worldY: number, transition?: WsiViewTransitionOptions): void;
@@ -127,30 +87,11 @@ export declare class WsiTileRenderer {
127
87
  getPointSizeByZoom(): number;
128
88
  fitToImage(transition?: WsiViewTransitionOptions): void;
129
89
  zoomBy(factor: number, screenX: number, screenY: number, transition?: WsiViewTransitionOptions): void;
130
- clampViewState(): void;
131
- emitViewState(): void;
132
- selectTier(): number;
133
- getViewBounds(): Bounds;
134
- intersectsBounds(a: Bounds, b: Bounds): boolean;
135
- getVisibleTiles(): ScheduledTile[];
136
- getVisibleTilesForTier(tier: number): ScheduledTile[];
137
- trimCache(): void;
138
90
  render(): void;
139
91
  requestRender(): void;
140
92
  resize(): void;
141
- onPointerDown(event: PointerEvent): void;
142
- onPointerMove(event: PointerEvent): void;
143
- onPointerUp(event: PointerEvent): void;
144
- onWheel(event: WheelEvent): void;
145
- onDoubleClick(event: MouseEvent): void;
146
- onContextMenu(event: MouseEvent): void;
147
93
  private onWebGlContextLost;
148
94
  private onWebGlContextRestored;
149
95
  destroy(): void;
150
- private initTileProgram;
151
- private initPointProgram;
152
- private handleTileLoaded;
153
- private createTextureFromBitmap;
154
96
  }
155
- export {};
156
97
  //# sourceMappingURL=wsi-tile-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wsi-tile-renderer.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-tile-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wsi-tile-renderer.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-tile-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ScheduledTile } from "./tile-scheduler";
2
+ import type { WsiImageSource } from "./types";
3
+ import type { Bounds } from "./wsi-renderer-types";
4
+ interface CameraViewLike {
5
+ getViewCorners: () => [readonly [number, number], readonly [number, number], readonly [number, number], readonly [number, number]];
6
+ getViewState: () => {
7
+ zoom: number;
8
+ };
9
+ getCenter: () => [number, number];
10
+ setCenter: (x: number, y: number) => void;
11
+ }
12
+ export declare function getViewBounds(camera: CameraViewLike): Bounds;
13
+ export declare function clampViewState(camera: CameraViewLike, source: WsiImageSource): void;
14
+ export declare function selectTier(camera: CameraViewLike, source: WsiImageSource): number;
15
+ export declare function intersectsBounds(a: Bounds, b: Bounds): boolean;
16
+ export declare function getVisibleTilesForTier(camera: CameraViewLike, source: WsiImageSource, tier: number): ScheduledTile[];
17
+ export declare function getVisibleTiles(camera: CameraViewLike, source: WsiImageSource): {
18
+ tier: number;
19
+ visible: ScheduledTile[];
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=wsi-tile-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-tile-visibility.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-tile-visibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnI,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAa5D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAoBnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAIjF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAmDpH;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAM1H"}
@@ -0,0 +1,4 @@
1
+ import type { ViewAnimationRuntimeState, ViewAnimationStartOptions } from "./wsi-renderer-types";
2
+ export declare function cancelViewAnimation(state: ViewAnimationRuntimeState): void;
3
+ export declare function startViewAnimation(options: ViewAnimationStartOptions): void;
4
+ //# sourceMappingURL=wsi-view-animation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-view-animation.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-view-animation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAM1E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CA+C3E"}
@@ -0,0 +1,17 @@
1
+ import type { OrthoCamera } from "../core/ortho-camera";
2
+ import type { WsiImageSource, WsiViewState } from "./types";
3
+ export declare function resolveDefaultZoomBounds(fitZoom: number): {
4
+ minZoom: number;
5
+ maxZoom: number;
6
+ };
7
+ export declare function resolveZoomBounds(fitZoom: number, minZoomOverride: number | null, maxZoomOverride: number | null): {
8
+ minZoom: number;
9
+ maxZoom: number;
10
+ };
11
+ export declare function resolveTargetViewState(camera: OrthoCamera, minZoom: number, maxZoom: number, next: Partial<WsiViewState>, clampViewState: () => void): WsiViewState;
12
+ export declare function computeFitToImageTarget(source: WsiImageSource, viewportWidth: number, viewportHeight: number, minZoom: number, maxZoom: number): {
13
+ fitZoom: number;
14
+ target: WsiViewState;
15
+ };
16
+ export declare function computeZoomByTarget(camera: OrthoCamera, minZoom: number, maxZoom: number, factor: number, screenX: number, screenY: number): Partial<WsiViewState> | null;
17
+ //# sourceMappingURL=wsi-view-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsi-view-ops.d.ts","sourceRoot":"","sources":["../../../src/wsi/wsi-view-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAO9F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUvJ;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,EAC3B,cAAc,EAAE,MAAM,IAAI,GACzB,YAAY,CAcd;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAgB3C;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAsB9B"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "open-plant",
3
3
  "description": "WebGL2-based high-performance WSI viewer rendering engine for React",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "license": "MIT",
6
6
  "author": "Open Plant",
7
7
  "repository": {
@@ -1,2 +0,0 @@
1
- (function(){"use strict";function U(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function q(r){if(r instanceof Error)return r.message;try{return String(r)}catch{return"unknown worker error"}}function X(r,f,o){if(r<=0||f<=0||o<=0)return 256;const i=Math.max(1,r*f),h=Math.sqrt(i/Math.max(1,o))*4;return Math.max(24,Math.min(1024,h))}function S(r,f,o){return(r*73856093^f*19349663)>>>0&o}function B(r){const f=U(),o=Math.max(0,Math.floor(r.count)),i=new Float32Array(r.positions),L=Math.floor(i.length/2),h=Math.max(0,Math.min(o,L));if(h<=0)return null;let I=null;if(r.drawIndices){const t=new Uint32Array(r.drawIndices);if(t.length>0){let n=!0;for(let s=0;s<t.length;s+=1)if(t[s]>=h){n=!1;break}if(n)I=t;else{const s=new Uint32Array(t.length);let e=0;for(let u=0;u<t.length;u+=1)t[u]<h&&(s[e++]=t[u]);I=e>0?s.subarray(0,e):null}}}const A=I?I.length:h;if(A===0)return null;const F=X(r.sourceWidth,r.sourceHeight,A),H=1/F,O=new Int32Array(A),P=new Int32Array(A);let c=0;if(I)for(let t=0;t<A;t+=1){const n=I[t],s=i[n*2],e=i[n*2+1];!Number.isFinite(s)||!Number.isFinite(e)||(O[c]=Math.floor(s*H),P[c]=Math.floor(e*H),c+=1)}else for(let t=0;t<h;t+=1){const n=i[t*2],s=i[t*2+1];!Number.isFinite(n)||!Number.isFinite(s)||(O[c]=Math.floor(n*H),P[c]=Math.floor(s*H),c+=1)}if(c===0)return null;const V=Math.min(c,Math.max(64,c>>>3));let a=1;for(;a<V*2;)a<<=1;const G=a-1;let l=new Int32Array(a*2),p=new Int32Array(a);l.fill(2147483647);let y=0;const _=new Int32Array(c);for(let t=0;t<c;t+=1){const n=O[t],s=P[t];let e=S(n,s,G);for(;;){const u=l[e*2];if(u===2147483647){if(l[e*2]=n,l[e*2+1]=s,p[e]=1,_[t]=e,y+=1,y*4>a*3){const j=a;a<<=1;const E=a-1,x=new Int32Array(a*2),v=new Int32Array(a);x.fill(2147483647);for(let d=0;d<j;d+=1){if(l[d*2]===2147483647)continue;const z=l[d*2],Z=l[d*2+1];let M=S(z,Z,E);for(;x[M*2]!==2147483647;)M=M+1&E;x[M*2]=z,x[M*2+1]=Z,v[M]=p[d]}for(l=x,p=v,e=S(n,s,E);l[e*2]!==n||l[e*2+1]!==s;)e=e+1&E;_[t]=e}break}if(u===n&&l[e*2+1]===s){p[e]+=1,_[t]=e;break}e=e+1&G}}const b=new Int32Array(y*2),k=new Uint32Array(y),K=new Uint32Array(y),g=new Int32Array(a);g.fill(-1);let w=0,R=0;for(let t=0;t<a;t+=1)l[t*2]!==2147483647&&(b[w*2]=l[t*2],b[w*2+1]=l[t*2+1],k[w]=R,K[w]=p[t],g[t]=w,R+=p[t],w+=1);const D=new Uint32Array(c),T=new Uint32Array(y);if(T.set(k),I)for(let t=0;t<c;t+=1){const n=g[_[t]];D[T[n]]=I[t],T[n]+=1}else{let t=0;for(let n=0;n<h;n+=1){const s=i[n*2],e=i[n*2+1];if(!Number.isFinite(s)||!Number.isFinite(e))continue;const u=g[_[t]];D[T[u]]=n,T[u]+=1,t+=1}}let C=1;for(;C<y*2;)C<<=1;const Y=C-1,N=new Int32Array(C);N.fill(-1);for(let t=0;t<y;t+=1){const n=b[t*2],s=b[t*2+1];let e=S(n,s,Y);for(;N[e]!==-1;)e=e+1&Y;N[e]=t}return{type:"point-hit-index-success",id:r.id,cellSize:F,safeCount:h,cellCount:y,hashCapacity:C,hashTable:N.buffer,cellKeys:b.buffer,cellOffsets:k.buffer,cellLengths:K.buffer,pointIndices:D.buffer,durationMs:U()-f}}const m=self;m.addEventListener("message",r=>{const f=r.data;if(!(!f||f.type!=="point-hit-index-request"))try{const o=B(f);if(!o){const i={type:"point-hit-index-success",id:f.id,cellSize:0,safeCount:0,cellCount:0,hashCapacity:0,hashTable:new Int32Array(0).buffer,cellKeys:new Int32Array(0).buffer,cellOffsets:new Uint32Array(0).buffer,cellLengths:new Uint32Array(0).buffer,pointIndices:new Uint32Array(0).buffer,durationMs:0};m.postMessage(i,[i.hashTable,i.cellKeys,i.cellOffsets,i.cellLengths,i.pointIndices]);return}m.postMessage(o,[o.hashTable,o.cellKeys,o.cellOffsets,o.cellLengths,o.pointIndices])}catch(o){const i={type:"point-hit-index-failure",id:f.id,error:q(o)};m.postMessage(i)}})})();
2
- //# sourceMappingURL=point-hit-index-worker-Bp1uxxyQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"point-hit-index-worker-Bp1uxxyQ.js","sources":["../src/workers/point-hit-index-worker.ts"],"sourcesContent":["import type {\n\tPointHitIndexWorkerRequest,\n\tPointHitIndexWorkerResponse,\n\tPointHitIndexWorkerSuccess,\n} from \"../wsi/point-hit-index-worker-protocol\";\n\nconst MIN_POINT_HIT_GRID_SIZE = 24;\nconst MAX_POINT_HIT_GRID_SIZE = 1024;\nconst POINT_HIT_GRID_DENSITY_SCALE = 4;\nconst HASH_EMPTY = -1;\n\nfunction nowMs(): number {\n\tif (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n\t\treturn performance.now();\n\t}\n\treturn Date.now();\n}\n\nfunction toErrorMessage(error: unknown): string {\n\tif (error instanceof Error) return error.message;\n\ttry {\n\t\treturn String(error);\n\t} catch {\n\t\treturn \"unknown worker error\";\n\t}\n}\n\nfunction resolveGridSize(sourceWidth: number, sourceHeight: number, visibleCount: number): number {\n\tif (sourceWidth <= 0 || sourceHeight <= 0 || visibleCount <= 0) return 256;\n\tconst area = Math.max(1, sourceWidth * sourceHeight);\n\tconst avgSpacing = Math.sqrt(area / Math.max(1, visibleCount));\n\tconst raw = avgSpacing * POINT_HIT_GRID_DENSITY_SCALE;\n\treturn Math.max(MIN_POINT_HIT_GRID_SIZE, Math.min(MAX_POINT_HIT_GRID_SIZE, raw));\n}\n\nfunction cellHash(cellX: number, cellY: number, mask: number): number {\n\treturn (((cellX * 73856093) ^ (cellY * 19349663)) >>> 0) & mask;\n}\n\nfunction handleRequest(msg: PointHitIndexWorkerRequest): PointHitIndexWorkerSuccess | null {\n\tconst start = nowMs();\n\tconst count = Math.max(0, Math.floor(msg.count));\n\tconst positions = new Float32Array(msg.positions);\n\tconst maxCountByPositions = Math.floor(positions.length / 2);\n\tconst safeCount = Math.max(0, Math.min(count, maxCountByPositions));\n\n\tif (safeCount <= 0) return null;\n\n\tlet drawIndices: Uint32Array | null = null;\n\tif (msg.drawIndices) {\n\t\tconst raw = new Uint32Array(msg.drawIndices);\n\t\tif (raw.length > 0) {\n\t\t\tlet allValid = true;\n\t\t\tfor (let i = 0; i < raw.length; i += 1) {\n\t\t\t\tif (raw[i] >= safeCount) { allValid = false; break; }\n\t\t\t}\n\t\t\tif (allValid) {\n\t\t\t\tdrawIndices = raw;\n\t\t\t} else {\n\t\t\t\tconst filtered = new Uint32Array(raw.length);\n\t\t\t\tlet cursor = 0;\n\t\t\t\tfor (let i = 0; i < raw.length; i += 1) {\n\t\t\t\t\tif (raw[i] < safeCount) { filtered[cursor++] = raw[i]; }\n\t\t\t\t}\n\t\t\t\tdrawIndices = cursor > 0 ? filtered.subarray(0, cursor) : null;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst visibleCount = drawIndices ? drawIndices.length : safeCount;\n\tif (visibleCount === 0) return null;\n\n\tconst cellSize = resolveGridSize(msg.sourceWidth, msg.sourceHeight, visibleCount);\n\tconst invCellSize = 1.0 / cellSize;\n\n\t// --- Pass 1: assign cell keys, count unique cells ---\n\tconst pointCellX = new Int32Array(visibleCount);\n\tconst pointCellY = new Int32Array(visibleCount);\n\tlet validCount = 0;\n\n\tif (drawIndices) {\n\t\tfor (let i = 0; i < visibleCount; i += 1) {\n\t\t\tconst pi = drawIndices[i];\n\t\t\tconst px = positions[pi * 2];\n\t\t\tconst py = positions[pi * 2 + 1];\n\t\t\tif (!Number.isFinite(px) || !Number.isFinite(py)) continue;\n\t\t\tpointCellX[validCount] = Math.floor(px * invCellSize);\n\t\t\tpointCellY[validCount] = Math.floor(py * invCellSize);\n\t\t\tvalidCount += 1;\n\t\t}\n\t} else {\n\t\tfor (let i = 0; i < safeCount; i += 1) {\n\t\t\tconst px = positions[i * 2];\n\t\t\tconst py = positions[i * 2 + 1];\n\t\t\tif (!Number.isFinite(px) || !Number.isFinite(py)) continue;\n\t\t\tpointCellX[validCount] = Math.floor(px * invCellSize);\n\t\t\tpointCellY[validCount] = Math.floor(py * invCellSize);\n\t\t\tvalidCount += 1;\n\t\t}\n\t}\n\n\tif (validCount === 0) return null;\n\n\t// --- Pass 2: build temporary hash to discover unique cells and count per cell ---\n\tconst estimatedCells = Math.min(validCount, Math.max(64, validCount >>> 3));\n\tlet hashCapacity = 1;\n\twhile (hashCapacity < estimatedCells * 2) hashCapacity <<= 1;\n\tconst hashMask = hashCapacity - 1;\n\n\tlet tempHashKeys = new Int32Array(hashCapacity * 2);\n\tlet tempHashCounts = new Int32Array(hashCapacity);\n\ttempHashKeys.fill(0x7FFFFFFF);\n\tlet cellCount = 0;\n\n\tconst pointCellSlot = new Int32Array(validCount);\n\n\tfor (let i = 0; i < validCount; i += 1) {\n\t\tconst cx = pointCellX[i];\n\t\tconst cy = pointCellY[i];\n\t\tlet slot = cellHash(cx, cy, hashMask);\n\n\t\twhile (true) {\n\t\t\tconst kx = tempHashKeys[slot * 2];\n\t\t\tif (kx === 0x7FFFFFFF) {\n\t\t\t\ttempHashKeys[slot * 2] = cx;\n\t\t\t\ttempHashKeys[slot * 2 + 1] = cy;\n\t\t\t\ttempHashCounts[slot] = 1;\n\t\t\t\tpointCellSlot[i] = slot;\n\t\t\t\tcellCount += 1;\n\t\t\t\tif (cellCount * 4 > hashCapacity * 3) {\n\t\t\t\t\tconst oldCap = hashCapacity;\n\t\t\t\t\thashCapacity <<= 1;\n\t\t\t\t\tconst newMask = hashCapacity - 1;\n\t\t\t\t\tconst newKeys = new Int32Array(hashCapacity * 2);\n\t\t\t\t\tconst newCounts = new Int32Array(hashCapacity);\n\t\t\t\t\tnewKeys.fill(0x7FFFFFFF);\n\t\t\t\t\tfor (let s = 0; s < oldCap; s += 1) {\n\t\t\t\t\t\tif (tempHashKeys[s * 2] === 0x7FFFFFFF) continue;\n\t\t\t\t\t\tconst ocx = tempHashKeys[s * 2];\n\t\t\t\t\t\tconst ocy = tempHashKeys[s * 2 + 1];\n\t\t\t\t\t\tlet ns = cellHash(ocx, ocy, newMask);\n\t\t\t\t\t\twhile (newKeys[ns * 2] !== 0x7FFFFFFF) ns = (ns + 1) & newMask;\n\t\t\t\t\t\tnewKeys[ns * 2] = ocx;\n\t\t\t\t\t\tnewKeys[ns * 2 + 1] = ocy;\n\t\t\t\t\t\tnewCounts[ns] = tempHashCounts[s];\n\t\t\t\t\t}\n\t\t\t\t\ttempHashKeys = newKeys;\n\t\t\t\t\ttempHashCounts = newCounts;\n\n\t\t\t\t\tslot = cellHash(cx, cy, newMask);\n\t\t\t\t\twhile (tempHashKeys[slot * 2] !== cx || tempHashKeys[slot * 2 + 1] !== cy) {\n\t\t\t\t\t\tslot = (slot + 1) & newMask;\n\t\t\t\t\t}\n\t\t\t\t\tpointCellSlot[i] = slot;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (kx === cx && tempHashKeys[slot * 2 + 1] === cy) {\n\t\t\t\ttempHashCounts[slot] += 1;\n\t\t\t\tpointCellSlot[i] = slot;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tslot = (slot + 1) & hashMask;\n\t\t}\n\t}\n\n\t// --- Pass 3: compute offsets via prefix sum ---\n\tconst finalHashMask = (hashCapacity - 1);\n\tconst cellKeys = new Int32Array(cellCount * 2);\n\tconst cellOffsets = new Uint32Array(cellCount);\n\tconst cellLengths = new Uint32Array(cellCount);\n\tconst slotToCellIndex = new Int32Array(hashCapacity);\n\tslotToCellIndex.fill(HASH_EMPTY);\n\n\tlet cellIdx = 0;\n\tlet offset = 0;\n\tfor (let s = 0; s < hashCapacity; s += 1) {\n\t\tif (tempHashKeys[s * 2] === 0x7FFFFFFF) continue;\n\t\tcellKeys[cellIdx * 2] = tempHashKeys[s * 2];\n\t\tcellKeys[cellIdx * 2 + 1] = tempHashKeys[s * 2 + 1];\n\t\tcellOffsets[cellIdx] = offset;\n\t\tcellLengths[cellIdx] = tempHashCounts[s];\n\t\tslotToCellIndex[s] = cellIdx;\n\t\toffset += tempHashCounts[s];\n\t\tcellIdx += 1;\n\t}\n\n\t// --- Pass 4: scatter point indices into flat array ---\n\tconst pointIndices = new Uint32Array(validCount);\n\tconst fillCursor = new Uint32Array(cellCount);\n\tfillCursor.set(cellOffsets);\n\n\tif (drawIndices) {\n\t\tfor (let i = 0; i < validCount; i += 1) {\n\t\t\tconst ci = slotToCellIndex[pointCellSlot[i]];\n\t\t\tpointIndices[fillCursor[ci]] = drawIndices[i];\n\t\t\tfillCursor[ci] += 1;\n\t\t}\n\t} else {\n\t\tlet srcIdx = 0;\n\t\tfor (let i = 0; i < safeCount; i += 1) {\n\t\t\tconst px = positions[i * 2];\n\t\t\tconst py = positions[i * 2 + 1];\n\t\t\tif (!Number.isFinite(px) || !Number.isFinite(py)) continue;\n\t\t\tconst ci = slotToCellIndex[pointCellSlot[srcIdx]];\n\t\t\tpointIndices[fillCursor[ci]] = i;\n\t\t\tfillCursor[ci] += 1;\n\t\t\tsrcIdx += 1;\n\t\t}\n\t}\n\n\t// --- Build final hash table for main-thread lookup ---\n\tlet finalCap = 1;\n\twhile (finalCap < cellCount * 2) finalCap <<= 1;\n\tconst finalMask = finalCap - 1;\n\tconst hashTable = new Int32Array(finalCap);\n\thashTable.fill(HASH_EMPTY);\n\n\tfor (let i = 0; i < cellCount; i += 1) {\n\t\tconst cx = cellKeys[i * 2];\n\t\tconst cy = cellKeys[i * 2 + 1];\n\t\tlet slot = cellHash(cx, cy, finalMask);\n\t\twhile (hashTable[slot] !== HASH_EMPTY) slot = (slot + 1) & finalMask;\n\t\thashTable[slot] = i;\n\t}\n\n\treturn {\n\t\ttype: \"point-hit-index-success\",\n\t\tid: msg.id,\n\t\tcellSize,\n\t\tsafeCount,\n\t\tcellCount,\n\t\thashCapacity: finalCap,\n\t\thashTable: hashTable.buffer,\n\t\tcellKeys: cellKeys.buffer,\n\t\tcellOffsets: cellOffsets.buffer,\n\t\tcellLengths: cellLengths.buffer,\n\t\tpointIndices: pointIndices.buffer,\n\t\tdurationMs: nowMs() - start,\n\t};\n}\n\ninterface WorkerScope {\n\tpostMessage(message: unknown, transfer?: Transferable[]): void;\n\taddEventListener(type: \"message\", listener: (event: MessageEvent<PointHitIndexWorkerRequest>) => void): void;\n}\n\nconst workerScope = self as unknown as WorkerScope;\n\nworkerScope.addEventListener(\"message\", (event: MessageEvent<PointHitIndexWorkerRequest>) => {\n\tconst data = event.data;\n\tif (!data || data.type !== \"point-hit-index-request\") return;\n\n\ttry {\n\t\tconst result = handleRequest(data);\n\t\tif (!result) {\n\t\t\tconst empty: PointHitIndexWorkerSuccess = {\n\t\t\t\ttype: \"point-hit-index-success\",\n\t\t\t\tid: data.id,\n\t\t\t\tcellSize: 0,\n\t\t\t\tsafeCount: 0,\n\t\t\t\tcellCount: 0,\n\t\t\t\thashCapacity: 0,\n\t\t\t\thashTable: new Int32Array(0).buffer,\n\t\t\t\tcellKeys: new Int32Array(0).buffer,\n\t\t\t\tcellOffsets: new Uint32Array(0).buffer,\n\t\t\t\tcellLengths: new Uint32Array(0).buffer,\n\t\t\t\tpointIndices: new Uint32Array(0).buffer,\n\t\t\t\tdurationMs: 0,\n\t\t\t};\n\t\t\tworkerScope.postMessage(empty, [\n\t\t\t\tempty.hashTable, empty.cellKeys,\n\t\t\t\tempty.cellOffsets, empty.cellLengths, empty.pointIndices,\n\t\t\t]);\n\t\t\treturn;\n\t\t}\n\t\tworkerScope.postMessage(result, [\n\t\t\tresult.hashTable, result.cellKeys,\n\t\t\tresult.cellOffsets, result.cellLengths, result.pointIndices,\n\t\t]);\n\t} catch (error) {\n\t\tconst fail: PointHitIndexWorkerResponse = {\n\t\t\ttype: \"point-hit-index-failure\",\n\t\t\tid: data.id,\n\t\t\terror: toErrorMessage(error),\n\t\t};\n\t\tworkerScope.postMessage(fail);\n\t}\n});\n"],"names":["nowMs","toErrorMessage","error","resolveGridSize","sourceWidth","sourceHeight","visibleCount","area","raw","cellHash","cellX","cellY","mask","handleRequest","msg","start","count","positions","maxCountByPositions","safeCount","drawIndices","allValid","i","filtered","cursor","cellSize","invCellSize","pointCellX","pointCellY","validCount","pi","px","py","estimatedCells","hashCapacity","hashMask","tempHashKeys","tempHashCounts","cellCount","pointCellSlot","cx","cy","slot","kx","oldCap","newMask","newKeys","newCounts","s","ocx","ocy","ns","cellKeys","cellOffsets","cellLengths","slotToCellIndex","cellIdx","offset","pointIndices","fillCursor","ci","srcIdx","finalCap","finalMask","hashTable","workerScope","event","data","result","empty","fail"],"mappings":"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"}