@luma.gl/core 9.1.9 → 9.2.0-alpha.3
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/dist/adapter/adapter.d.ts +14 -1
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/adapter/adapter.js +27 -0
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/canvas-context.d.ts +101 -48
- package/dist/adapter/canvas-context.d.ts.map +1 -1
- package/dist/adapter/canvas-context.js +255 -153
- package/dist/adapter/canvas-context.js.map +1 -1
- package/dist/adapter/device.d.ts +112 -42
- package/dist/adapter/device.d.ts.map +1 -1
- package/dist/adapter/device.js +153 -56
- package/dist/adapter/device.js.map +1 -1
- package/dist/adapter/luma.d.ts +24 -22
- package/dist/adapter/luma.d.ts.map +1 -1
- package/dist/adapter/luma.js +76 -92
- package/dist/adapter/luma.js.map +1 -1
- package/dist/adapter/resources/buffer.d.ts +18 -12
- package/dist/adapter/resources/buffer.d.ts.map +1 -1
- package/dist/adapter/resources/buffer.js +14 -18
- package/dist/adapter/resources/buffer.js.map +1 -1
- package/dist/adapter/resources/command-buffer.d.ts +1 -1
- package/dist/adapter/resources/command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/command-buffer.js +3 -3
- package/dist/adapter/resources/command-buffer.js.map +1 -1
- package/dist/adapter/resources/command-encoder.d.ts +9 -2
- package/dist/adapter/resources/command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/command-encoder.js +7 -4
- package/dist/adapter/resources/command-encoder.js.map +1 -1
- package/dist/adapter/resources/compute-pass.d.ts +2 -2
- package/dist/adapter/resources/compute-pass.d.ts.map +1 -1
- package/dist/adapter/resources/compute-pass.js +3 -3
- package/dist/adapter/resources/compute-pass.js.map +1 -1
- package/dist/adapter/resources/compute-pipeline.d.ts +1 -1
- package/dist/adapter/resources/compute-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/compute-pipeline.js +7 -7
- package/dist/adapter/resources/compute-pipeline.js.map +1 -1
- package/dist/adapter/resources/external-texture.d.ts +1 -1
- package/dist/adapter/resources/external-texture.d.ts.map +1 -1
- package/dist/adapter/resources/external-texture.js +5 -5
- package/dist/adapter/resources/external-texture.js.map +1 -1
- package/dist/adapter/resources/framebuffer.d.ts +4 -4
- package/dist/adapter/resources/framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/framebuffer.js +8 -9
- package/dist/adapter/resources/framebuffer.js.map +1 -1
- package/dist/adapter/resources/pipeline-layout.d.ts.map +1 -1
- package/dist/adapter/resources/pipeline-layout.js +3 -0
- package/dist/adapter/resources/pipeline-layout.js.map +1 -1
- package/dist/adapter/resources/query-set.d.ts +1 -1
- package/dist/adapter/resources/query-set.d.ts.map +1 -1
- package/dist/adapter/resources/query-set.js +5 -5
- package/dist/adapter/resources/query-set.js.map +1 -1
- package/dist/adapter/resources/render-pass.d.ts +2 -2
- package/dist/adapter/resources/render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/render-pass.js +10 -13
- package/dist/adapter/resources/render-pass.js.map +1 -1
- package/dist/adapter/resources/render-pipeline.d.ts +7 -9
- package/dist/adapter/resources/render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/render-pipeline.js +17 -29
- package/dist/adapter/resources/render-pipeline.js.map +1 -1
- package/dist/adapter/resources/resource.d.ts +1 -0
- package/dist/adapter/resources/resource.d.ts.map +1 -1
- package/dist/adapter/resources/resource.js.map +1 -1
- package/dist/adapter/resources/sampler.d.ts.map +1 -1
- package/dist/adapter/resources/sampler.js +1 -3
- package/dist/adapter/resources/sampler.js.map +1 -1
- package/dist/adapter/resources/shader.d.ts +2 -2
- package/dist/adapter/resources/shader.d.ts.map +1 -1
- package/dist/adapter/resources/shader.js +14 -14
- package/dist/adapter/resources/shader.js.map +1 -1
- package/dist/adapter/resources/texture-view.d.ts +2 -2
- package/dist/adapter/resources/texture-view.d.ts.map +1 -1
- package/dist/adapter/resources/texture-view.js +7 -7
- package/dist/adapter/resources/texture-view.js.map +1 -1
- package/dist/adapter/resources/texture.d.ts +84 -135
- package/dist/adapter/resources/texture.d.ts.map +1 -1
- package/dist/adapter/resources/texture.js +136 -152
- package/dist/adapter/resources/texture.js.map +1 -1
- package/dist/adapter/resources/vertex-array.d.ts +4 -2
- package/dist/adapter/resources/vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/vertex-array.js +4 -7
- package/dist/adapter/resources/vertex-array.js.map +1 -1
- package/dist/adapter/types/attachments.d.ts +3 -3
- package/dist/adapter/types/attachments.d.ts.map +1 -1
- package/dist/adapter/types/buffer-layout.d.ts +1 -1
- package/dist/adapter/types/buffer-layout.d.ts.map +1 -1
- package/dist/adapter/types/parameters.d.ts +7 -3
- package/dist/adapter/types/parameters.d.ts.map +1 -1
- package/dist/adapter/types/parameters.js.map +1 -1
- package/dist/adapter/types/shader-layout.d.ts +5 -5
- package/dist/adapter/types/shader-layout.d.ts.map +1 -1
- package/dist/adapter-utils/format-compiler-log.d.ts.map +1 -1
- package/dist/adapter-utils/format-compiler-log.js +8 -0
- package/dist/adapter-utils/format-compiler-log.js.map +1 -1
- package/dist/adapter-utils/get-attribute-from-layouts.d.ts +6 -5
- package/dist/adapter-utils/get-attribute-from-layouts.d.ts.map +1 -1
- package/dist/adapter-utils/get-attribute-from-layouts.js +8 -7
- package/dist/adapter-utils/get-attribute-from-layouts.js.map +1 -1
- package/dist/dist.dev.js +1162 -851
- package/dist/dist.min.js +7 -6
- package/dist/image-utils/image-types.d.ts +19 -0
- package/dist/image-utils/image-types.d.ts.map +1 -0
- package/dist/image-utils/image-types.js +34 -0
- package/dist/image-utils/image-types.js.map +1 -0
- package/dist/index.cjs +1129 -819
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +17 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -12
- package/dist/index.js.map +1 -1
- package/dist/portable/uniform-block.d.ts +2 -2
- package/dist/portable/uniform-block.d.ts.map +1 -1
- package/dist/portable/uniform-buffer-layout.d.ts +4 -3
- package/dist/portable/uniform-buffer-layout.d.ts.map +1 -1
- package/dist/portable/uniform-buffer-layout.js +3 -2
- package/dist/portable/uniform-buffer-layout.js.map +1 -1
- package/dist/portable/uniform-store.d.ts +2 -2
- package/dist/portable/uniform-store.d.ts.map +1 -1
- package/dist/shadertypes/data-types/data-types.d.ts +32 -0
- package/dist/shadertypes/data-types/data-types.d.ts.map +1 -0
- package/dist/{gpu-type-utils/texture-formats.js → shadertypes/data-types/data-types.js} +1 -1
- package/dist/shadertypes/data-types/data-types.js.map +1 -0
- package/dist/shadertypes/data-types/decode-data-types.d.ts +16 -0
- package/dist/shadertypes/data-types/decode-data-types.d.ts.map +1 -0
- package/dist/shadertypes/data-types/decode-data-types.js +74 -0
- package/dist/shadertypes/data-types/decode-data-types.js.map +1 -0
- package/dist/shadertypes/data-types/decode-shader-types.d.ts +17 -0
- package/dist/shadertypes/data-types/decode-shader-types.d.ts.map +1 -0
- package/dist/shadertypes/data-types/decode-shader-types.js +171 -0
- package/dist/shadertypes/data-types/decode-shader-types.js.map +1 -0
- package/dist/shadertypes/data-types/shader-types.d.ts +45 -0
- package/dist/shadertypes/data-types/shader-types.d.ts.map +1 -0
- package/dist/shadertypes/data-types/shader-types.js.map +1 -0
- package/dist/shadertypes/textures/pixel-utils.d.ts +112 -0
- package/dist/shadertypes/textures/pixel-utils.d.ts.map +1 -0
- package/dist/shadertypes/textures/pixel-utils.js +193 -0
- package/dist/shadertypes/textures/pixel-utils.js.map +1 -0
- package/dist/shadertypes/textures/texture-format-decoder.d.ts +18 -0
- package/dist/shadertypes/textures/texture-format-decoder.d.ts.map +1 -0
- package/dist/{gpu-type-utils/decode-texture-format.js → shadertypes/textures/texture-format-decoder.js} +52 -13
- package/dist/shadertypes/textures/texture-format-decoder.js.map +1 -0
- package/dist/shadertypes/textures/texture-format-generics.d.ts +33 -0
- package/dist/shadertypes/textures/texture-format-generics.d.ts.map +1 -0
- package/dist/{gpu-type-utils/texture-features.js → shadertypes/textures/texture-format-generics.js} +1 -1
- package/dist/shadertypes/textures/texture-format-generics.js.map +1 -0
- package/dist/{gpu-type-utils → shadertypes/textures}/texture-format-table.d.ts +2 -3
- package/dist/shadertypes/textures/texture-format-table.d.ts.map +1 -0
- package/dist/{gpu-type-utils → shadertypes/textures}/texture-format-table.js +42 -43
- package/dist/shadertypes/textures/texture-format-table.js.map +1 -0
- package/dist/shadertypes/textures/texture-formats.d.ts +90 -0
- package/dist/shadertypes/textures/texture-formats.d.ts.map +1 -0
- package/dist/shadertypes/textures/texture-formats.js +58 -0
- package/dist/shadertypes/textures/texture-formats.js.map +1 -0
- package/dist/shadertypes/vertex-arrays/decode-vertex-format.d.ts +18 -0
- package/dist/shadertypes/vertex-arrays/decode-vertex-format.d.ts.map +1 -0
- package/dist/shadertypes/vertex-arrays/decode-vertex-format.js +100 -0
- package/dist/shadertypes/vertex-arrays/decode-vertex-format.js.map +1 -0
- package/dist/shadertypes/vertex-arrays/vertex-formats.d.ts +27 -0
- package/dist/shadertypes/vertex-arrays/vertex-formats.d.ts.map +1 -0
- package/dist/shadertypes/vertex-arrays/vertex-formats.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/promise-utils.d.ts +6 -0
- package/dist/utils/promise-utils.d.ts.map +1 -0
- package/dist/utils/promise-utils.js +15 -0
- package/dist/utils/promise-utils.js.map +1 -0
- package/package.json +2 -2
- package/src/adapter/adapter.ts +36 -1
- package/src/adapter/canvas-context.ts +321 -198
- package/src/adapter/device.ts +261 -110
- package/src/adapter/luma.ts +97 -113
- package/src/adapter/resources/buffer.ts +45 -28
- package/src/adapter/resources/command-buffer.ts +4 -4
- package/src/adapter/resources/command-encoder.ts +15 -6
- package/src/adapter/resources/compute-pass.ts +11 -11
- package/src/adapter/resources/compute-pipeline.ts +8 -8
- package/src/adapter/resources/external-texture.ts +6 -6
- package/src/adapter/resources/framebuffer.ts +14 -15
- package/src/adapter/resources/pipeline-layout.ts +4 -0
- package/src/adapter/resources/query-set.ts +6 -6
- package/src/adapter/resources/render-pass.ts +20 -23
- package/src/adapter/resources/render-pipeline.ts +36 -42
- package/src/adapter/resources/resource.ts +1 -0
- package/src/adapter/resources/sampler.ts +1 -4
- package/src/adapter/resources/shader.ts +15 -15
- package/src/adapter/resources/texture-view.ts +12 -12
- package/src/adapter/resources/texture.ts +206 -300
- package/src/adapter/resources/vertex-array.ts +9 -10
- package/src/adapter/types/attachments.ts +5 -5
- package/src/adapter/types/buffer-layout.ts +1 -1
- package/src/adapter/types/parameters.ts +16 -11
- package/src/adapter/types/shader-layout.ts +8 -5
- package/src/adapter-utils/format-compiler-log.ts +8 -0
- package/src/adapter-utils/get-attribute-from-layouts.ts +17 -12
- package/src/image-utils/image-types.ts +59 -0
- package/src/index.ts +67 -47
- package/src/portable/uniform-block.ts +2 -2
- package/src/portable/uniform-buffer-layout.ts +7 -5
- package/src/portable/uniform-store.ts +2 -2
- package/src/shadertypes/data-types/data-types.ts +96 -0
- package/src/shadertypes/data-types/decode-data-types.ts +91 -0
- package/src/shadertypes/data-types/decode-shader-types.ts +211 -0
- package/src/shadertypes/data-types/shader-types.ts +87 -0
- package/src/shadertypes/textures/pixel-utils.ts +239 -0
- package/src/{gpu-type-utils/decode-texture-format.ts → shadertypes/textures/texture-format-decoder.ts} +71 -20
- package/src/shadertypes/textures/texture-format-generics.ts +190 -0
- package/src/{gpu-type-utils → shadertypes/textures}/texture-format-table.ts +63 -56
- package/src/shadertypes/textures/texture-formats.ts +334 -0
- package/src/shadertypes/vertex-arrays/decode-vertex-format.ts +124 -0
- package/src/shadertypes/vertex-arrays/vertex-formats.ts +91 -0
- package/src/types.ts +12 -5
- package/src/utils/promise-utils.ts +19 -0
- package/dist/adapter-utils/buffer-layout-helper.d.ts +0 -12
- package/dist/adapter-utils/buffer-layout-helper.d.ts.map +0 -1
- package/dist/adapter-utils/buffer-layout-helper.js +0 -41
- package/dist/adapter-utils/buffer-layout-helper.js.map +0 -1
- package/dist/adapter-utils/buffer-layout-order.d.ts +0 -4
- package/dist/adapter-utils/buffer-layout-order.d.ts.map +0 -1
- package/dist/adapter-utils/buffer-layout-order.js +0 -16
- package/dist/adapter-utils/buffer-layout-order.js.map +0 -1
- package/dist/gpu-type-utils/decode-attribute-type.d.ts +0 -20
- package/dist/gpu-type-utils/decode-attribute-type.d.ts.map +0 -1
- package/dist/gpu-type-utils/decode-attribute-type.js +0 -68
- package/dist/gpu-type-utils/decode-attribute-type.js.map +0 -1
- package/dist/gpu-type-utils/decode-data-type.d.ts +0 -16
- package/dist/gpu-type-utils/decode-data-type.d.ts.map +0 -1
- package/dist/gpu-type-utils/decode-data-type.js +0 -48
- package/dist/gpu-type-utils/decode-data-type.js.map +0 -1
- package/dist/gpu-type-utils/decode-shader-types.d.ts +0 -9
- package/dist/gpu-type-utils/decode-shader-types.d.ts.map +0 -1
- package/dist/gpu-type-utils/decode-shader-types.js +0 -42
- package/dist/gpu-type-utils/decode-shader-types.js.map +0 -1
- package/dist/gpu-type-utils/decode-texture-format.d.ts +0 -11
- package/dist/gpu-type-utils/decode-texture-format.d.ts.map +0 -1
- package/dist/gpu-type-utils/decode-texture-format.js.map +0 -1
- package/dist/gpu-type-utils/decode-vertex-format.d.ts +0 -22
- package/dist/gpu-type-utils/decode-vertex-format.d.ts.map +0 -1
- package/dist/gpu-type-utils/decode-vertex-format.js +0 -34
- package/dist/gpu-type-utils/decode-vertex-format.js.map +0 -1
- package/dist/gpu-type-utils/shader-types.d.ts +0 -21
- package/dist/gpu-type-utils/shader-types.d.ts.map +0 -1
- package/dist/gpu-type-utils/shader-types.js.map +0 -1
- package/dist/gpu-type-utils/texture-features.d.ts +0 -6
- package/dist/gpu-type-utils/texture-features.d.ts.map +0 -1
- package/dist/gpu-type-utils/texture-features.js.map +0 -1
- package/dist/gpu-type-utils/texture-format-capabilities.d.ts +0 -21
- package/dist/gpu-type-utils/texture-format-capabilities.d.ts.map +0 -1
- package/dist/gpu-type-utils/texture-format-capabilities.js +0 -27
- package/dist/gpu-type-utils/texture-format-capabilities.js.map +0 -1
- package/dist/gpu-type-utils/texture-format-info.d.ts +0 -38
- package/dist/gpu-type-utils/texture-format-info.d.ts.map +0 -1
- package/dist/gpu-type-utils/texture-format-info.js +0 -5
- package/dist/gpu-type-utils/texture-format-info.js.map +0 -1
- package/dist/gpu-type-utils/texture-format-table.d.ts.map +0 -1
- package/dist/gpu-type-utils/texture-format-table.js.map +0 -1
- package/dist/gpu-type-utils/texture-formats.d.ts +0 -11
- package/dist/gpu-type-utils/texture-formats.d.ts.map +0 -1
- package/dist/gpu-type-utils/texture-formats.js.map +0 -1
- package/dist/gpu-type-utils/vertex-format-from-attribute.d.ts +0 -10
- package/dist/gpu-type-utils/vertex-format-from-attribute.d.ts.map +0 -1
- package/dist/gpu-type-utils/vertex-format-from-attribute.js +0 -91
- package/dist/gpu-type-utils/vertex-format-from-attribute.js.map +0 -1
- package/dist/gpu-type-utils/vertex-formats.d.ts +0 -14
- package/dist/gpu-type-utils/vertex-formats.d.ts.map +0 -1
- package/dist/gpu-type-utils/vertex-formats.js.map +0 -1
- package/dist/gpu-type-utils/wgsl-utils.d.ts +0 -4
- package/dist/gpu-type-utils/wgsl-utils.d.ts.map +0 -1
- package/dist/gpu-type-utils/wgsl-utils.js +0 -20
- package/dist/gpu-type-utils/wgsl-utils.js.map +0 -1
- package/src/adapter-utils/buffer-layout-helper.ts +0 -52
- package/src/adapter-utils/buffer-layout-order.ts +0 -27
- package/src/gpu-type-utils/decode-attribute-type.ts +0 -96
- package/src/gpu-type-utils/decode-data-type.ts +0 -66
- package/src/gpu-type-utils/decode-shader-types.ts +0 -49
- package/src/gpu-type-utils/decode-vertex-format.ts +0 -53
- package/src/gpu-type-utils/shader-types.ts +0 -78
- package/src/gpu-type-utils/texture-features.ts +0 -23
- package/src/gpu-type-utils/texture-format-capabilities.ts +0 -53
- package/src/gpu-type-utils/texture-format-info.ts +0 -42
- package/src/gpu-type-utils/texture-formats.ts +0 -161
- package/src/gpu-type-utils/vertex-format-from-attribute.ts +0 -114
- package/src/gpu-type-utils/vertex-formats.ts +0 -90
- package/src/gpu-type-utils/wgsl-utils.ts +0 -22
- /package/dist/{gpu-type-utils → shadertypes/data-types}/shader-types.js +0 -0
- /package/dist/{gpu-type-utils → shadertypes/vertex-arrays}/vertex-formats.js +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import {TypedArray, TypedArrayConstructor} from '../../types';
|
|
6
|
+
import {PrimitiveDataType, SignedDataType, NormalizedDataType, DataTypeInfo} from './data-types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Gets info about a data type constant (signed or normalized)
|
|
10
|
+
* @returns underlying primitive / signed types, byte length, normalization, integer, signed flags
|
|
11
|
+
*/
|
|
12
|
+
export function getDataTypeInfo(type: NormalizedDataType): DataTypeInfo {
|
|
13
|
+
const [signedType, primitiveType, byteLength] = NORMALIZED_TYPE_MAP[type];
|
|
14
|
+
const normalized: boolean = type.includes('norm');
|
|
15
|
+
const integer: boolean = !normalized && !type.startsWith('float');
|
|
16
|
+
const signed: boolean = type.startsWith('s');
|
|
17
|
+
return {
|
|
18
|
+
signedType,
|
|
19
|
+
primitiveType,
|
|
20
|
+
byteLength,
|
|
21
|
+
normalized,
|
|
22
|
+
integer,
|
|
23
|
+
signed
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Build a vertex format from a signed data type and a component */
|
|
28
|
+
export function getNormalizedDataType(signedDataType: SignedDataType): NormalizedDataType {
|
|
29
|
+
const dataType: NormalizedDataType = signedDataType;
|
|
30
|
+
// prettier-ignore
|
|
31
|
+
switch (dataType) {
|
|
32
|
+
case 'uint8': return 'unorm8';
|
|
33
|
+
case 'sint8': return 'snorm8';
|
|
34
|
+
case 'uint16': return 'unorm16';
|
|
35
|
+
case 'sint16': return 'snorm16';
|
|
36
|
+
default: return dataType;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Align offset to 1, 2 or 4 elements (4, 8 or 16 bytes) */
|
|
41
|
+
export function alignTo(size: number, count: number): number {
|
|
42
|
+
// prettier-ignore
|
|
43
|
+
switch (count) {
|
|
44
|
+
case 1: return size; // Pad upwards to even multiple of 2
|
|
45
|
+
case 2: return size + (size % 2); // Pad upwards to even multiple of 2
|
|
46
|
+
default: return size + ((4 - (size % 4)) % 4); // Pad upwards to even multiple of 4
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Returns the VariableShaderType that corresponds to a typed array */
|
|
51
|
+
export function getDataType(arrayOrType: TypedArray | TypedArrayConstructor): SignedDataType {
|
|
52
|
+
const Constructor = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;
|
|
53
|
+
if (Constructor === Uint8ClampedArray) {
|
|
54
|
+
return 'uint8';
|
|
55
|
+
}
|
|
56
|
+
const info = Object.values(NORMALIZED_TYPE_MAP).find(entry => Constructor === entry[4]);
|
|
57
|
+
if (!info) {
|
|
58
|
+
throw new Error(Constructor.name);
|
|
59
|
+
}
|
|
60
|
+
return info[0];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Returns the TypedArray that corresponds to a shader data type */
|
|
64
|
+
export function getTypedArrayConstructor(type: NormalizedDataType): TypedArrayConstructor {
|
|
65
|
+
const [, , , , Constructor] = NORMALIZED_TYPE_MAP[type];
|
|
66
|
+
return Constructor;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const NORMALIZED_TYPE_MAP: Record<
|
|
70
|
+
NormalizedDataType,
|
|
71
|
+
[
|
|
72
|
+
SignedDataType,
|
|
73
|
+
PrimitiveDataType,
|
|
74
|
+
bytes: 1 | 2 | 4,
|
|
75
|
+
normalized: boolean,
|
|
76
|
+
arrayConstructor: TypedArrayConstructor
|
|
77
|
+
]
|
|
78
|
+
> = {
|
|
79
|
+
uint8: ['uint8', 'u32', 1, false, Uint8Array],
|
|
80
|
+
sint8: ['sint8', 'i32', 1, false, Int8Array],
|
|
81
|
+
unorm8: ['uint8', 'f32', 1, true, Uint8Array],
|
|
82
|
+
snorm8: ['sint8', 'f32', 1, true, Int8Array],
|
|
83
|
+
uint16: ['uint16', 'u32', 2, false, Uint16Array],
|
|
84
|
+
sint16: ['sint16', 'i32', 2, false, Int16Array],
|
|
85
|
+
unorm16: ['uint16', 'u32', 2, true, Uint16Array],
|
|
86
|
+
snorm16: ['sint16', 'i32', 2, true, Int16Array],
|
|
87
|
+
float16: ['float16', 'f16', 2, false, Uint16Array],
|
|
88
|
+
float32: ['float32', 'f32', 4, false, Float32Array],
|
|
89
|
+
uint32: ['uint32', 'u32', 4, false, Uint32Array],
|
|
90
|
+
sint32: ['sint32', 'i32', 4, false, Int32Array]
|
|
91
|
+
};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import {PrimitiveDataType} from './data-types';
|
|
6
|
+
import type {
|
|
7
|
+
VariableShaderType,
|
|
8
|
+
AttributeShaderType,
|
|
9
|
+
AttributeShaderTypeInfo,
|
|
10
|
+
VariableShaderTypeAlias,
|
|
11
|
+
AttributeShaderTypeAlias
|
|
12
|
+
} from './shader-types';
|
|
13
|
+
|
|
14
|
+
/** Split a uniform type string into type and components */
|
|
15
|
+
export function getVariableShaderTypeInfo(format: VariableShaderType): {
|
|
16
|
+
type: PrimitiveDataType;
|
|
17
|
+
components: number;
|
|
18
|
+
} {
|
|
19
|
+
const decoded = UNIFORM_FORMATS[format];
|
|
20
|
+
return decoded;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Decodes a vertex type, returning byte length and flags (integer, signed, normalized) */
|
|
24
|
+
export function getAttributeShaderTypeInfo(
|
|
25
|
+
attributeType: AttributeShaderType
|
|
26
|
+
): AttributeShaderTypeInfo {
|
|
27
|
+
const [primitiveType, components] = TYPE_INFO[attributeType];
|
|
28
|
+
const integer: boolean = primitiveType === 'i32' || primitiveType === 'u32';
|
|
29
|
+
const signed: boolean = primitiveType !== 'u32';
|
|
30
|
+
|
|
31
|
+
const byteLength = PRIMITIVE_TYPE_SIZES[primitiveType] * components;
|
|
32
|
+
return {
|
|
33
|
+
primitiveType,
|
|
34
|
+
components,
|
|
35
|
+
byteLength,
|
|
36
|
+
integer,
|
|
37
|
+
signed
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function makeShaderAttributeType(
|
|
42
|
+
primitiveType: PrimitiveDataType,
|
|
43
|
+
components: 1 | 2 | 3 | 4
|
|
44
|
+
): AttributeShaderType {
|
|
45
|
+
return components === 1 ? primitiveType : `vec${components}<${primitiveType}>`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function resolveAttributeShaderTypeAlias(
|
|
49
|
+
alias: AttributeShaderTypeAlias | AttributeShaderType
|
|
50
|
+
): AttributeShaderType {
|
|
51
|
+
return WGSL_ATTRIBUTE_TYPE_ALIAS_MAP[alias as AttributeShaderTypeAlias] || alias;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function resolveVariableShaderTypeAlias(
|
|
55
|
+
alias: VariableShaderTypeAlias | VariableShaderType
|
|
56
|
+
): VariableShaderType {
|
|
57
|
+
return WGSL_VARIABLE_TYPE_ALIAS_MAP[alias as VariableShaderTypeAlias] || alias;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// TABLES
|
|
61
|
+
|
|
62
|
+
const PRIMITIVE_TYPE_SIZES: Record<PrimitiveDataType, 2 | 4> = {
|
|
63
|
+
f32: 4,
|
|
64
|
+
f16: 2,
|
|
65
|
+
i32: 4,
|
|
66
|
+
u32: 4
|
|
67
|
+
// 'bool-webgl': 4,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/** All valid shader attribute types. A table guarantees exhaustive list and fast execution */
|
|
71
|
+
const TYPE_INFO: Record<AttributeShaderType, [PrimitiveDataType, components: 1 | 2 | 3 | 4]> = {
|
|
72
|
+
f32: ['f32', 1],
|
|
73
|
+
'vec2<f32>': ['f32', 2],
|
|
74
|
+
'vec3<f32>': ['f32', 3],
|
|
75
|
+
'vec4<f32>': ['f32', 4],
|
|
76
|
+
f16: ['f16', 1],
|
|
77
|
+
'vec2<f16>': ['f16', 2],
|
|
78
|
+
'vec3<f16>': ['f16', 3],
|
|
79
|
+
'vec4<f16>': ['f16', 4],
|
|
80
|
+
i32: ['i32', 1],
|
|
81
|
+
'vec2<i32>': ['i32', 2],
|
|
82
|
+
'vec3<i32>': ['i32', 3],
|
|
83
|
+
'vec4<i32>': ['i32', 4],
|
|
84
|
+
u32: ['u32', 1],
|
|
85
|
+
'vec2<u32>': ['u32', 2],
|
|
86
|
+
'vec3<u32>': ['u32', 3],
|
|
87
|
+
'vec4<u32>': ['u32', 4]
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/** @todo These tables are quite big, consider parsing type strings instead */
|
|
91
|
+
const UNIFORM_FORMATS: Record<VariableShaderType, {type: PrimitiveDataType; components: number}> = {
|
|
92
|
+
f32: {type: 'f32', components: 1},
|
|
93
|
+
f16: {type: 'f16', components: 1},
|
|
94
|
+
i32: {type: 'i32', components: 1},
|
|
95
|
+
u32: {type: 'u32', components: 1},
|
|
96
|
+
// 'bool-webgl': {type: 'bool-webgl', components: 1},
|
|
97
|
+
'vec2<f32>': {type: 'f32', components: 2},
|
|
98
|
+
'vec3<f32>': {type: 'f32', components: 3},
|
|
99
|
+
'vec4<f32>': {type: 'f32', components: 4},
|
|
100
|
+
'vec2<f16>': {type: 'f16', components: 2},
|
|
101
|
+
'vec3<f16>': {type: 'f16', components: 3},
|
|
102
|
+
'vec4<f16>': {type: 'f16', components: 4},
|
|
103
|
+
'vec2<i32>': {type: 'i32', components: 2},
|
|
104
|
+
'vec3<i32>': {type: 'i32', components: 3},
|
|
105
|
+
'vec4<i32>': {type: 'i32', components: 4},
|
|
106
|
+
'vec2<u32>': {type: 'u32', components: 2},
|
|
107
|
+
'vec3<u32>': {type: 'u32', components: 3},
|
|
108
|
+
'vec4<u32>': {type: 'u32', components: 4},
|
|
109
|
+
|
|
110
|
+
'mat2x2<f32>': {type: 'f32', components: 4},
|
|
111
|
+
'mat2x3<f32>': {type: 'f32', components: 6},
|
|
112
|
+
'mat2x4<f32>': {type: 'f32', components: 8},
|
|
113
|
+
'mat3x2<f32>': {type: 'f32', components: 6},
|
|
114
|
+
'mat3x3<f32>': {type: 'f32', components: 9},
|
|
115
|
+
'mat3x4<f32>': {type: 'f32', components: 12},
|
|
116
|
+
'mat4x2<f32>': {type: 'f32', components: 8},
|
|
117
|
+
'mat4x3<f32>': {type: 'f32', components: 12},
|
|
118
|
+
'mat4x4<f32>': {type: 'f32', components: 16},
|
|
119
|
+
|
|
120
|
+
'mat2x2<f16>': {type: 'f16', components: 4},
|
|
121
|
+
'mat2x3<f16>': {type: 'f16', components: 6},
|
|
122
|
+
'mat2x4<f16>': {type: 'f16', components: 8},
|
|
123
|
+
'mat3x2<f16>': {type: 'f16', components: 6},
|
|
124
|
+
'mat3x3<f16>': {type: 'f16', components: 9},
|
|
125
|
+
'mat3x4<f16>': {type: 'f16', components: 12},
|
|
126
|
+
'mat4x2<f16>': {type: 'f16', components: 8},
|
|
127
|
+
'mat4x3<f16>': {type: 'f16', components: 12},
|
|
128
|
+
'mat4x4<f16>': {type: 'f16', components: 16},
|
|
129
|
+
|
|
130
|
+
'mat2x2<i32>': {type: 'i32', components: 4},
|
|
131
|
+
'mat2x3<i32>': {type: 'i32', components: 6},
|
|
132
|
+
'mat2x4<i32>': {type: 'i32', components: 8},
|
|
133
|
+
'mat3x2<i32>': {type: 'i32', components: 6},
|
|
134
|
+
'mat3x3<i32>': {type: 'i32', components: 9},
|
|
135
|
+
'mat3x4<i32>': {type: 'i32', components: 12},
|
|
136
|
+
'mat4x2<i32>': {type: 'i32', components: 8},
|
|
137
|
+
'mat4x3<i32>': {type: 'i32', components: 12},
|
|
138
|
+
'mat4x4<i32>': {type: 'i32', components: 16},
|
|
139
|
+
|
|
140
|
+
'mat2x2<u32>': {type: 'u32', components: 4},
|
|
141
|
+
'mat2x3<u32>': {type: 'u32', components: 6},
|
|
142
|
+
'mat2x4<u32>': {type: 'u32', components: 8},
|
|
143
|
+
'mat3x2<u32>': {type: 'u32', components: 6},
|
|
144
|
+
'mat3x3<u32>': {type: 'u32', components: 9},
|
|
145
|
+
'mat3x4<u32>': {type: 'u32', components: 12},
|
|
146
|
+
'mat4x2<u32>': {type: 'u32', components: 8},
|
|
147
|
+
'mat4x3<u32>': {type: 'u32', components: 12},
|
|
148
|
+
'mat4x4<u32>': {type: 'u32', components: 16}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/** Predeclared aliases @see https://www.w3.org/TR/WGSL/#vector-types */
|
|
152
|
+
export const WGSL_ATTRIBUTE_TYPE_ALIAS_MAP: Record<AttributeShaderTypeAlias, AttributeShaderType> =
|
|
153
|
+
{
|
|
154
|
+
vec2i: 'vec2<i32>',
|
|
155
|
+
vec3i: 'vec3<i32>',
|
|
156
|
+
vec4i: 'vec4<i32>',
|
|
157
|
+
vec2u: 'vec2<u32>',
|
|
158
|
+
vec3u: 'vec3<u32>',
|
|
159
|
+
vec4u: 'vec4<u32>',
|
|
160
|
+
vec2f: 'vec2<f32>',
|
|
161
|
+
vec3f: 'vec3<f32>',
|
|
162
|
+
vec4f: 'vec4<f32>',
|
|
163
|
+
// Requires the f16 extension.
|
|
164
|
+
vec2h: 'vec2<f16>',
|
|
165
|
+
vec3h: 'vec3<f16>',
|
|
166
|
+
vec4h: 'vec4<f16>'
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/** @todo These tables are quite big, consider parsing alias strings instead */
|
|
170
|
+
export const WGSL_VARIABLE_TYPE_ALIAS_MAP: Record<VariableShaderTypeAlias, VariableShaderType> = {
|
|
171
|
+
...WGSL_ATTRIBUTE_TYPE_ALIAS_MAP,
|
|
172
|
+
mat2x2f: 'mat2x2<f32>',
|
|
173
|
+
mat2x3f: 'mat2x3<f32>',
|
|
174
|
+
mat2x4f: 'mat2x4<f32>',
|
|
175
|
+
mat3x2f: 'mat3x2<f32>',
|
|
176
|
+
mat3x3f: 'mat3x3<f32>',
|
|
177
|
+
mat3x4f: 'mat3x4<f32>',
|
|
178
|
+
mat4x2f: 'mat4x2<f32>',
|
|
179
|
+
mat4x3f: 'mat4x3<f32>',
|
|
180
|
+
mat4x4f: 'mat4x4<f32>',
|
|
181
|
+
|
|
182
|
+
mat2x2i: 'mat2x2<i32>',
|
|
183
|
+
mat2x3i: 'mat2x3<i32>',
|
|
184
|
+
mat2x4i: 'mat2x4<i32>',
|
|
185
|
+
mat3x2i: 'mat3x2<i32>',
|
|
186
|
+
mat3x3i: 'mat3x3<i32>',
|
|
187
|
+
mat3x4i: 'mat3x4<i32>',
|
|
188
|
+
mat4x2i: 'mat4x2<i32>',
|
|
189
|
+
mat4x3i: 'mat4x3<i32>',
|
|
190
|
+
mat4x4i: 'mat4x4<i32>',
|
|
191
|
+
|
|
192
|
+
mat2x2u: 'mat2x2<u32>',
|
|
193
|
+
mat2x3u: 'mat2x3<u32>',
|
|
194
|
+
mat2x4u: 'mat2x4<u32>',
|
|
195
|
+
mat3x2u: 'mat3x2<u32>',
|
|
196
|
+
mat3x3u: 'mat3x3<u32>',
|
|
197
|
+
mat3x4u: 'mat3x4<u32>',
|
|
198
|
+
mat4x2u: 'mat4x2<u32>',
|
|
199
|
+
mat4x3u: 'mat4x3<u32>',
|
|
200
|
+
mat4x4u: 'mat4x4<u32>',
|
|
201
|
+
|
|
202
|
+
mat2x2h: 'mat2x2<f16>',
|
|
203
|
+
mat2x3h: 'mat2x3<f16>',
|
|
204
|
+
mat2x4h: 'mat2x4<f16>',
|
|
205
|
+
mat3x2h: 'mat3x2<f16>',
|
|
206
|
+
mat3x3h: 'mat3x3<f16>',
|
|
207
|
+
mat3x4h: 'mat3x4<f16>',
|
|
208
|
+
mat4x2h: 'mat4x2<f16>',
|
|
209
|
+
mat4x3h: 'mat4x3<f16>',
|
|
210
|
+
mat4x4h: 'mat4x4<f16>'
|
|
211
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {PrimitiveDataType} from './data-types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Describes the type of an attribute as defined in the shader source code.
|
|
9
|
+
* @note This is a subset of shader variable types
|
|
10
|
+
* @note Buffers with various `VertexFormat`s can be supplied for each type, GPU will convert them at runtime/
|
|
11
|
+
*/
|
|
12
|
+
export type AttributeShaderType =
|
|
13
|
+
| PrimitiveDataType
|
|
14
|
+
| `vec2<${PrimitiveDataType}>`
|
|
15
|
+
| `vec3<${PrimitiveDataType}>`
|
|
16
|
+
| `vec4<${PrimitiveDataType}>`;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Describes the type of a variable that can declared in shader source code.
|
|
20
|
+
* @note Uniforms can be declared using these types
|
|
21
|
+
* @note Uniforms can be of a wider range of types than attributes.
|
|
22
|
+
* @note to WebGL users: "bindings" (textures, samplers, and uniform buffers) are considered "bindings", not shader variables/uniforms
|
|
23
|
+
*/
|
|
24
|
+
export type VariableShaderType =
|
|
25
|
+
| PrimitiveDataType
|
|
26
|
+
| `vec2<${PrimitiveDataType}>`
|
|
27
|
+
| `vec3<${PrimitiveDataType}>`
|
|
28
|
+
| `vec4<${PrimitiveDataType}>`
|
|
29
|
+
| `mat2x2<${PrimitiveDataType}>`
|
|
30
|
+
| `mat2x3<${PrimitiveDataType}>`
|
|
31
|
+
| `mat2x4<${PrimitiveDataType}>`
|
|
32
|
+
| `mat3x2<${PrimitiveDataType}>`
|
|
33
|
+
| `mat3x3<${PrimitiveDataType}>`
|
|
34
|
+
| `mat3x4<${PrimitiveDataType}>`
|
|
35
|
+
| `mat4x2<${PrimitiveDataType}>`
|
|
36
|
+
| `mat4x3<${PrimitiveDataType}>`
|
|
37
|
+
| `mat4x4<${PrimitiveDataType}>`;
|
|
38
|
+
|
|
39
|
+
/* Suffixes used by WGSL alias types */
|
|
40
|
+
type ShaderTypeAliasSuffix = 'f' | 'i' | 'u' | 'h';
|
|
41
|
+
|
|
42
|
+
/** Shorthand type aliases recognized by WGSL */
|
|
43
|
+
export type AttributeShaderTypeAlias =
|
|
44
|
+
| `vec2${ShaderTypeAliasSuffix}`
|
|
45
|
+
| `vec3${ShaderTypeAliasSuffix}`
|
|
46
|
+
| `vec4${ShaderTypeAliasSuffix}`;
|
|
47
|
+
|
|
48
|
+
/** Shorthand type aliases recognized by WGSL */
|
|
49
|
+
export type VariableShaderTypeAlias =
|
|
50
|
+
| AttributeShaderTypeAlias
|
|
51
|
+
| `mat2x2${ShaderTypeAliasSuffix}`
|
|
52
|
+
| `mat2x3${ShaderTypeAliasSuffix}`
|
|
53
|
+
| `mat2x4${ShaderTypeAliasSuffix}`
|
|
54
|
+
| `mat3x2${ShaderTypeAliasSuffix}`
|
|
55
|
+
| `mat3x3${ShaderTypeAliasSuffix}`
|
|
56
|
+
| `mat3x4${ShaderTypeAliasSuffix}`
|
|
57
|
+
| `mat4x2${ShaderTypeAliasSuffix}`
|
|
58
|
+
| `mat4x3${ShaderTypeAliasSuffix}`
|
|
59
|
+
| `mat4x4${ShaderTypeAliasSuffix}`;
|
|
60
|
+
|
|
61
|
+
/** A composite shader type can include structs and arrays, recursively */
|
|
62
|
+
export type CompositeShaderType = VariableShaderType | StructShaderType | ArrayShaderType;
|
|
63
|
+
|
|
64
|
+
/** Represents a struct in WGSL */
|
|
65
|
+
export type StructShaderType = {
|
|
66
|
+
members: Record<string, CompositeShaderType>;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** Represents an array in WGSL */
|
|
70
|
+
export type ArrayShaderType = {
|
|
71
|
+
type: CompositeShaderType;
|
|
72
|
+
length: number;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** Information extracted from a AttributeShaderType constant */
|
|
76
|
+
export type AttributeShaderTypeInfo = {
|
|
77
|
+
/** WGSL-style primitive data type, f32, i32, u32 */
|
|
78
|
+
primitiveType: PrimitiveDataType;
|
|
79
|
+
/** Whether this is a normalized integer (that must be used as float) */
|
|
80
|
+
components: 1 | 2 | 3 | 4;
|
|
81
|
+
/** Length in bytes of the data for one vertex */
|
|
82
|
+
byteLength?: number;
|
|
83
|
+
/** Whether this is for integer or float vert */
|
|
84
|
+
integer: boolean;
|
|
85
|
+
/** Whether this data type is signed */
|
|
86
|
+
signed: boolean;
|
|
87
|
+
};
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
export type ImageData = {
|
|
6
|
+
/** Offset into the data (in addition to any offset built-in to the ArrayBufferView) */
|
|
7
|
+
byteOffset?: number;
|
|
8
|
+
/** The stride, in bytes, between the beginning of each texel block row and the subsequent texel block row. Required if there are multiple texel block rows (i.e. the copy height or depth is more than one block). */
|
|
9
|
+
bytesPerRow?: number;
|
|
10
|
+
/** Number or rows per image (needed if multiple images are being set) */
|
|
11
|
+
rowsPerImage?: number;
|
|
12
|
+
/** Bits per channel */
|
|
13
|
+
bitsPerChannel: [number, number, number, number];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type PixelData = {
|
|
17
|
+
arrayBuffer: ArrayBuffer;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
/** Bytes per pixel */
|
|
21
|
+
bytesPerPixel: number;
|
|
22
|
+
bytesPerRow: number;
|
|
23
|
+
bitsPerChannel: [number, number, number, number];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Extracts a single RGBA pixel value from PixelData at the given (x, y) coordinate.
|
|
28
|
+
*
|
|
29
|
+
* The pixel's data is assumed to be packed according to pixelData.bitsPerChannel.
|
|
30
|
+
* The pixel data for a given row is padded to pixelData.bytesPerRow.
|
|
31
|
+
*
|
|
32
|
+
* @param pixelData - The metadata and data for the pixel buffer.
|
|
33
|
+
* @param x - The x coordinate (0-based).
|
|
34
|
+
* @param y - The y coordinate (0-based).
|
|
35
|
+
* @returns A tuple [r, g, b, a] where each channel is the extracted numeric value.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
|
|
39
|
+
Assume you obtained an ArrayBuffer from copyTextureToBuffer and have the following metadata:
|
|
40
|
+
|
|
41
|
+
const pixelData: PixelData = {
|
|
42
|
+
bitsPerChannel: [5, 6, 5, 0], // For example, a 16-bit RGB565 format (no alpha)
|
|
43
|
+
width: 800,
|
|
44
|
+
height: 600,
|
|
45
|
+
bytesPerPixel: 2, // 16 bits per pixel
|
|
46
|
+
bytesPerRow: 1600, // Assuming no extra padding
|
|
47
|
+
arrayBuffer: myTextureBuffer, // Obtained from copyTextureToBuffer
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
You can then extract the pixel at (x, y) like so:
|
|
51
|
+
|
|
52
|
+
const rgba = extractPixel(pixelData, x, y);
|
|
53
|
+
console.log("Extracted RGBA:", rgba);
|
|
54
|
+
|
|
55
|
+
For RGBA formats where all channels are present (e.g. [8, 8, 8, 8]), the function will extract a 4-channel pixel value.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
export function readPixel(
|
|
59
|
+
pixelData: PixelData,
|
|
60
|
+
x: number,
|
|
61
|
+
y: number,
|
|
62
|
+
bitsPerChannel: [number, number, number, number]
|
|
63
|
+
): [number, number, number, number] {
|
|
64
|
+
if (x < 0 || x >= pixelData.width || y < 0 || y >= pixelData.height) {
|
|
65
|
+
throw new Error('Coordinates out of bounds.');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Compute the byte offset of the pixel in the buffer.
|
|
69
|
+
const byteOffset = y * pixelData.bytesPerRow + x * pixelData.bytesPerPixel;
|
|
70
|
+
|
|
71
|
+
// Create a Uint8Array view for this pixel's bytes.
|
|
72
|
+
// We only need to view pixelData.bytesPerPixel bytes.
|
|
73
|
+
const pixelDataView = new DataView(pixelData.arrayBuffer, byteOffset, pixelData.bytesPerPixel);
|
|
74
|
+
|
|
75
|
+
let bitOffsetWithinPixel = 0;
|
|
76
|
+
const channels: number[] = [];
|
|
77
|
+
|
|
78
|
+
// Extract each of the four channels.
|
|
79
|
+
for (let i = 0; i < 4; i++) {
|
|
80
|
+
const bits = bitsPerChannel[i];
|
|
81
|
+
// If a channel's bit width is zero or negative, consider it not present.
|
|
82
|
+
if (bits <= 0) {
|
|
83
|
+
channels.push(0);
|
|
84
|
+
} else {
|
|
85
|
+
const channelValue = readBitsFromDataView(pixelDataView, bitOffsetWithinPixel, bits);
|
|
86
|
+
channels.push(channelValue);
|
|
87
|
+
bitOffsetWithinPixel += bits;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return [channels[0], channels[1], channels[2], channels[3]];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Encodes an RGBA pixel into a DataView at a given bit offset according to a specified bit layout.
|
|
96
|
+
*
|
|
97
|
+
* The channels are written sequentially in the order R, G, B, A. For each channel, the number
|
|
98
|
+
* of bits is taken from the bitsPerChannel array. Channel values are masked to fit within the specified width.
|
|
99
|
+
*
|
|
100
|
+
* @param dataView - The DataView into which the pixel will be encoded.
|
|
101
|
+
* @param bitOffset - The bit offset in the DataView where the pixel should be written.
|
|
102
|
+
* @param bitsPerChannel - A tuple specifying the number of bits for each channel: [R, G, B, A].
|
|
103
|
+
* @param pixel - A tuple [r, g, b, a] containing the channel values (as numbers).
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
|
|
107
|
+
Assume you want to encode a pixel into a packed format where:
|
|
108
|
+
- Red uses 5 bits
|
|
109
|
+
- Green uses 6 bits
|
|
110
|
+
- Blue uses 5 bits
|
|
111
|
+
- Alpha is not used (0 bits)
|
|
112
|
+
And the pixel format is packed into 16 bits total.
|
|
113
|
+
|
|
114
|
+
You might have:
|
|
115
|
+
const bitsPerChannel: [number, number, number, number] = [5, 6, 5, 0];
|
|
116
|
+
const pixel: [number, number, number, number] = [15, 31, 15, 0]; // Example values
|
|
117
|
+
const buffer = new ArrayBuffer(2); // 16 bits = 2 bytes
|
|
118
|
+
const dataView = new DataView(buffer);
|
|
119
|
+
|
|
120
|
+
Now encode the pixel at bit offset 0:
|
|
121
|
+
encodePixel(dataView, 0, bitsPerChannel, pixel);
|
|
122
|
+
|
|
123
|
+
The dataView now contains the 16-bit packed pixel value in big-endian order.
|
|
124
|
+
*/
|
|
125
|
+
export function writePixel(
|
|
126
|
+
dataView: DataView,
|
|
127
|
+
bitOffset: number,
|
|
128
|
+
bitsPerChannel: [number, number, number, number],
|
|
129
|
+
pixel: [number, number, number, number]
|
|
130
|
+
): void {
|
|
131
|
+
let currentBitOffset = bitOffset;
|
|
132
|
+
for (let channel = 0; channel < 4; channel++) {
|
|
133
|
+
const bits = bitsPerChannel[channel];
|
|
134
|
+
// Clamp the channel value to the maximum allowed by the bit width.
|
|
135
|
+
const maxValue = (1 << bits) - 1;
|
|
136
|
+
const channelValue = pixel[channel] & maxValue;
|
|
137
|
+
writeBitsToDataView(dataView, currentBitOffset, bits, channelValue);
|
|
138
|
+
currentBitOffset += bits;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Reads a specified number of bits from a DataView starting at a given bit offset.
|
|
144
|
+
*
|
|
145
|
+
* For channels with a bit width of 8, 16, or 32 bits and when the bitOffset is byte-aligned,
|
|
146
|
+
* this function uses DataView methods for fast extraction.
|
|
147
|
+
*
|
|
148
|
+
* Bits are assumed to be stored in big-endian order (i.e. the most-significant bit is at position 7 in each byte).
|
|
149
|
+
*
|
|
150
|
+
* @param dataView - The DataView containing the data.
|
|
151
|
+
* @param bitOffset - The offset (in bits) within the data from which to start reading.
|
|
152
|
+
* @param bitCount - The number of bits to read (supported range: 1 to 32).
|
|
153
|
+
* @returns The extracted value as a number.
|
|
154
|
+
*/
|
|
155
|
+
export function readBitsFromDataView(
|
|
156
|
+
dataView: DataView,
|
|
157
|
+
bitOffset: number,
|
|
158
|
+
bitCount: number
|
|
159
|
+
): number {
|
|
160
|
+
// Check if we can optimize when bitOffset is byte-aligned.
|
|
161
|
+
if (bitOffset % 8 === 0) {
|
|
162
|
+
const byteOffset = bitOffset / 8;
|
|
163
|
+
if (bitCount === 8 && byteOffset + 1 <= dataView.byteLength) {
|
|
164
|
+
return dataView.getUint8(byteOffset);
|
|
165
|
+
} else if (bitCount === 16 && byteOffset + 2 <= dataView.byteLength) {
|
|
166
|
+
// false for big-endian reading.
|
|
167
|
+
return dataView.getUint16(byteOffset, false);
|
|
168
|
+
} else if (bitCount === 32 && byteOffset + 4 <= dataView.byteLength) {
|
|
169
|
+
return dataView.getUint32(byteOffset, false);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Fallback: bit-level extraction for non-aligned or non-standard bit widths.
|
|
174
|
+
let value = 0;
|
|
175
|
+
for (let i = 0; i < bitCount; i++) {
|
|
176
|
+
const overallBitIndex = bitOffset + i;
|
|
177
|
+
const byteIndex = Math.floor(overallBitIndex / 8);
|
|
178
|
+
const bitIndex = overallBitIndex % 8;
|
|
179
|
+
// Read the byte and extract the bit at position (7 - bitIndex).
|
|
180
|
+
const byteValue = dataView.getUint8(byteIndex);
|
|
181
|
+
const bit = (byteValue >> (7 - bitIndex)) & 1;
|
|
182
|
+
value = (value << 1) | bit;
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Writes a specified number of bits from a value into a DataView at a given bit offset.
|
|
189
|
+
*
|
|
190
|
+
* For channels with a bit width of 8, 16, or 32 bits and when the bit offset is byte-aligned,
|
|
191
|
+
* this function uses DataView methods for fast writing.
|
|
192
|
+
*
|
|
193
|
+
* Bits are assumed to be stored in big-endian order (i.e. the most-significant bit is at position 7 in each byte).
|
|
194
|
+
*
|
|
195
|
+
* @param dataView - The DataView to write into.
|
|
196
|
+
* @param bitOffset - The bit offset at which to begin writing.
|
|
197
|
+
* @param bitCount - The number of bits to write (supported range: 1 to 32).
|
|
198
|
+
* @param value - The numeric value whose lower bitCount bits will be written.
|
|
199
|
+
*/
|
|
200
|
+
export function writeBitsToDataView(
|
|
201
|
+
dataView: DataView,
|
|
202
|
+
bitOffset: number,
|
|
203
|
+
bitCount: number,
|
|
204
|
+
value: number
|
|
205
|
+
): void {
|
|
206
|
+
// If the bitOffset is byte-aligned, we may optimize for common bit widths.
|
|
207
|
+
if (bitOffset % 8 === 0) {
|
|
208
|
+
const byteOffset = bitOffset / 8;
|
|
209
|
+
if (bitCount === 8 && byteOffset + 1 <= dataView.byteLength) {
|
|
210
|
+
dataView.setUint8(byteOffset, value & 0xff);
|
|
211
|
+
return;
|
|
212
|
+
} else if (bitCount === 16 && byteOffset + 2 <= dataView.byteLength) {
|
|
213
|
+
dataView.setUint16(byteOffset, value & 0xffff, false); // big-endian
|
|
214
|
+
return;
|
|
215
|
+
} else if (bitCount === 32 && byteOffset + 4 <= dataView.byteLength) {
|
|
216
|
+
dataView.setUint32(byteOffset, value, false); // big-endian
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Fallback: write bit-by-bit.
|
|
222
|
+
for (let i = 0; i < bitCount; i++) {
|
|
223
|
+
const overallBitIndex = bitOffset + i;
|
|
224
|
+
const byteIndex = Math.floor(overallBitIndex / 8);
|
|
225
|
+
const bitIndex = overallBitIndex % 8;
|
|
226
|
+
const mask = 1 << (7 - bitIndex);
|
|
227
|
+
// Extract the i-th bit from value (starting from the most-significant bit)
|
|
228
|
+
const bitValue = (value >> (bitCount - 1 - i)) & 1;
|
|
229
|
+
// Read the current byte.
|
|
230
|
+
let currentByte = dataView.getUint8(byteIndex);
|
|
231
|
+
// Clear the target bit.
|
|
232
|
+
currentByte &= ~mask;
|
|
233
|
+
// Set the target bit if bitValue is 1.
|
|
234
|
+
if (bitValue) {
|
|
235
|
+
currentByte |= mask;
|
|
236
|
+
}
|
|
237
|
+
dataView.setUint8(byteIndex, currentByte);
|
|
238
|
+
}
|
|
239
|
+
}
|