scichart-engine 0.4.1

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/analysis/contours.d.ts +20 -0
  4. package/dist/analysis/fitting.d.ts +24 -0
  5. package/dist/analysis/index.d.ts +12 -0
  6. package/dist/analysis/math.d.ts +32 -0
  7. package/dist/analysis/utils.d.ts +150 -0
  8. package/dist/core/Chart.d.ts +15 -0
  9. package/dist/core/ChartControls.d.ts +30 -0
  10. package/dist/core/ChartLegend.d.ts +35 -0
  11. package/dist/core/ChartStatistics.d.ts +18 -0
  12. package/dist/core/EventEmitter.d.ts +30 -0
  13. package/dist/core/InteractionManager.d.ts +67 -0
  14. package/dist/core/OverlayRenderer.d.ts +67 -0
  15. package/dist/core/Series.d.ts +4 -0
  16. package/dist/core/annotations/AnnotationManager.d.ts +57 -0
  17. package/dist/core/annotations/index.d.ts +5 -0
  18. package/dist/core/annotations/types.d.ts +157 -0
  19. package/dist/core/chart/ChartCore.d.ts +103 -0
  20. package/dist/core/chart/ChartExporter.d.ts +18 -0
  21. package/dist/core/chart/ChartNavigation.d.ts +33 -0
  22. package/dist/core/chart/ChartRenderer.d.ts +53 -0
  23. package/dist/core/chart/ChartScaling.d.ts +26 -0
  24. package/dist/core/chart/ChartSeries.d.ts +4 -0
  25. package/dist/core/chart/ChartSetup.d.ts +64 -0
  26. package/dist/core/chart/ChartUI.d.ts +22 -0
  27. package/dist/core/chart/exporter/SVGExporter.d.ts +6 -0
  28. package/dist/core/chart/exporter/index.d.ts +5 -0
  29. package/dist/core/chart/index.d.ts +14 -0
  30. package/dist/core/chart/plugins/PluginManager.d.ts +13 -0
  31. package/dist/core/chart/plugins/types.d.ts +13 -0
  32. package/dist/core/chart/series/SeriesActions.d.ts +7 -0
  33. package/dist/core/chart/series/SeriesBuffer.d.ts +4 -0
  34. package/dist/core/chart/series/SeriesFit.d.ts +3 -0
  35. package/dist/core/chart/series/index.d.ts +7 -0
  36. package/dist/core/chart/series/types.d.ts +22 -0
  37. package/dist/core/chart/types.d.ts +72 -0
  38. package/dist/core/index.d.ts +9 -0
  39. package/dist/core/series/Series.d.ts +52 -0
  40. package/dist/core/series/SeriesBounds.d.ts +3 -0
  41. package/dist/core/series/SeriesDataUtils.d.ts +7 -0
  42. package/dist/core/series/index.d.ts +6 -0
  43. package/dist/core/tooltip/TooltipManager.d.ts +203 -0
  44. package/dist/core/tooltip/TooltipPositioner.d.ts +83 -0
  45. package/dist/core/tooltip/TooltipRenderer.d.ts +64 -0
  46. package/dist/core/tooltip/index.d.ts +18 -0
  47. package/dist/core/tooltip/templates/AnnotationTemplate.d.ts +18 -0
  48. package/dist/core/tooltip/templates/CrosshairTemplate.d.ts +30 -0
  49. package/dist/core/tooltip/templates/DefaultTemplate.d.ts +30 -0
  50. package/dist/core/tooltip/templates/HeatmapTemplate.d.ts +34 -0
  51. package/dist/core/tooltip/templates/MinimalTemplate.d.ts +26 -0
  52. package/dist/core/tooltip/templates/RangeTemplate.d.ts +18 -0
  53. package/dist/core/tooltip/templates/ScientificTemplate.d.ts +34 -0
  54. package/dist/core/tooltip/templates/index.d.ts +27 -0
  55. package/dist/core/tooltip/themes.d.ts +48 -0
  56. package/dist/core/tooltip/types.d.ts +396 -0
  57. package/dist/examples.d.ts +19 -0
  58. package/dist/gpu/adapter/gpuRenderer.d.ts +135 -0
  59. package/dist/gpu/adapter/index.d.ts +7 -0
  60. package/dist/gpu/adapter/seriesAdapter.d.ts +88 -0
  61. package/dist/gpu/backends/webgl/WebGLBackend.d.ts +42 -0
  62. package/dist/gpu/backends/webgl/index.d.ts +5 -0
  63. package/dist/gpu/backends/webgl/programFactory.d.ts +30 -0
  64. package/dist/gpu/backends/webgl/shaders.d.ts +14 -0
  65. package/dist/gpu/backends/webgpu/MassiveDataRenderer.d.ts +111 -0
  66. package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +58 -0
  67. package/dist/gpu/backends/webgpu/pipelines/bandPipeline.d.ts +24 -0
  68. package/dist/gpu/backends/webgpu/pipelines/heatmapPipeline.d.ts +28 -0
  69. package/dist/gpu/backends/webgpu/pipelines/index.d.ts +10 -0
  70. package/dist/gpu/backends/webgpu/pipelines/instancedLinePipeline.d.ts +23 -0
  71. package/dist/gpu/backends/webgpu/pipelines/instancedPointPipeline.d.ts +25 -0
  72. package/dist/gpu/backends/webgpu/pipelines/linePipeline.d.ts +23 -0
  73. package/dist/gpu/backends/webgpu/pipelines/pointPipeline.d.ts +28 -0
  74. package/dist/gpu/backends/webgpu/pipelines/trianglePipeline.d.ts +5 -0
  75. package/dist/gpu/backends/webgpu/pipelines/triangleShader.d.ts +1 -0
  76. package/dist/gpu/backends/webgpu/shaders/heatmap.wgsl.d.ts +8 -0
  77. package/dist/gpu/backends/webgpu/shaders/index.d.ts +8 -0
  78. package/dist/gpu/backends/webgpu/shaders/instanced.wgsl.d.ts +16 -0
  79. package/dist/gpu/backends/webgpu/shaders/line.wgsl.d.ts +8 -0
  80. package/dist/gpu/backends/webgpu/shaders/point.wgsl.d.ts +9 -0
  81. package/dist/gpu/benchmark/benchmark.d.ts +74 -0
  82. package/dist/gpu/benchmark/index.d.ts +5 -0
  83. package/dist/gpu/compute/gpuCompute.d.ts +72 -0
  84. package/dist/gpu/compute/index.d.ts +6 -0
  85. package/dist/gpu/compute/shaders.d.ts +9 -0
  86. package/dist/gpu/drawList.d.ts +77 -0
  87. package/dist/gpu/examples/gallery.d.ts +20 -0
  88. package/dist/gpu/examples/index.d.ts +3 -0
  89. package/dist/gpu/examples/webgpu-line-demo.d.ts +8 -0
  90. package/dist/gpu/examples/webgpu-triangle.d.ts +1 -0
  91. package/dist/gpu/frame.d.ts +25 -0
  92. package/dist/gpu/index.d.ts +24 -0
  93. package/dist/gpu/resources/bufferStore.d.ts +40 -0
  94. package/dist/gpu/resources/index.d.ts +9 -0
  95. package/dist/gpu/resources/pipelineCache.d.ts +33 -0
  96. package/dist/gpu/resources/textureStore.d.ts +41 -0
  97. package/dist/gpu/types.d.ts +47 -0
  98. package/dist/index.d.ts +34 -0
  99. package/dist/overlay/CanvasOverlay.d.ts +102 -0
  100. package/dist/overlay/index.d.ts +4 -0
  101. package/dist/react/SciChart.d.ts +60 -0
  102. package/dist/react/index.d.ts +5 -0
  103. package/dist/react/useSciChart.d.ts +56 -0
  104. package/dist/renderer/BarRenderer.d.ts +14 -0
  105. package/dist/renderer/CandlestickRenderer.d.ts +12 -0
  106. package/dist/renderer/HeatmapRenderer.d.ts +15 -0
  107. package/dist/renderer/NativeWebGLRenderer.d.ts +16 -0
  108. package/dist/renderer/RendererInterface.d.ts +70 -0
  109. package/dist/renderer/WebGPURenderer.d.ts +16 -0
  110. package/dist/renderer/index.d.ts +10 -0
  111. package/dist/renderer/native/NativeWebGLRenderer.d.ts +30 -0
  112. package/dist/renderer/native/bufferStore.d.ts +11 -0
  113. package/dist/renderer/native/draw.d.ts +31 -0
  114. package/dist/renderer/native/programFactory.d.ts +3 -0
  115. package/dist/renderer/native/renderFrame.d.ts +3 -0
  116. package/dist/renderer/native/shaderSources.d.ts +6 -0
  117. package/dist/renderer/native/textureStore.d.ts +8 -0
  118. package/dist/renderer/native/types.d.ts +58 -0
  119. package/dist/renderer/native/utils.d.ts +4 -0
  120. package/dist/renderer/shaders.d.ts +77 -0
  121. package/dist/scales/index.d.ts +54 -0
  122. package/dist/scichart-engine.es.js +8408 -0
  123. package/dist/scichart-engine.es.js.map +1 -0
  124. package/dist/scichart-engine.umd.js +871 -0
  125. package/dist/scichart-engine.umd.js.map +1 -0
  126. package/dist/streaming/index.d.ts +7 -0
  127. package/dist/streaming/mock.d.ts +12 -0
  128. package/dist/streaming/types.d.ts +57 -0
  129. package/dist/streaming/utils.d.ts +19 -0
  130. package/dist/streaming/websocket.d.ts +6 -0
  131. package/dist/theme/index.d.ts +123 -0
  132. package/dist/types.d.ts +333 -0
  133. package/dist/workers/downsample.d.ts +34 -0
  134. package/dist/workers/downsample.worker.d.ts +46 -0
  135. package/package.json +59 -0
