uplot-webgpu 0.1.0 → 0.2.0
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/index.js +0 -17
- package/index.ts +5 -0
- package/package.json +4 -69
- package/paths/ts/bars.ts +253 -0
- package/paths/ts/catmullRomCentrip.ts +127 -0
- package/paths/ts/index.ts +9 -0
- package/paths/ts/linear.ts +172 -0
- package/paths/ts/monotoneCubic.ts +70 -0
- package/paths/ts/points.ts +70 -0
- package/paths/ts/spline.ts +105 -0
- package/paths/ts/stepped.ts +126 -0
- package/paths/ts/types.ts +143 -0
- package/paths/ts/utils.ts +303 -0
- package/scripts/ts/uPlot.ts +3732 -0
- package/scripts/ts/utils/dom.ts +124 -0
- package/scripts/ts/utils/domClasses.ts +22 -0
- package/scripts/ts/utils/feats.ts +13 -0
- package/scripts/ts/utils/fmtDate.ts +398 -0
- package/scripts/ts/utils/opts.ts +844 -0
- package/scripts/ts/utils/strings.ts +22 -0
- package/scripts/ts/utils/sync.ts +27 -0
- package/scripts/ts/utils/utils.ts +692 -0
- package/scripts/{webgpu → ts/webgpu}/GPUPath.ts +92 -41
- package/scripts/{webgpu → ts/webgpu}/WebGPURenderer.ts +176 -84
- package/scripts/ts/webgpu/exporters.ts +221 -0
- package/scripts/ts/webgpu/index.ts +31 -0
- package/scripts/{webgpu → ts/webgpu}/shaders.ts +0 -1
- package/scripts/uPlot.js +0 -2
- package/scripts/webgpu/GPUPath.js +513 -606
- package/scripts/webgpu/WebGPURenderer.js +3484 -4018
- package/scripts/webgpu/exporters.js +191 -201
- package/scripts/webgpu/index.js +12 -0
- package/scripts/webgpu/shaders.js +6 -3
- package/tinybuild.config.js +6 -6
- package/tsconfig.json +64 -0
- package/scripts/uPlot.d.ts +0 -26
- package/scripts/webgpu/GPUPath.d.ts +0 -46
- package/scripts/webgpu/WebGPURenderer.d.ts +0 -176
- package/scripts/webgpu/exporters.d.ts +0 -8
- package/scripts/webgpu/shaders.d.ts +0 -2
- package/scripts/webgpu/smokeTest.d.ts +0 -2
- package/scripts/webgpu/webgpu-ambient.d.ts +0 -41
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
declare const Buffer: any;
|
|
2
|
+
export function rgbaImageDataToBmpBytes(imageData: ImageData | {width: number; height: number; data: Uint8ClampedArray | Uint8Array}): Uint8Array {
|
|
3
|
+
let width = Math.max(0, Math.floor(Number(imageData?.width) || 0));
|
|
4
|
+
let height = Math.max(0, Math.floor(Number(imageData?.height) || 0));
|
|
5
|
+
let data = imageData?.data || new Uint8ClampedArray(0);
|
|
6
|
+
let rowStride = Math.ceil((width * 4) / 4) * 4;
|
|
7
|
+
let pixelBytes = rowStride * height;
|
|
8
|
+
let bytes = new Uint8Array(14 + 40 + pixelBytes);
|
|
9
|
+
let view = new DataView(bytes.buffer);
|
|
10
|
+
|
|
11
|
+
bytes[0] = 0x42;
|
|
12
|
+
bytes[1] = 0x4d;
|
|
13
|
+
view.setUint32(2, bytes.length, true);
|
|
14
|
+
view.setUint32(10, 54, true);
|
|
15
|
+
view.setUint32(14, 40, true);
|
|
16
|
+
view.setInt32(18, width, true);
|
|
17
|
+
view.setInt32(22, -height, true);
|
|
18
|
+
view.setUint16(26, 1, true);
|
|
19
|
+
view.setUint16(28, 32, true);
|
|
20
|
+
view.setUint32(34, pixelBytes, true);
|
|
21
|
+
|
|
22
|
+
let out = 54;
|
|
23
|
+
for (let y = 0; y < height; y++) {
|
|
24
|
+
let src = y * width * 4;
|
|
25
|
+
for (let x = 0; x < width; x++) {
|
|
26
|
+
let si = src + x * 4;
|
|
27
|
+
let di = out + x * 4;
|
|
28
|
+
bytes[di + 0] = data[si + 2] || 0;
|
|
29
|
+
bytes[di + 1] = data[si + 1] || 0;
|
|
30
|
+
bytes[di + 2] = data[si + 0] || 0;
|
|
31
|
+
bytes[di + 3] = data[si + 3] == null ? 255 : data[si + 3];
|
|
32
|
+
}
|
|
33
|
+
out += rowStride;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return bytes;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
function makeCrc32Table() {
|
|
41
|
+
let table = new Uint32Array(256);
|
|
42
|
+
for (let i = 0; i < 256; i++) {
|
|
43
|
+
let c = i;
|
|
44
|
+
for (let j = 0; j < 8; j++)
|
|
45
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
46
|
+
table[i] = c >>> 0;
|
|
47
|
+
}
|
|
48
|
+
return table;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const CRC32_TABLE = makeCrc32Table();
|
|
52
|
+
|
|
53
|
+
function crc32(bytes) {
|
|
54
|
+
let c = 0xffffffff;
|
|
55
|
+
for (let i = 0; i < bytes.length; i++)
|
|
56
|
+
c = CRC32_TABLE[(c ^ bytes[i]) & 255] ^ (c >>> 8);
|
|
57
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function adler32(bytes) {
|
|
61
|
+
let a = 1;
|
|
62
|
+
let b = 0;
|
|
63
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
64
|
+
a = (a + bytes[i]) % 65521;
|
|
65
|
+
b = (b + a) % 65521;
|
|
66
|
+
}
|
|
67
|
+
return ((b << 16) | a) >>> 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function writeU32(bytes, offset, value) {
|
|
71
|
+
bytes[offset + 0] = (value >>> 24) & 255;
|
|
72
|
+
bytes[offset + 1] = (value >>> 16) & 255;
|
|
73
|
+
bytes[offset + 2] = (value >>> 8) & 255;
|
|
74
|
+
bytes[offset + 3] = value & 255;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function asciiBytes(text) {
|
|
78
|
+
let out = new Uint8Array(text.length);
|
|
79
|
+
for (let i = 0; i < text.length; i++)
|
|
80
|
+
out[i] = text.charCodeAt(i) & 255;
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function pngChunk(type, data) {
|
|
85
|
+
let name = asciiBytes(type);
|
|
86
|
+
let out = new Uint8Array(12 + data.length);
|
|
87
|
+
writeU32(out, 0, data.length);
|
|
88
|
+
out.set(name, 4);
|
|
89
|
+
out.set(data, 8);
|
|
90
|
+
let crcInput = new Uint8Array(name.length + data.length);
|
|
91
|
+
crcInput.set(name, 0);
|
|
92
|
+
crcInput.set(data, name.length);
|
|
93
|
+
writeU32(out, out.length - 4, crc32(crcInput));
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function zlibStore(bytes) {
|
|
98
|
+
let blocks = [];
|
|
99
|
+
let total = 2 + 4;
|
|
100
|
+
for (let pos = 0; pos < bytes.length; pos += 65535) {
|
|
101
|
+
let len = Math.min(65535, bytes.length - pos);
|
|
102
|
+
let block = new Uint8Array(5 + len);
|
|
103
|
+
block[0] = pos + len >= bytes.length ? 1 : 0;
|
|
104
|
+
block[1] = len & 255;
|
|
105
|
+
block[2] = (len >>> 8) & 255;
|
|
106
|
+
let nlen = (~len) & 65535;
|
|
107
|
+
block[3] = nlen & 255;
|
|
108
|
+
block[4] = (nlen >>> 8) & 255;
|
|
109
|
+
block.set(bytes.subarray(pos, pos + len), 5);
|
|
110
|
+
blocks.push(block);
|
|
111
|
+
total += block.length;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let out = new Uint8Array(total);
|
|
115
|
+
out[0] = 0x78;
|
|
116
|
+
out[1] = 0x01;
|
|
117
|
+
let o = 2;
|
|
118
|
+
for (let block of blocks) {
|
|
119
|
+
out.set(block, o);
|
|
120
|
+
o += block.length;
|
|
121
|
+
}
|
|
122
|
+
writeU32(out, o, adler32(bytes));
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function rgbaImageDataToPngBytes(imageData: ImageData | {width: number; height: number; data: Uint8ClampedArray | Uint8Array}): Uint8Array {
|
|
127
|
+
let width = Math.max(0, Math.floor(Number(imageData?.width) || 0));
|
|
128
|
+
let height = Math.max(0, Math.floor(Number(imageData?.height) || 0));
|
|
129
|
+
let data = imageData?.data || new Uint8ClampedArray(0);
|
|
130
|
+
let raw = new Uint8Array((width * 4 + 1) * height);
|
|
131
|
+
let dst = 0;
|
|
132
|
+
let src = 0;
|
|
133
|
+
for (let y = 0; y < height; y++) {
|
|
134
|
+
raw[dst++] = 0;
|
|
135
|
+
for (let x = 0; x < width; x++) {
|
|
136
|
+
raw[dst++] = data[src++] || 0;
|
|
137
|
+
raw[dst++] = data[src++] || 0;
|
|
138
|
+
raw[dst++] = data[src++] || 0;
|
|
139
|
+
let a = data[src++];
|
|
140
|
+
raw[dst++] = a == null ? 255 : a;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let ihdr = new Uint8Array(13);
|
|
145
|
+
writeU32(ihdr, 0, width);
|
|
146
|
+
writeU32(ihdr, 4, height);
|
|
147
|
+
ihdr[8] = 8;
|
|
148
|
+
ihdr[9] = 6;
|
|
149
|
+
ihdr[10] = 0;
|
|
150
|
+
ihdr[11] = 0;
|
|
151
|
+
ihdr[12] = 0;
|
|
152
|
+
|
|
153
|
+
let signature = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
154
|
+
let chunks = [signature, pngChunk('IHDR', ihdr), pngChunk('IDAT', zlibStore(raw)), pngChunk('IEND', new Uint8Array(0))];
|
|
155
|
+
let total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
156
|
+
let out = new Uint8Array(total);
|
|
157
|
+
let offset = 0;
|
|
158
|
+
for (let chunk of chunks) {
|
|
159
|
+
out.set(chunk, offset);
|
|
160
|
+
offset += chunk.length;
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function normalizeExportType(type?: string): string {
|
|
166
|
+
type = String(type || 'image/png').toLowerCase();
|
|
167
|
+
return type == 'image/bmp' || type == 'image/x-ms-bmp' ? 'image/bmp' : 'image/png';
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function bytesToBase64(bytes: Uint8Array): string {
|
|
171
|
+
if (typeof Buffer != 'undefined')
|
|
172
|
+
return Buffer.from(bytes).toString('base64');
|
|
173
|
+
|
|
174
|
+
let s = '';
|
|
175
|
+
let chunk = 0x8000;
|
|
176
|
+
for (let i = 0; i < bytes.length; i += chunk)
|
|
177
|
+
s += String.fromCharCode(...bytes.subarray(i, i + chunk));
|
|
178
|
+
return btoa(s);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function bytesToArrayBuffer(bytes: Uint8Array): ArrayBuffer {
|
|
182
|
+
let out = new ArrayBuffer(bytes.byteLength);
|
|
183
|
+
new Uint8Array(out).set(bytes);
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function bytesToBlob(bytes: Uint8Array, type: string): Blob | {type: string; size: number; arrayBuffer(): Promise<ArrayBuffer>} {
|
|
188
|
+
let buffer = bytesToArrayBuffer(bytes);
|
|
189
|
+
|
|
190
|
+
if (typeof Blob != 'undefined')
|
|
191
|
+
return new Blob([buffer], {type});
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
type,
|
|
195
|
+
size: bytes.byteLength,
|
|
196
|
+
async arrayBuffer() {
|
|
197
|
+
return buffer.slice(0);
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function textToBlob(text: string, type: string): Blob | {type: string; size: number; arrayBuffer(): Promise<ArrayBuffer>} {
|
|
203
|
+
if (typeof Blob != 'undefined')
|
|
204
|
+
return new Blob([text], {type});
|
|
205
|
+
|
|
206
|
+
let bytes = new TextEncoder().encode(text);
|
|
207
|
+
return bytesToBlob(bytes, type);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function escapeXmlAttr(value: unknown): string {
|
|
211
|
+
return String(value).replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function encodeTextBase64(text: string): string {
|
|
215
|
+
if (typeof Buffer != 'undefined')
|
|
216
|
+
return Buffer.from(text, 'utf8').toString('base64');
|
|
217
|
+
|
|
218
|
+
let bytes = new TextEncoder().encode(text);
|
|
219
|
+
return bytesToBase64(bytes);
|
|
220
|
+
}
|
|
221
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export { GPUPath } from './GPUPath';
|
|
2
|
+
export type {
|
|
3
|
+
GPUPathArcCommand,
|
|
4
|
+
GPUPathArcFlag,
|
|
5
|
+
GPUPathBounds,
|
|
6
|
+
GPUPathCloseCommand,
|
|
7
|
+
GPUPathCommand,
|
|
8
|
+
GPUPathCubicCommand,
|
|
9
|
+
GPUPathEllipseCommand,
|
|
10
|
+
GPUPathLike,
|
|
11
|
+
GPUPathLineCommand,
|
|
12
|
+
GPUPathMoveCommand,
|
|
13
|
+
GPUPathPoint,
|
|
14
|
+
GPUPathRect,
|
|
15
|
+
GPUPathRectCommand,
|
|
16
|
+
GPUPathSubpath,
|
|
17
|
+
} from './GPUPath';
|
|
18
|
+
export { default, WebGPURenderer, WebGPURendererInternals } from './WebGPURenderer';
|
|
19
|
+
export type {
|
|
20
|
+
CanvasGradientLike,
|
|
21
|
+
CanvasPatternLike,
|
|
22
|
+
RGBA,
|
|
23
|
+
WebGPUMemoryMode,
|
|
24
|
+
WebGPURendererFrameStats,
|
|
25
|
+
WebGPURendererMemoryStats,
|
|
26
|
+
WebGPURendererOptions,
|
|
27
|
+
WebGPURuntimeStats,
|
|
28
|
+
WebGPUWarmupStats,
|
|
29
|
+
} from './WebGPURenderer';
|
|
30
|
+
export { CHART_WGSL, IMAGE_WGSL } from './shaders';
|
|
31
|
+
export * from './exporters';
|