@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CjsFormatGr2.js","sources":["../../../../../src/formats/gr2/core/CjsFormatGr2.js"],"sourcesContent":["/**\n * Exposed CarbonEngineJS-facing GR2 format class.\n *\n * Keep this file small and reviewable: parsing, conversion, rebuild, and JSON\n * helper glue live in core/helpers.js.\n */\n\nimport { curves } from \"./curves.js\";\nimport { tangents } from \"./tangents.js\";\nimport { inspectGsfRaw, isGsfRaw, projectGsf } from \"./gsf.js\";\nimport {\n CLASS_KEYS,\n DEFAULT_VALUES,\n OUTPUT_CMF,\n OUTPUT_GR2,\n OUTPUT_GR2_JSON,\n OUTPUT_JSON,\n OUTPUT_RAW,\n inspectRawGr2Result,\n normalizeValues,\n readRawInput,\n readWithValues,\n toJsonValue,\n validateClass,\n validateClassKey\n} from \"./helpers.js\";\n\n/**\n * CarbonEngineJS-facing GR2 reader.\n *\n * The Cjs prefix marks this as a JavaScript format/construction boundary. It\n * can emit plain GR2 JSON data or hydrate caller-supplied CarbonEngineJS-style\n * classes without pretending those classes are the engine runtime itself.\n */\nexport class CjsFormatGr2\n{\n\n #emit = DEFAULT_VALUES.emit;\n #decompressCurves = DEFAULT_VALUES.decompressCurves;\n #unpackTangents = DEFAULT_VALUES.unpackTangents;\n #rebuildMissingNormals = DEFAULT_VALUES.rebuildMissingNormals;\n #rebuildMissingTangents = DEFAULT_VALUES.rebuildMissingTangents;\n #rebuildMissingBiNormals = DEFAULT_VALUES.rebuildMissingBiNormals;\n #classes = {};\n\n /**\n * Create a reusable format profile.\n *\n * @param {object} [options] Default format/build values.\n */\n constructor(options = {})\n {\n this.SetValues(options);\n }\n\n /**\n * Set format values for this reusable profile.\n *\n * @param {object} [options] Values to merge into the profile.\n * @returns {CjsFormatGr2} This format profile.\n */\n SetValues(options = {})\n {\n const values = normalizeValues(this.GetValues(), options);\n\n this.#emit = values.emit;\n this.#decompressCurves = values.decompressCurves;\n this.#unpackTangents = values.unpackTangents;\n this.#rebuildMissingNormals = values.rebuildMissingNormals;\n this.#rebuildMissingTangents = values.rebuildMissingTangents;\n this.#rebuildMissingBiNormals = values.rebuildMissingBiNormals;\n this.#classes = values.classes;\n\n return this;\n }\n\n /**\n * Get this profile's current values, optionally with per-call overrides.\n *\n * @param {object} [options] Optional values to merge into a copy.\n * @returns {object} A copy of the effective values.\n */\n GetValues(options = {})\n {\n return normalizeValues({\n emit: this.#emit,\n decompressCurves: this.#decompressCurves,\n unpackTangents: this.#unpackTangents,\n rebuildMissingNormals: this.#rebuildMissingNormals,\n rebuildMissingTangents: this.#rebuildMissingTangents,\n rebuildMissingBiNormals: this.#rebuildMissingBiNormals,\n classes: this.#classes\n }, options);\n }\n\n /**\n * Set multiple GR2 JSON node constructors for this profile.\n *\n * @param {object} [classes] Map of node class keys to constructors.\n * @returns {CjsFormatGr2} This format profile.\n */\n SetClasses(classes = {})\n {\n return this.SetValues({ classes });\n }\n\n /**\n * Set a GR2 JSON node constructor for this profile.\n *\n * @param {string} type Node class key.\n * @param {Function|null|undefined} Class Constructor to use, or nullish to delete.\n * @returns {CjsFormatGr2} This format profile.\n */\n SetClass(type, Class)\n {\n validateClassKey(type);\n if (Class === null || Class === undefined)\n {\n delete this.#classes[type];\n return this;\n }\n\n validateClass(type, Class);\n this.#classes = { ...this.#classes, [type]: Class };\n return this;\n }\n\n /**\n * Get a configured GR2 JSON node constructor.\n *\n * @param {string} type Node class key.\n * @returns {Function|undefined}\n */\n GetClass(type)\n {\n validateClassKey(type);\n return this.#classes[type];\n }\n\n /**\n * Whether this reader has a constructor for a GR2 JSON node key.\n *\n * @param {string} type Node class key.\n * @returns {boolean}\n */\n HasClass(type)\n {\n return !!this.GetClass(type);\n }\n\n /**\n * Parse a .gr2 buffer and return JSON by default, classes when configured,\n * or raw reflection data when `emit` is \"raw\".\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @param {object} [options] Per-call values.\n * @returns {object}\n */\n Read(input, options = {})\n {\n return readWithValues(this, input, this.GetValues(options));\n }\n\n /**\n * Parse a .gr2 buffer into the reflected Granny object graph.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n ReadRaw(input)\n {\n return readRawInput(input);\n }\n\n /**\n * Return a stable, lightweight summary for a GR2 buffer or raw result.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n Inspect(input)\n {\n return inspectRawGr2Result(this.ReadRaw(input));\n }\n\n /** Whether input is a Granny State document carried by the GR2 container. */\n IsGSF(input)\n {\n return isGsfRaw(this.ReadRaw(input));\n }\n\n /** Read the GState semantic projection, or raw reflected data with `emit: \"raw\"`. */\n ReadGSF(input, options = {})\n {\n const raw = this.ReadRaw(input);\n return options.emit === \"raw\" ? raw : projectGsf(raw);\n }\n\n /** Inspect a GSF document and its referenced GR2 animations. */\n InspectGSF(input)\n {\n return inspectGsfRaw(this.ReadRaw(input));\n }\n\n /**\n * Convert format output to plain JSON-compatible data.\n *\n * @param {object} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n ToJSON(value)\n {\n return toJsonValue(value);\n }\n\n /**\n * Static one-shot read. Static methods use camelCase by convention.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @param {object} [options] Reader and post-processing values.\n * @returns {object}\n */\n static read(input, options = {})\n {\n return readWithValues(CjsFormatGr2, input, normalizeValues(DEFAULT_VALUES, options));\n }\n\n /**\n * Static one-shot raw read.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n static readRaw(input)\n {\n return readRawInput(input);\n }\n\n /**\n * Static one-shot inspection.\n *\n * @param {Uint8Array|Buffer|object} input Raw .gr2 bytes or an existing raw read result.\n * @returns {object}\n */\n static inspect(input)\n {\n return inspectRawGr2Result(readRawInput(input));\n }\n\n /** Whether input is a Granny State document carried by the GR2 container. */\n static isGsf(input)\n {\n try\n {\n return isGsfRaw(readRawInput(input));\n }\n catch\n {\n return false;\n }\n }\n\n /** Read the GState semantic projection, or raw reflected data with `emit: \"raw\"`. */\n static readGsf(input, options = {})\n {\n const raw = readRawInput(input);\n return options.emit === \"raw\" ? raw : projectGsf(raw);\n }\n\n /** Async one-shot GSF read for standard format API compatibility. */\n static readGsfAsync(input, options = {})\n {\n return Promise.resolve(this.readGsf(input, options));\n }\n\n /** Inspect a GSF document and its referenced GR2 animations. */\n static inspectGsf(input)\n {\n return inspectGsfRaw(readRawInput(input));\n }\n\n /**\n * Static JSON-compatible conversion.\n *\n * @param {object} value Format output to convert.\n * @returns {any} Plain JSON-compatible data.\n */\n static toJSON(value)\n {\n return toJsonValue(value);\n }\n\n static OUTPUT_JSON = OUTPUT_JSON;\n static OUTPUT_GR2 = OUTPUT_GR2;\n static OUTPUT_GR2_JSON = OUTPUT_GR2_JSON;\n static OUTPUT_CMF = OUTPUT_CMF;\n static OUTPUT_RAW = OUTPUT_RAW;\n static CLASS_KEYS = CLASS_KEYS;\n static type = Object.freeze([ \"geometry\" ]);\n static mediaTypes = Object.freeze([ \"geometry\" ]);\n static inputTypes = Object.freeze([ \"gr2\", \"gsf\" ]);\n static outputTypes = Object.freeze([ OUTPUT_GR2, OUTPUT_CMF ]);\n static debugOutputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_GR2_JSON, OUTPUT_RAW ]);\n static curves = curves;\n static tangents = tangents;\n static gsf = Object.freeze({ isRaw: isGsfRaw, project: projectGsf, inspectRaw: inspectGsfRaw });\n\n}\n\nexport default CjsFormatGr2;\n"],"names":["CjsFormatGr2","DEFAULT_VALUES","emit","decompressCurves","unpackTangents","rebuildMissingNormals","rebuildMissingTangents","rebuildMissingBiNormals","constructor","options","SetValues","values","normalizeValues","GetValues","classes","SetClasses","SetClass","type","Class","validateClassKey","undefined","validateClass","GetClass","HasClass","Read","input","readWithValues","ReadRaw","readRawInput","Inspect","inspectRawGr2Result","IsGSF","isGsfRaw","ReadGSF","raw","projectGsf","InspectGSF","inspectGsfRaw","ToJSON","value","toJsonValue","read","readRaw","inspect","isGsf","readGsf","readGsfAsync","Promise","resolve","inspectGsf","toJSON","OUTPUT_JSON","OUTPUT_GR2","OUTPUT_GR2_JSON","OUTPUT_CMF","OUTPUT_RAW","CLASS_KEYS","Object","freeze","mediaTypes","inputTypes","outputTypes","debugOutputTypes","curves","tangents","gsf","isRaw","project","inspectRaw"],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// Clean-room BitKnit2 (Granny .gr2 section format 4) decompressor.
|
|
2
|
+
//
|
|
3
|
+
// Original CarbonEngineJS implementation written solely from the published
|
|
4
|
+
// format specification (docs/formats/bitknit2.md) by an isolated agent with
|
|
5
|
+
// no access to any other BitKnit implementation, then validated byte-exact
|
|
6
|
+
// against 539 real EVE .gr2 BitKnit2 streams (sections and pointer-fixup
|
|
7
|
+
// blocks) plus synthetic raw-quantum streams. Replaced the prior EUPL-derived
|
|
8
|
+
// port on 2026-07-24; see THIRD-PARTY-NOTICES.md.
|
|
9
|
+
|
|
10
|
+
const TOTAL = 0x8000;
|
|
11
|
+
const QUANTUM_BYTES = 0x10000;
|
|
12
|
+
const MAGIC = 0x75B1;
|
|
13
|
+
|
|
14
|
+
// Powers of two as exact doubles, indexed 0..32. All entropy-state values are
|
|
15
|
+
// unsigned 32-bit; floor division by these avoids signed-shift pitfalls.
|
|
16
|
+
const POW2 = new Float64Array(33);
|
|
17
|
+
for (let i = 0; i <= 32; i++) {
|
|
18
|
+
POW2[i] = Math.pow(2, i);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* One adaptive frequency model with 15-bit precision (TOTAL = 0x8000).
|
|
23
|
+
* Holds a cumulative table cum[0..V] (cum[V] = TOTAL), per-symbol
|
|
24
|
+
* accumulators, and a 1024-entry lookup table for fast symbol search.
|
|
25
|
+
*/
|
|
26
|
+
class FrequencyModel {
|
|
27
|
+
/**
|
|
28
|
+
* @param {number} symbolCount Total symbols V.
|
|
29
|
+
* @param {number} minProbCount Trailing minimum-probability symbols M.
|
|
30
|
+
*/
|
|
31
|
+
constructor(symbolCount, minProbCount) {
|
|
32
|
+
const V = symbolCount;
|
|
33
|
+
const E = V - minProbCount;
|
|
34
|
+
const cum = new Uint16Array(V + 1);
|
|
35
|
+
for (let i = 0; i < E; i++) {
|
|
36
|
+
cum[i] = Math.floor((TOTAL - minProbCount) * i / E);
|
|
37
|
+
}
|
|
38
|
+
for (let i = E; i <= V; i++) {
|
|
39
|
+
cum[i] = TOTAL - V + i;
|
|
40
|
+
}
|
|
41
|
+
this.symbolCount = V;
|
|
42
|
+
this.cum = cum;
|
|
43
|
+
this.acc = new Uint16Array(V).fill(1);
|
|
44
|
+
this.tick = 0;
|
|
45
|
+
this.inc = Math.floor((TOTAL - V) / 1024);
|
|
46
|
+
this.lastInc = 1 + TOTAL - V - this.inc * 1024;
|
|
47
|
+
this.lookup = new Uint16Array(1024);
|
|
48
|
+
this.rebuildLookup();
|
|
49
|
+
}
|
|
50
|
+
rebuildLookup() {
|
|
51
|
+
const cum = this.cum;
|
|
52
|
+
const lookup = this.lookup;
|
|
53
|
+
let s = 0;
|
|
54
|
+
for (let k = 0; k < 1024; k++) {
|
|
55
|
+
const threshold = k * 32;
|
|
56
|
+
while (threshold >= cum[s + 1]) {
|
|
57
|
+
s++;
|
|
58
|
+
}
|
|
59
|
+
lookup[k] = s;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Record one decoded symbol; every 1024th observation folds the
|
|
65
|
+
* accumulators halfway into the cumulative table and resets them.
|
|
66
|
+
* @param {number} sym
|
|
67
|
+
*/
|
|
68
|
+
observe(sym) {
|
|
69
|
+
const acc = this.acc;
|
|
70
|
+
acc[sym] += this.inc;
|
|
71
|
+
this.tick = this.tick + 1 & 1023;
|
|
72
|
+
if (this.tick === 0) {
|
|
73
|
+
acc[sym] += this.lastInc;
|
|
74
|
+
const cum = this.cum;
|
|
75
|
+
const V = this.symbolCount;
|
|
76
|
+
let run = 0;
|
|
77
|
+
for (let i = 1; i <= V; i++) {
|
|
78
|
+
run += acc[i - 1];
|
|
79
|
+
cum[i] += run - cum[i] >> 1;
|
|
80
|
+
acc[i - 1] = 1;
|
|
81
|
+
}
|
|
82
|
+
this.rebuildLookup();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Decompress a BitKnit2 stream (Granny .gr2 section format 4).
|
|
89
|
+
*
|
|
90
|
+
* The stream is a sequence of little-endian uint16 words beginning with the
|
|
91
|
+
* magic 0x75B1, producing output in 65,536-byte quanta that are either raw
|
|
92
|
+
* (word-aligned byte copies) or entropy-coded with two interleaved 32-bit
|
|
93
|
+
* range states driving adaptive literal/match commands.
|
|
94
|
+
*
|
|
95
|
+
* @param {Uint8Array} bytes Compressed stream bytes.
|
|
96
|
+
* @param {number} expandedSize Exact decompressed byte length.
|
|
97
|
+
* @returns {Uint8Array} Decompressed output of exactly expandedSize bytes.
|
|
98
|
+
* @throws {Error} On bad magic, word-stream underflow, a match reaching
|
|
99
|
+
* before output offset 0, or a coded quantum ending with neither entropy
|
|
100
|
+
* state equal to 0x10000.
|
|
101
|
+
*/
|
|
102
|
+
function decompressBitKnit2(bytes, expandedSize) {
|
|
103
|
+
const out = new Uint8Array(expandedSize);
|
|
104
|
+
if (expandedSize === 0) {
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
const wordCount = bytes.length >>> 1;
|
|
108
|
+
let wordIndex = 0;
|
|
109
|
+
function nextWord() {
|
|
110
|
+
if (wordIndex >= wordCount) {
|
|
111
|
+
throw new Error("BitKnit2: source underflow");
|
|
112
|
+
}
|
|
113
|
+
const p = wordIndex * 2;
|
|
114
|
+
wordIndex++;
|
|
115
|
+
return bytes[p] | bytes[p + 1] << 8;
|
|
116
|
+
}
|
|
117
|
+
if (nextWord() !== MAGIC) {
|
|
118
|
+
throw new Error("BitKnit2: bad magic word");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Nine adaptive models, all created at stream start; they persist and
|
|
122
|
+
// keep adapting across quantum boundaries.
|
|
123
|
+
const commandModels = [new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36), new FrequencyModel(300, 36)];
|
|
124
|
+
const cacheRefModels = [new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0), new FrequencyModel(40, 0)];
|
|
125
|
+
const exponentModel = new FrequencyModel(21, 0);
|
|
126
|
+
|
|
127
|
+
// Recent-offset cache: eight entries plus a packed 4-bit-per-rank order
|
|
128
|
+
// word (nibble at bit 4r = slot holding rank r; rank 0 = most recent).
|
|
129
|
+
const recentOffsets = new Float64Array(8).fill(1);
|
|
130
|
+
let recentOrder = 0x76543210;
|
|
131
|
+
|
|
132
|
+
// Distance used by literal deltas; replaced by every match distance.
|
|
133
|
+
let deltaOffset = 1;
|
|
134
|
+
|
|
135
|
+
// Two interleaved entropy states; swapped after every operation.
|
|
136
|
+
let stateA = 0;
|
|
137
|
+
let stateB = 0;
|
|
138
|
+
function initEntropyStates() {
|
|
139
|
+
let merged = nextWord() * 0x10000 + nextWord();
|
|
140
|
+
const split = merged & 15;
|
|
141
|
+
merged = Math.floor(merged / 16);
|
|
142
|
+
if (merged < 0x10000) {
|
|
143
|
+
merged = merged * 0x10000 + nextWord();
|
|
144
|
+
}
|
|
145
|
+
stateA = split === 0 ? merged : Math.floor(merged / POW2[split]);
|
|
146
|
+
if (stateA < 0x10000) {
|
|
147
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
148
|
+
}
|
|
149
|
+
const modulus = POW2[16 + split];
|
|
150
|
+
stateB = (merged % 0x10000 * 0x10000 + nextWord()) % modulus + modulus;
|
|
151
|
+
}
|
|
152
|
+
function popBits(n) {
|
|
153
|
+
const value = stateA % POW2[n];
|
|
154
|
+
stateA = Math.floor(stateA / POW2[n]);
|
|
155
|
+
if (stateA < 0x10000) {
|
|
156
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
157
|
+
}
|
|
158
|
+
const t = stateA;
|
|
159
|
+
stateA = stateB;
|
|
160
|
+
stateB = t;
|
|
161
|
+
return value;
|
|
162
|
+
}
|
|
163
|
+
function popSymbol(model) {
|
|
164
|
+
const cum = model.cum;
|
|
165
|
+
const code = stateA & TOTAL - 1;
|
|
166
|
+
let sym = model.lookup[code >>> 5];
|
|
167
|
+
while (code >= cum[sym + 1]) {
|
|
168
|
+
sym++;
|
|
169
|
+
}
|
|
170
|
+
stateA = Math.floor(stateA / TOTAL) * (cum[sym + 1] - cum[sym]) + (code - cum[sym]);
|
|
171
|
+
if (stateA < 0x10000) {
|
|
172
|
+
stateA = stateA * 0x10000 + nextWord();
|
|
173
|
+
}
|
|
174
|
+
model.observe(sym);
|
|
175
|
+
const t = stateA;
|
|
176
|
+
stateA = stateB;
|
|
177
|
+
stateB = t;
|
|
178
|
+
return sym;
|
|
179
|
+
}
|
|
180
|
+
let offset = 0;
|
|
181
|
+
while (offset < expandedSize) {
|
|
182
|
+
const quantumEnd = Math.min(expandedSize, offset - offset % QUANTUM_BYTES + QUANTUM_BYTES);
|
|
183
|
+
if (wordIndex >= wordCount) {
|
|
184
|
+
throw new Error("BitKnit2: source underflow");
|
|
185
|
+
}
|
|
186
|
+
const peekPos = wordIndex * 2;
|
|
187
|
+
const peek = bytes[peekPos] | bytes[peekPos + 1] << 8;
|
|
188
|
+
if (peek === 0) {
|
|
189
|
+
// Raw quantum: consume the zero word, then copy bytes straight
|
|
190
|
+
// from the word stream in stream order.
|
|
191
|
+
wordIndex++;
|
|
192
|
+
const remainingWords = wordCount - wordIndex;
|
|
193
|
+
const quantumRemaining = quantumEnd - offset;
|
|
194
|
+
const length = Math.min(remainingWords * 2, quantumRemaining);
|
|
195
|
+
const start = wordIndex * 2;
|
|
196
|
+
out.set(bytes.subarray(start, start + length), offset);
|
|
197
|
+
offset += length;
|
|
198
|
+
// When length is odd, the final word's high byte is NOT consumed
|
|
199
|
+
// and the next quantum begins at that same word.
|
|
200
|
+
wordIndex += length >> 1;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Coded quantum.
|
|
205
|
+
initEntropyStates();
|
|
206
|
+
if (offset === 0) {
|
|
207
|
+
out[0] = popBits(8);
|
|
208
|
+
offset = 1;
|
|
209
|
+
}
|
|
210
|
+
while (offset < quantumEnd) {
|
|
211
|
+
const phase = offset & 3;
|
|
212
|
+
const command = popSymbol(commandModels[phase]);
|
|
213
|
+
if (command < 256) {
|
|
214
|
+
// Literal: byte delta against the byte one last-match-distance
|
|
215
|
+
// behind.
|
|
216
|
+
out[offset] = command + out[offset - deltaOffset] & 0xFF;
|
|
217
|
+
offset++;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Match length.
|
|
222
|
+
let copyLength;
|
|
223
|
+
if (command < 288) {
|
|
224
|
+
copyLength = command - 254;
|
|
225
|
+
} else {
|
|
226
|
+
const n = command - 287;
|
|
227
|
+
copyLength = POW2[n] + popBits(n) + 32;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Match distance.
|
|
231
|
+
const ref = popSymbol(cacheRefModels[phase]);
|
|
232
|
+
let copyOffset;
|
|
233
|
+
if (ref < 8) {
|
|
234
|
+
// Recent-offset cache hit at rank `ref`, then promote to
|
|
235
|
+
// rank 0 (ranks 0..ref-1 shift up one nibble).
|
|
236
|
+
const shift = 4 * ref;
|
|
237
|
+
const slot = recentOrder >>> shift & 15;
|
|
238
|
+
copyOffset = recentOffsets[slot];
|
|
239
|
+
if (ref === 7) {
|
|
240
|
+
recentOrder = (recentOrder << 4 | slot) >>> 0;
|
|
241
|
+
} else if (ref > 0) {
|
|
242
|
+
const mask = (16 << shift) - 1;
|
|
243
|
+
recentOrder = (recentOrder & ~mask | (recentOrder << 4 | slot) & mask) >>> 0;
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
// Explicit distance: exponent symbol, extra mantissa bits,
|
|
247
|
+
// optionally one raw word appended as the LOW 16 bits.
|
|
248
|
+
const n = popSymbol(exponentModel);
|
|
249
|
+
let extra = popBits(n & 15);
|
|
250
|
+
if (n >= 16) {
|
|
251
|
+
extra = extra * 0x10000 + nextWord();
|
|
252
|
+
}
|
|
253
|
+
copyOffset = 32 * POW2[n] + extra * 32 + ref - 39;
|
|
254
|
+
// Insert: rank-7 slot takes the rank-6 slot's value, then the
|
|
255
|
+
// rank-6 slot takes the new distance; order is unchanged.
|
|
256
|
+
const slot7 = recentOrder >>> 28 & 15;
|
|
257
|
+
const slot6 = recentOrder >>> 24 & 15;
|
|
258
|
+
recentOffsets[slot7] = recentOffsets[slot6];
|
|
259
|
+
recentOffsets[slot6] = copyOffset;
|
|
260
|
+
}
|
|
261
|
+
deltaOffset = copyOffset;
|
|
262
|
+
const src = offset - copyOffset;
|
|
263
|
+
if (src < 0) {
|
|
264
|
+
throw new Error("BitKnit2: match source before output start");
|
|
265
|
+
}
|
|
266
|
+
// Byte-by-byte ascending copy; self-overlap replicates.
|
|
267
|
+
for (let i = 0; i < copyLength; i++) {
|
|
268
|
+
out[offset + i] = out[src + i];
|
|
269
|
+
}
|
|
270
|
+
offset += copyLength;
|
|
271
|
+
}
|
|
272
|
+
if (stateA !== 0x10000 && stateB !== 0x10000) {
|
|
273
|
+
throw new Error("BitKnit2: corrupt quantum end state");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return out;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export { decompressBitKnit2 };
|
|
280
|
+
//# sourceMappingURL=bitknit2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitknit2.js","sources":["../../../../../src/formats/gr2/core/bitknit2.js"],"sourcesContent":["// Clean-room BitKnit2 (Granny .gr2 section format 4) decompressor.\n//\n// Original CarbonEngineJS implementation written solely from the published\n// format specification (docs/formats/bitknit2.md) by an isolated agent with\n// no access to any other BitKnit implementation, then validated byte-exact\n// against 539 real EVE .gr2 BitKnit2 streams (sections and pointer-fixup\n// blocks) plus synthetic raw-quantum streams. Replaced the prior EUPL-derived\n// port on 2026-07-24; see THIRD-PARTY-NOTICES.md.\n\nconst TOTAL = 0x8000;\nconst QUANTUM_BYTES = 0x10000;\nconst MAGIC = 0x75B1;\n\n// Powers of two as exact doubles, indexed 0..32. All entropy-state values are\n// unsigned 32-bit; floor division by these avoids signed-shift pitfalls.\nconst POW2 = new Float64Array(33);\nfor (let i = 0; i <= 32; i++)\n{\n POW2[i] = Math.pow(2, i);\n}\n\n/**\n * One adaptive frequency model with 15-bit precision (TOTAL = 0x8000).\n * Holds a cumulative table cum[0..V] (cum[V] = TOTAL), per-symbol\n * accumulators, and a 1024-entry lookup table for fast symbol search.\n */\nclass FrequencyModel\n{\n /**\n * @param {number} symbolCount Total symbols V.\n * @param {number} minProbCount Trailing minimum-probability symbols M.\n */\n constructor(symbolCount, minProbCount)\n {\n const V = symbolCount;\n const E = V - minProbCount;\n const cum = new Uint16Array(V + 1);\n for (let i = 0; i < E; i++)\n {\n cum[i] = Math.floor((TOTAL - minProbCount) * i / E);\n }\n for (let i = E; i <= V; i++)\n {\n cum[i] = TOTAL - V + i;\n }\n this.symbolCount = V;\n this.cum = cum;\n this.acc = new Uint16Array(V).fill(1);\n this.tick = 0;\n this.inc = Math.floor((TOTAL - V) / 1024);\n this.lastInc = 1 + TOTAL - V - this.inc * 1024;\n this.lookup = new Uint16Array(1024);\n this.rebuildLookup();\n }\n\n rebuildLookup()\n {\n const cum = this.cum;\n const lookup = this.lookup;\n let s = 0;\n for (let k = 0; k < 1024; k++)\n {\n const threshold = k * 32;\n while (threshold >= cum[s + 1])\n {\n s++;\n }\n lookup[k] = s;\n }\n }\n\n /**\n * Record one decoded symbol; every 1024th observation folds the\n * accumulators halfway into the cumulative table and resets them.\n * @param {number} sym\n */\n observe(sym)\n {\n const acc = this.acc;\n acc[sym] += this.inc;\n this.tick = (this.tick + 1) & 1023;\n if (this.tick === 0)\n {\n acc[sym] += this.lastInc;\n const cum = this.cum;\n const V = this.symbolCount;\n let run = 0;\n for (let i = 1; i <= V; i++)\n {\n run += acc[i - 1];\n cum[i] += (run - cum[i]) >> 1;\n acc[i - 1] = 1;\n }\n this.rebuildLookup();\n }\n }\n}\n\n/**\n * Decompress a BitKnit2 stream (Granny .gr2 section format 4).\n *\n * The stream is a sequence of little-endian uint16 words beginning with the\n * magic 0x75B1, producing output in 65,536-byte quanta that are either raw\n * (word-aligned byte copies) or entropy-coded with two interleaved 32-bit\n * range states driving adaptive literal/match commands.\n *\n * @param {Uint8Array} bytes Compressed stream bytes.\n * @param {number} expandedSize Exact decompressed byte length.\n * @returns {Uint8Array} Decompressed output of exactly expandedSize bytes.\n * @throws {Error} On bad magic, word-stream underflow, a match reaching\n * before output offset 0, or a coded quantum ending with neither entropy\n * state equal to 0x10000.\n */\nexport function decompressBitKnit2(bytes, expandedSize)\n{\n const out = new Uint8Array(expandedSize);\n if (expandedSize === 0)\n {\n return out;\n }\n\n const wordCount = bytes.length >>> 1;\n let wordIndex = 0;\n\n function nextWord()\n {\n if (wordIndex >= wordCount)\n {\n throw new Error(\"BitKnit2: source underflow\");\n }\n const p = wordIndex * 2;\n wordIndex++;\n return bytes[p] | (bytes[p + 1] << 8);\n }\n\n if (nextWord() !== MAGIC)\n {\n throw new Error(\"BitKnit2: bad magic word\");\n }\n\n // Nine adaptive models, all created at stream start; they persist and\n // keep adapting across quantum boundaries.\n const commandModels = [\n new FrequencyModel(300, 36),\n new FrequencyModel(300, 36),\n new FrequencyModel(300, 36),\n new FrequencyModel(300, 36)\n ];\n const cacheRefModels = [\n new FrequencyModel(40, 0),\n new FrequencyModel(40, 0),\n new FrequencyModel(40, 0),\n new FrequencyModel(40, 0)\n ];\n const exponentModel = new FrequencyModel(21, 0);\n\n // Recent-offset cache: eight entries plus a packed 4-bit-per-rank order\n // word (nibble at bit 4r = slot holding rank r; rank 0 = most recent).\n const recentOffsets = new Float64Array(8).fill(1);\n let recentOrder = 0x76543210;\n\n // Distance used by literal deltas; replaced by every match distance.\n let deltaOffset = 1;\n\n // Two interleaved entropy states; swapped after every operation.\n let stateA = 0;\n let stateB = 0;\n\n function initEntropyStates()\n {\n let merged = nextWord() * 0x10000 + nextWord();\n const split = merged & 15;\n merged = Math.floor(merged / 16);\n if (merged < 0x10000)\n {\n merged = merged * 0x10000 + nextWord();\n }\n stateA = split === 0 ? merged : Math.floor(merged / POW2[split]);\n if (stateA < 0x10000)\n {\n stateA = stateA * 0x10000 + nextWord();\n }\n const modulus = POW2[16 + split];\n stateB = ((merged % 0x10000) * 0x10000 + nextWord()) % modulus + modulus;\n }\n\n function popBits(n)\n {\n const value = stateA % POW2[n];\n stateA = Math.floor(stateA / POW2[n]);\n if (stateA < 0x10000)\n {\n stateA = stateA * 0x10000 + nextWord();\n }\n const t = stateA;\n stateA = stateB;\n stateB = t;\n return value;\n }\n\n function popSymbol(model)\n {\n const cum = model.cum;\n const code = stateA & (TOTAL - 1);\n let sym = model.lookup[code >>> 5];\n while (code >= cum[sym + 1])\n {\n sym++;\n }\n stateA = Math.floor(stateA / TOTAL) * (cum[sym + 1] - cum[sym]) + (code - cum[sym]);\n if (stateA < 0x10000)\n {\n stateA = stateA * 0x10000 + nextWord();\n }\n model.observe(sym);\n const t = stateA;\n stateA = stateB;\n stateB = t;\n return sym;\n }\n\n let offset = 0;\n while (offset < expandedSize)\n {\n const quantumEnd = Math.min(expandedSize, offset - (offset % QUANTUM_BYTES) + QUANTUM_BYTES);\n\n if (wordIndex >= wordCount)\n {\n throw new Error(\"BitKnit2: source underflow\");\n }\n const peekPos = wordIndex * 2;\n const peek = bytes[peekPos] | (bytes[peekPos + 1] << 8);\n\n if (peek === 0)\n {\n // Raw quantum: consume the zero word, then copy bytes straight\n // from the word stream in stream order.\n wordIndex++;\n const remainingWords = wordCount - wordIndex;\n const quantumRemaining = quantumEnd - offset;\n const length = Math.min(remainingWords * 2, quantumRemaining);\n const start = wordIndex * 2;\n out.set(bytes.subarray(start, start + length), offset);\n offset += length;\n // When length is odd, the final word's high byte is NOT consumed\n // and the next quantum begins at that same word.\n wordIndex += length >> 1;\n continue;\n }\n\n // Coded quantum.\n initEntropyStates();\n\n if (offset === 0)\n {\n out[0] = popBits(8);\n offset = 1;\n }\n\n while (offset < quantumEnd)\n {\n const phase = offset & 3;\n const command = popSymbol(commandModels[phase]);\n\n if (command < 256)\n {\n // Literal: byte delta against the byte one last-match-distance\n // behind.\n out[offset] = (command + out[offset - deltaOffset]) & 0xFF;\n offset++;\n continue;\n }\n\n // Match length.\n let copyLength;\n if (command < 288)\n {\n copyLength = command - 254;\n }\n else\n {\n const n = command - 287;\n copyLength = POW2[n] + popBits(n) + 32;\n }\n\n // Match distance.\n const ref = popSymbol(cacheRefModels[phase]);\n let copyOffset;\n if (ref < 8)\n {\n // Recent-offset cache hit at rank `ref`, then promote to\n // rank 0 (ranks 0..ref-1 shift up one nibble).\n const shift = 4 * ref;\n const slot = (recentOrder >>> shift) & 15;\n copyOffset = recentOffsets[slot];\n if (ref === 7)\n {\n recentOrder = ((recentOrder << 4) | slot) >>> 0;\n }\n else if (ref > 0)\n {\n const mask = (16 << shift) - 1;\n recentOrder = ((recentOrder & ~mask) | (((recentOrder << 4) | slot) & mask)) >>> 0;\n }\n }\n else\n {\n // Explicit distance: exponent symbol, extra mantissa bits,\n // optionally one raw word appended as the LOW 16 bits.\n const n = popSymbol(exponentModel);\n let extra = popBits(n & 15);\n if (n >= 16)\n {\n extra = extra * 0x10000 + nextWord();\n }\n copyOffset = 32 * POW2[n] + extra * 32 + ref - 39;\n // Insert: rank-7 slot takes the rank-6 slot's value, then the\n // rank-6 slot takes the new distance; order is unchanged.\n const slot7 = (recentOrder >>> 28) & 15;\n const slot6 = (recentOrder >>> 24) & 15;\n recentOffsets[slot7] = recentOffsets[slot6];\n recentOffsets[slot6] = copyOffset;\n }\n\n deltaOffset = copyOffset;\n const src = offset - copyOffset;\n if (src < 0)\n {\n throw new Error(\"BitKnit2: match source before output start\");\n }\n // Byte-by-byte ascending copy; self-overlap replicates.\n for (let i = 0; i < copyLength; i++)\n {\n out[offset + i] = out[src + i];\n }\n offset += copyLength;\n }\n\n if (stateA !== 0x10000 && stateB !== 0x10000)\n {\n throw new Error(\"BitKnit2: corrupt quantum end state\");\n }\n }\n\n return out;\n}\n"],"names":["TOTAL","QUANTUM_BYTES","MAGIC","POW2","Float64Array","i","Math","pow","FrequencyModel","constructor","symbolCount","minProbCount","V","E","cum","Uint16Array","floor","acc","fill","tick","inc","lastInc","lookup","rebuildLookup","s","k","threshold","observe","sym","run","decompressBitKnit2","bytes","expandedSize","out","Uint8Array","wordCount","length","wordIndex","nextWord","Error","p","commandModels","cacheRefModels","exponentModel","recentOffsets","recentOrder","deltaOffset","stateA","stateB","initEntropyStates","merged","split","modulus","popBits","n","value","t","popSymbol","model","code","offset","quantumEnd","min","peekPos","peek","remainingWords","quantumRemaining","start","set","subarray","phase","command","copyLength","ref","copyOffset","shift","slot","mask","extra","slot7","slot6","src"],"mappings":"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"}
|