@@ -0,0 +1,60 @@
1
+ import { CSSProperties } from 'react';
2
+ import { UseSciChartOptions } from './useSciChart';
3
+ import { ZoomOptions, CursorOptions, Bounds } from '../types';
4
+ import { Chart } from '../core/Chart';
5
+
6
+ export interface SciChartSeries {
7
+ id: string;
8
+ x: Float32Array | Float64Array;
9
+ y: Float32Array | Float64Array;
10
+ color?: string;
11
+ width?: number;
12
+ visible?: boolean;
13
+ }
14
+ export interface SciChartProps extends UseSciChartOptions {
15
+ /** Series data to display */
16
+ series?: SciChartSeries[];
17
+ /** Zoom state (controlled) */
18
+ zoom?: ZoomOptions;
19
+ /** Callback when zoom changes */
20
+ onZoomChange?: (bounds: Bounds) => void;
21
+ /** Cursor configuration */
22
+ cursor?: CursorOptions;
23
+ /** Container width */
24
+ width?: number | string;
25
+ /** Container height */
26
+ height?: number | string;
27
+ /** Additional class name */
28
+ className?: string;
29
+ /** Additional styles */
30
+ style?: CSSProperties;
31
+ /** Debug mode - shows FPS counter */
32
+ debug?: boolean;
33
+ }
34
+ export interface SciChartRef {
35
+ /** Get the chart instance */
36
+ getChart: () => Chart | null;
37
+ /** Reset zoom to show all data */
38
+ resetZoom: () => void;
39
+ /** Get current bounds */
40
+ getBounds: () => Bounds | null;
41
+ }
42
+ /**
43
+ * SciChart React Component
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * <SciChart
48
+ * series={[
49
+ * { id: 'cv-1', x: potentialData, y: currentData, color: '#ff0055' }
50
+ * ]}
51
+ * xAxis={{ label: 'E / V' }}
52
+ * yAxis={{ label: 'I / A' }}
53
+ * height={400}
54
+ * cursor={{ enabled: true, snap: true }}
55
+ * onZoomChange={(bounds) => console.log('Zoom:', bounds)}
56
+ * />
57
+ * ```
58
+ */
59
+ export declare const SciChart: import('react').ForwardRefExoticComponent<SciChartProps & import('react').RefAttributes<SciChartRef>>;
60
+ export default SciChart;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * React bindings for SciChart Engine
3
+ */
4
+ export { SciChart, type SciChartProps, type SciChartRef, type SciChartSeries } from './SciChart';
5
+ export { useSciChart, type UseSciChartOptions, type UseSciChartReturn } from './useSciChart';
@@ -0,0 +1,56 @@
1
+ import { RefObject } from 'react';
2
+ import { Chart, ChartOptions } from '../core/Chart';
3
+ import { SeriesOptions, SeriesUpdateData, ZoomOptions, Bounds } from '../types';
4
+
5
+ export interface UseSciChartOptions extends Omit<ChartOptions, "container"> {
6
+ /** Auto-resize on container changes */
7
+ autoResize?: boolean;
8
+ }
9
+ export interface UseSciChartReturn {
10
+ /** Chart instance (null until initialized) */
11
+ chart: Chart | null;
12
+ /** Whether the chart is ready */
13
+ isReady: boolean;
14
+ /** Error during initialization */
15
+ error: Error | null;
16
+ /** Current view bounds */
17
+ bounds: Bounds | null;
18
+ /** Add a series */
19
+ addSeries: (options: SeriesOptions) => void;
20
+ /** Update series data */
21
+ updateSeries: (id: string, data: SeriesUpdateData) => void;
22
+ /** Remove a series */
23
+ removeSeries: (id: string) => void;
24
+ /** Set zoom range */
25
+ zoom: (options: ZoomOptions) => void;
26
+ /** Reset zoom to show all data */
27
+ resetZoom: () => void;
28
+ }
29
+ /**
30
+ * React hook for using SciChart Engine
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * function MyChart() {
35
+ * const canvasRef = useRef<HTMLCanvasElement>(null);
36
+ * const { chart, isReady, addSeries, zoom } = useSciChart(canvasRef, {
37
+ * xAxis: { label: 'E / V' },
38
+ * yAxis: { label: 'I / A' }
39
+ * });
40
+ *
41
+ * useEffect(() => {
42
+ * if (isReady) {
43
+ * addSeries({
44
+ * id: 'cv-1',
45
+ * type: 'line',
46
+ * data: { x: xData, y: yData },
47
+ * style: { color: '#ff0055' }
48
+ * });
49
+ * }
50
+ * }, [isReady]);
51
+ *
52
+ * return <canvas ref={canvasRef} />;
53
+ * }
54
+ * ```
55
+ */
56
+ export declare function useSciChart(containerRef: RefObject<HTMLDivElement>, options?: UseSciChartOptions): UseSciChartReturn;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Prepare bar chart data for WebGL rendering
3
+ * Creates rectangle vertices for each bar (2 triangles per bar = 6 vertices)
4
+ *
5
+ * @param x - X positions of bar centers
6
+ * @param y - Y heights of bars
7
+ * @param barWidth - Width of each bar in data units
8
+ * @returns Interleaved vertex data ready for gl.TRIANGLES
9
+ */
10
+ export declare function interleaveBarData(x: Float32Array | Float64Array | number[], y: Float32Array | Float64Array | number[], barWidth: number): Float32Array;
11
+ /**
12
+ * Calculate automatic bar width based on data spacing
13
+ */
14
+ export declare function calculateBarWidth(x: Float32Array | Float64Array | number[]): number;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Candlestick Renderer Utilities
3
+ */
4
+ /**
5
+ * Interleave data for candlestick rendering
6
+ * Each candle is represented by a body (box) and a wick (line/thin box)
7
+ * Returns a Float32Array of interleaved [x, y] coordinates for TRIANGLES
8
+ */
9
+ export declare function interleaveCandlestickData(x: Float32Array | Float64Array, open: Float32Array | Float64Array, high: Float32Array | Float64Array, low: Float32Array | Float64Array, close: Float32Array | Float64Array, width: number): {
10
+ bullish: Float32Array;
11
+ bearish: Float32Array;
12
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Prepare Heatmap data for WebGL rendering
3
+ * Creates a mesh of triangles for the grid.
4
+ *
5
+ * @param x - X coordinates of grid columns
6
+ * @param y - Y coordinates of grid rows
7
+ * @param z - Z values (matrix flattened in row-major order: width=x.length, height=y.length)
8
+ * @returns Interleaved data [x, y, value, ...] ready for gl.TRIANGLES
9
+ */
10
+ export declare function interleaveHeatmapData(x: Float32Array | Float64Array | number[], y: Float32Array | Float64Array | number[], z: Float32Array | Float64Array | number[]): Float32Array;
11
+ /**
12
+ * Generates a colormap texture data
13
+ * Viridis approximation
14
+ */
15
+ export declare function getColormap(name?: string): Uint8Array;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * NativeWebGLRenderer - Zero-dependency WebGL renderer
3
+ *
4
+ * This renderer uses raw WebGL APIs without any external libraries.
5
+ * Performance is identical (or slightly better) than regl since
6
+ * we eliminate the abstraction layer overhead.
7
+ *
8
+ * Key optimizations:
9
+ * - Pre-compiled shaders (compiled once, reused)
10
+ * - Uniform updates via GPU (no buffer recreation for zoom/pan)
11
+ * - Buffer pooling for dynamic data
12
+ * - Minimal state changes per frame
13
+ */
14
+ export { NativeWebGLRenderer } from './native/NativeWebGLRenderer';
15
+ export { interleaveBandData, interleaveData, interleaveStepData, parseColor, } from './native/utils';
16
+ export type { NativeRenderOptions, NativeSeriesRenderData } from './native/types';
@@ -0,0 +1,70 @@
1
+ import { Bounds } from '../types';
2
+
3
+ export interface SeriesRenderData {
4
+ id: string;
5
+ buffer: WebGLBuffer;
6
+ count: number;
7
+ style: any;
8
+ visible: boolean;
9
+ type: string;
10
+ zBounds?: {
11
+ min: number;
12
+ max: number;
13
+ };
14
+ colormapTexture?: WebGLTexture;
15
+ }
16
+ export interface RenderOptions {
17
+ bounds: Bounds;
18
+ backgroundColor?: [number, number, number, number];
19
+ }
20
+ /**
21
+ * Common interface for all WebGL renderer implementations
22
+ */
23
+ export interface IWebGLRenderer {
24
+ /** Check if WebGL is available and initialized */
25
+ readonly available: boolean;
26
+ /**
27
+ * Create or update a GPU buffer with interleaved X,Y data
28
+ * @param id - Unique buffer identifier
29
+ * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]
30
+ */
31
+ createBuffer(id: string, data: Float32Array): void;
32
+ /**
33
+ * Get a buffer by ID
34
+ */
35
+ getBuffer(id: string): WebGLBuffer | undefined;
36
+ /**
37
+ * Delete a buffer and free GPU memory
38
+ */
39
+ deleteBuffer(id: string): void;
40
+ /**
41
+ * Create a 1D texture for heatmaps
42
+ */
43
+ createColormapTexture(id: string, data: Uint8Array): WebGLTexture;
44
+ /**
45
+ * Render a frame with all visible series
46
+ */
47
+ render(series: SeriesRenderData[], options: RenderOptions): void;
48
+ /**
49
+ * Handle canvas resize
50
+ */
51
+ resize(): void;
52
+ /**
53
+ * Get WebGL capabilities/limits
54
+ */
55
+ getLimits(): Record<string, unknown>;
56
+ /**
57
+ * Cleanup and destroy all GPU resources
58
+ */
59
+ destroy(): void;
60
+ }
61
+ /**
62
+ * Create a WebGL renderer (Native WebGL)
63
+ *
64
+ * @param canvas - Target canvas element
65
+ */
66
+ export declare function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer;
67
+ /**
68
+ * Create a renderer synchronously (native only)
69
+ */
70
+ export { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';
@@ -0,0 +1,16 @@
1
+ export interface WebGPURendererOptions {
2
+ powerPreference?: "low-power" | "high-performance";
3
+ preferredFormat?: string;
4
+ antialias?: boolean;
5
+ }
6
+ export declare class WebGPURenderer {
7
+ readonly available: boolean;
8
+ private canvas;
9
+ private adapter;
10
+ private device;
11
+ private context;
12
+ constructor(canvas: HTMLCanvasElement, opts?: WebGPURendererOptions);
13
+ static isSupported(): boolean;
14
+ init(opts?: WebGPURendererOptions): Promise<void>;
15
+ destroy(): void;
16
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Renderer module exports
3
+ */
4
+ export { NativeWebGLRenderer, interleaveData, interleaveStepData, interleaveBandData, parseColor, type NativeSeriesRenderData, type NativeRenderOptions, } from './NativeWebGLRenderer';
5
+ export { type IWebGLRenderer, type SeriesRenderData, type RenderOptions, createRenderer, createNativeRenderer, } from './RendererInterface';
6
+ export { WebGPURenderer, type WebGPURendererOptions } from './WebGPURenderer';
7
+ export * from './shaders';
8
+ export { interleaveBarData, calculateBarWidth } from './BarRenderer';
9
+ export { interleaveHeatmapData, getColormap } from './HeatmapRenderer';
10
+ export { interleaveCandlestickData } from './CandlestickRenderer';
@@ -0,0 +1,30 @@
1
+ import { NativeRenderOptions, NativeSeriesRenderData } from './types';
2
+
3
+ export declare class NativeWebGLRenderer {
4
+ private canvas;
5
+ private gl;
6
+ private dpr;
7
+ private programs;
8
+ private buffers;
9
+ private textures;
10
+ private isInitialized;
11
+ setDPR(dpr: number): void;
12
+ constructor(canvas: HTMLCanvasElement);
13
+ get available(): boolean;
14
+ createBuffer(id: string, data: Float32Array): void;
15
+ updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean;
16
+ getBuffer(id: string): WebGLBuffer | undefined;
17
+ deleteBuffer(id: string): void;
18
+ createColormapTexture(id: string, data: Uint8Array): WebGLTexture;
19
+ getTexture(id: string): WebGLTexture | undefined;
20
+ render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void;
21
+ resize(): void;
22
+ getLimits(): {
23
+ maxTextureSize: any;
24
+ maxViewportDims: any;
25
+ renderer: any;
26
+ vendor: any;
27
+ };
28
+ destroy(): void;
29
+ }
30
+ export type { NativeSeriesRenderData, NativeRenderOptions } from './types';
@@ -0,0 +1,11 @@
1
+ export declare class BufferStore {
2
+ private gl;
3
+ private buffers;
4
+ private bufferSizes;
5
+ constructor(gl: WebGLRenderingContext);
6
+ createBuffer(id: string, data: Float32Array): void;
7
+ updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean;
8
+ getBuffer(id: string): WebGLBuffer | undefined;
9
+ deleteBuffer(id: string): void;
10
+ destroy(): void;
11
+ }
@@ -0,0 +1,31 @@
1
+ import { Bounds } from '../../types';
2
+ import { ShaderProgram } from './types';
3
+
4
+ export declare function calculateUniforms(bounds: Bounds): {
5
+ scale: [number, number];
6
+ translate: [number, number];
7
+ };
8
+ export declare function renderLine(gl: WebGLRenderingContext, prog: ShaderProgram, buffer: WebGLBuffer, count: number, uniforms: {
9
+ scale: [number, number];
10
+ translate: [number, number];
11
+ }, color: [number, number, number, number]): void;
12
+ export declare function renderBand(gl: WebGLRenderingContext, prog: ShaderProgram, buffer: WebGLBuffer, count: number, uniforms: {
13
+ scale: [number, number];
14
+ translate: [number, number];
15
+ }, color: [number, number, number, number]): void;
16
+ export declare function renderPoints(gl: WebGLRenderingContext, prog: ShaderProgram, buffer: WebGLBuffer, count: number, uniforms: {
17
+ scale: [number, number];
18
+ translate: [number, number];
19
+ }, color: [number, number, number, number], pointSize: number, symbol?: string): void;
20
+ export declare function renderHeatmap(gl: WebGLRenderingContext, prog: ShaderProgram, buffer: WebGLBuffer, count: number, uniforms: {
21
+ scale: [number, number];
22
+ translate: [number, number];
23
+ }, zBounds?: {
24
+ min: number;
25
+ max: number;
26
+ }, texture?: WebGLTexture): void;
27
+ export declare function renderBar(gl: WebGLRenderingContext, prog: ShaderProgram, buffer: WebGLBuffer, count: number, uniforms: {
28
+ scale: [number, number];
29
+ translate: [number, number];
30
+ }, color: [number, number, number, number]): void;
31
+ export declare function computeSeriesColor(style: any): [number, number, number, number];
@@ -0,0 +1,3 @@
1
+ import { ProgramBundle } from './types';
2
+
3
+ export declare function createProgramBundle(gl: WebGLRenderingContext): ProgramBundle;
@@ -0,0 +1,3 @@
1
+ import { NativeRenderOptions, NativeSeriesRenderData, ProgramBundle } from './types';
2
+
3
+ export declare function renderFrame(gl: WebGLRenderingContext, canvas: HTMLCanvasElement, dpr: number, programs: ProgramBundle, series: NativeSeriesRenderData[], options: NativeRenderOptions): void;
@@ -0,0 +1,6 @@
1
+ export declare const LINE_VERT = "\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n";
2
+ export declare const LINE_FRAG = "\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n";
3
+ export declare const POINT_VERT = "\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n";
4
+ export declare const POINT_FRAG = "\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n";
5
+ export declare const HEATMAP_VERT = "\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n";
6
+ export declare const HEATMAP_FRAG = "\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n";
@@ -0,0 +1,8 @@
1
+ export declare class TextureStore {
2
+ private gl;
3
+ private textures;
4
+ constructor(gl: WebGLRenderingContext);
5
+ createColormapTexture(id: string, data: Uint8Array): WebGLTexture;
6
+ getTexture(id: string): WebGLTexture | undefined;
7
+ destroy(): void;
8
+ }
@@ -0,0 +1,58 @@
1
+ import { Bounds } from '../../types';
2
+
3
+ export interface NativeSeriesRenderData {
4
+ id: string;
5
+ buffer: WebGLBuffer;
6
+ count: number;
7
+ style: any;
8
+ visible: boolean;
9
+ type: "line" | "scatter" | "line+scatter" | "step" | "step+scatter" | "band" | "bar" | "heatmap" | "candlestick";
10
+ /** For step types: pre-computed step buffer */
11
+ stepBuffer?: WebGLBuffer;
12
+ stepCount?: number;
13
+ /** Optional specific Y-bounds for this series (overrides global bounds) */
14
+ yBounds?: {
15
+ min: number;
16
+ max: number;
17
+ };
18
+ /** Heatmap specific */
19
+ zBounds?: {
20
+ min: number;
21
+ max: number;
22
+ };
23
+ colormap?: string;
24
+ colormapTexture?: WebGLTexture;
25
+ }
26
+ export interface NativeRenderOptions {
27
+ bounds: Bounds;
28
+ backgroundColor?: [number, number, number, number];
29
+ plotArea?: {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ };
35
+ }
36
+ export interface ShaderProgram {
37
+ program: WebGLProgram;
38
+ attributes: {
39
+ position: number;
40
+ value?: number;
41
+ };
42
+ uniforms: {
43
+ uScale: WebGLUniformLocation;
44
+ uTranslate: WebGLUniformLocation;
45
+ uColor: WebGLUniformLocation | null;
46
+ uPointSize: WebGLUniformLocation | null;
47
+ uSymbol: WebGLUniformLocation | null;
48
+ uMinValue: WebGLUniformLocation | null;
49
+ uMaxValue: WebGLUniformLocation | null;
50
+ uColormap: WebGLUniformLocation | null;
51
+ };
52
+ }
53
+ export type ProgramMode = "line" | "point" | "heatmap";
54
+ export interface ProgramBundle {
55
+ lineProgram: ShaderProgram;
56
+ pointProgram: ShaderProgram;
57
+ heatmapProgram: ShaderProgram;
58
+ }
@@ -0,0 +1,4 @@
1
+ export declare function parseColor(color: string): [number, number, number, number];
2
+ export declare function interleaveData(x: Float32Array | Float64Array | number[], y: Float32Array | Float64Array | number[]): Float32Array;
3
+ export declare function interleaveStepData(x: Float32Array | Float64Array | number[], y: Float32Array | Float64Array | number[], mode?: "before" | "after" | "center"): Float32Array;
4
+ export declare function interleaveBandData(x: Float32Array | Float64Array | number[], y1: Float32Array | Float64Array | number[], y2: Float32Array | Float64Array | number[]): Float32Array;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Line Vertex Shader
3
+ *
4
+ * Transforms 2D points from data space to clip space using uniforms.
5
+ * This allows zoom/pan without recreating vertex buffers.
6
+ */
7
+ export declare const lineVertexShader = "\nprecision highp float;\n\n// Attributes (per-vertex data)\nattribute vec2 position;\n\n// Uniforms (constant across all vertices)\nuniform vec2 uScale; // Zoom factor [scaleX, scaleY]\nuniform vec2 uTranslate; // Pan offset [translateX, translateY]\nuniform vec2 uResolution; // Canvas size in pixels\n\n// Varying (passed to fragment shader)\nvarying float vAlpha;\n\nvoid main() {\n // Transform position: apply scale and translate\n vec2 pos = position * uScale + uTranslate;\n\n // pos is now in normalized device coordinates (-1 to 1)\n gl_Position = vec4(pos, 0.0, 1.0);\n\n // Pass alpha for potential fading effects\n vAlpha = 1.0;\n}\n";
8
+ /**
9
+ * Line Fragment Shader
10
+ *
11
+ * Simple solid color output with configurable opacity.
12
+ */
13
+ export declare const lineFragmentShader = "\nprecision highp float;\n\n// Uniforms\nuniform vec4 uColor; // RGBA color\n\n// Varying from vertex shader\nvarying float vAlpha;\n\nvoid main() {\n gl_FragColor = vec4(uColor.rgb, uColor.a * vAlpha);\n}\n";
14
+ /**
15
+ * Antialiased Line Vertex Shader
16
+ *
17
+ * For thick lines with proper antialiasing, we need to expand
18
+ * lines into quads and compute distance from line center.
19
+ */
20
+ export declare const lineAAVertexShader = "\nprecision highp float;\n\nattribute vec2 position;\nattribute vec2 normal; // Perpendicular to line direction\nattribute float miter; // Miter length for joins\n\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform vec2 uResolution;\nuniform float uLineWidth;\n\nvarying vec2 vNormal;\nvarying float vLineWidth;\n\nvoid main() {\n // Transform position\n vec2 pos = position * uScale + uTranslate;\n\n // Convert to screen space for line width calculation\n vec2 screenPos = (pos * 0.5 + 0.5) * uResolution;\n\n // Offset by line width in screen space\n float halfWidth = uLineWidth * 0.5;\n screenPos += normal * halfWidth * miter;\n\n // Convert back to clip space\n pos = (screenPos / uResolution) * 2.0 - 1.0;\n\n gl_Position = vec4(pos, 0.0, 1.0);\n\n vNormal = normal;\n vLineWidth = uLineWidth;\n}\n";
21
+ /**
22
+ * Antialiased Line Fragment Shader
23
+ *
24
+ * Uses distance-based antialiasing for smooth edges.
25
+ */
26
+ export declare const lineAAFragmentShader = "\nprecision highp float;\n\nuniform vec4 uColor;\nuniform float uLineWidth;\n\nvarying vec2 vNormal;\nvarying float vLineWidth;\n\nvoid main() {\n // Distance from line center (0 at center, 1 at edge)\n float dist = length(vNormal);\n\n // Smooth step for antialiasing\n float aa = 1.0 / uLineWidth;\n float alpha = 1.0 - smoothstep(1.0 - aa, 1.0, dist);\n\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n";
27
+ /**
28
+ * Point/Scatter Vertex Shader
29
+ *
30
+ * Renders data points as squares/circles.
31
+ */
32
+ export declare const pointVertexShader = "\nprecision highp float;\n\nattribute vec2 position;\n\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n";
33
+ /**
34
+ * Point/Scatter Fragment Shader
35
+ *
36
+ * Renders circular points with smooth edges.
37
+ */
38
+ export declare const pointFragmentShader = "\nprecision highp float;\n\nuniform vec4 uColor;\n\nvoid main() {\n // Distance from point center\n vec2 coord = gl_PointCoord - vec2(0.5);\n float dist = length(coord);\n\n // Discard outside circle\n if (dist > 0.5) discard;\n\n // Smooth edge\n float alpha = 1.0 - smoothstep(0.4, 0.5, dist);\n\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n";
39
+ /**
40
+ * Heatmap Vertex Shader (for future density plots)
41
+ */
42
+ export declare const heatmapVertexShader = "\nprecision highp float;\n\nattribute vec2 position;\nattribute float value;\n\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvarying float vValue;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n vValue = value;\n}\n";
43
+ /**
44
+ * Heatmap Fragment Shader
45
+ *
46
+ * Maps values to colors using a colormap.
47
+ */
48
+ export declare const heatmapFragmentShader = "\nprecision highp float;\n\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvarying float vValue;\n\nvoid main() {\n float normalized = (vValue - uMinValue) / (uMaxValue - uMinValue);\n normalized = clamp(normalized, 0.0, 1.0);\n\n vec4 color = texture2D(uColormap, vec2(normalized, 0.5));\n gl_FragColor = color;\n}\n";
49
+ /**
50
+ * Bar Chart Vertex Shader
51
+ *
52
+ * Renders rectangular bars using quad primitives.
53
+ */
54
+ export declare const barVertexShader = "\nprecision highp float;\n\n// Attributes\nattribute vec2 position; // Corner position of bar quad [x, y]\nattribute vec2 barData; // [barX, barY] - center and height of bar\n\n// Uniforms\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uBarWidth; // Width of bars in data units\n\nvoid main() {\n // Calculate bar corner in data space\n float halfWidth = uBarWidth * 0.5;\n vec2 dataPos = vec2(\n barData.x + position.x * halfWidth, // X: center \u00B1 halfWidth\n position.y * barData.y // Y: 0 to barY\n );\n \n // Transform to clip space\n vec2 clipPos = dataPos * uScale + uTranslate;\n gl_Position = vec4(clipPos, 0.0, 1.0);\n}\n";
55
+ export declare const barFragmentShader = "\nprecision highp float;\n\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n";
56
+ export declare const Shaders: {
57
+ line: {
58
+ vertex: string;
59
+ fragment: string;
60
+ };
61
+ lineAA: {
62
+ vertex: string;
63
+ fragment: string;
64
+ };
65
+ point: {
66
+ vertex: string;
67
+ fragment: string;
68
+ };
69
+ bar: {
70
+ vertex: string;
71
+ fragment: string;
72
+ };
73
+ heatmap: {
74
+ vertex: string;
75
+ fragment: string;
76
+ };
77
+ };
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Scale interface and implementations
3
+ *
4
+ * Scales transform data values to pixel coordinates and vice versa.
5
+ */
6
+ export interface Scale {
7
+ /** Data domain [min, max] */
8
+ domain: [number, number];
9
+ /** Pixel range [min, max] */
10
+ range: [number, number];
11
+ /** Scale type identifier */
12
+ type: "linear" | "log";
13
+ /** Set the domain */
14
+ setDomain(min: number, max: number): void;
15
+ /** Set the range */
16
+ setRange(min: number, max: number): void;
17
+ /** Transform data value to pixel */
18
+ transform(value: number): number;
19
+ /** Transform pixel to data value */
20
+ invert(pixel: number): number;
21
+ /** Generate nice tick values */
22
+ ticks(count?: number): number[];
23
+ }
24
+ /**
25
+ * Linear scale - proportional mapping
26
+ */
27
+ export declare class LinearScale implements Scale {
28
+ domain: [number, number];
29
+ range: [number, number];
30
+ readonly type: "linear";
31
+ setDomain(min: number, max: number): void;
32
+ setRange(min: number, max: number): void;
33
+ transform(value: number): number;
34
+ invert(pixel: number): number;
35
+ ticks(count?: number): number[];
36
+ }
37
+ /**
38
+ * Logarithmic scale - for exponential data
39
+ */
40
+ export declare class LogScale implements Scale {
41
+ domain: [number, number];
42
+ range: [number, number];
43
+ readonly type: "log";
44
+ private base;
45
+ setDomain(min: number, max: number): void;
46
+ setRange(min: number, max: number): void;
47
+ transform(value: number): number;
48
+ invert(pixel: number): number;
49
+ ticks(count?: number): number[];
50
+ }
51
+ /**
52
+ * Factory function to create scale by type
53
+ */
54
+ export declare function createScale(type: "linear" | "log"): Scale;