@carbonenginejs/runtime-resource 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/NOTICE +31 -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 +68 -59
- package/dist/CjsResourceSource.js.map +1 -1
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
- package/dist/format/CjsBlueReader.js +269 -269
- package/dist/format/CjsFormat.js +197 -192
- package/dist/format/CjsFormat.js.map +1 -1
- 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 +157 -153
- package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -1
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +387 -382
- package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -1
- package/dist/formats/black/core/CjsBlackReader.js +639 -639
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +437 -433
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -1
- package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -0
- package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js.map +1 -0
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackDefinitions.js.map +1 -1
- 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 +493 -489
- package/dist/formats/bnk/core/musicNodes.js.map +1 -1
- 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 +123 -118
- package/dist/formats/cmf/core/binary.js.map +1 -1
- 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 +200 -193
- package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
- package/dist/formats/dds/core/bc6h.js +288 -288
- package/dist/formats/dds/core/bc7.js +256 -251
- package/dist/formats/dds/core/bc7.js.map +1 -1
- 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 +3911 -3901
- package/dist/formats/fbx/core/helpers.js.map +1 -1
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +93 -87
- package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
- package/dist/formats/flac/core/helpers.js +295 -295
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +92 -87
- package/dist/formats/gif/CjsGifFormat.js.map +1 -1
- 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 +212 -206
- package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
- package/dist/formats/jpeg/core/helpers.js +350 -350
- package/dist/formats/jpeg/core/jpeg.js +387 -377
- package/dist/formats/jpeg/core/jpeg.js.map +1 -1
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +197 -192
- package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
- package/dist/formats/mp3/core/helpers.js +338 -338
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +197 -191
- package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
- 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 +94 -88
- package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
- 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 +1004 -999
- package/dist/formats/ogg/core/vorbis.js.map +1 -1
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/png/CjsPngFormat.js +201 -195
- package/dist/formats/png/CjsPngFormat.js.map +1 -1
- 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 +634 -629
- package/dist/formats/stl/core/stl.js.map +1 -1
- package/dist/formats/stl/core/targets.js +163 -163
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +197 -192
- package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
- package/dist/formats/tga/core/helpers.js +446 -446
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +198 -192
- package/dist/formats/wav/CjsWavFormat.js.map +1 -1
- package/dist/formats/wav/core/helpers.js +328 -328
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +197 -191
- package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
- package/dist/formats/webm/core/helpers.js +537 -537
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +91 -86
- package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
- package/dist/formats/webp/core/helpers.js +214 -214
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +242 -241
- package/dist/formats/wem/CjsWemFormat.js.map +1 -1
- 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 +89 -83
- package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
- package/dist/formats/yaml/core/CjsYamlReader.js +311 -305
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
- 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 +73 -0
- package/docs/architecture.md +86 -0
- package/docs/concepts/resource-lifecycle.md +217 -0
- package/docs/formats/README.md +105 -0
- package/docs/formats/gr2.md +161 -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/classes/README.md +33 -0
- package/docs/reference/classes/core.md +106 -0
- package/docs/reference/classes/dropped.md +46 -0
- package/docs/reference/classes/formats.md +522 -0
- package/docs/reference/classes/resources.md +346 -0
- package/docs/reference/classes/texture.md +26 -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/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +0 -4
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +0 -1
- package/resource-lifecycle.md +0 -679
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { CjsWebmFormat, CjsWebmFormat as default } from './CjsWebmFormat.js';
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { CjsWebmFormat, CjsWebmFormat as default } from './CjsWebmFormat.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,86 +1,91 @@
|
|
|
1
|
-
import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, isSupportedWithValues, toJsonValue, isWebP, toBytes, OUTPUT_JSON, OUTPUT_RAW } from './core/helpers.js';
|
|
2
|
-
|
|
3
|
-
const FORMAT_NAME = "CjsWebpFormat";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
static
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
static
|
|
82
|
-
static
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
1
|
+
import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, isSupportedWithValues, toJsonValue, isWebP, toBytes, OUTPUT_JSON, OUTPUT_RAW } from './core/helpers.js';
|
|
2
|
+
|
|
3
|
+
const FORMAT_NAME = "CjsWebpFormat";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Metadata-only WebP format profile that inspects RIFF chunk headers and
|
|
7
|
+
* emits raw container bytes or debug JSON without decoding pixels.
|
|
8
|
+
*/
|
|
9
|
+
class CjsWebpFormat {
|
|
10
|
+
#values = DEFAULT_VALUES;
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.SetValues(options);
|
|
13
|
+
}
|
|
14
|
+
SetValues(options = {}) {
|
|
15
|
+
this.#values = normalizeValues(this.#values, {
|
|
16
|
+
inputType: "webp",
|
|
17
|
+
...options
|
|
18
|
+
}, FORMAT_NAME);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
GetValues(options = {}) {
|
|
22
|
+
return normalizeValues(this.#values, {
|
|
23
|
+
inputType: "webp",
|
|
24
|
+
...options
|
|
25
|
+
}, FORMAT_NAME);
|
|
26
|
+
}
|
|
27
|
+
Read(input, options = {}) {
|
|
28
|
+
return readWithValues(input, this.GetValues(options));
|
|
29
|
+
}
|
|
30
|
+
async ReadAsync(input, options = {}) {
|
|
31
|
+
return this.Read(input, options);
|
|
32
|
+
}
|
|
33
|
+
Inspect(input, options = {}) {
|
|
34
|
+
return inspectWithValues(input, this.GetValues(options));
|
|
35
|
+
}
|
|
36
|
+
IsSupported(input, options = {}) {
|
|
37
|
+
return isSupportedWithValues(input, this.GetValues(options));
|
|
38
|
+
}
|
|
39
|
+
ToJSON(value) {
|
|
40
|
+
return toJsonValue(value);
|
|
41
|
+
}
|
|
42
|
+
static read(input, options = {}) {
|
|
43
|
+
return readWithValues(input, normalizeValues(DEFAULT_VALUES, {
|
|
44
|
+
inputType: "webp",
|
|
45
|
+
...options
|
|
46
|
+
}, FORMAT_NAME));
|
|
47
|
+
}
|
|
48
|
+
static async readAsync(input, options = {}) {
|
|
49
|
+
return CjsWebpFormat.read(input, options);
|
|
50
|
+
}
|
|
51
|
+
static inspect(input, options = {}) {
|
|
52
|
+
return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, {
|
|
53
|
+
inputType: "webp",
|
|
54
|
+
...options
|
|
55
|
+
}, FORMAT_NAME));
|
|
56
|
+
}
|
|
57
|
+
static isSupported(input, options = {}) {
|
|
58
|
+
return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, {
|
|
59
|
+
inputType: "webp",
|
|
60
|
+
...options
|
|
61
|
+
}, FORMAT_NAME));
|
|
62
|
+
}
|
|
63
|
+
static toJSON(value) {
|
|
64
|
+
return toJsonValue(value);
|
|
65
|
+
}
|
|
66
|
+
static isWebP(input) {
|
|
67
|
+
try {
|
|
68
|
+
return isWebP(toBytes(input));
|
|
69
|
+
} catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Emit targets for this format (canonical frozen enum).
|
|
76
|
+
*/
|
|
77
|
+
static Output = Object.freeze({
|
|
78
|
+
RAW: OUTPUT_RAW,
|
|
79
|
+
JSON: OUTPUT_JSON
|
|
80
|
+
});
|
|
81
|
+
static OUTPUT_WEBP_JSON = "webpJson";
|
|
82
|
+
static type = Object.freeze(["image"]);
|
|
83
|
+
static mediaTypes = Object.freeze(["image"]);
|
|
84
|
+
static inputTypes = Object.freeze(["webp"]);
|
|
85
|
+
static outputTypes = Object.freeze([]);
|
|
86
|
+
static debugOutputTypes = Object.freeze(["webpJson", OUTPUT_RAW]);
|
|
87
|
+
static implementationStatus = "metadata-only";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { CjsWebpFormat };
|
|
91
|
+
//# sourceMappingURL=CjsWebpFormat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CjsWebpFormat.js","sources":["../../../../src/formats/webp/CjsWebpFormat.js"],"sourcesContent":["import {\n DEFAULT_VALUES,\n OUTPUT_JSON,\n OUTPUT_RAW,\n inspectWithValues,\n isSupportedWithValues,\n isWebP,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsWebpFormat\";\n\nexport class CjsWebpFormat\n{\n #values = DEFAULT_VALUES;\n\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n SetValues(options = {})\n {\n this.#values = normalizeValues(this.#values, { inputType: \"webp\", ...options }, FORMAT_NAME);\n return this;\n }\n\n GetValues(options = {})\n {\n return normalizeValues(this.#values, { inputType: \"webp\", ...options }, FORMAT_NAME);\n }\n\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options));\n }\n\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options));\n }\n\n IsSupported(input, options = {})\n {\n return isSupportedWithValues(input, this.GetValues(options));\n }\n\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static async readAsync(input, options = {})\n {\n return CjsWebpFormat.read(input, options);\n }\n\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static isSupported(input, options = {})\n {\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n static isWebP(input)\n {\n try\n {\n return isWebP(toBytes(input));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n RAW: OUTPUT_RAW,\n JSON: OUTPUT_JSON\n });\n\n static OUTPUT_WEBP_JSON = \"webpJson\";\n\n static type = Object.freeze([ \"image\" ]);\n\n static mediaTypes = Object.freeze([ \"image\" ]);\n\n static inputTypes = Object.freeze([ \"webp\" ]);\n\n static outputTypes = Object.freeze([]);\n\n static debugOutputTypes = Object.freeze([ \"webpJson\", OUTPUT_RAW ]);\n\n static implementationStatus = \"metadata-only\";\n}\n\nexport default CjsWebpFormat;\n"],"names":["FORMAT_NAME","CjsWebpFormat","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","toJSON","isWebP","toBytes","Output","Object","freeze","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","OUTPUT_WEBP_JSON","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes","implementationStatus"],"mappings":";;AAaA,MAAMA,WAAW,GAAG,eAAe;
|
|
1
|
+
{"version":3,"file":"CjsWebpFormat.js","sources":["../../../../src/formats/webp/CjsWebpFormat.js"],"sourcesContent":["import {\n DEFAULT_VALUES,\n OUTPUT_JSON,\n OUTPUT_RAW,\n inspectWithValues,\n isSupportedWithValues,\n isWebP,\n normalizeValues,\n readWithValues,\n toBytes,\n toJsonValue\n} from \"./core/helpers.js\";\n\nconst FORMAT_NAME = \"CjsWebpFormat\";\n\n/**\n * Metadata-only WebP format profile that inspects RIFF chunk headers and\n * emits raw container bytes or debug JSON without decoding pixels.\n */\nexport class CjsWebpFormat\n{\n #values = DEFAULT_VALUES;\n\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n SetValues(options = {})\n {\n this.#values = normalizeValues(this.#values, { inputType: \"webp\", ...options }, FORMAT_NAME);\n return this;\n }\n\n GetValues(options = {})\n {\n return normalizeValues(this.#values, { inputType: \"webp\", ...options }, FORMAT_NAME);\n }\n\n Read(input, options = {})\n {\n return readWithValues(input, this.GetValues(options));\n }\n\n async ReadAsync(input, options = {})\n {\n return this.Read(input, options);\n }\n\n Inspect(input, options = {})\n {\n return inspectWithValues(input, this.GetValues(options));\n }\n\n IsSupported(input, options = {})\n {\n return isSupportedWithValues(input, this.GetValues(options));\n }\n\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n static read(input, options = {})\n {\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static async readAsync(input, options = {})\n {\n return CjsWebpFormat.read(input, options);\n }\n\n static inspect(input, options = {})\n {\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static isSupported(input, options = {})\n {\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, { inputType: \"webp\", ...options }, FORMAT_NAME));\n }\n\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n static isWebP(input)\n {\n try\n {\n return isWebP(toBytes(input));\n }\n catch\n {\n return false;\n }\n }\n\n /**\n * Emit targets for this format (canonical frozen enum).\n */\n static Output = Object.freeze({\n RAW: OUTPUT_RAW,\n JSON: OUTPUT_JSON\n });\n\n static OUTPUT_WEBP_JSON = \"webpJson\";\n\n static type = Object.freeze([ \"image\" ]);\n\n static mediaTypes = Object.freeze([ \"image\" ]);\n\n static inputTypes = Object.freeze([ \"webp\" ]);\n\n static outputTypes = Object.freeze([]);\n\n static debugOutputTypes = Object.freeze([ \"webpJson\", OUTPUT_RAW ]);\n\n static implementationStatus = \"metadata-only\";\n}\n\nexport default CjsWebpFormat;\n"],"names":["FORMAT_NAME","CjsWebpFormat","DEFAULT_VALUES","constructor","options","SetValues","normalizeValues","inputType","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","toJSON","isWebP","toBytes","Output","Object","freeze","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","OUTPUT_WEBP_JSON","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes","implementationStatus"],"mappings":"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"}
|
|
@@ -1,214 +1,214 @@
|
|
|
1
|
-
const OUTPUT_RAW = "raw";
|
|
2
|
-
const OUTPUT_JSON = "json";
|
|
3
|
-
const DEFAULT_VALUES = Object.freeze({
|
|
4
|
-
emit: OUTPUT_RAW,
|
|
5
|
-
inputType: "webp",
|
|
6
|
-
source: ""
|
|
7
|
-
});
|
|
8
|
-
function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = "CjsWebpFormat") {
|
|
9
|
-
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
10
|
-
throw new TypeError(`${readerName}: options must be an object`);
|
|
11
|
-
}
|
|
12
|
-
const allowed = new Set(["emit", "inputType", "source"]);
|
|
13
|
-
for (const key of Object.keys(options)) {
|
|
14
|
-
if (!allowed.has(key)) throw new TypeError(`${readerName}: unknown option ${JSON.stringify(key)}`);
|
|
15
|
-
}
|
|
16
|
-
const values = {
|
|
17
|
-
...DEFAULT_VALUES,
|
|
18
|
-
...(base || {}),
|
|
19
|
-
...options
|
|
20
|
-
};
|
|
21
|
-
if (![OUTPUT_RAW, OUTPUT_JSON, "webpJson"].includes(values.emit)) {
|
|
22
|
-
throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(values.emit)}`);
|
|
23
|
-
}
|
|
24
|
-
return values;
|
|
25
|
-
}
|
|
26
|
-
function toBytes(input) {
|
|
27
|
-
if (input instanceof Uint8Array) return input;
|
|
28
|
-
if (input instanceof ArrayBuffer) return new Uint8Array(input);
|
|
29
|
-
if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
30
|
-
throw new TypeError("WebP input must be Uint8Array, ArrayBuffer, or a view");
|
|
31
|
-
}
|
|
32
|
-
function isWebP(bytes) {
|
|
33
|
-
return bytes.byteLength >= 12 && ascii(bytes, 0, 4) === "RIFF" && ascii(bytes, 8, 4) === "WEBP";
|
|
34
|
-
}
|
|
35
|
-
function inspectWithValues(input, values = DEFAULT_VALUES, expectedType = "webp") {
|
|
36
|
-
const bytes = toBytes(input);
|
|
37
|
-
if (!isWebP(bytes)) throw new TypeError("CjsWebpFormat: input is not a RIFF WebP container");
|
|
38
|
-
const metadata = inspectWebP(bytes);
|
|
39
|
-
if (expectedType && metadata.sourceFormat !== expectedType) {
|
|
40
|
-
throw new TypeError(`CjsWebpFormat: expected ${expectedType}, got ${metadata.sourceFormat}`);
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
...metadata,
|
|
44
|
-
byteLength: bytes.byteLength,
|
|
45
|
-
source: values.source || "buffer"
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function isSupportedWithValues(input, values = DEFAULT_VALUES) {
|
|
49
|
-
try {
|
|
50
|
-
const metadata = inspectWithValues(input, values);
|
|
51
|
-
return {
|
|
52
|
-
format: "webp",
|
|
53
|
-
source: values.source || "buffer",
|
|
54
|
-
supported: "partial",
|
|
55
|
-
confidence: 1,
|
|
56
|
-
preferred: "raw",
|
|
57
|
-
reason: "WebP container and image metadata are recognized; software RGBA decode is not implemented.",
|
|
58
|
-
metadata,
|
|
59
|
-
variants: [{
|
|
60
|
-
kind: "raw",
|
|
61
|
-
payloadType: "raw",
|
|
62
|
-
codec: "webp",
|
|
63
|
-
mimeType: "image/webp",
|
|
64
|
-
supported: true,
|
|
65
|
-
containerOnly: true,
|
|
66
|
-
isDecoded: false,
|
|
67
|
-
rgbaDecodeSupported: false
|
|
68
|
-
}, {
|
|
69
|
-
kind: "rgba",
|
|
70
|
-
payloadType: "rgba",
|
|
71
|
-
codec: "rgba8unorm",
|
|
72
|
-
supported: false,
|
|
73
|
-
reason: "WebP software RGBA decode is not implemented yet."
|
|
74
|
-
}],
|
|
75
|
-
warnings: [],
|
|
76
|
-
errors: []
|
|
77
|
-
};
|
|
78
|
-
} catch (error) {
|
|
79
|
-
return {
|
|
80
|
-
format: "webp",
|
|
81
|
-
source: values.source || "buffer",
|
|
82
|
-
supported: "none",
|
|
83
|
-
confidence: 0,
|
|
84
|
-
preferred: "",
|
|
85
|
-
reason: error.message,
|
|
86
|
-
metadata: null,
|
|
87
|
-
variants: [],
|
|
88
|
-
warnings: [],
|
|
89
|
-
errors: [error.message]
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
function readWithValues(input, values = DEFAULT_VALUES) {
|
|
94
|
-
const bytes = toBytes(input);
|
|
95
|
-
const metadata = inspectWithValues(bytes, values);
|
|
96
|
-
if (values.emit === OUTPUT_RAW) {
|
|
97
|
-
return {
|
|
98
|
-
payloadType: "raw",
|
|
99
|
-
sourceFormat: "webp",
|
|
100
|
-
mimeType: "image/webp",
|
|
101
|
-
containerOnly: true,
|
|
102
|
-
isDecoded: false,
|
|
103
|
-
rgbaDecodeSupported: false,
|
|
104
|
-
metadata,
|
|
105
|
-
bytes
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
if (values.emit === OUTPUT_JSON || values.emit === "webpJson") return metadata;
|
|
109
|
-
const error = new Error(`webp: emit "${values.emit}" is not implemented yet`);
|
|
110
|
-
error.code = "CJS_FORMAT_OUTPUT_NOT_IMPLEMENTED";
|
|
111
|
-
throw error;
|
|
112
|
-
}
|
|
113
|
-
function toJsonValue(value) {
|
|
114
|
-
if (value instanceof Uint8Array) return {
|
|
115
|
-
byteLength: value.byteLength
|
|
116
|
-
};
|
|
117
|
-
if (Array.isArray(value)) return value.map(toJsonValue);
|
|
118
|
-
if (value && typeof value === "object") {
|
|
119
|
-
const output = {};
|
|
120
|
-
for (const [key, entry] of Object.entries(value)) output[key] = toJsonValue(entry);
|
|
121
|
-
return output;
|
|
122
|
-
}
|
|
123
|
-
return value;
|
|
124
|
-
}
|
|
125
|
-
function inspectWebP(bytes) {
|
|
126
|
-
const riffLength = readU32LE(bytes, 4);
|
|
127
|
-
const chunks = [];
|
|
128
|
-
let width = 0;
|
|
129
|
-
let height = 0;
|
|
130
|
-
let codec = "webp";
|
|
131
|
-
let hasAlpha = false;
|
|
132
|
-
let animated = false;
|
|
133
|
-
const animationFrames = [];
|
|
134
|
-
let offset = 12;
|
|
135
|
-
while (offset + 8 <= bytes.byteLength) {
|
|
136
|
-
const type = ascii(bytes, offset, 4);
|
|
137
|
-
const size = readU32LE(bytes, offset + 4);
|
|
138
|
-
const dataOffset = offset + 8;
|
|
139
|
-
if (dataOffset + size > bytes.byteLength) throw new Error(`webp: ${type} chunk is truncated`);
|
|
140
|
-
chunks.push({
|
|
141
|
-
type,
|
|
142
|
-
byteOffset: dataOffset,
|
|
143
|
-
byteLength: size
|
|
144
|
-
});
|
|
145
|
-
if (type === "VP8 ") {
|
|
146
|
-
codec = "vp8";
|
|
147
|
-
if (size >= 10 && bytes[dataOffset + 3] === 0x9d && bytes[dataOffset + 4] === 0x01 && bytes[dataOffset + 5] === 0x2a) {
|
|
148
|
-
width = readU16LE(bytes, dataOffset + 6) & 0x3fff;
|
|
149
|
-
height = readU16LE(bytes, dataOffset + 8) & 0x3fff;
|
|
150
|
-
}
|
|
151
|
-
} else if (type === "VP8L") {
|
|
152
|
-
codec = "vp8l";
|
|
153
|
-
if (size >= 5 && bytes[dataOffset] === 0x2f) {
|
|
154
|
-
width = 1 + (bytes[dataOffset + 1] | (bytes[dataOffset + 2] & 0x3f) << 8);
|
|
155
|
-
height = 1 + (bytes[dataOffset + 2] >>> 6 | bytes[dataOffset + 3] << 2 | (bytes[dataOffset + 4] & 0x0f) << 10);
|
|
156
|
-
hasAlpha = true;
|
|
157
|
-
}
|
|
158
|
-
} else if (type === "VP8X") {
|
|
159
|
-
codec = "vp8x";
|
|
160
|
-
if (size >= 10) {
|
|
161
|
-
const flags = bytes[dataOffset];
|
|
162
|
-
hasAlpha = !!(flags & 0x10);
|
|
163
|
-
animated = !!(flags & 0x02);
|
|
164
|
-
width = 1 + readU24LE(bytes, dataOffset + 4);
|
|
165
|
-
height = 1 + readU24LE(bytes, dataOffset + 7);
|
|
166
|
-
}
|
|
167
|
-
} else if (type === "ALPH") hasAlpha = true;else if (type === "ANIM") animated = true;else if (type === "ANMF") {
|
|
168
|
-
animated = true;
|
|
169
|
-
if (size >= 16) {
|
|
170
|
-
animationFrames.push({
|
|
171
|
-
x: readU24LE(bytes, dataOffset),
|
|
172
|
-
y: readU24LE(bytes, dataOffset + 3),
|
|
173
|
-
width: 1 + readU24LE(bytes, dataOffset + 6),
|
|
174
|
-
height: 1 + readU24LE(bytes, dataOffset + 9),
|
|
175
|
-
durationMs: readU24LE(bytes, dataOffset + 12),
|
|
176
|
-
flags: bytes[dataOffset + 15]
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
offset = dataOffset + size + (size & 1);
|
|
181
|
-
}
|
|
182
|
-
return {
|
|
183
|
-
payloadType: "image",
|
|
184
|
-
mediaTypes: ["image"],
|
|
185
|
-
sourceFormat: "webp",
|
|
186
|
-
container: "riff",
|
|
187
|
-
riffLength,
|
|
188
|
-
codec,
|
|
189
|
-
width,
|
|
190
|
-
height,
|
|
191
|
-
hasAlpha,
|
|
192
|
-
animated,
|
|
193
|
-
animationFrameCount: animationFrames.length,
|
|
194
|
-
animationDurationMs: animationFrames.reduce((sum, frame) => sum + frame.durationMs, 0),
|
|
195
|
-
animationFrames,
|
|
196
|
-
isCompressed: true,
|
|
197
|
-
chunks
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
function ascii(bytes, offset, length) {
|
|
201
|
-
return String.fromCharCode(...bytes.subarray(offset, offset + length));
|
|
202
|
-
}
|
|
203
|
-
function readU16LE(bytes, offset) {
|
|
204
|
-
return bytes[offset] | bytes[offset + 1] << 8;
|
|
205
|
-
}
|
|
206
|
-
function readU24LE(bytes, offset) {
|
|
207
|
-
return bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16;
|
|
208
|
-
}
|
|
209
|
-
function readU32LE(bytes, offset) {
|
|
210
|
-
return (bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] * 0x1000000) >>> 0;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export { DEFAULT_VALUES, OUTPUT_JSON, OUTPUT_RAW, inspectWithValues, isSupportedWithValues, isWebP, normalizeValues, readWithValues, toBytes, toJsonValue };
|
|
214
|
-
//# sourceMappingURL=helpers.js.map
|
|
1
|
+
const OUTPUT_RAW = "raw";
|
|
2
|
+
const OUTPUT_JSON = "json";
|
|
3
|
+
const DEFAULT_VALUES = Object.freeze({
|
|
4
|
+
emit: OUTPUT_RAW,
|
|
5
|
+
inputType: "webp",
|
|
6
|
+
source: ""
|
|
7
|
+
});
|
|
8
|
+
function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = "CjsWebpFormat") {
|
|
9
|
+
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
10
|
+
throw new TypeError(`${readerName}: options must be an object`);
|
|
11
|
+
}
|
|
12
|
+
const allowed = new Set(["emit", "inputType", "source"]);
|
|
13
|
+
for (const key of Object.keys(options)) {
|
|
14
|
+
if (!allowed.has(key)) throw new TypeError(`${readerName}: unknown option ${JSON.stringify(key)}`);
|
|
15
|
+
}
|
|
16
|
+
const values = {
|
|
17
|
+
...DEFAULT_VALUES,
|
|
18
|
+
...(base || {}),
|
|
19
|
+
...options
|
|
20
|
+
};
|
|
21
|
+
if (![OUTPUT_RAW, OUTPUT_JSON, "webpJson"].includes(values.emit)) {
|
|
22
|
+
throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(values.emit)}`);
|
|
23
|
+
}
|
|
24
|
+
return values;
|
|
25
|
+
}
|
|
26
|
+
function toBytes(input) {
|
|
27
|
+
if (input instanceof Uint8Array) return input;
|
|
28
|
+
if (input instanceof ArrayBuffer) return new Uint8Array(input);
|
|
29
|
+
if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
30
|
+
throw new TypeError("WebP input must be Uint8Array, ArrayBuffer, or a view");
|
|
31
|
+
}
|
|
32
|
+
function isWebP(bytes) {
|
|
33
|
+
return bytes.byteLength >= 12 && ascii(bytes, 0, 4) === "RIFF" && ascii(bytes, 8, 4) === "WEBP";
|
|
34
|
+
}
|
|
35
|
+
function inspectWithValues(input, values = DEFAULT_VALUES, expectedType = "webp") {
|
|
36
|
+
const bytes = toBytes(input);
|
|
37
|
+
if (!isWebP(bytes)) throw new TypeError("CjsWebpFormat: input is not a RIFF WebP container");
|
|
38
|
+
const metadata = inspectWebP(bytes);
|
|
39
|
+
if (expectedType && metadata.sourceFormat !== expectedType) {
|
|
40
|
+
throw new TypeError(`CjsWebpFormat: expected ${expectedType}, got ${metadata.sourceFormat}`);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
...metadata,
|
|
44
|
+
byteLength: bytes.byteLength,
|
|
45
|
+
source: values.source || "buffer"
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function isSupportedWithValues(input, values = DEFAULT_VALUES) {
|
|
49
|
+
try {
|
|
50
|
+
const metadata = inspectWithValues(input, values);
|
|
51
|
+
return {
|
|
52
|
+
format: "webp",
|
|
53
|
+
source: values.source || "buffer",
|
|
54
|
+
supported: "partial",
|
|
55
|
+
confidence: 1,
|
|
56
|
+
preferred: "raw",
|
|
57
|
+
reason: "WebP container and image metadata are recognized; software RGBA decode is not implemented.",
|
|
58
|
+
metadata,
|
|
59
|
+
variants: [{
|
|
60
|
+
kind: "raw",
|
|
61
|
+
payloadType: "raw",
|
|
62
|
+
codec: "webp",
|
|
63
|
+
mimeType: "image/webp",
|
|
64
|
+
supported: true,
|
|
65
|
+
containerOnly: true,
|
|
66
|
+
isDecoded: false,
|
|
67
|
+
rgbaDecodeSupported: false
|
|
68
|
+
}, {
|
|
69
|
+
kind: "rgba",
|
|
70
|
+
payloadType: "rgba",
|
|
71
|
+
codec: "rgba8unorm",
|
|
72
|
+
supported: false,
|
|
73
|
+
reason: "WebP software RGBA decode is not implemented yet."
|
|
74
|
+
}],
|
|
75
|
+
warnings: [],
|
|
76
|
+
errors: []
|
|
77
|
+
};
|
|
78
|
+
} catch (error) {
|
|
79
|
+
return {
|
|
80
|
+
format: "webp",
|
|
81
|
+
source: values.source || "buffer",
|
|
82
|
+
supported: "none",
|
|
83
|
+
confidence: 0,
|
|
84
|
+
preferred: "",
|
|
85
|
+
reason: error.message,
|
|
86
|
+
metadata: null,
|
|
87
|
+
variants: [],
|
|
88
|
+
warnings: [],
|
|
89
|
+
errors: [error.message]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function readWithValues(input, values = DEFAULT_VALUES) {
|
|
94
|
+
const bytes = toBytes(input);
|
|
95
|
+
const metadata = inspectWithValues(bytes, values);
|
|
96
|
+
if (values.emit === OUTPUT_RAW) {
|
|
97
|
+
return {
|
|
98
|
+
payloadType: "raw",
|
|
99
|
+
sourceFormat: "webp",
|
|
100
|
+
mimeType: "image/webp",
|
|
101
|
+
containerOnly: true,
|
|
102
|
+
isDecoded: false,
|
|
103
|
+
rgbaDecodeSupported: false,
|
|
104
|
+
metadata,
|
|
105
|
+
bytes
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (values.emit === OUTPUT_JSON || values.emit === "webpJson") return metadata;
|
|
109
|
+
const error = new Error(`webp: emit "${values.emit}" is not implemented yet`);
|
|
110
|
+
error.code = "CJS_FORMAT_OUTPUT_NOT_IMPLEMENTED";
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
function toJsonValue(value) {
|
|
114
|
+
if (value instanceof Uint8Array) return {
|
|
115
|
+
byteLength: value.byteLength
|
|
116
|
+
};
|
|
117
|
+
if (Array.isArray(value)) return value.map(toJsonValue);
|
|
118
|
+
if (value && typeof value === "object") {
|
|
119
|
+
const output = {};
|
|
120
|
+
for (const [key, entry] of Object.entries(value)) output[key] = toJsonValue(entry);
|
|
121
|
+
return output;
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function inspectWebP(bytes) {
|
|
126
|
+
const riffLength = readU32LE(bytes, 4);
|
|
127
|
+
const chunks = [];
|
|
128
|
+
let width = 0;
|
|
129
|
+
let height = 0;
|
|
130
|
+
let codec = "webp";
|
|
131
|
+
let hasAlpha = false;
|
|
132
|
+
let animated = false;
|
|
133
|
+
const animationFrames = [];
|
|
134
|
+
let offset = 12;
|
|
135
|
+
while (offset + 8 <= bytes.byteLength) {
|
|
136
|
+
const type = ascii(bytes, offset, 4);
|
|
137
|
+
const size = readU32LE(bytes, offset + 4);
|
|
138
|
+
const dataOffset = offset + 8;
|
|
139
|
+
if (dataOffset + size > bytes.byteLength) throw new Error(`webp: ${type} chunk is truncated`);
|
|
140
|
+
chunks.push({
|
|
141
|
+
type,
|
|
142
|
+
byteOffset: dataOffset,
|
|
143
|
+
byteLength: size
|
|
144
|
+
});
|
|
145
|
+
if (type === "VP8 ") {
|
|
146
|
+
codec = "vp8";
|
|
147
|
+
if (size >= 10 && bytes[dataOffset + 3] === 0x9d && bytes[dataOffset + 4] === 0x01 && bytes[dataOffset + 5] === 0x2a) {
|
|
148
|
+
width = readU16LE(bytes, dataOffset + 6) & 0x3fff;
|
|
149
|
+
height = readU16LE(bytes, dataOffset + 8) & 0x3fff;
|
|
150
|
+
}
|
|
151
|
+
} else if (type === "VP8L") {
|
|
152
|
+
codec = "vp8l";
|
|
153
|
+
if (size >= 5 && bytes[dataOffset] === 0x2f) {
|
|
154
|
+
width = 1 + (bytes[dataOffset + 1] | (bytes[dataOffset + 2] & 0x3f) << 8);
|
|
155
|
+
height = 1 + (bytes[dataOffset + 2] >>> 6 | bytes[dataOffset + 3] << 2 | (bytes[dataOffset + 4] & 0x0f) << 10);
|
|
156
|
+
hasAlpha = true;
|
|
157
|
+
}
|
|
158
|
+
} else if (type === "VP8X") {
|
|
159
|
+
codec = "vp8x";
|
|
160
|
+
if (size >= 10) {
|
|
161
|
+
const flags = bytes[dataOffset];
|
|
162
|
+
hasAlpha = !!(flags & 0x10);
|
|
163
|
+
animated = !!(flags & 0x02);
|
|
164
|
+
width = 1 + readU24LE(bytes, dataOffset + 4);
|
|
165
|
+
height = 1 + readU24LE(bytes, dataOffset + 7);
|
|
166
|
+
}
|
|
167
|
+
} else if (type === "ALPH") hasAlpha = true;else if (type === "ANIM") animated = true;else if (type === "ANMF") {
|
|
168
|
+
animated = true;
|
|
169
|
+
if (size >= 16) {
|
|
170
|
+
animationFrames.push({
|
|
171
|
+
x: readU24LE(bytes, dataOffset),
|
|
172
|
+
y: readU24LE(bytes, dataOffset + 3),
|
|
173
|
+
width: 1 + readU24LE(bytes, dataOffset + 6),
|
|
174
|
+
height: 1 + readU24LE(bytes, dataOffset + 9),
|
|
175
|
+
durationMs: readU24LE(bytes, dataOffset + 12),
|
|
176
|
+
flags: bytes[dataOffset + 15]
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
offset = dataOffset + size + (size & 1);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
payloadType: "image",
|
|
184
|
+
mediaTypes: ["image"],
|
|
185
|
+
sourceFormat: "webp",
|
|
186
|
+
container: "riff",
|
|
187
|
+
riffLength,
|
|
188
|
+
codec,
|
|
189
|
+
width,
|
|
190
|
+
height,
|
|
191
|
+
hasAlpha,
|
|
192
|
+
animated,
|
|
193
|
+
animationFrameCount: animationFrames.length,
|
|
194
|
+
animationDurationMs: animationFrames.reduce((sum, frame) => sum + frame.durationMs, 0),
|
|
195
|
+
animationFrames,
|
|
196
|
+
isCompressed: true,
|
|
197
|
+
chunks
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function ascii(bytes, offset, length) {
|
|
201
|
+
return String.fromCharCode(...bytes.subarray(offset, offset + length));
|
|
202
|
+
}
|
|
203
|
+
function readU16LE(bytes, offset) {
|
|
204
|
+
return bytes[offset] | bytes[offset + 1] << 8;
|
|
205
|
+
}
|
|
206
|
+
function readU24LE(bytes, offset) {
|
|
207
|
+
return bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16;
|
|
208
|
+
}
|
|
209
|
+
function readU32LE(bytes, offset) {
|
|
210
|
+
return (bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] * 0x1000000) >>> 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export { DEFAULT_VALUES, OUTPUT_JSON, OUTPUT_RAW, inspectWithValues, isSupportedWithValues, isWebP, normalizeValues, readWithValues, toBytes, toJsonValue };
|
|
214
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { CjsWebpFormat, CjsWebpFormat as default } from './CjsWebpFormat.js';
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { CjsWebpFormat, CjsWebpFormat as default } from './CjsWebpFormat.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|