@carbonenginejs/runtime-resource 0.8.0 → 0.9.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/LICENSE +21 -21
- package/NOTICE +29 -29
- package/README.md +67 -548
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3005 -3005
- package/dist/CjsResManQueue.js +214 -214
- package/dist/CjsResource.js +566 -566
- package/dist/CjsResourceSource.js +59 -59
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
- package/dist/format/CjsBlueReader.js +269 -269
- package/dist/format/CjsFormat.js +192 -192
- package/dist/format/CjsReader.js +18 -18
- package/dist/format/CjsResourceProbe.js +277 -277
- package/dist/format/payloadContract.js +173 -173
- package/dist/formats/black/CjsBlackFormat.js +278 -278
- package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
- package/dist/formats/black/core/CjsBlackReader.js +639 -639
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +182 -182
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +125 -125
- package/dist/formats/bnk/core/graph.js +140 -140
- package/dist/formats/bnk/core/helpers.js +409 -409
- package/dist/formats/bnk/core/musicNodes.js +489 -489
- package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +118 -118
- package/dist/formats/cmf/core/buffers.js +233 -233
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +287 -287
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +364 -364
- package/dist/formats/cmf/core/shared.js +268 -268
- package/dist/formats/cmf/core/writer.js +517 -517
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +193 -193
- package/dist/formats/dds/core/bc6h.js +288 -288
- package/dist/formats/dds/core/bc7.js +251 -251
- package/dist/formats/dds/core/helpers.js +815 -815
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3901 -3901
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +87 -87
- package/dist/formats/flac/core/helpers.js +295 -295
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +87 -87
- package/dist/formats/gif/core/helpers.js +360 -360
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +290 -290
- package/dist/formats/gltf/core/helpers.js +292 -292
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +666 -666
- package/dist/formats/gltf/core/targets.js +163 -163
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/gr2/CjsGr2Format.js +46 -0
- package/dist/formats/gr2/CjsGr2Format.js.map +1 -0
- package/dist/formats/gr2/core/CjsFormatGr2.js +273 -0
- package/dist/formats/gr2/core/CjsFormatGr2.js.map +1 -0
- package/dist/formats/gr2/core/bitknit2.js +280 -0
- package/dist/formats/gr2/core/bitknit2.js.map +1 -0
- package/dist/formats/gr2/core/curves.js +1047 -0
- package/dist/formats/gr2/core/curves.js.map +1 -0
- package/dist/formats/gr2/core/gsf.js +72 -0
- package/dist/formats/gr2/core/gsf.js.map +1 -0
- package/dist/formats/gr2/core/helpers.js +332 -0
- package/dist/formats/gr2/core/helpers.js.map +1 -0
- package/dist/formats/gr2/core/json.js +622 -0
- package/dist/formats/gr2/core/json.js.map +1 -0
- package/dist/formats/gr2/core/oodle1.js +388 -0
- package/dist/formats/gr2/core/oodle1.js.map +1 -0
- package/dist/formats/gr2/core/reader.js +617 -0
- package/dist/formats/gr2/core/reader.js.map +1 -0
- package/dist/formats/gr2/core/tangents.js +48 -0
- package/dist/formats/gr2/core/tangents.js.map +1 -0
- package/dist/formats/gr2/core/targets.js +351 -0
- package/dist/formats/gr2/core/targets.js.map +1 -0
- package/dist/formats/gr2/index.js +3 -0
- package/dist/formats/gr2/index.js.map +1 -0
- package/dist/formats/index.js +30 -23
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
- package/dist/formats/jpeg/core/helpers.js +350 -350
- package/dist/formats/jpeg/core/jpeg.js +377 -377
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +192 -192
- package/dist/formats/mp3/core/helpers.js +338 -338
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +191 -191
- package/dist/formats/mp4/core/helpers.js +449 -449
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +88 -88
- package/dist/formats/ogg/core/helpers.js +387 -387
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +999 -999
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/png/CjsPngFormat.js +195 -195
- package/dist/formats/png/core/helpers.js +583 -583
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +261 -261
- package/dist/formats/red/core/CjsRedReader.js +194 -194
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +139 -139
- package/dist/formats/red/core/redGraph.js +68 -68
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +629 -629
- package/dist/formats/stl/core/targets.js +163 -163
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +192 -192
- package/dist/formats/tga/core/helpers.js +446 -446
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +192 -192
- package/dist/formats/wav/core/helpers.js +328 -328
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +191 -191
- package/dist/formats/webm/core/helpers.js +537 -537
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +86 -86
- package/dist/formats/webp/core/helpers.js +214 -214
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +241 -241
- package/dist/formats/wem/core/bitStream.js +259 -259
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +417 -417
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +83 -83
- package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
- package/dist/formats/yaml/core/helpers.js +160 -160
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +49 -48
- package/dist/index.js.map +1 -1
- package/dist/resourcePath.js +18 -18
- package/dist/resourceStates.js +9 -9
- package/dist/resources/AudioGeometryResData.js +47 -47
- package/dist/resources/GStateBindingCallbackData.js +31 -31
- package/dist/resources/MeshDecalData.js +37 -37
- package/dist/resources/MeshDecalLodData.js +34 -34
- package/dist/resources/Tr2EffectRes.js +71 -71
- package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resources/Tr2GrannyStateRes.js +44 -44
- package/dist/resources/Tr2ImageRes.js +114 -114
- package/dist/resources/Tr2LightProfileRes.js +40 -40
- package/dist/resources/Tr2MaterialArea.js +34 -34
- package/dist/resources/Tr2MaterialMesh.js +31 -31
- package/dist/resources/Tr2MaterialRes.js +34 -34
- package/dist/resources/Tr2ShaderPermutation.js +43 -43
- package/dist/resources/Tr2TextureLodManager.js +80 -80
- package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resources/Tr2TexturePackChannel.js +37 -37
- package/dist/resources/Tr2TexturePipeline.js +52 -52
- package/dist/resources/Tr2TexturePipelineParams.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resources/Tr2TexturePipelineStepGenerateMips.js +22 -0
- package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
- package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resources/TriGeometryRes.js +239 -239
- package/dist/resources/TriGeometryResAreaData.js +59 -59
- package/dist/resources/TriGeometryResJointData.js +38 -38
- package/dist/resources/TriGeometryResLodData.js +88 -88
- package/dist/resources/TriGeometryResMeshData.js +63 -63
- package/dist/resources/TriGeometryResSkeletonData.js +34 -34
- package/dist/resources/TriGrannyRes.js +43 -43
- package/dist/resources/TriJointBinding.js +38 -38
- package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resources/TriRtGeometryConstants.js +88 -88
- package/dist/resources/TriTextureRes.js +304 -304
- package/dist/resources/enums.js +18 -18
- package/dist/resources/resourceBoundary.js +47 -47
- package/dist/resources/texturePipelineBehavior.js +308 -308
- package/dist/texture/CjsTextureArrayRes.js +406 -406
- package/dist/texture/CjsTextureParameterProxy.js +133 -133
- package/docs/README.md +69 -0
- package/docs/architecture.md +86 -0
- package/docs/concepts/resource-lifecycle.md +217 -0
- package/docs/formats/README.md +104 -0
- package/{FORMAT-PROVENANCE.md → docs/formats/provenance.md} +173 -155
- package/docs/formats/stl.md +37 -0
- package/docs/formats/wwise.md +44 -0
- package/docs/reference/events.md +92 -0
- package/docs/reference/motherlode-cache.md +244 -0
- package/docs/reference/queues.md +102 -0
- package/docs/reference/reload.md +107 -0
- package/docs/reference/texture-arrays.md +113 -0
- package/docs/reference/texture-pipeline.md +53 -0
- package/docs/roadmap.md +104 -0
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +20 -20
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/gr2/LICENSE +21 -0
- package/format-notices/gr2/NOTICE +60 -0
- package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -0
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +52 -51
- package/resource-lifecycle.md +0 -679
|
@@ -1,251 +1,251 @@
|
|
|
1
|
-
// BC7 is defined as a little-endian 128-bit block format. The mode and
|
|
2
|
-
// partition constants below are the fixed tables from the Khronos Data Format
|
|
3
|
-
// Specification, section 20.1. The decoder itself is CarbonEngineJS code.
|
|
4
|
-
|
|
5
|
-
const MODE = Object.freeze([{
|
|
6
|
-
subsets: 3,
|
|
7
|
-
partitionBits: 4,
|
|
8
|
-
rotationBits: 0,
|
|
9
|
-
selectionBits: 0,
|
|
10
|
-
colorBits: 4,
|
|
11
|
-
alphaBits: 0,
|
|
12
|
-
endpointPBits: 1,
|
|
13
|
-
sharedPBits: 0,
|
|
14
|
-
indexBits: 3,
|
|
15
|
-
secondaryIndexBits: 0
|
|
16
|
-
}, {
|
|
17
|
-
subsets: 2,
|
|
18
|
-
partitionBits: 6,
|
|
19
|
-
rotationBits: 0,
|
|
20
|
-
selectionBits: 0,
|
|
21
|
-
colorBits: 6,
|
|
22
|
-
alphaBits: 0,
|
|
23
|
-
endpointPBits: 0,
|
|
24
|
-
sharedPBits: 1,
|
|
25
|
-
indexBits: 3,
|
|
26
|
-
secondaryIndexBits: 0
|
|
27
|
-
}, {
|
|
28
|
-
subsets: 3,
|
|
29
|
-
partitionBits: 6,
|
|
30
|
-
rotationBits: 0,
|
|
31
|
-
selectionBits: 0,
|
|
32
|
-
colorBits: 5,
|
|
33
|
-
alphaBits: 0,
|
|
34
|
-
endpointPBits: 0,
|
|
35
|
-
sharedPBits: 0,
|
|
36
|
-
indexBits: 2,
|
|
37
|
-
secondaryIndexBits: 0
|
|
38
|
-
}, {
|
|
39
|
-
subsets: 2,
|
|
40
|
-
partitionBits: 6,
|
|
41
|
-
rotationBits: 0,
|
|
42
|
-
selectionBits: 0,
|
|
43
|
-
colorBits: 7,
|
|
44
|
-
alphaBits: 0,
|
|
45
|
-
endpointPBits: 1,
|
|
46
|
-
sharedPBits: 0,
|
|
47
|
-
indexBits: 2,
|
|
48
|
-
secondaryIndexBits: 0
|
|
49
|
-
}, {
|
|
50
|
-
subsets: 1,
|
|
51
|
-
partitionBits: 0,
|
|
52
|
-
rotationBits: 2,
|
|
53
|
-
selectionBits: 1,
|
|
54
|
-
colorBits: 5,
|
|
55
|
-
alphaBits: 6,
|
|
56
|
-
endpointPBits: 0,
|
|
57
|
-
sharedPBits: 0,
|
|
58
|
-
indexBits: 2,
|
|
59
|
-
secondaryIndexBits: 3
|
|
60
|
-
}, {
|
|
61
|
-
subsets: 1,
|
|
62
|
-
partitionBits: 0,
|
|
63
|
-
rotationBits: 2,
|
|
64
|
-
selectionBits: 0,
|
|
65
|
-
colorBits: 7,
|
|
66
|
-
alphaBits: 8,
|
|
67
|
-
endpointPBits: 0,
|
|
68
|
-
sharedPBits: 0,
|
|
69
|
-
indexBits: 2,
|
|
70
|
-
secondaryIndexBits: 2
|
|
71
|
-
}, {
|
|
72
|
-
subsets: 1,
|
|
73
|
-
partitionBits: 0,
|
|
74
|
-
rotationBits: 0,
|
|
75
|
-
selectionBits: 0,
|
|
76
|
-
colorBits: 7,
|
|
77
|
-
alphaBits: 7,
|
|
78
|
-
endpointPBits: 1,
|
|
79
|
-
sharedPBits: 0,
|
|
80
|
-
indexBits: 4,
|
|
81
|
-
secondaryIndexBits: 0
|
|
82
|
-
}, {
|
|
83
|
-
subsets: 2,
|
|
84
|
-
partitionBits: 6,
|
|
85
|
-
rotationBits: 0,
|
|
86
|
-
selectionBits: 0,
|
|
87
|
-
colorBits: 5,
|
|
88
|
-
alphaBits: 5,
|
|
89
|
-
endpointPBits: 1,
|
|
90
|
-
sharedPBits: 0,
|
|
91
|
-
indexBits: 2,
|
|
92
|
-
secondaryIndexBits: 0
|
|
93
|
-
}]);
|
|
94
|
-
const WEIGHTS = Object.freeze({
|
|
95
|
-
2: new Uint8Array([0, 21, 43, 64]),
|
|
96
|
-
3: new Uint8Array([0, 9, 18, 27, 37, 46, 55, 64]),
|
|
97
|
-
4: new Uint8Array([0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64])
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// One bit per texel, in y-major order.
|
|
101
|
-
const PARTITIONS_2 = new Uint16Array([0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22]);
|
|
102
|
-
|
|
103
|
-
// Two bits per texel, in y-major order.
|
|
104
|
-
const PARTITIONS_3 = new Uint32Array([0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254]);
|
|
105
|
-
const ANCHOR_2 = new Uint8Array([15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15]);
|
|
106
|
-
const ANCHOR_3_SECOND = new Uint8Array([3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3]);
|
|
107
|
-
const ANCHOR_3_THIRD = new Uint8Array([15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8]);
|
|
108
|
-
function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16) {
|
|
109
|
-
const rgba = new Uint8Array(width * height * 4);
|
|
110
|
-
const blockRows = Math.ceil(height / 4);
|
|
111
|
-
const blockColumns = Math.ceil(width / 4);
|
|
112
|
-
for (let blockY = 0; blockY < blockRows; blockY++) {
|
|
113
|
-
for (let blockX = 0; blockX < blockColumns; blockX++) {
|
|
114
|
-
const blockOffset = blockY * rowPitch + blockX * 16;
|
|
115
|
-
const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));
|
|
116
|
-
copyBlock(pixels, rgba, width, height, blockX, blockY);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return rgba;
|
|
120
|
-
}
|
|
121
|
-
function decodeBc7Block(block) {
|
|
122
|
-
if (block.byteLength < 16) throw new RangeError("BC7 block must contain 16 bytes");
|
|
123
|
-
if (block[0] === 0) return new Uint8Array(16 * 4);
|
|
124
|
-
const reader = new BitReader(block);
|
|
125
|
-
let mode = 0;
|
|
126
|
-
while (mode < 8 && reader.read(1) === 0) mode++;
|
|
127
|
-
if (mode === 8) return new Uint8Array(16 * 4);
|
|
128
|
-
const info = MODE[mode];
|
|
129
|
-
const partition = reader.read(info.partitionBits);
|
|
130
|
-
const rotation = reader.read(info.rotationBits);
|
|
131
|
-
const selection = reader.read(info.selectionBits);
|
|
132
|
-
const endpointCount = info.subsets * 2;
|
|
133
|
-
const endpoints = Array.from({
|
|
134
|
-
length: endpointCount
|
|
135
|
-
}, () => [0, 0, 0, 255]);
|
|
136
|
-
for (let channel = 0; channel < 3; channel++) {
|
|
137
|
-
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
138
|
-
endpoints[endpoint][channel] = reader.read(info.colorBits);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (info.alphaBits) {
|
|
142
|
-
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
143
|
-
endpoints[endpoint][3] = reader.read(info.alphaBits);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const pBits = new Uint8Array(endpointCount);
|
|
147
|
-
if (info.endpointPBits) {
|
|
148
|
-
for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);
|
|
149
|
-
} else if (info.sharedPBits) {
|
|
150
|
-
for (let subset = 0; subset < info.subsets; subset++) {
|
|
151
|
-
const pBit = reader.read(1);
|
|
152
|
-
pBits[subset * 2] = pBit;
|
|
153
|
-
pBits[subset * 2 + 1] = pBit;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);
|
|
157
|
-
const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);
|
|
158
|
-
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
159
|
-
for (let channel = 0; channel < 3; channel++) {
|
|
160
|
-
const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][channel] << 1 | pBits[endpoint] : endpoints[endpoint][channel];
|
|
161
|
-
endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);
|
|
162
|
-
}
|
|
163
|
-
if (info.alphaBits) {
|
|
164
|
-
const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][3] << 1 | pBits[endpoint] : endpoints[endpoint][3];
|
|
165
|
-
endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
const primary = readIndices(reader, info.indexBits, info.subsets, partition);
|
|
169
|
-
const secondary = info.secondaryIndexBits ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition) : primary;
|
|
170
|
-
const colorUsesSecondary = info.selectionBits && selection === 1;
|
|
171
|
-
const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);
|
|
172
|
-
const colorIndices = colorUsesSecondary ? secondary : primary;
|
|
173
|
-
const alphaIndices = alphaUsesSecondary ? secondary : primary;
|
|
174
|
-
const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;
|
|
175
|
-
const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;
|
|
176
|
-
const pixels = new Uint8Array(16 * 4);
|
|
177
|
-
for (let pixel = 0; pixel < 16; pixel++) {
|
|
178
|
-
const subset = getSubset(info.subsets, partition, pixel);
|
|
179
|
-
const first = endpoints[subset * 2];
|
|
180
|
-
const second = endpoints[subset * 2 + 1];
|
|
181
|
-
const output = pixel * 4;
|
|
182
|
-
for (let channel = 0; channel < 3; channel++) {
|
|
183
|
-
pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);
|
|
184
|
-
}
|
|
185
|
-
pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);
|
|
186
|
-
if (rotation) {
|
|
187
|
-
const channel = rotation - 1;
|
|
188
|
-
const value = pixels[output + channel];
|
|
189
|
-
pixels[output + channel] = pixels[output + 3];
|
|
190
|
-
pixels[output + 3] = value;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return pixels;
|
|
194
|
-
}
|
|
195
|
-
function readIndices(reader, bitCount, subsets, partition) {
|
|
196
|
-
const indices = new Uint8Array(16);
|
|
197
|
-
for (let pixel = 0; pixel < 16; pixel++) {
|
|
198
|
-
const subset = getSubset(subsets, partition, pixel);
|
|
199
|
-
const isAnchor = pixel === getAnchor(subsets, partition, subset);
|
|
200
|
-
indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));
|
|
201
|
-
}
|
|
202
|
-
return indices;
|
|
203
|
-
}
|
|
204
|
-
function getSubset(subsets, partition, pixel) {
|
|
205
|
-
if (subsets === 1) return 0;
|
|
206
|
-
if (subsets === 2) return PARTITIONS_2[partition] >>> pixel & 1;
|
|
207
|
-
return PARTITIONS_3[partition] >>> pixel * 2 & 3;
|
|
208
|
-
}
|
|
209
|
-
function getAnchor(subsets, partition, subset) {
|
|
210
|
-
if (subset === 0) return 0;
|
|
211
|
-
if (subsets === 2) return ANCHOR_2[partition];
|
|
212
|
-
return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];
|
|
213
|
-
}
|
|
214
|
-
function expandEndpoint(value, bitCount) {
|
|
215
|
-
if (bitCount === 8) return value;
|
|
216
|
-
return value << 8 - bitCount | value >>> 2 * bitCount - 8;
|
|
217
|
-
}
|
|
218
|
-
function interpolate(first, second, index, bitCount) {
|
|
219
|
-
const weight = WEIGHTS[bitCount][index];
|
|
220
|
-
return (64 - weight) * first + weight * second + 32 >>> 6;
|
|
221
|
-
}
|
|
222
|
-
function copyBlock(block, output, width, height, blockX, blockY) {
|
|
223
|
-
for (let y = 0; y < 4; y++) {
|
|
224
|
-
const outputY = blockY * 4 + y;
|
|
225
|
-
if (outputY >= height) continue;
|
|
226
|
-
for (let x = 0; x < 4; x++) {
|
|
227
|
-
const outputX = blockX * 4 + x;
|
|
228
|
-
if (outputX >= width) continue;
|
|
229
|
-
const sourceOffset = (y * 4 + x) * 4;
|
|
230
|
-
output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
class BitReader {
|
|
235
|
-
constructor(bytes) {
|
|
236
|
-
this.bytes = bytes;
|
|
237
|
-
this.offset = 0;
|
|
238
|
-
}
|
|
239
|
-
read(bitCount) {
|
|
240
|
-
let value = 0;
|
|
241
|
-
for (let bit = 0; bit < bitCount; bit++) {
|
|
242
|
-
if (this.offset >= 128) throw new RangeError("BC7 block bitstream exceeds 128 bits");
|
|
243
|
-
value |= (this.bytes[this.offset >>> 3] >>> (this.offset & 7) & 1) << bit;
|
|
244
|
-
this.offset++;
|
|
245
|
-
}
|
|
246
|
-
return value;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export { decodeBc7, decodeBc7Block };
|
|
251
|
-
//# sourceMappingURL=bc7.js.map
|
|
1
|
+
// BC7 is defined as a little-endian 128-bit block format. The mode and
|
|
2
|
+
// partition constants below are the fixed tables from the Khronos Data Format
|
|
3
|
+
// Specification, section 20.1. The decoder itself is CarbonEngineJS code.
|
|
4
|
+
|
|
5
|
+
const MODE = Object.freeze([{
|
|
6
|
+
subsets: 3,
|
|
7
|
+
partitionBits: 4,
|
|
8
|
+
rotationBits: 0,
|
|
9
|
+
selectionBits: 0,
|
|
10
|
+
colorBits: 4,
|
|
11
|
+
alphaBits: 0,
|
|
12
|
+
endpointPBits: 1,
|
|
13
|
+
sharedPBits: 0,
|
|
14
|
+
indexBits: 3,
|
|
15
|
+
secondaryIndexBits: 0
|
|
16
|
+
}, {
|
|
17
|
+
subsets: 2,
|
|
18
|
+
partitionBits: 6,
|
|
19
|
+
rotationBits: 0,
|
|
20
|
+
selectionBits: 0,
|
|
21
|
+
colorBits: 6,
|
|
22
|
+
alphaBits: 0,
|
|
23
|
+
endpointPBits: 0,
|
|
24
|
+
sharedPBits: 1,
|
|
25
|
+
indexBits: 3,
|
|
26
|
+
secondaryIndexBits: 0
|
|
27
|
+
}, {
|
|
28
|
+
subsets: 3,
|
|
29
|
+
partitionBits: 6,
|
|
30
|
+
rotationBits: 0,
|
|
31
|
+
selectionBits: 0,
|
|
32
|
+
colorBits: 5,
|
|
33
|
+
alphaBits: 0,
|
|
34
|
+
endpointPBits: 0,
|
|
35
|
+
sharedPBits: 0,
|
|
36
|
+
indexBits: 2,
|
|
37
|
+
secondaryIndexBits: 0
|
|
38
|
+
}, {
|
|
39
|
+
subsets: 2,
|
|
40
|
+
partitionBits: 6,
|
|
41
|
+
rotationBits: 0,
|
|
42
|
+
selectionBits: 0,
|
|
43
|
+
colorBits: 7,
|
|
44
|
+
alphaBits: 0,
|
|
45
|
+
endpointPBits: 1,
|
|
46
|
+
sharedPBits: 0,
|
|
47
|
+
indexBits: 2,
|
|
48
|
+
secondaryIndexBits: 0
|
|
49
|
+
}, {
|
|
50
|
+
subsets: 1,
|
|
51
|
+
partitionBits: 0,
|
|
52
|
+
rotationBits: 2,
|
|
53
|
+
selectionBits: 1,
|
|
54
|
+
colorBits: 5,
|
|
55
|
+
alphaBits: 6,
|
|
56
|
+
endpointPBits: 0,
|
|
57
|
+
sharedPBits: 0,
|
|
58
|
+
indexBits: 2,
|
|
59
|
+
secondaryIndexBits: 3
|
|
60
|
+
}, {
|
|
61
|
+
subsets: 1,
|
|
62
|
+
partitionBits: 0,
|
|
63
|
+
rotationBits: 2,
|
|
64
|
+
selectionBits: 0,
|
|
65
|
+
colorBits: 7,
|
|
66
|
+
alphaBits: 8,
|
|
67
|
+
endpointPBits: 0,
|
|
68
|
+
sharedPBits: 0,
|
|
69
|
+
indexBits: 2,
|
|
70
|
+
secondaryIndexBits: 2
|
|
71
|
+
}, {
|
|
72
|
+
subsets: 1,
|
|
73
|
+
partitionBits: 0,
|
|
74
|
+
rotationBits: 0,
|
|
75
|
+
selectionBits: 0,
|
|
76
|
+
colorBits: 7,
|
|
77
|
+
alphaBits: 7,
|
|
78
|
+
endpointPBits: 1,
|
|
79
|
+
sharedPBits: 0,
|
|
80
|
+
indexBits: 4,
|
|
81
|
+
secondaryIndexBits: 0
|
|
82
|
+
}, {
|
|
83
|
+
subsets: 2,
|
|
84
|
+
partitionBits: 6,
|
|
85
|
+
rotationBits: 0,
|
|
86
|
+
selectionBits: 0,
|
|
87
|
+
colorBits: 5,
|
|
88
|
+
alphaBits: 5,
|
|
89
|
+
endpointPBits: 1,
|
|
90
|
+
sharedPBits: 0,
|
|
91
|
+
indexBits: 2,
|
|
92
|
+
secondaryIndexBits: 0
|
|
93
|
+
}]);
|
|
94
|
+
const WEIGHTS = Object.freeze({
|
|
95
|
+
2: new Uint8Array([0, 21, 43, 64]),
|
|
96
|
+
3: new Uint8Array([0, 9, 18, 27, 37, 46, 55, 64]),
|
|
97
|
+
4: new Uint8Array([0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64])
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// One bit per texel, in y-major order.
|
|
101
|
+
const PARTITIONS_2 = new Uint16Array([0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22]);
|
|
102
|
+
|
|
103
|
+
// Two bits per texel, in y-major order.
|
|
104
|
+
const PARTITIONS_3 = new Uint32Array([0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254]);
|
|
105
|
+
const ANCHOR_2 = new Uint8Array([15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15]);
|
|
106
|
+
const ANCHOR_3_SECOND = new Uint8Array([3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3]);
|
|
107
|
+
const ANCHOR_3_THIRD = new Uint8Array([15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8]);
|
|
108
|
+
function decodeBc7(source, width, height, rowPitch = Math.ceil(width / 4) * 16) {
|
|
109
|
+
const rgba = new Uint8Array(width * height * 4);
|
|
110
|
+
const blockRows = Math.ceil(height / 4);
|
|
111
|
+
const blockColumns = Math.ceil(width / 4);
|
|
112
|
+
for (let blockY = 0; blockY < blockRows; blockY++) {
|
|
113
|
+
for (let blockX = 0; blockX < blockColumns; blockX++) {
|
|
114
|
+
const blockOffset = blockY * rowPitch + blockX * 16;
|
|
115
|
+
const pixels = decodeBc7Block(source.subarray(blockOffset, blockOffset + 16));
|
|
116
|
+
copyBlock(pixels, rgba, width, height, blockX, blockY);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return rgba;
|
|
120
|
+
}
|
|
121
|
+
function decodeBc7Block(block) {
|
|
122
|
+
if (block.byteLength < 16) throw new RangeError("BC7 block must contain 16 bytes");
|
|
123
|
+
if (block[0] === 0) return new Uint8Array(16 * 4);
|
|
124
|
+
const reader = new BitReader(block);
|
|
125
|
+
let mode = 0;
|
|
126
|
+
while (mode < 8 && reader.read(1) === 0) mode++;
|
|
127
|
+
if (mode === 8) return new Uint8Array(16 * 4);
|
|
128
|
+
const info = MODE[mode];
|
|
129
|
+
const partition = reader.read(info.partitionBits);
|
|
130
|
+
const rotation = reader.read(info.rotationBits);
|
|
131
|
+
const selection = reader.read(info.selectionBits);
|
|
132
|
+
const endpointCount = info.subsets * 2;
|
|
133
|
+
const endpoints = Array.from({
|
|
134
|
+
length: endpointCount
|
|
135
|
+
}, () => [0, 0, 0, 255]);
|
|
136
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
137
|
+
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
138
|
+
endpoints[endpoint][channel] = reader.read(info.colorBits);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (info.alphaBits) {
|
|
142
|
+
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
143
|
+
endpoints[endpoint][3] = reader.read(info.alphaBits);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const pBits = new Uint8Array(endpointCount);
|
|
147
|
+
if (info.endpointPBits) {
|
|
148
|
+
for (let endpoint = 0; endpoint < endpointCount; endpoint++) pBits[endpoint] = reader.read(1);
|
|
149
|
+
} else if (info.sharedPBits) {
|
|
150
|
+
for (let subset = 0; subset < info.subsets; subset++) {
|
|
151
|
+
const pBit = reader.read(1);
|
|
152
|
+
pBits[subset * 2] = pBit;
|
|
153
|
+
pBits[subset * 2 + 1] = pBit;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const colorPrecision = info.colorBits + (info.endpointPBits || info.sharedPBits ? 1 : 0);
|
|
157
|
+
const alphaPrecision = info.alphaBits + (info.alphaBits && (info.endpointPBits || info.sharedPBits) ? 1 : 0);
|
|
158
|
+
for (let endpoint = 0; endpoint < endpointCount; endpoint++) {
|
|
159
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
160
|
+
const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][channel] << 1 | pBits[endpoint] : endpoints[endpoint][channel];
|
|
161
|
+
endpoints[endpoint][channel] = expandEndpoint(value, colorPrecision);
|
|
162
|
+
}
|
|
163
|
+
if (info.alphaBits) {
|
|
164
|
+
const value = info.endpointPBits || info.sharedPBits ? endpoints[endpoint][3] << 1 | pBits[endpoint] : endpoints[endpoint][3];
|
|
165
|
+
endpoints[endpoint][3] = expandEndpoint(value, alphaPrecision);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const primary = readIndices(reader, info.indexBits, info.subsets, partition);
|
|
169
|
+
const secondary = info.secondaryIndexBits ? readIndices(reader, info.secondaryIndexBits, info.subsets, partition) : primary;
|
|
170
|
+
const colorUsesSecondary = info.selectionBits && selection === 1;
|
|
171
|
+
const alphaUsesSecondary = info.secondaryIndexBits && (!info.selectionBits || selection === 0);
|
|
172
|
+
const colorIndices = colorUsesSecondary ? secondary : primary;
|
|
173
|
+
const alphaIndices = alphaUsesSecondary ? secondary : primary;
|
|
174
|
+
const colorIndexBits = colorUsesSecondary ? info.secondaryIndexBits : info.indexBits;
|
|
175
|
+
const alphaIndexBits = alphaUsesSecondary ? info.secondaryIndexBits : info.indexBits;
|
|
176
|
+
const pixels = new Uint8Array(16 * 4);
|
|
177
|
+
for (let pixel = 0; pixel < 16; pixel++) {
|
|
178
|
+
const subset = getSubset(info.subsets, partition, pixel);
|
|
179
|
+
const first = endpoints[subset * 2];
|
|
180
|
+
const second = endpoints[subset * 2 + 1];
|
|
181
|
+
const output = pixel * 4;
|
|
182
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
183
|
+
pixels[output + channel] = interpolate(first[channel], second[channel], colorIndices[pixel], colorIndexBits);
|
|
184
|
+
}
|
|
185
|
+
pixels[output + 3] = interpolate(first[3], second[3], alphaIndices[pixel], alphaIndexBits);
|
|
186
|
+
if (rotation) {
|
|
187
|
+
const channel = rotation - 1;
|
|
188
|
+
const value = pixels[output + channel];
|
|
189
|
+
pixels[output + channel] = pixels[output + 3];
|
|
190
|
+
pixels[output + 3] = value;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return pixels;
|
|
194
|
+
}
|
|
195
|
+
function readIndices(reader, bitCount, subsets, partition) {
|
|
196
|
+
const indices = new Uint8Array(16);
|
|
197
|
+
for (let pixel = 0; pixel < 16; pixel++) {
|
|
198
|
+
const subset = getSubset(subsets, partition, pixel);
|
|
199
|
+
const isAnchor = pixel === getAnchor(subsets, partition, subset);
|
|
200
|
+
indices[pixel] = reader.read(bitCount - (isAnchor ? 1 : 0));
|
|
201
|
+
}
|
|
202
|
+
return indices;
|
|
203
|
+
}
|
|
204
|
+
function getSubset(subsets, partition, pixel) {
|
|
205
|
+
if (subsets === 1) return 0;
|
|
206
|
+
if (subsets === 2) return PARTITIONS_2[partition] >>> pixel & 1;
|
|
207
|
+
return PARTITIONS_3[partition] >>> pixel * 2 & 3;
|
|
208
|
+
}
|
|
209
|
+
function getAnchor(subsets, partition, subset) {
|
|
210
|
+
if (subset === 0) return 0;
|
|
211
|
+
if (subsets === 2) return ANCHOR_2[partition];
|
|
212
|
+
return subset === 1 ? ANCHOR_3_SECOND[partition] : ANCHOR_3_THIRD[partition];
|
|
213
|
+
}
|
|
214
|
+
function expandEndpoint(value, bitCount) {
|
|
215
|
+
if (bitCount === 8) return value;
|
|
216
|
+
return value << 8 - bitCount | value >>> 2 * bitCount - 8;
|
|
217
|
+
}
|
|
218
|
+
function interpolate(first, second, index, bitCount) {
|
|
219
|
+
const weight = WEIGHTS[bitCount][index];
|
|
220
|
+
return (64 - weight) * first + weight * second + 32 >>> 6;
|
|
221
|
+
}
|
|
222
|
+
function copyBlock(block, output, width, height, blockX, blockY) {
|
|
223
|
+
for (let y = 0; y < 4; y++) {
|
|
224
|
+
const outputY = blockY * 4 + y;
|
|
225
|
+
if (outputY >= height) continue;
|
|
226
|
+
for (let x = 0; x < 4; x++) {
|
|
227
|
+
const outputX = blockX * 4 + x;
|
|
228
|
+
if (outputX >= width) continue;
|
|
229
|
+
const sourceOffset = (y * 4 + x) * 4;
|
|
230
|
+
output.set(block.subarray(sourceOffset, sourceOffset + 4), (outputY * width + outputX) * 4);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
class BitReader {
|
|
235
|
+
constructor(bytes) {
|
|
236
|
+
this.bytes = bytes;
|
|
237
|
+
this.offset = 0;
|
|
238
|
+
}
|
|
239
|
+
read(bitCount) {
|
|
240
|
+
let value = 0;
|
|
241
|
+
for (let bit = 0; bit < bitCount; bit++) {
|
|
242
|
+
if (this.offset >= 128) throw new RangeError("BC7 block bitstream exceeds 128 bits");
|
|
243
|
+
value |= (this.bytes[this.offset >>> 3] >>> (this.offset & 7) & 1) << bit;
|
|
244
|
+
this.offset++;
|
|
245
|
+
}
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export { decodeBc7, decodeBc7Block };
|
|
251
|
+
//# sourceMappingURL=bc7.js.map
|