@carbonenginejs/runtime-resource 0.1.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/FORMAT-PROVENANCE.md +135 -0
- package/LICENSE +21 -0
- package/NOTICE +29 -0
- package/README.md +241 -0
- package/dist/CjsMotherLode.js +56 -0
- package/dist/CjsMotherLode.js.map +1 -0
- package/dist/CjsResMan.js +740 -0
- package/dist/CjsResMan.js.map +1 -0
- package/dist/CjsResManQueue.js +214 -0
- package/dist/CjsResManQueue.js.map +1 -0
- package/dist/CjsResource.js +366 -0
- package/dist/CjsResource.js.map +1 -0
- package/dist/CjsResourceSource.js +59 -0
- package/dist/CjsResourceSource.js.map +1 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/dist/format/CjsFormat.js +178 -0
- package/dist/format/CjsFormat.js.map +1 -0
- package/dist/format/CjsResourceProbe.js +269 -0
- package/dist/format/CjsResourceProbe.js.map +1 -0
- package/dist/format/payloadContract.js +173 -0
- package/dist/format/payloadContract.js.map +1 -0
- package/dist/formats/black/CjsBlackFormat.js +272 -0
- package/dist/formats/black/CjsBlackFormat.js.map +1 -0
- package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -0
- package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -0
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -0
- package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -0
- package/dist/formats/black/core/CjsBlackReader.js +760 -0
- package/dist/formats/black/core/CjsBlackReader.js.map +1 -0
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -0
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -0
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -0
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +1 -0
- package/dist/formats/black/core/blackConstants.js +7 -0
- package/dist/formats/black/core/blackConstants.js.map +1 -0
- package/dist/formats/black/core/blackDefinitions.js +10 -0
- package/dist/formats/black/core/blackDefinitions.js.map +1 -0
- package/dist/formats/black/core/blackEnums.js +6 -0
- package/dist/formats/black/core/blackEnums.js.map +1 -0
- package/dist/formats/black/core/blackSchema.js +3 -0
- package/dist/formats/black/core/blackSchema.js.map +1 -0
- package/dist/formats/black/core/blackVersion.js +22 -0
- package/dist/formats/black/core/blackVersion.js.map +1 -0
- package/dist/formats/black/core/helpers.js +182 -0
- package/dist/formats/black/core/helpers.js.map +1 -0
- package/dist/formats/black/core/schema.js +4 -0
- package/dist/formats/black/core/schema.js.map +1 -0
- package/dist/formats/black/index.js +2 -0
- package/dist/formats/black/index.js.map +1 -0
- package/dist/formats/bnk/CjsBnkFormat.js +245 -0
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -0
- package/dist/formats/bnk/core/helpers.js +354 -0
- package/dist/formats/bnk/core/helpers.js.map +1 -0
- package/dist/formats/bnk/core/soundbanksInfo.js +246 -0
- package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -0
- package/dist/formats/bnk/index.js +3 -0
- package/dist/formats/bnk/index.js.map +1 -0
- package/dist/formats/cmf/CjsCmfFormat.js +491 -0
- package/dist/formats/cmf/CjsCmfFormat.js.map +1 -0
- package/dist/formats/cmf/core/binary.js +118 -0
- package/dist/formats/cmf/core/binary.js.map +1 -0
- package/dist/formats/cmf/core/buffers.js +233 -0
- package/dist/formats/cmf/core/buffers.js.map +1 -0
- package/dist/formats/cmf/core/constants.js +47 -0
- package/dist/formats/cmf/core/constants.js.map +1 -0
- package/dist/formats/cmf/core/gr2Anim.js +453 -0
- package/dist/formats/cmf/core/gr2Anim.js.map +1 -0
- package/dist/formats/cmf/core/helpers.js +287 -0
- package/dist/formats/cmf/core/helpers.js.map +1 -0
- package/dist/formats/cmf/core/pack.js +276 -0
- package/dist/formats/cmf/core/pack.js.map +1 -0
- package/dist/formats/cmf/core/schema.js +364 -0
- package/dist/formats/cmf/core/schema.js.map +1 -0
- package/dist/formats/cmf/core/shared.js +268 -0
- package/dist/formats/cmf/core/shared.js.map +1 -0
- package/dist/formats/cmf/core/writer.js +517 -0
- package/dist/formats/cmf/core/writer.js.map +1 -0
- package/dist/formats/cmf/index.js +2 -0
- package/dist/formats/cmf/index.js.map +1 -0
- package/dist/formats/dds/CjsDdsFormat.js +187 -0
- package/dist/formats/dds/CjsDdsFormat.js.map +1 -0
- package/dist/formats/dds/core/helpers.js +812 -0
- package/dist/formats/dds/core/helpers.js.map +1 -0
- package/dist/formats/dds/index.js +2 -0
- package/dist/formats/dds/index.js.map +1 -0
- package/dist/formats/fbx/CjsFbxFormat.js +260 -0
- package/dist/formats/fbx/CjsFbxFormat.js.map +1 -0
- package/dist/formats/fbx/core/helpers.js +3901 -0
- package/dist/formats/fbx/core/helpers.js.map +1 -0
- package/dist/formats/fbx/index.js +2 -0
- package/dist/formats/fbx/index.js.map +1 -0
- package/dist/formats/flac/CjsFlacFormat.js +81 -0
- package/dist/formats/flac/CjsFlacFormat.js.map +1 -0
- package/dist/formats/flac/core/helpers.js +295 -0
- package/dist/formats/flac/core/helpers.js.map +1 -0
- package/dist/formats/flac/index.js +2 -0
- package/dist/formats/flac/index.js.map +1 -0
- package/dist/formats/gif/CjsGifFormat.js +81 -0
- package/dist/formats/gif/CjsGifFormat.js.map +1 -0
- package/dist/formats/gif/core/helpers.js +360 -0
- package/dist/formats/gif/core/helpers.js.map +1 -0
- package/dist/formats/gif/index.js +2 -0
- package/dist/formats/gif/index.js.map +1 -0
- package/dist/formats/gltf/CjsGltfFormat.js +284 -0
- package/dist/formats/gltf/CjsGltfFormat.js.map +1 -0
- package/dist/formats/gltf/core/helpers.js +292 -0
- package/dist/formats/gltf/core/helpers.js.map +1 -0
- package/dist/formats/gltf/core/json.js +79 -0
- package/dist/formats/gltf/core/json.js.map +1 -0
- package/dist/formats/gltf/core/parser.js +666 -0
- package/dist/formats/gltf/core/parser.js.map +1 -0
- package/dist/formats/gltf/core/targets.js +163 -0
- package/dist/formats/gltf/core/targets.js.map +1 -0
- package/dist/formats/gltf/index.js +2 -0
- package/dist/formats/gltf/index.js.map +1 -0
- package/dist/formats/index.js +23 -0
- package/dist/formats/index.js.map +1 -0
- package/dist/formats/jpeg/CjsJpegFormat.js +200 -0
- package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -0
- package/dist/formats/jpeg/core/helpers.js +350 -0
- package/dist/formats/jpeg/core/helpers.js.map +1 -0
- package/dist/formats/jpeg/core/jpeg.js +377 -0
- package/dist/formats/jpeg/core/jpeg.js.map +1 -0
- package/dist/formats/jpeg/index.js +2 -0
- package/dist/formats/jpeg/index.js.map +1 -0
- package/dist/formats/mp3/CjsMp3Format.js +186 -0
- package/dist/formats/mp3/CjsMp3Format.js.map +1 -0
- package/dist/formats/mp3/core/helpers.js +338 -0
- package/dist/formats/mp3/core/helpers.js.map +1 -0
- package/dist/formats/mp3/index.js +2 -0
- package/dist/formats/mp3/index.js.map +1 -0
- package/dist/formats/mp4/CjsMp4Format.js +185 -0
- package/dist/formats/mp4/CjsMp4Format.js.map +1 -0
- package/dist/formats/mp4/core/helpers.js +449 -0
- package/dist/formats/mp4/core/helpers.js.map +1 -0
- package/dist/formats/mp4/index.js +2 -0
- package/dist/formats/mp4/index.js.map +1 -0
- package/dist/formats/obj/CjsObjFormat.js +247 -0
- package/dist/formats/obj/CjsObjFormat.js.map +1 -0
- package/dist/formats/obj/core/helpers.js +573 -0
- package/dist/formats/obj/core/helpers.js.map +1 -0
- package/dist/formats/obj/core/json.js +64 -0
- package/dist/formats/obj/core/json.js.map +1 -0
- package/dist/formats/obj/core/parser.js +321 -0
- package/dist/formats/obj/core/parser.js.map +1 -0
- package/dist/formats/obj/index.js +2 -0
- package/dist/formats/obj/index.js.map +1 -0
- package/dist/formats/ogg/CjsOggFormat.js +82 -0
- package/dist/formats/ogg/CjsOggFormat.js.map +1 -0
- package/dist/formats/ogg/core/helpers.js +387 -0
- package/dist/formats/ogg/core/helpers.js.map +1 -0
- package/dist/formats/ogg/core/imdct.js +178 -0
- package/dist/formats/ogg/core/imdct.js.map +1 -0
- package/dist/formats/ogg/core/vorbis.js +999 -0
- package/dist/formats/ogg/core/vorbis.js.map +1 -0
- package/dist/formats/ogg/index.js +2 -0
- package/dist/formats/ogg/index.js.map +1 -0
- package/dist/formats/png/CjsPngFormat.js +189 -0
- package/dist/formats/png/CjsPngFormat.js.map +1 -0
- package/dist/formats/png/core/helpers.js +583 -0
- package/dist/formats/png/core/helpers.js.map +1 -0
- package/dist/formats/png/index.js +2 -0
- package/dist/formats/png/index.js.map +1 -0
- package/dist/formats/red/CjsRedFormat.js +247 -0
- package/dist/formats/red/CjsRedFormat.js.map +1 -0
- package/dist/formats/red/core/CjsRedReader.js +201 -0
- package/dist/formats/red/core/CjsRedReader.js.map +1 -0
- package/dist/formats/red/core/blackDefinitions.js +3 -0
- package/dist/formats/red/core/blackDefinitions.js.map +1 -0
- package/dist/formats/red/core/helpers.js +136 -0
- package/dist/formats/red/core/helpers.js.map +1 -0
- package/dist/formats/red/core/redGraph.js +68 -0
- package/dist/formats/red/core/redGraph.js.map +1 -0
- package/dist/formats/red/core/schema.js +4 -0
- package/dist/formats/red/core/schema.js.map +1 -0
- package/dist/formats/red/index.js +2 -0
- package/dist/formats/red/index.js.map +1 -0
- package/dist/formats/stl/CjsStlFormat.js +304 -0
- package/dist/formats/stl/CjsStlFormat.js.map +1 -0
- package/dist/formats/stl/core/helpers.js +257 -0
- package/dist/formats/stl/core/helpers.js.map +1 -0
- package/dist/formats/stl/core/json.js +51 -0
- package/dist/formats/stl/core/json.js.map +1 -0
- package/dist/formats/stl/core/stl.js +544 -0
- package/dist/formats/stl/core/stl.js.map +1 -0
- package/dist/formats/stl/core/targets.js +163 -0
- package/dist/formats/stl/core/targets.js.map +1 -0
- package/dist/formats/stl/index.js +2 -0
- package/dist/formats/stl/index.js.map +1 -0
- package/dist/formats/tga/CjsTgaFormat.js +186 -0
- package/dist/formats/tga/CjsTgaFormat.js.map +1 -0
- package/dist/formats/tga/core/helpers.js +446 -0
- package/dist/formats/tga/core/helpers.js.map +1 -0
- package/dist/formats/tga/index.js +2 -0
- package/dist/formats/tga/index.js.map +1 -0
- package/dist/formats/wav/CjsWavFormat.js +186 -0
- package/dist/formats/wav/CjsWavFormat.js.map +1 -0
- package/dist/formats/wav/core/helpers.js +328 -0
- package/dist/formats/wav/core/helpers.js.map +1 -0
- package/dist/formats/wav/index.js +2 -0
- package/dist/formats/wav/index.js.map +1 -0
- package/dist/formats/webm/CjsWebmFormat.js +185 -0
- package/dist/formats/webm/CjsWebmFormat.js.map +1 -0
- package/dist/formats/webm/core/helpers.js +537 -0
- package/dist/formats/webm/core/helpers.js.map +1 -0
- package/dist/formats/webm/index.js +2 -0
- package/dist/formats/webm/index.js.map +1 -0
- package/dist/formats/webp/CjsWebpFormat.js +80 -0
- package/dist/formats/webp/CjsWebpFormat.js.map +1 -0
- package/dist/formats/webp/core/helpers.js +214 -0
- package/dist/formats/webp/core/helpers.js.map +1 -0
- package/dist/formats/webp/index.js +2 -0
- package/dist/formats/webp/index.js.map +1 -0
- package/dist/formats/wem/CjsWemFormat.js +197 -0
- package/dist/formats/wem/CjsWemFormat.js.map +1 -0
- package/dist/formats/wem/core/bitStream.js +259 -0
- package/dist/formats/wem/core/bitStream.js.map +1 -0
- package/dist/formats/wem/core/codebookLibrary.js +164 -0
- package/dist/formats/wem/core/codebookLibrary.js.map +1 -0
- package/dist/formats/wem/core/helpers.js +336 -0
- package/dist/formats/wem/core/helpers.js.map +1 -0
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -0
- package/dist/formats/wem/core/packedCodebooksAotuv603.js.map +1 -0
- package/dist/formats/wem/core/wemToOgg.js +485 -0
- package/dist/formats/wem/core/wemToOgg.js.map +1 -0
- package/dist/formats/wem/index.js +2 -0
- package/dist/formats/wem/index.js.map +1 -0
- package/dist/formats/yaml/CjsYamlFormat.js +77 -0
- package/dist/formats/yaml/CjsYamlFormat.js.map +1 -0
- package/dist/formats/yaml/core/CjsYamlReader.js +304 -0
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -0
- package/dist/formats/yaml/core/helpers.js +160 -0
- package/dist/formats/yaml/core/helpers.js.map +1 -0
- package/dist/formats/yaml/index.js +2 -0
- package/dist/formats/yaml/index.js.map +1 -0
- package/dist/generated/resources/AudioGeometryResData.js +47 -0
- package/dist/generated/resources/AudioGeometryResData.js.map +1 -0
- package/dist/generated/resources/CmfVertexReader.js +46 -0
- package/dist/generated/resources/CmfVertexReader.js.map +1 -0
- package/dist/generated/resources/GStateBindingCallbackData.js +31 -0
- package/dist/generated/resources/GStateBindingCallbackData.js.map +1 -0
- package/dist/generated/resources/MeshDecalData.js +37 -0
- package/dist/generated/resources/MeshDecalData.js.map +1 -0
- package/dist/generated/resources/MeshDecalLodData.js +34 -0
- package/dist/generated/resources/MeshDecalLodData.js.map +1 -0
- package/dist/generated/resources/Tr2AsyncSave.js +46 -0
- package/dist/generated/resources/Tr2AsyncSave.js.map +1 -0
- package/dist/generated/resources/Tr2CmfContents.js +37 -0
- package/dist/generated/resources/Tr2CmfContents.js.map +1 -0
- package/dist/generated/resources/Tr2GrannyIntersectionResult.js +58 -0
- package/dist/generated/resources/Tr2GrannyIntersectionResult.js.map +1 -0
- package/dist/generated/resources/Tr2LoadPrepareFence.js +37 -0
- package/dist/generated/resources/Tr2LoadPrepareFence.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialArea.js +34 -0
- package/dist/generated/resources/Tr2MaterialArea.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialMesh.js +31 -0
- package/dist/generated/resources/Tr2MaterialMesh.js.map +1 -0
- package/dist/generated/resources/Tr2MaterialRes.js +34 -0
- package/dist/generated/resources/Tr2MaterialRes.js.map +1 -0
- package/dist/generated/resources/Tr2ShaderPermutation.js +43 -0
- package/dist/generated/resources/Tr2ShaderPermutation.js.map +1 -0
- package/dist/generated/resources/Tr2TextureLodManager.js +60 -0
- package/dist/generated/resources/Tr2TextureLodManager.js.map +1 -0
- package/dist/generated/resources/Tr2TextureLodUpdateRequest.js +37 -0
- package/dist/generated/resources/Tr2TextureLodUpdateRequest.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePackChannel.js +37 -0
- package/dist/generated/resources/Tr2TexturePackChannel.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipeline.js +44 -0
- package/dist/generated/resources/Tr2TexturePipeline.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineParams.js +34 -0
- package/dist/generated/resources/Tr2TexturePipelineParams.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepCompress.js +40 -0
- package/dist/generated/resources/Tr2TexturePipelineStepCompress.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLimitSize.js +34 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLimitSize.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLoad.js +31 -0
- package/dist/generated/resources/Tr2TexturePipelineStepLoad.js.map +1 -0
- package/dist/generated/resources/Tr2TexturePipelineStepPack.js +43 -0
- package/dist/generated/resources/Tr2TexturePipelineStepPack.js.map +1 -0
- package/dist/generated/resources/TriGeometryResAreaData.js +59 -0
- package/dist/generated/resources/TriGeometryResAreaData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResJointData.js +38 -0
- package/dist/generated/resources/TriGeometryResJointData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResLodData.js +88 -0
- package/dist/generated/resources/TriGeometryResLodData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResMeshData.js +63 -0
- package/dist/generated/resources/TriGeometryResMeshData.js.map +1 -0
- package/dist/generated/resources/TriGeometryResSkeletonData.js +34 -0
- package/dist/generated/resources/TriGeometryResSkeletonData.js.map +1 -0
- package/dist/generated/resources/TriJointBinding.js +38 -0
- package/dist/generated/resources/TriJointBinding.js.map +1 -0
- package/dist/generated/resources/TriMorphTargetGeometryConstants.js +46 -0
- package/dist/generated/resources/TriMorphTargetGeometryConstants.js.map +1 -0
- package/dist/generated/resources/TriRtGeometryConstants.js +88 -0
- package/dist/generated/resources/TriRtGeometryConstants.js.map +1 -0
- package/dist/generated/resources/enums.js +18 -0
- package/dist/generated/resources/enums.js.map +1 -0
- package/dist/generated/resources/index.js +32 -0
- package/dist/generated/resources/index.js.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/resourcePath.js +18 -0
- package/dist/resourcePath.js.map +1 -0
- package/dist/resourceStates.js +9 -0
- package/dist/resourceStates.js.map +1 -0
- package/dist/resources/Tr2EffectRes.js +71 -0
- package/dist/resources/Tr2EffectRes.js.map +1 -0
- package/dist/resources/Tr2GrannyStateRes.js +44 -0
- package/dist/resources/Tr2GrannyStateRes.js.map +1 -0
- package/dist/resources/Tr2ImageRes.js +114 -0
- package/dist/resources/Tr2ImageRes.js.map +1 -0
- package/dist/resources/Tr2LightProfileRes.js +40 -0
- package/dist/resources/Tr2LightProfileRes.js.map +1 -0
- package/dist/resources/TriGeometryRes.js +216 -0
- package/dist/resources/TriGeometryRes.js.map +1 -0
- package/dist/resources/TriGrannyRes.js +43 -0
- package/dist/resources/TriGrannyRes.js.map +1 -0
- package/dist/resources/TriTextureRes.js +304 -0
- package/dist/resources/TriTextureRes.js.map +1 -0
- package/dist/resources/resourceBoundary.js +47 -0
- package/dist/resources/resourceBoundary.js.map +1 -0
- package/dist/texture/CjsTextureArrayRes.js +406 -0
- package/dist/texture/CjsTextureArrayRes.js.map +1 -0
- package/dist/texture/CjsTextureParameterProxy.js +133 -0
- package/dist/texture/CjsTextureParameterProxy.js.map +1 -0
- package/format-notices/black/LICENSE +21 -0
- package/format-notices/black/NOTICE +47 -0
- package/format-notices/bnk/LICENSE +21 -0
- package/format-notices/bnk/NOTICE +17 -0
- package/format-notices/cmf/LICENSE +21 -0
- package/format-notices/cmf/NOTICE +36 -0
- package/format-notices/dds/LICENSE +21 -0
- package/format-notices/dds/NOTICE +14 -0
- package/format-notices/fbx/LICENSE +21 -0
- package/format-notices/fbx/NOTICE +14 -0
- package/format-notices/flac/LICENSE +21 -0
- package/format-notices/flac/NOTICE +14 -0
- package/format-notices/gif/LICENSE +21 -0
- package/format-notices/gif/NOTICE +14 -0
- package/format-notices/gltf/LICENSE +21 -0
- package/format-notices/gltf/NOTICE +27 -0
- package/format-notices/jpeg/LICENSE +21 -0
- package/format-notices/jpeg/NOTICE +14 -0
- package/format-notices/mp3/LICENSE +21 -0
- package/format-notices/mp3/NOTICE +14 -0
- package/format-notices/mp4/LICENSE +21 -0
- package/format-notices/mp4/NOTICE +14 -0
- package/format-notices/obj/LICENSE +21 -0
- package/format-notices/obj/NOTICE +26 -0
- package/format-notices/ogg/LICENSE +21 -0
- package/format-notices/ogg/NOTICE +28 -0
- package/format-notices/png/LICENSE +21 -0
- package/format-notices/png/NOTICE +14 -0
- package/format-notices/red/LICENSE +21 -0
- package/format-notices/red/NOTICE +31 -0
- package/format-notices/stl/LICENSE +21 -0
- package/format-notices/stl/NOTICE +21 -0
- package/format-notices/tga/LICENSE +21 -0
- package/format-notices/tga/NOTICE +14 -0
- package/format-notices/wav/LICENSE +21 -0
- package/format-notices/wav/NOTICE +14 -0
- package/format-notices/webm/LICENSE +21 -0
- package/format-notices/webm/NOTICE +14 -0
- package/format-notices/webp/LICENSE +21 -0
- package/format-notices/webp/NOTICE +14 -0
- package/format-notices/wem/LICENSE +57 -0
- package/format-notices/wem/NOTICE +33 -0
- package/format-notices/yaml/LICENSE +21 -0
- package/format-notices/yaml/NOTICE +44 -0
- package/package.json +51 -0
- package/resource-lifecycle.md +487 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
const OUTPUT_IMAGE = "image";
|
|
2
|
+
const OUTPUT_RGBA = "rgba";
|
|
3
|
+
const OUTPUT_RAW = "raw";
|
|
4
|
+
const OUTPUT_JSON = "json";
|
|
5
|
+
const DEFAULT_VALUES = Object.freeze({
|
|
6
|
+
emit: OUTPUT_RAW,
|
|
7
|
+
inputType: "",
|
|
8
|
+
source: ""
|
|
9
|
+
});
|
|
10
|
+
const DEBUG_OUTPUTS = Object.freeze({
|
|
11
|
+
png: "pngJson",
|
|
12
|
+
jpeg: "jpegJson",
|
|
13
|
+
jpg: "jpegJson",
|
|
14
|
+
tga: "tgaJson",
|
|
15
|
+
dds: "ddsJson"
|
|
16
|
+
});
|
|
17
|
+
const IMAGE_MIME_TYPES = Object.freeze({
|
|
18
|
+
png: "image/png",
|
|
19
|
+
jpeg: "image/jpeg",
|
|
20
|
+
jpg: "image/jpeg",
|
|
21
|
+
tga: "image/x-tga",
|
|
22
|
+
dds: "image/vnd-ms.dds"
|
|
23
|
+
});
|
|
24
|
+
function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = "CjsImageFormat") {
|
|
25
|
+
const values = {
|
|
26
|
+
...DEFAULT_VALUES,
|
|
27
|
+
...(base || {}),
|
|
28
|
+
...(options || {})
|
|
29
|
+
};
|
|
30
|
+
values.inputType = normalizeInputType(values.inputType);
|
|
31
|
+
values.emit = normalizeEmit(values.emit, values.inputType, readerName);
|
|
32
|
+
return values;
|
|
33
|
+
}
|
|
34
|
+
function normalizeInputType(inputType) {
|
|
35
|
+
if (!inputType) return "";
|
|
36
|
+
const value = String(inputType).replace(/^\./u, "").toLowerCase();
|
|
37
|
+
return value === "jpg" ? "jpeg" : value;
|
|
38
|
+
}
|
|
39
|
+
function normalizeEmit(emit, inputType, readerName) {
|
|
40
|
+
if (emit === undefined || emit === null) return OUTPUT_RAW;
|
|
41
|
+
if (emit === OUTPUT_JSON && inputType) return DEBUG_OUTPUTS[inputType] || OUTPUT_JSON;
|
|
42
|
+
if ([OUTPUT_IMAGE, OUTPUT_RGBA, OUTPUT_RAW, OUTPUT_JSON].includes(emit)) return emit;
|
|
43
|
+
if (Object.values(DEBUG_OUTPUTS).includes(emit)) return emit;
|
|
44
|
+
throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(emit)}`);
|
|
45
|
+
}
|
|
46
|
+
function toBytes(input) {
|
|
47
|
+
if (input instanceof Uint8Array) return input;
|
|
48
|
+
if (input instanceof ArrayBuffer) return new Uint8Array(input);
|
|
49
|
+
if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
50
|
+
throw new TypeError("Image input must be Uint8Array, ArrayBuffer, or DataView");
|
|
51
|
+
}
|
|
52
|
+
function inspectWithValues(input, values = DEFAULT_VALUES, expectedType = "") {
|
|
53
|
+
const bytes = toBytes(input);
|
|
54
|
+
const detected = inspectBytes(bytes);
|
|
55
|
+
const sourceFormat = expectedType || values.inputType || detected.sourceFormat;
|
|
56
|
+
if (expectedType && detected.sourceFormat && detected.sourceFormat !== expectedType) {
|
|
57
|
+
throw new TypeError(`CjsFormat${capitalize(expectedType)}: expected ${expectedType}, got ${detected.sourceFormat}`);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
payloadType: sourceFormat === "dds" ? "texture" : "image",
|
|
61
|
+
mediaTypes: sourceFormat === "dds" ? ["texture", "image"] : ["image"],
|
|
62
|
+
sourceFormat,
|
|
63
|
+
byteLength: bytes.byteLength,
|
|
64
|
+
...detected
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function isSupportedWithValues(input, values = DEFAULT_VALUES, expectedType = "") {
|
|
68
|
+
try {
|
|
69
|
+
const metadata = inspectWithValues(input, values, expectedType);
|
|
70
|
+
const pngSupport = metadata.sourceFormat === "png" ? pngRgbaSupport(metadata) : null;
|
|
71
|
+
const variants = [{
|
|
72
|
+
kind: "rgba",
|
|
73
|
+
payloadType: "rgba",
|
|
74
|
+
codec: "rgba8unorm",
|
|
75
|
+
supported: pngSupport?.supported === true,
|
|
76
|
+
reason: pngSupport?.reason || `${metadata.sourceFormat.toUpperCase()} RGBA decode is not implemented yet.`,
|
|
77
|
+
meta: {
|
|
78
|
+
async: true
|
|
79
|
+
}
|
|
80
|
+
}, rawVariant(metadata)];
|
|
81
|
+
return {
|
|
82
|
+
format: metadata.sourceFormat,
|
|
83
|
+
source: values.source || "buffer",
|
|
84
|
+
supported: metadata.sourceFormat ? variants.some(variant => variant.kind === "rgba" && variant.supported) ? "full" : "partial" : "none",
|
|
85
|
+
confidence: metadata.sourceFormat ? 1 : 0,
|
|
86
|
+
preferred: variants.find(v => v.supported)?.codec || "",
|
|
87
|
+
reason: metadata.sourceFormat ? "Container/header recognized." : "Unrecognized image format.",
|
|
88
|
+
metadata,
|
|
89
|
+
variants,
|
|
90
|
+
warnings: [],
|
|
91
|
+
errors: []
|
|
92
|
+
};
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
format: expectedType || values.inputType || "",
|
|
96
|
+
source: values.source || "buffer",
|
|
97
|
+
supported: "none",
|
|
98
|
+
confidence: 0,
|
|
99
|
+
preferred: "",
|
|
100
|
+
reason: error.message,
|
|
101
|
+
metadata: null,
|
|
102
|
+
variants: [],
|
|
103
|
+
warnings: [],
|
|
104
|
+
errors: [error.message]
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function readWithValues(input, values = DEFAULT_VALUES, expectedType = "") {
|
|
109
|
+
const bytes = toBytes(input);
|
|
110
|
+
const metadata = inspectWithValues(bytes, values, expectedType);
|
|
111
|
+
if (values.emit === OUTPUT_RAW) {
|
|
112
|
+
return {
|
|
113
|
+
payloadType: "raw",
|
|
114
|
+
sourceFormat: metadata.sourceFormat,
|
|
115
|
+
mimeType: imageMimeType(metadata.sourceFormat),
|
|
116
|
+
containerOnly: true,
|
|
117
|
+
isDecoded: false,
|
|
118
|
+
rgbaDecodeSupported: metadata.sourceFormat === "png" && pngRgbaSupport(metadata).supported === true,
|
|
119
|
+
metadata,
|
|
120
|
+
bytes
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (values.emit === OUTPUT_JSON || values.emit === DEBUG_OUTPUTS[metadata.sourceFormat]) {
|
|
124
|
+
return metadata;
|
|
125
|
+
}
|
|
126
|
+
const error = new Error(`${metadata.sourceFormat}: emit "${values.emit}" is not implemented yet`);
|
|
127
|
+
error.code = "CJS_FORMAT_OUTPUT_NOT_IMPLEMENTED";
|
|
128
|
+
error.sourceFormat = metadata.sourceFormat;
|
|
129
|
+
error.emit = values.emit;
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
async function readWithValuesAsync(input, values = DEFAULT_VALUES, expectedType = "") {
|
|
133
|
+
const bytes = toBytes(input);
|
|
134
|
+
const metadata = inspectWithValues(bytes, values, expectedType);
|
|
135
|
+
if (values.emit === OUTPUT_RAW || values.emit === OUTPUT_JSON || values.emit === DEBUG_OUTPUTS[metadata.sourceFormat]) {
|
|
136
|
+
return readWithValues(bytes, values, expectedType);
|
|
137
|
+
}
|
|
138
|
+
if ((values.emit === OUTPUT_RGBA || values.emit === OUTPUT_IMAGE) && metadata.sourceFormat === "png") {
|
|
139
|
+
return decodePngToRgba(bytes, metadata);
|
|
140
|
+
}
|
|
141
|
+
return readWithValues(bytes, values, expectedType);
|
|
142
|
+
}
|
|
143
|
+
function toJsonValue(value) {
|
|
144
|
+
if (value instanceof Uint8Array) {
|
|
145
|
+
return {
|
|
146
|
+
byteLength: value.byteLength
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(value)) return value.map(toJsonValue);
|
|
150
|
+
if (value && typeof value === "object") {
|
|
151
|
+
const output = {};
|
|
152
|
+
for (const [key, entry] of Object.entries(value)) output[key] = toJsonValue(entry);
|
|
153
|
+
return output;
|
|
154
|
+
}
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
function inspectBytes(bytes) {
|
|
158
|
+
if (isPNG(bytes)) return inspectPNG(bytes);
|
|
159
|
+
if (isJPEG(bytes)) return inspectJPEG(bytes);
|
|
160
|
+
if (isDDS(bytes)) return inspectDDS(bytes);
|
|
161
|
+
if (isTGA(bytes)) return inspectTGA(bytes);
|
|
162
|
+
return {
|
|
163
|
+
sourceFormat: "",
|
|
164
|
+
width: 0,
|
|
165
|
+
height: 0
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function isPNG(bytes) {
|
|
169
|
+
return bytes.byteLength >= 24 && bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47 && bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a;
|
|
170
|
+
}
|
|
171
|
+
function isJPEG(bytes) {
|
|
172
|
+
return bytes.byteLength >= 4 && bytes[0] === 0xff && bytes[1] === 0xd8;
|
|
173
|
+
}
|
|
174
|
+
function isDDS(bytes) {
|
|
175
|
+
return bytes.byteLength >= 128 && bytes[0] === 0x44 && bytes[1] === 0x44 && bytes[2] === 0x53 && bytes[3] === 0x20;
|
|
176
|
+
}
|
|
177
|
+
function isTGA(bytes) {
|
|
178
|
+
if (bytes.byteLength < 18) return false;
|
|
179
|
+
const imageType = bytes[2],
|
|
180
|
+
width = readU16LE(bytes, 12),
|
|
181
|
+
height = readU16LE(bytes, 14),
|
|
182
|
+
bpp = bytes[16];
|
|
183
|
+
return width > 0 && height > 0 && [1, 2, 3, 9, 10, 11].includes(imageType) && [8, 16, 24, 32].includes(bpp);
|
|
184
|
+
}
|
|
185
|
+
function inspectPNG(bytes) {
|
|
186
|
+
const colorType = bytes[25],
|
|
187
|
+
bitDepth = bytes[24];
|
|
188
|
+
const chunks = readPngChunkSummary(bytes);
|
|
189
|
+
return {
|
|
190
|
+
sourceFormat: "png",
|
|
191
|
+
width: readU32BE(bytes, 16),
|
|
192
|
+
height: readU32BE(bytes, 20),
|
|
193
|
+
bitDepth,
|
|
194
|
+
colorType,
|
|
195
|
+
channels: pngChannels(colorType),
|
|
196
|
+
pixelFormat: `png-${bitDepth}-${colorType}`,
|
|
197
|
+
isCompressed: false,
|
|
198
|
+
compressionMethod: bytes[26],
|
|
199
|
+
filterMethod: bytes[27],
|
|
200
|
+
interlaceMethod: bytes[28],
|
|
201
|
+
...chunks
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async function decodePngToRgba(bytes, metadata) {
|
|
205
|
+
const support = pngRgbaSupport(metadata);
|
|
206
|
+
if (!support.supported) {
|
|
207
|
+
throwPngUnsupported(metadata, support.reason);
|
|
208
|
+
}
|
|
209
|
+
const chunks = readPngChunks(bytes);
|
|
210
|
+
metadata.__pngPalette = chunks.palette;
|
|
211
|
+
metadata.__pngTransparency = chunks.trns;
|
|
212
|
+
if (chunks.trns && metadata.colorType === 0) {
|
|
213
|
+
metadata.__pngTransparentGray = metadata.bitDepth === 16 ? chunks.trns[0] << 8 | chunks.trns[1] : chunks.trns[1];
|
|
214
|
+
}
|
|
215
|
+
const compressed = concatBytes(chunks.idat);
|
|
216
|
+
const inflated = new Uint8Array(await new Response(new Blob([compressed]).stream().pipeThrough(new DecompressionStream("deflate"))).arrayBuffer());
|
|
217
|
+
const channels = pngChannels(metadata.colorType);
|
|
218
|
+
const rgba = new Uint8Array(metadata.width * metadata.height * 4);
|
|
219
|
+
if (metadata.interlaceMethod === 0) {
|
|
220
|
+
const bytesPerSample = metadata.bitDepth >= 8 ? Math.ceil(metadata.bitDepth / 8) : 1;
|
|
221
|
+
const rowBytes = Math.ceil(metadata.width * channels * metadata.bitDepth / 8);
|
|
222
|
+
const filterBytesPerPixel = Math.max(1, channels * bytesPerSample);
|
|
223
|
+
const expectedLength = metadata.height * (rowBytes + 1);
|
|
224
|
+
if (inflated.byteLength < expectedLength) {
|
|
225
|
+
throwPngUnsupported(metadata, "PNG image data is truncated.");
|
|
226
|
+
}
|
|
227
|
+
const rows = unfilterPngRows(inflated, metadata.height, rowBytes, filterBytesPerPixel);
|
|
228
|
+
for (let y = 0; y < metadata.height; y++) {
|
|
229
|
+
decodePngRow(rows, y * rowBytes, rgba, y * metadata.width * 4, metadata, metadata.width);
|
|
230
|
+
}
|
|
231
|
+
} else {
|
|
232
|
+
decodeAdam7Rows(inflated, rgba, metadata);
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
payloadType: OUTPUT_RGBA,
|
|
236
|
+
sourceFormat: "png",
|
|
237
|
+
mimeType: "image/png",
|
|
238
|
+
containerOnly: false,
|
|
239
|
+
isDecoded: true,
|
|
240
|
+
rgbaDecodeSupported: true,
|
|
241
|
+
width: metadata.width,
|
|
242
|
+
height: metadata.height,
|
|
243
|
+
pixelFormat: "rgba8unorm",
|
|
244
|
+
strideBytes: metadata.width * 4,
|
|
245
|
+
origin: "top-left",
|
|
246
|
+
colorSpace: chunks.srgb ? "srgb" : "unknown",
|
|
247
|
+
alphaMode: [4, 6].includes(metadata.colorType) || chunks.trns ? "straight" : "opaque",
|
|
248
|
+
metadata,
|
|
249
|
+
data: rgba
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function rawVariant(metadata) {
|
|
253
|
+
return {
|
|
254
|
+
kind: "raw",
|
|
255
|
+
payloadType: "raw",
|
|
256
|
+
codec: metadata.sourceFormat,
|
|
257
|
+
mimeType: imageMimeType(metadata.sourceFormat),
|
|
258
|
+
supported: true,
|
|
259
|
+
containerOnly: true,
|
|
260
|
+
isDecoded: false,
|
|
261
|
+
rgbaDecodeSupported: metadata.sourceFormat === "png" && pngRgbaSupport(metadata).supported === true
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function imageMimeType(sourceFormat) {
|
|
265
|
+
return IMAGE_MIME_TYPES[sourceFormat] || "application/octet-stream";
|
|
266
|
+
}
|
|
267
|
+
function pngRgbaSupport(metadata) {
|
|
268
|
+
if (metadata.idatChunkCount < 1 || metadata.idatBytes < 1) {
|
|
269
|
+
return {
|
|
270
|
+
supported: false,
|
|
271
|
+
reason: "PNG has no IDAT image data for RGBA decode."
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (!metadata.hasIend) {
|
|
275
|
+
return {
|
|
276
|
+
supported: false,
|
|
277
|
+
reason: "PNG stream has no complete IEND chunk."
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const depths = {
|
|
281
|
+
0: [1, 2, 4, 8, 16],
|
|
282
|
+
2: [8, 16],
|
|
283
|
+
3: [1, 2, 4, 8],
|
|
284
|
+
4: [8, 16],
|
|
285
|
+
6: [8, 16]
|
|
286
|
+
};
|
|
287
|
+
if (!Object.hasOwn(depths, metadata.colorType) || !depths[metadata.colorType].includes(metadata.bitDepth)) {
|
|
288
|
+
return {
|
|
289
|
+
supported: false,
|
|
290
|
+
reason: "PNG color type and bit depth are unsupported by the RGBA decoder."
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
if (![0, 1].includes(metadata.interlaceMethod)) {
|
|
294
|
+
return {
|
|
295
|
+
supported: false,
|
|
296
|
+
reason: "PNG interlace method is unsupported by the RGBA decoder."
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (metadata.compressionMethod !== 0 || metadata.filterMethod !== 0) {
|
|
300
|
+
return {
|
|
301
|
+
supported: false,
|
|
302
|
+
reason: "PNG compression/filter methods are unsupported by the RGBA decoder."
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
if (typeof DecompressionStream !== "function" || typeof Blob !== "function" || typeof Response !== "function") {
|
|
306
|
+
return {
|
|
307
|
+
supported: false,
|
|
308
|
+
reason: "PNG async RGBA decode requires platform DecompressionStream support."
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
supported: true,
|
|
313
|
+
reason: "Use readAsync/readWithValuesAsync for platform deflate decode."
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function readPngChunks(bytes) {
|
|
317
|
+
const chunks = {
|
|
318
|
+
idat: [],
|
|
319
|
+
palette: null,
|
|
320
|
+
trns: null,
|
|
321
|
+
srgb: false
|
|
322
|
+
};
|
|
323
|
+
let offset = 8;
|
|
324
|
+
while (offset + 12 <= bytes.byteLength) {
|
|
325
|
+
const length = readU32BE(bytes, offset);
|
|
326
|
+
const type = String.fromCharCode(bytes[offset + 4], bytes[offset + 5], bytes[offset + 6], bytes[offset + 7]);
|
|
327
|
+
const start = offset + 8;
|
|
328
|
+
const end = start + length;
|
|
329
|
+
if (end + 4 > bytes.byteLength) break;
|
|
330
|
+
const data = bytes.subarray(start, end);
|
|
331
|
+
if (type === "IDAT") chunks.idat.push(data);else if (type === "PLTE") chunks.palette = data;else if (type === "tRNS") chunks.trns = data;else if (type === "sRGB") chunks.srgb = true;
|
|
332
|
+
offset = end + 4;
|
|
333
|
+
if (type === "IEND") break;
|
|
334
|
+
}
|
|
335
|
+
return chunks;
|
|
336
|
+
}
|
|
337
|
+
function readPngChunkSummary(bytes) {
|
|
338
|
+
let offset = 8;
|
|
339
|
+
let chunkCount = 0;
|
|
340
|
+
let idatChunkCount = 0;
|
|
341
|
+
let idatBytes = 0;
|
|
342
|
+
let hasPalette = false;
|
|
343
|
+
let hasTransparency = false;
|
|
344
|
+
let hasSrgb = false;
|
|
345
|
+
let hasIend = false;
|
|
346
|
+
let chunksComplete = true;
|
|
347
|
+
while (offset + 12 <= bytes.byteLength) {
|
|
348
|
+
const length = readU32BE(bytes, offset);
|
|
349
|
+
const type = String.fromCharCode(bytes[offset + 4], bytes[offset + 5], bytes[offset + 6], bytes[offset + 7]);
|
|
350
|
+
const end = offset + 8 + length;
|
|
351
|
+
if (end + 4 > bytes.byteLength) {
|
|
352
|
+
chunksComplete = false;
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
chunkCount++;
|
|
356
|
+
if (type === "IDAT") {
|
|
357
|
+
idatChunkCount++;
|
|
358
|
+
idatBytes += length;
|
|
359
|
+
} else if (type === "PLTE") hasPalette = true;else if (type === "tRNS") hasTransparency = true;else if (type === "sRGB") hasSrgb = true;else if (type === "IEND") hasIend = true;
|
|
360
|
+
offset = end + 4;
|
|
361
|
+
if (type === "IEND") break;
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
chunkCount,
|
|
365
|
+
idatChunkCount,
|
|
366
|
+
idatBytes,
|
|
367
|
+
hasPalette,
|
|
368
|
+
hasTransparency,
|
|
369
|
+
hasSrgb,
|
|
370
|
+
hasIend,
|
|
371
|
+
chunksComplete
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
function concatBytes(chunks) {
|
|
375
|
+
const length = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
|
|
376
|
+
const output = new Uint8Array(length);
|
|
377
|
+
let offset = 0;
|
|
378
|
+
for (const chunk of chunks) {
|
|
379
|
+
output.set(chunk, offset);
|
|
380
|
+
offset += chunk.byteLength;
|
|
381
|
+
}
|
|
382
|
+
return output;
|
|
383
|
+
}
|
|
384
|
+
function unfilterPngRows(inflated, height, rowBytes, bytesPerPixel) {
|
|
385
|
+
const rows = new Uint8Array(height * rowBytes);
|
|
386
|
+
let inputOffset = 0;
|
|
387
|
+
for (let y = 0; y < height; y++) {
|
|
388
|
+
const filter = inflated[inputOffset++];
|
|
389
|
+
const rowOffset = y * rowBytes;
|
|
390
|
+
const previousOffset = (y - 1) * rowBytes;
|
|
391
|
+
for (let x = 0; x < rowBytes; x++) {
|
|
392
|
+
const raw = inflated[inputOffset++];
|
|
393
|
+
const left = x >= bytesPerPixel ? rows[rowOffset + x - bytesPerPixel] : 0;
|
|
394
|
+
const up = y > 0 ? rows[previousOffset + x] : 0;
|
|
395
|
+
const upLeft = y > 0 && x >= bytesPerPixel ? rows[previousOffset + x - bytesPerPixel] : 0;
|
|
396
|
+
let value = raw;
|
|
397
|
+
if (filter === 1) value = raw + left;else if (filter === 2) value = raw + up;else if (filter === 3) value = raw + Math.floor((left + up) / 2);else if (filter === 4) value = raw + paeth(left, up, upLeft);else if (filter !== 0) throw new Error(`png: unsupported filter type ${filter}`);
|
|
398
|
+
rows[rowOffset + x] = value & 0xff;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return rows;
|
|
402
|
+
}
|
|
403
|
+
function decodePngRow(rows, rowOffset, output, outputOffset, metadata, rowWidth, xStep = 1) {
|
|
404
|
+
const channels = pngChannels(metadata.colorType);
|
|
405
|
+
const bitDepth = metadata.bitDepth;
|
|
406
|
+
for (let x = 0; x < rowWidth; x++) {
|
|
407
|
+
const samples = [];
|
|
408
|
+
for (let channel = 0; channel < channels; channel++) {
|
|
409
|
+
samples.push(readPngSample(rows, rowOffset, x * channels + channel, bitDepth));
|
|
410
|
+
}
|
|
411
|
+
const out = outputOffset + x * xStep * 4;
|
|
412
|
+
if (metadata.colorType === 0) {
|
|
413
|
+
const gray = scalePngSample(samples[0], bitDepth);
|
|
414
|
+
output[out] = gray;
|
|
415
|
+
output[out + 1] = gray;
|
|
416
|
+
output[out + 2] = gray;
|
|
417
|
+
output[out + 3] = pngTransparentGray(metadata, samples[0]) ? 0 : 255;
|
|
418
|
+
} else if (metadata.colorType === 2) {
|
|
419
|
+
output[out] = scalePngSample(samples[0], bitDepth);
|
|
420
|
+
output[out + 1] = scalePngSample(samples[1], bitDepth);
|
|
421
|
+
output[out + 2] = scalePngSample(samples[2], bitDepth);
|
|
422
|
+
output[out + 3] = 255;
|
|
423
|
+
} else if (metadata.colorType === 3) {
|
|
424
|
+
const index = samples[0];
|
|
425
|
+
const palette = metadata.__pngPalette || [];
|
|
426
|
+
output[out] = palette[index * 3] || 0;
|
|
427
|
+
output[out + 1] = palette[index * 3 + 1] || 0;
|
|
428
|
+
output[out + 2] = palette[index * 3 + 2] || 0;
|
|
429
|
+
output[out + 3] = metadata.__pngTransparency?.[index] ?? 255;
|
|
430
|
+
} else if (metadata.colorType === 4) {
|
|
431
|
+
const gray = scalePngSample(samples[0], bitDepth);
|
|
432
|
+
output[out] = gray;
|
|
433
|
+
output[out + 1] = gray;
|
|
434
|
+
output[out + 2] = gray;
|
|
435
|
+
output[out + 3] = scalePngSample(samples[1], bitDepth);
|
|
436
|
+
} else {
|
|
437
|
+
output[out] = scalePngSample(samples[0], bitDepth);
|
|
438
|
+
output[out + 1] = scalePngSample(samples[1], bitDepth);
|
|
439
|
+
output[out + 2] = scalePngSample(samples[2], bitDepth);
|
|
440
|
+
output[out + 3] = scalePngSample(samples[3], bitDepth);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function decodeAdam7Rows(inflated, output, metadata) {
|
|
445
|
+
const passes = [[0, 0, 8, 8], [4, 0, 8, 8], [0, 4, 4, 8], [2, 0, 4, 4], [0, 2, 2, 4], [1, 0, 2, 2], [0, 1, 1, 2]];
|
|
446
|
+
const channels = pngChannels(metadata.colorType);
|
|
447
|
+
const bytesPerSample = metadata.bitDepth >= 8 ? Math.ceil(metadata.bitDepth / 8) : 1;
|
|
448
|
+
const filterBytesPerPixel = Math.max(1, channels * bytesPerSample);
|
|
449
|
+
let offset = 0;
|
|
450
|
+
for (const [xStart, yStart, xStep, yStep] of passes) {
|
|
451
|
+
const passWidth = Math.max(0, Math.ceil((metadata.width - xStart) / xStep));
|
|
452
|
+
const passHeight = Math.max(0, Math.ceil((metadata.height - yStart) / yStep));
|
|
453
|
+
if (passWidth === 0 || passHeight === 0) continue;
|
|
454
|
+
const rowBytes = Math.ceil(passWidth * channels * metadata.bitDepth / 8);
|
|
455
|
+
const expectedLength = passHeight * (rowBytes + 1);
|
|
456
|
+
if (offset + expectedLength > inflated.byteLength) {
|
|
457
|
+
throwPngUnsupported(metadata, "PNG Adam7 image data is truncated.");
|
|
458
|
+
}
|
|
459
|
+
const rows = unfilterPngRows(inflated.subarray(offset, offset + expectedLength), passHeight, rowBytes, filterBytesPerPixel);
|
|
460
|
+
for (let y = 0; y < passHeight; y++) {
|
|
461
|
+
const destinationY = yStart + y * yStep;
|
|
462
|
+
const destinationX = xStart;
|
|
463
|
+
const outputOffset = (destinationY * metadata.width + destinationX) * 4;
|
|
464
|
+
decodePngRow(rows, y * rowBytes, output, outputOffset, metadata, passWidth, xStep);
|
|
465
|
+
}
|
|
466
|
+
offset += expectedLength;
|
|
467
|
+
}
|
|
468
|
+
if (offset !== inflated.byteLength) {
|
|
469
|
+
throwPngUnsupported(metadata, "PNG Adam7 image data has trailing bytes.");
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
function readPngSample(rows, rowOffset, sampleIndex, bitDepth) {
|
|
473
|
+
if (bitDepth >= 8) {
|
|
474
|
+
const bytesPerSample = bitDepth / 8;
|
|
475
|
+
const offset = rowOffset + sampleIndex * bytesPerSample;
|
|
476
|
+
return bytesPerSample === 1 ? rows[offset] : rows[offset] << 8 | rows[offset + 1];
|
|
477
|
+
}
|
|
478
|
+
const perByte = 8 / bitDepth;
|
|
479
|
+
const offset = rowOffset + Math.floor(sampleIndex / perByte);
|
|
480
|
+
const shift = (perByte - 1 - sampleIndex % perByte) * bitDepth;
|
|
481
|
+
return rows[offset] >>> shift & (1 << bitDepth) - 1;
|
|
482
|
+
}
|
|
483
|
+
function scalePngSample(value, bitDepth) {
|
|
484
|
+
const max = (1 << Math.min(bitDepth, 16)) - 1;
|
|
485
|
+
return Math.round(value * 255 / max);
|
|
486
|
+
}
|
|
487
|
+
function pngTransparentGray(metadata, value) {
|
|
488
|
+
return metadata.__pngTransparentGray !== undefined && value === metadata.__pngTransparentGray;
|
|
489
|
+
}
|
|
490
|
+
function paeth(a, b, c) {
|
|
491
|
+
const p = a + b - c;
|
|
492
|
+
const pa = Math.abs(p - a),
|
|
493
|
+
pb = Math.abs(p - b),
|
|
494
|
+
pc = Math.abs(p - c);
|
|
495
|
+
return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
|
|
496
|
+
}
|
|
497
|
+
function throwPngUnsupported(metadata, message) {
|
|
498
|
+
const error = new Error(`png: ${message}`);
|
|
499
|
+
error.code = "CJS_FORMAT_OUTPUT_NOT_SUPPORTED";
|
|
500
|
+
error.sourceFormat = metadata.sourceFormat;
|
|
501
|
+
throw error;
|
|
502
|
+
}
|
|
503
|
+
function inspectJPEG(bytes) {
|
|
504
|
+
let offset = 2;
|
|
505
|
+
while (offset + 9 < bytes.byteLength) {
|
|
506
|
+
if (bytes[offset] !== 0xff) {
|
|
507
|
+
offset++;
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
const marker = bytes[offset + 1],
|
|
511
|
+
length = readU16BE(bytes, offset + 2);
|
|
512
|
+
if ([0xc0, 0xc1, 0xc2, 0xc3].includes(marker)) {
|
|
513
|
+
return {
|
|
514
|
+
sourceFormat: "jpeg",
|
|
515
|
+
width: readU16BE(bytes, offset + 7),
|
|
516
|
+
height: readU16BE(bytes, offset + 5),
|
|
517
|
+
channels: bytes[offset + 9],
|
|
518
|
+
marker,
|
|
519
|
+
pixelFormat: "jpeg-ycbcr",
|
|
520
|
+
isCompressed: true
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
offset += Math.max(length + 2, 2);
|
|
524
|
+
}
|
|
525
|
+
return {
|
|
526
|
+
sourceFormat: "jpeg",
|
|
527
|
+
width: 0,
|
|
528
|
+
height: 0,
|
|
529
|
+
channels: 0,
|
|
530
|
+
pixelFormat: "jpeg",
|
|
531
|
+
isCompressed: true
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
function inspectDDS(bytes) {
|
|
535
|
+
const fourCc = String.fromCharCode(bytes[84], bytes[85], bytes[86], bytes[87]).replace(/\0+$/u, "");
|
|
536
|
+
return {
|
|
537
|
+
sourceFormat: "dds",
|
|
538
|
+
width: readU32LE(bytes, 16),
|
|
539
|
+
height: readU32LE(bytes, 12),
|
|
540
|
+
mipCount: Math.max(readU32LE(bytes, 28), 1),
|
|
541
|
+
fourCc,
|
|
542
|
+
textureFormat: fourCc || "dds-legacy",
|
|
543
|
+
isCompressed: !!fourCc,
|
|
544
|
+
hasMipMaps: readU32LE(bytes, 28) > 1
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
function inspectTGA(bytes) {
|
|
548
|
+
return {
|
|
549
|
+
sourceFormat: "tga",
|
|
550
|
+
width: readU16LE(bytes, 12),
|
|
551
|
+
height: readU16LE(bytes, 14),
|
|
552
|
+
channels: Math.max(bytes[16] / 8, 1),
|
|
553
|
+
imageType: bytes[2],
|
|
554
|
+
pixelFormat: `tga-${bytes[16]}`,
|
|
555
|
+
isCompressed: [9, 10, 11].includes(bytes[2])
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
function pngChannels(colorType) {
|
|
559
|
+
if (colorType === 0) return 1;
|
|
560
|
+
if (colorType === 2) return 3;
|
|
561
|
+
if (colorType === 3) return 1;
|
|
562
|
+
if (colorType === 4) return 2;
|
|
563
|
+
if (colorType === 6) return 4;
|
|
564
|
+
return 0;
|
|
565
|
+
}
|
|
566
|
+
function readU16BE(bytes, offset) {
|
|
567
|
+
return bytes[offset] << 8 | bytes[offset + 1];
|
|
568
|
+
}
|
|
569
|
+
function readU16LE(bytes, offset) {
|
|
570
|
+
return bytes[offset] | bytes[offset + 1] << 8;
|
|
571
|
+
}
|
|
572
|
+
function readU32BE(bytes, offset) {
|
|
573
|
+
return bytes[offset] * 0x1000000 + (bytes[offset + 1] << 16 | bytes[offset + 2] << 8 | bytes[offset + 3]) >>> 0;
|
|
574
|
+
}
|
|
575
|
+
function readU32LE(bytes, offset) {
|
|
576
|
+
return (bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] * 0x1000000) >>> 0;
|
|
577
|
+
}
|
|
578
|
+
function capitalize(value) {
|
|
579
|
+
return value ? value[0].toUpperCase() + value.slice(1) : "Image";
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
export { DEFAULT_VALUES, OUTPUT_IMAGE, OUTPUT_JSON, OUTPUT_RAW, OUTPUT_RGBA, inspectBytes, inspectWithValues, isDDS, isJPEG, isPNG, isSupportedWithValues, isTGA, normalizeEmit, normalizeInputType, normalizeValues, readWithValues, readWithValuesAsync, toBytes, toJsonValue };
|
|
583
|
+
//# sourceMappingURL=helpers.js.map
|