@carbonenginejs/runtime-resource 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/NOTICE +29 -29
- package/README.md +67 -548
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3005 -3005
- package/dist/CjsResManQueue.js +214 -214
- package/dist/CjsResource.js +566 -566
- package/dist/CjsResourceSource.js +59 -59
- package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
- package/dist/format/CjsBlueReader.js +269 -269
- package/dist/format/CjsFormat.js +192 -192
- package/dist/format/CjsReader.js +18 -18
- package/dist/format/CjsResourceProbe.js +277 -277
- package/dist/format/payloadContract.js +173 -173
- package/dist/formats/black/CjsBlackFormat.js +278 -278
- package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
- package/dist/formats/black/core/CjsBlackReader.js +639 -639
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
- package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +182 -182
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +125 -125
- package/dist/formats/bnk/core/graph.js +140 -140
- package/dist/formats/bnk/core/helpers.js +409 -409
- package/dist/formats/bnk/core/musicNodes.js +489 -489
- package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +118 -118
- package/dist/formats/cmf/core/buffers.js +233 -233
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +287 -287
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +364 -364
- package/dist/formats/cmf/core/shared.js +268 -268
- package/dist/formats/cmf/core/writer.js +517 -517
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +193 -193
- package/dist/formats/dds/core/bc6h.js +288 -288
- package/dist/formats/dds/core/bc7.js +251 -251
- package/dist/formats/dds/core/helpers.js +815 -815
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3901 -3901
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +87 -87
- package/dist/formats/flac/core/helpers.js +295 -295
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +87 -87
- package/dist/formats/gif/core/helpers.js +360 -360
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +290 -290
- package/dist/formats/gltf/core/helpers.js +292 -292
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +666 -666
- package/dist/formats/gltf/core/targets.js +163 -163
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/gr2/CjsGr2Format.js +46 -0
- package/dist/formats/gr2/CjsGr2Format.js.map +1 -0
- package/dist/formats/gr2/core/CjsFormatGr2.js +273 -0
- package/dist/formats/gr2/core/CjsFormatGr2.js.map +1 -0
- package/dist/formats/gr2/core/bitknit2.js +280 -0
- package/dist/formats/gr2/core/bitknit2.js.map +1 -0
- package/dist/formats/gr2/core/curves.js +1047 -0
- package/dist/formats/gr2/core/curves.js.map +1 -0
- package/dist/formats/gr2/core/gsf.js +72 -0
- package/dist/formats/gr2/core/gsf.js.map +1 -0
- package/dist/formats/gr2/core/helpers.js +332 -0
- package/dist/formats/gr2/core/helpers.js.map +1 -0
- package/dist/formats/gr2/core/json.js +622 -0
- package/dist/formats/gr2/core/json.js.map +1 -0
- package/dist/formats/gr2/core/oodle1.js +388 -0
- package/dist/formats/gr2/core/oodle1.js.map +1 -0
- package/dist/formats/gr2/core/reader.js +617 -0
- package/dist/formats/gr2/core/reader.js.map +1 -0
- package/dist/formats/gr2/core/tangents.js +48 -0
- package/dist/formats/gr2/core/tangents.js.map +1 -0
- package/dist/formats/gr2/core/targets.js +351 -0
- package/dist/formats/gr2/core/targets.js.map +1 -0
- package/dist/formats/gr2/index.js +3 -0
- package/dist/formats/gr2/index.js.map +1 -0
- package/dist/formats/index.js +30 -23
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
- package/dist/formats/jpeg/core/helpers.js +350 -350
- package/dist/formats/jpeg/core/jpeg.js +377 -377
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +192 -192
- package/dist/formats/mp3/core/helpers.js +338 -338
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +191 -191
- package/dist/formats/mp4/core/helpers.js +449 -449
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +88 -88
- package/dist/formats/ogg/core/helpers.js +387 -387
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +999 -999
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/png/CjsPngFormat.js +195 -195
- package/dist/formats/png/core/helpers.js +583 -583
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +261 -261
- package/dist/formats/red/core/CjsRedReader.js +194 -194
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +139 -139
- package/dist/formats/red/core/redGraph.js +68 -68
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +629 -629
- package/dist/formats/stl/core/targets.js +163 -163
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +192 -192
- package/dist/formats/tga/core/helpers.js +446 -446
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +192 -192
- package/dist/formats/wav/core/helpers.js +328 -328
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +191 -191
- package/dist/formats/webm/core/helpers.js +537 -537
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +86 -86
- package/dist/formats/webp/core/helpers.js +214 -214
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +241 -241
- package/dist/formats/wem/core/bitStream.js +259 -259
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +417 -417
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +83 -83
- package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
- package/dist/formats/yaml/core/helpers.js +160 -160
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +49 -48
- package/dist/index.js.map +1 -1
- package/dist/resourcePath.js +18 -18
- package/dist/resourceStates.js +9 -9
- package/dist/resources/AudioGeometryResData.js +47 -47
- package/dist/resources/GStateBindingCallbackData.js +31 -31
- package/dist/resources/MeshDecalData.js +37 -37
- package/dist/resources/MeshDecalLodData.js +34 -34
- package/dist/resources/Tr2EffectRes.js +71 -71
- package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resources/Tr2GrannyStateRes.js +44 -44
- package/dist/resources/Tr2ImageRes.js +114 -114
- package/dist/resources/Tr2LightProfileRes.js +40 -40
- package/dist/resources/Tr2MaterialArea.js +34 -34
- package/dist/resources/Tr2MaterialMesh.js +31 -31
- package/dist/resources/Tr2MaterialRes.js +34 -34
- package/dist/resources/Tr2ShaderPermutation.js +43 -43
- package/dist/resources/Tr2TextureLodManager.js +80 -80
- package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resources/Tr2TexturePackChannel.js +37 -37
- package/dist/resources/Tr2TexturePipeline.js +52 -52
- package/dist/resources/Tr2TexturePipelineParams.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resources/Tr2TexturePipelineStepGenerateMips.js +22 -0
- package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
- package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resources/TriGeometryRes.js +239 -239
- package/dist/resources/TriGeometryResAreaData.js +59 -59
- package/dist/resources/TriGeometryResJointData.js +38 -38
- package/dist/resources/TriGeometryResLodData.js +88 -88
- package/dist/resources/TriGeometryResMeshData.js +63 -63
- package/dist/resources/TriGeometryResSkeletonData.js +34 -34
- package/dist/resources/TriGrannyRes.js +43 -43
- package/dist/resources/TriJointBinding.js +38 -38
- package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resources/TriRtGeometryConstants.js +88 -88
- package/dist/resources/TriTextureRes.js +304 -304
- package/dist/resources/enums.js +18 -18
- package/dist/resources/resourceBoundary.js +47 -47
- package/dist/resources/texturePipelineBehavior.js +308 -308
- package/dist/texture/CjsTextureArrayRes.js +406 -406
- package/dist/texture/CjsTextureParameterProxy.js +133 -133
- package/docs/README.md +69 -0
- package/docs/architecture.md +86 -0
- package/docs/concepts/resource-lifecycle.md +217 -0
- package/docs/formats/README.md +104 -0
- package/{FORMAT-PROVENANCE.md → docs/formats/provenance.md} +173 -155
- package/docs/formats/stl.md +37 -0
- package/docs/formats/wwise.md +44 -0
- package/docs/reference/events.md +92 -0
- package/docs/reference/motherlode-cache.md +244 -0
- package/docs/reference/queues.md +102 -0
- package/docs/reference/reload.md +107 -0
- package/docs/reference/texture-arrays.md +113 -0
- package/docs/reference/texture-pipeline.md +53 -0
- package/docs/roadmap.md +104 -0
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +20 -20
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/gr2/LICENSE +21 -0
- package/format-notices/gr2/NOTICE +60 -0
- package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -0
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +52 -51
- package/resource-lifecycle.md +0 -679
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sources":["../../../../../src/formats/gr2/core/json.js"],"sourcesContent":["/**\n * GR2 JSON emitter.\n * @author cppctamber\n * `emitJson(fileInfo, version)` returns a plain object whose key order\n * mirrors the reader schema. Normalized integer values are dequantized with\n * float32 reciprocals, Real16 values are already converted by reader.js, and\n * non-finite floats are serialized as 0.\n */\n\nconst fr = Math.fround;\n\n/**\n * Member type ids whose numeric values need conversion for GR2 JSON output.\n */\nconst MEMBER_TYPES = Object.freeze({\n Real32: 10, Int8: 11, UInt8: 12, BinormalInt8: 13, NormalUInt8: 14,\n Int16: 15, UInt16: 16, BinormalInt16: 17, NormalUInt16: 18,\n Int32: 19, UInt32: 20, Real16: 21\n});\nconst T = MEMBER_TYPES;\n\n/** Float32 reciprocal used to dequantize NormalUInt8 values. */\nconst INV255_VALUE = fr(1 / 255);\n\n/** Float32 reciprocal used to dequantize NormalUInt16 values. */\nconst INV65535_VALUE = fr(1 / 65535);\n\n/** Float32 reciprocal used to dequantize BinormalInt8 values. */\nconst INV127_VALUE = fr(1 / 127);\n\n/** Float32 reciprocal used to dequantize BinormalInt16 values. */\nconst INV32767_VALUE = fr(1 / 32767);\n\nconst\n INV255 = INV255_VALUE,\n INV65535 = INV65535_VALUE,\n INV127 = INV127_VALUE,\n INV32767 = INV32767_VALUE;\n\n/**\n * Node keys accepted by {@link emitJson}'s `options.classes` map.\n *\n * Each key names one GR2 JSON node shape; the mapped constructor is\n * instantiated with `new` and populated with that node's usual fields instead\n * of a plain object literal.\n */\nexport const CLASS_KEYS = Object.freeze([\n \"Root\", \"Mesh\", \"BoneBinding\", \"IndexGroup\", \"MorphTarget\", \"Model\",\n \"Skeleton\", \"Bone\", \"Animation\", \"TrackGroup\", \"TransformTrack\", \"Curve\"\n]);\n\n/**\n * Constructors used to hydrate GR2 JSON nodes as class instances.\n *\n * Every key is optional; node types with no matching constructor keep the\n * default plain-object shape. See {@link CLASS_KEYS} for valid keys.\n *\n * @typedef {{[key: string]: new () => object}} Gr2NodeClasses\n */\n\n/**\n * Instantiate and populate a node class, or return the plain props unchanged.\n *\n * @param {Gr2NodeClasses} classes Opt-in node class map.\n * @param {string} key Node key to look up in `classes`.\n * @param {object} props Fields to populate onto the instance.\n * @returns {object} A populated class instance, or `props` when no\n * constructor is registered for `key`.\n */\nfunction build(classes, key, props, hydrationOptions = {})\n{\n const Ctor = classes[key];\n return Ctor ? populate(new Ctor(), props, hydrationOptions) : props;\n}\n\nfunction populate(instance, props, hydrationOptions = {})\n{\n if (!instance || typeof instance.SetValues !== \"function\")\n {\n throw new TypeError(\"CjsFormatGr2 class population requires classes to implement SetValues(values)\");\n }\n instance.SetValues(props, { ...hydrationOptions, skipUpdate: true, skipEvents: true });\n return instance;\n}\n\n/**\n * Root object emitted in the GR2 JSON shape.\n *\n * @typedef {object} Gr2JsonRoot\n * @property {number} grannyFileFormatRevision Granny file format revision.\n * @property {string} grannyFileSource Original source filename, or an empty string.\n * @property {object[]} meshes Mesh records with deinterleaved vertex channels.\n * @property {object[]} models Model records with skeleton and mesh bindings.\n * @property {object[]} animations Animation records and transform tracks.\n */\n\n/**\n * Convert a reflected numeric value to the float convention used by GR2 JSON.\n *\n * @param {number} v Raw reflected numeric value.\n * @param {number} memberType Granny member type id.\n * @returns {number} Converted and float32-rounded value.\n */\nfunction convert(v, memberType)\n{\n switch (memberType)\n {\n case T.NormalUInt8:\n return fr(v * INV255);\n\n case T.NormalUInt16:\n return fr(v * INV65535);\n\n case T.BinormalInt8:\n return fr(v * INV127);\n\n case T.BinormalInt16:\n return fr(v * INV32767);\n\n default:\n return fr(v);\n }\n}\n\n/**\n * Replace non-finite JSON numbers with zero.\n *\n * @param {number} v Candidate numeric value.\n * @returns {number} The original finite value, or zero.\n */\nfunction sf(v) { return Number.isFinite(v) ? v : 0; }\n\n/**\n * Copy and dequantize one vertex channel from reflected vertex objects.\n *\n * Missing Granny members return an empty channel.\n *\n * @param {object[]} vertices Reflected vertex array with non-enumerable type metadata.\n * @param {string} memberName Granny vertex member name to copy.\n * @param {number} destWidth Number of components in the emitted channel.\n * @returns {number[]} Flat deinterleaved channel values.\n */\nfunction copyChannel(vertices, memberName, destWidth)\n{\n const\n type = vertices.__type || [],\n m = type.find(x => x.name === memberName);\n if (!m) return [];\n const\n srcWidth = m.arrayWidth > 1 ? m.arrayWidth : 1,\n n = Math.min(srcWidth, destWidth),\n out = new Array(vertices.length * destWidth).fill(0);\n for (let i = 0; i < vertices.length; i++)\n {\n const\n raw = vertices[i][memberName],\n arr = Array.isArray(raw) ? raw : [ raw ],\n base = i * destWidth;\n for (let k = 0; k < n; k++)\n {\n out[base + k] = sf(convert(arr[k], m.type));\n }\n }\n return out;\n}\n\nconst VERTEX_CHANNELS = Object.freeze([\n [ \"position\", \"Position\", 3 ],\n [ \"blendIndice\", \"BoneIndices\", 4 ],\n [ \"tangent\", \"Tangent\", 4 ],\n [ \"normal\", \"Normal\", 3 ],\n [ \"texcoord0\", \"TextureCoordinates0\", 2 ],\n [ \"texcoord1\", \"TextureCoordinates1\", 2 ],\n [ \"binormal\", \"Binormal\", 4 ],\n [ \"blendWeight\", \"BoneWeights\", 4 ]\n]);\n\nfunction emitVertexChannels(vertices)\n{\n const channels = {};\n for (const [ name, memberName, width ] of VERTEX_CHANNELS)\n {\n channels[name] = copyChannel(vertices, memberName, width);\n }\n return channels;\n}\n\n/**\n * Flatten reflected scalar-array wrappers into plain JavaScript values.\n *\n * @param {ArrayLike<any>} a Reflected scalar array or already-flat array.\n * @returns {any[]} Plain scalar values.\n */\nfunction scalarArray(a)\n{\n if (!a || !a.length) return [];\n if (typeof a[0] === \"object\" && a[0] !== null)\n {\n const k = Object.keys(a[0])[0];\n return a.map(x => x[k]);\n }\n return a;\n}\n\n/**\n * Granny curve format ids emitted by the GR2 JSON curve serializer.\n */\nconst CURVE_FORMATS = Object.freeze({\n DaKeyframes32f: 0, DaK32fC32f: 1, DaIdentity: 2, DaConstant32f: 3,\n D3Constant32f: 4, D4Constant32f: 5, DaK16uC16u: 6, DaK8uC8u: 7,\n D4nK16uC15u: 8, D4nK8uC7u: 9, D3K16uC16u: 10, D3K8uC8u: 11,\n D9I1K16uC16u: 12, D9I3K16uC16u: 13, D9I1K8uC8u: 14, D9I3K8uC8u: 15,\n D3I1K32fC32f: 16, D3I1K16uC16u: 17, D3I1K8uC8u: 18\n});\nconst F = CURVE_FORMATS;\n\n/**\n * Locate the inline curve-data header inside a reflected curve-data object.\n *\n * @param {object} cd Reflected Granny curve-data object.\n * @returns {{Format: number, Degree: number}|null} Header object when present.\n */\nfunction curveHeader(cd)\n{\n for (const k of Object.keys(cd))\n {\n if (k.startsWith(\"CurveDataHeader\")) return cd[k];\n }\n return null;\n}\n\n/**\n * Convert a reflected scalar array to float32-rounded finite numbers.\n *\n * @param {ArrayLike<any>} a Reflected scalar array.\n * @returns {number[]} Float array.\n */\nfunction farr(a) { return scalarArray(a).map(x => sf(fr(x))); }\n\n/**\n * Convert a reflected scalar array to unsigned 32-bit integer values.\n *\n * @param {ArrayLike<any>} a Reflected scalar array.\n * @returns {number[]} Unsigned integer array.\n */\nfunction uarr(a) { return scalarArray(a).map(x => x >>> 0); }\n\n/**\n * Emit one Granny Curve2 object in GR2 JSON form.\n *\n * @param {object} curve2 Reflected Granny curve object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Compact curve record with format-specific fields.\n */\nfunction emitCurve(curve2, classes = {})\n{\n const cd = curve2 && curve2.CurveData;\n if (!cd) return build(classes, \"Curve\", { format: 0, degree: 0, error: \"no curve data\" });\n const\n h = curveHeader(cd) || { Format: 0, Degree: 0 },\n format = h.Format,\n degree = h.Degree,\n o = { format, degree };\n switch (format)\n {\n case F.DaIdentity:\n break;\n\n case F.DaKeyframes32f:\n o.dimension = cd.Dimension;\n o.controls = farr(cd.Controls);\n break;\n\n case F.DaConstant32f:\n o.controls = farr(cd.Controls);\n break;\n\n case F.D3Constant32f:\n o.controls = (cd.Controls || [ 0, 0, 0 ]).slice(0, 3).map(x => sf(fr(x)));\n break;\n\n case F.D4Constant32f:\n o.controls = (cd.Controls || [ 0, 0, 0, 0 ]).slice(0, 4).map(x => sf(fr(x)));\n break;\n\n case F.DaK32fC32f:\n o.knots = farr(cd.Knots);\n o.controls = farr(cd.Controls);\n break;\n\n case F.DaK16uC16u:\n case F.DaK8uC8u:\n o.oneOverKnotScaleTrunc = cd.OneOverKnotScaleTrunc;\n o.controlScaleOffsets = farr(cd.ControlScaleOffsets);\n o.knotsControls = uarr(cd.KnotsControls);\n break;\n\n case F.D4nK16uC15u:\n case F.D4nK8uC7u:\n o.scaleOffsetTableEntries = cd.ScaleOffsetTableEntries;\n o.oneOverKnotScale = sf(fr(cd.OneOverKnotScale));\n o.knotsControls = uarr(cd.KnotsControls);\n break;\n\n case F.D3K16uC16u:\n case F.D3K8uC8u:\n case F.D3I1K16uC16u:\n case F.D3I1K8uC8u:\n case F.D9I3K16uC16u:\n case F.D9I3K8uC8u:\n o.oneOverKnotScaleTrunc = cd.OneOverKnotScaleTrunc;\n o.controlScales = (cd.ControlScales || [ 0, 0, 0 ]).map(x => sf(fr(x)));\n o.controlOffsets = (cd.ControlOffsets || [ 0, 0, 0 ]).map(x => sf(fr(x)));\n o.knotsControls = uarr(cd.KnotsControls);\n break;\n\n case F.D3I1K32fC32f:\n o.controlScales = (cd.ControlScales || [ 0, 0, 0 ]).map(x => sf(fr(x)));\n o.controlOffsets = (cd.ControlOffsets || [ 0, 0, 0 ]).map(x => sf(fr(x)));\n o.knotsControls = farr(cd.KnotsControls);\n break;\n\n case F.D9I1K16uC16u:\n case F.D9I1K8uC8u:\n o.oneOverKnotScaleTrunc = cd.OneOverKnotScaleTrunc;\n o.controlScales = [ sf(fr(cd.ControlScale)) ];\n o.controlOffsets = [ sf(fr(cd.ControlOffset)) ];\n o.knotsControls = uarr(cd.KnotsControls);\n break;\n\n default:\n o.error = `Unknown format ${format}`;\n }\n return build(classes, \"Curve\", o);\n}\n\n/**\n * Convert arbitrary reflected variant data to JSON-safe plain values.\n *\n * @param {any} v Reflected variant value.\n * @returns {JsonValue} JSON-compatible value.\n */\nfunction emitVariant(v)\n{\n if (v === null || v === undefined) return null;\n if (Array.isArray(v)) return v.map(emitVariant);\n if (typeof v === \"object\")\n {\n const o = {};\n for (const k of Object.keys(v))\n {\n o[k] = emitVariant(v[k]);\n }\n return o;\n }\n if (typeof v === \"number\") return Number.isInteger(v) ? v : sf(fr(v));\n return v;\n}\n\n/**\n * Attach converted extended data when the reflected variant is present.\n *\n * @param {object} target Emitted GR2 JSON object to mutate.\n * @param {object|null|undefined} ext Reflected extended-data variant.\n * @returns {void}\n */\nfunction addExtendedData(target, ext)\n{\n if (ext !== null && ext !== undefined && typeof ext === \"object\")\n {\n target.extendedData = emitVariant(ext);\n }\n}\n\n/**\n * Emit one reflected Granny morph target (blend shape) in GR2 JSON shape.\n *\n * Morph target vertex data uses the same deinterleaved channel layout as a\n * mesh's primary vertex data.\n *\n * @param {object} mt Reflected Granny `granny_morph_target` object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted morph-target record.\n */\nfunction emitMorphTarget(mt, classes = {})\n{\n const\n vd = mt.VertexData,\n verts = (vd && vd.Vertices) || [];\n return build(classes, \"MorphTarget\", {\n name: mt.ScalarName ?? \"\",\n dataIsDeltas: !!mt.DataIsDeltas,\n vertex: emitVertexChannels(verts)\n });\n}\n\nfunction mappedAnnotationRows(set, vertexCount)\n{\n const\n annotations = set.VertexAnnotations || [],\n map = scalarArray(set.VertexAnnotationIndices),\n rows = [],\n vertexIndices = [];\n\n if (set.IndicesMapFromVertexToAnnotation)\n {\n for (let vertexIndex = 0; vertexIndex < Math.min(map.length, vertexCount); vertexIndex++)\n {\n const annotationIndex = map[vertexIndex];\n if (!Number.isInteger(annotationIndex) || annotationIndex < 0 || annotationIndex >= annotations.length) continue;\n rows.push(annotations[annotationIndex]);\n vertexIndices.push(vertexIndex);\n }\n }\n else\n {\n const count = map.length ? Math.min(map.length, annotations.length) : annotations.length;\n for (let annotationIndex = 0; annotationIndex < count; annotationIndex++)\n {\n const vertexIndex = map.length ? map[annotationIndex] : annotationIndex;\n if (!Number.isInteger(vertexIndex) || vertexIndex < 0 || vertexIndex >= vertexCount) continue;\n rows.push(annotations[annotationIndex]);\n vertexIndices.push(vertexIndex);\n }\n }\n\n Object.defineProperty(rows, \"__type\", {\n value: annotations.__type || [],\n configurable: true\n });\n\n const identity = rows.length === vertexCount && vertexIndices.every((value, index) => value === index);\n return { rows, vertexIndices: identity ? null : vertexIndices };\n}\n\nfunction emitVertexAnnotationTarget(set, vertexCount, classes = {})\n{\n if (!set || !set.VertexAnnotations?.length) return null;\n\n const mapped = mappedAnnotationRows(set, vertexCount);\n if (!mapped.rows.length) return null;\n\n const target = {\n name: set.Name ?? \"\",\n dataIsDeltas: true,\n vertex: emitVertexChannels(mapped.rows)\n };\n if (mapped.vertexIndices) target.vertexIndices = mapped.vertexIndices;\n return build(classes, \"MorphTarget\", target);\n}\n\n/**\n * Emit a reflected Granny mesh in GR2 JSON shape.\n *\n * @param {object} mesh Reflected Granny mesh object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted mesh record.\n */\nfunction emitMesh(mesh, classes = {})\n{\n const o = {};\n o.name = mesh.Name ?? \"\";\n o.minBounds = [ 0, 0, 0 ];\n o.maxBounds = [ 0, 0, 0 ];\n\n o.boneBindings = (mesh.BoneBindings || []).map(bb => build(classes, \"BoneBinding\", {\n name: bb.BoneName ?? \"\",\n minBounds: (bb.OBBMin || [ 0, 0, 0 ]).map(x => sf(fr(x))),\n maxBounds: (bb.OBBMax || [ 0, 0, 0 ]).map(x => sf(fr(x)))\n }));\n\n const\n vd = mesh.PrimaryVertexData,\n verts = (vd && vd.Vertices) || [];\n o.vertex = emitVertexChannels(verts);\n o.morphTargets = (mesh.MorphTargets || []).map(mt => emitMorphTarget(mt, classes));\n o.morphTargets.push(...(vd?.VertexAnnotationSets || [])\n .map(set => emitVertexAnnotationTarget(set, verts.length, classes))\n .filter(Boolean));\n\n const\n topo = mesh.PrimaryTopology || {},\n i32arr = scalarArray(topo.Indices),\n i16arr = scalarArray(topo.Indices16),\n groups = topo.Groups || [];\n o.indices = [];\n let indices = null, bpi = 0;\n if (i32arr.length) { indices = i32arr; bpi = 4; }\n else if (i16arr.length) { indices = i16arr.map(x => x & 0xffff); bpi = 2; }\n if (indices)\n {\n for (const g of groups)\n {\n const\n faces = new Array(g.TriCount * 3),\n start = g.TriFirst * 3;\n for (let i = 0; i < g.TriCount * 3; i++)\n {\n faces[i] = indices[start + i] >>> 0;\n }\n o.indices.push(build(classes, \"IndexGroup\", {\n name: `area_${g.MaterialIndex}`,\n bytesPerIndex: bpi,\n faces\n }));\n }\n }\n return build(classes, \"Mesh\", o);\n}\n\n/**\n * Emit a reflected Granny skeleton bone in GR2 JSON shape.\n *\n * @param {object} bone Reflected Granny bone object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted bone record.\n */\nfunction emitBone(bone, classes = {})\n{\n const\n t = bone.LocalTransform || bone.Transform ||\n { flags: 0, position: [ 0, 0, 0 ], orientation: [ 0, 0, 0, 1 ], scaleShear: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ] },\n o = {};\n o.name = bone.Name ?? \"\";\n o.parentIndex = bone.ParentIndex | 0;\n o.flag = t.flags;\n if (t.flags & 1) o.position = t.position.map(x => sf(fr(x)));\n if (t.flags & 2) o.orientation = t.orientation.map(x => sf(fr(x)));\n if (t.flags & 4) o.scaleShear = t.scaleShear.map(x => sf(fr(x)));\n addExtendedData(o, bone.ExtendedData);\n return build(classes, \"Bone\", o);\n}\n\n/**\n * Emit a reflected Granny skeleton in GR2 JSON shape.\n *\n * @param {object|null} skel Reflected Granny skeleton object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted skeleton record.\n */\nfunction emitSkeleton(skel, classes = {})\n{\n const o = {};\n o.name = skel ? (skel.Name ?? \"\") : \"\";\n o.bones = skel ? (skel.Bones || []).map(b => emitBone(b, classes)) : [];\n if (skel) addExtendedData(o, skel.ExtendedData);\n return build(classes, \"Skeleton\", o);\n}\n\n/**\n * Emit a reflected Granny model in GR2 JSON shape.\n *\n * @param {object} model Reflected Granny model object.\n * @param {object} fileInfo Root reflected Granny file-info object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted model record.\n */\nfunction emitModel(model, fileInfo, classes = {})\n{\n const o = {};\n o.name = model.Name ?? \"\";\n o.skeleton = emitSkeleton(model.Skeleton, classes);\n const meshes = fileInfo.Meshes || [];\n o.meshBindings = (model.MeshBindings || []).map(mb =>\n {\n const idx = meshes.indexOf(mb && mb.Mesh);\n return idx;\n });\n addExtendedData(o, model.ExtendedData);\n return build(classes, \"Model\", o);\n}\n\n/**\n * Emit a reflected Granny transform track in GR2 JSON shape.\n *\n * @param {object} tt Reflected Granny transform-track object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted transform-track record.\n */\nfunction emitTransformTrack(tt, classes = {})\n{\n return build(classes, \"TransformTrack\", {\n name: tt.Name ?? \"\",\n flags: tt.Flags | 0,\n orientation: emitCurve(tt.OrientationCurve, classes),\n position: emitCurve(tt.PositionCurve, classes),\n scaleShear: emitCurve(tt.ScaleShearCurve, classes)\n });\n}\n\n/**\n * Emit a reflected Granny track group in GR2 JSON shape.\n *\n * @param {object} tg Reflected Granny track-group object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted track-group record.\n */\nfunction emitTrackGroup(tg, classes = {})\n{\n return build(classes, \"TrackGroup\", {\n name: tg.Name ?? \"\",\n transformTracks: (tg.TransformTracks || []).map(tt => emitTransformTrack(tt, classes))\n });\n}\n\n/**\n * Emit a reflected Granny animation in GR2 JSON shape.\n *\n * @param {object} anim Reflected Granny animation object.\n * @param {Gr2NodeClasses} [classes] Opt-in node class map.\n * @returns {object} Emitted animation record.\n */\nfunction emitAnimation(anim, classes = {})\n{\n const o = {};\n o.name = anim.Name ?? \"\";\n o.duration = sf(fr(anim.Duration));\n o.timeStep = sf(fr(anim.TimeStep));\n o.oversampling = sf(fr(anim.Oversampling));\n o.defaultLoopCount = anim.DefaultLoopCount | 0;\n o.flags = anim.Flags | 0;\n o.trackGroups = (anim.TrackGroups || []).filter(t => t).map(tg => emitTrackGroup(tg, classes));\n addExtendedData(o, anim.ExtendedData);\n return build(classes, \"Animation\", o);\n}\n\n/**\n * Convert a reflected `granny_file_info` graph into a GR2 JSON object.\n *\n * The key order and numeric conversion rules are stable so downstream tools can\n * compare emitted data.\n *\n * When `options.classes` is given, matching node types are instantiated and\n * populated as class instances instead of plain object literals; an opt-in\n * alternative to walking the returned JSON into application-specific classes\n * by hand. See {@link CLASS_KEYS} for the recognized keys.\n *\n * @param {object} fileInfo Reflected `granny_file_info` object from `reader.js`.\n * @param {number} version Granny file format revision.\n * @param {object} [options] Emission options.\n * @param {Gr2NodeClasses} [options.classes] Opt-in node class map.\n * @returns {Gr2JsonRoot} Plain JSON-compatible `GR2 JSON` object, or a\n * populated `classes.Root` instance when provided.\n */\nexport function emitJson(fileInfo, version, options = {})\n{\n const { classes = {}, ...hydrationOptions } = options;\n return build(classes, \"Root\", {\n grannyFileFormatRevision: version | 0,\n grannyFileSource: fileInfo.FromFileName ?? \"\",\n meshes: (fileInfo.Meshes || []).filter(m => m).map(m => emitMesh(m, classes)),\n models: (fileInfo.Models || []).filter(m => m).map(m => emitModel(m, fileInfo, classes)),\n animations: (fileInfo.Animations || []).filter(a => a).map(a => emitAnimation(a, classes))\n }, hydrationOptions);\n}\n"],"names":["fr","Math","fround","MEMBER_TYPES","Object","freeze","Real32","Int8","UInt8","BinormalInt8","NormalUInt8","Int16","UInt16","BinormalInt16","NormalUInt16","Int32","UInt32","Real16","T","INV255_VALUE","INV65535_VALUE","INV127_VALUE","INV32767_VALUE","INV255","INV65535","INV127","INV32767","CLASS_KEYS","build","classes","key","props","hydrationOptions","Ctor","populate","instance","SetValues","TypeError","skipUpdate","skipEvents","convert","v","memberType","sf","Number","isFinite","copyChannel","vertices","memberName","destWidth","type","__type","m","find","x","name","srcWidth","arrayWidth","n","min","out","Array","length","fill","i","raw","arr","isArray","base","k","VERTEX_CHANNELS","emitVertexChannels","channels","width","scalarArray","a","keys","map","CURVE_FORMATS","DaKeyframes32f","DaK32fC32f","DaIdentity","DaConstant32f","D3Constant32f","D4Constant32f","DaK16uC16u","DaK8uC8u","D4nK16uC15u","D4nK8uC7u","D3K16uC16u","D3K8uC8u","D9I1K16uC16u","D9I3K16uC16u","D9I1K8uC8u","D9I3K8uC8u","D3I1K32fC32f","D3I1K16uC16u","D3I1K8uC8u","F","curveHeader","cd","startsWith","farr","uarr","emitCurve","curve2","CurveData","format","degree","error","h","Format","Degree","o","dimension","Dimension","controls","Controls","slice","knots","Knots","oneOverKnotScaleTrunc","OneOverKnotScaleTrunc","controlScaleOffsets","ControlScaleOffsets","knotsControls","KnotsControls","scaleOffsetTableEntries","ScaleOffsetTableEntries","oneOverKnotScale","OneOverKnotScale","controlScales","ControlScales","controlOffsets","ControlOffsets","ControlScale","ControlOffset","emitVariant","undefined","isInteger","addExtendedData","target","ext","extendedData","emitMorphTarget","mt","vd","VertexData","verts","Vertices","ScalarName","dataIsDeltas","DataIsDeltas","vertex","mappedAnnotationRows","set","vertexCount","annotations","VertexAnnotations","VertexAnnotationIndices","rows","vertexIndices","IndicesMapFromVertexToAnnotation","vertexIndex","annotationIndex","push","count","defineProperty","value","configurable","identity","every","index","emitVertexAnnotationTarget","mapped","Name","emitMesh","mesh","minBounds","maxBounds","boneBindings","BoneBindings","bb","BoneName","OBBMin","OBBMax","PrimaryVertexData","morphTargets","MorphTargets","VertexAnnotationSets","filter","Boolean","topo","PrimaryTopology","i32arr","Indices","i16arr","Indices16","groups","Groups","indices","bpi","g","faces","TriCount","start","TriFirst","MaterialIndex","bytesPerIndex","emitBone","bone","t","LocalTransform","Transform","flags","position","orientation","scaleShear","parentIndex","ParentIndex","flag","ExtendedData","emitSkeleton","skel","bones","Bones","b","emitModel","model","fileInfo","skeleton","Skeleton","meshes","Meshes","meshBindings","MeshBindings","mb","idx","indexOf","Mesh","emitTransformTrack","tt","Flags","OrientationCurve","PositionCurve","ScaleShearCurve","emitTrackGroup","tg","transformTracks","TransformTracks","emitAnimation","anim","duration","Duration","timeStep","TimeStep","oversampling","Oversampling","defaultLoopCount","DefaultLoopCount","trackGroups","TrackGroups","emitJson","version","options","grannyFileFormatRevision","grannyFileSource","FromFileName","models","Models","animations","Animations"],"mappings":"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"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Granny Oodle1 section decompressor.
|
|
3
|
+
*
|
|
4
|
+
* Ported from nwn2mdk gr2_decompress.cpp (Boost licence), derived from
|
|
5
|
+
* berenm/xoreos-tools granny-decoder, and cross-checked against opengr2. The
|
|
6
|
+
* codec uses an adaptive arithmetic coder over a 7-bit-per-byte stream, drives
|
|
7
|
+
* adaptive frequency windows, and emits an LZ token stream. Sections decode in
|
|
8
|
+
* up to three consecutive segments with fresh dictionaries sharing one bitstream.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Large back-reference sizes selected by Oodle1 size codes 61..64. */
|
|
12
|
+
const OODLE1_BACKREF_SIZES = Object.freeze([128, 192, 256, 512]);
|
|
13
|
+
|
|
14
|
+
/** Number of bytes occupied by the three Oodle1 parameter blocks. */
|
|
15
|
+
const OODLE1_PARAMETER_BYTES = 36;
|
|
16
|
+
|
|
17
|
+
/** Extra bytes appended to the arithmetic stream for decoder lookahead safety. */
|
|
18
|
+
const OODLE1_STREAM_PADDING = 8;
|
|
19
|
+
|
|
20
|
+
/** Extra output bytes reserved because final Oodle1 back-references may overshoot. */
|
|
21
|
+
const OODLE1_OUTPUT_SLACK = 512;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Arithmetic decoder for the Oodle1 7-bit-per-byte bitstream.
|
|
25
|
+
*/
|
|
26
|
+
class Decoder {
|
|
27
|
+
/**
|
|
28
|
+
* Create an arithmetic decoder over a padded compressed stream.
|
|
29
|
+
*
|
|
30
|
+
* @param {Uint8Array} stream Compressed payload after the parameter header.
|
|
31
|
+
*/
|
|
32
|
+
constructor(stream) {
|
|
33
|
+
this.stream = stream;
|
|
34
|
+
this.pos = 0;
|
|
35
|
+
this.numer = stream[0] >> 1;
|
|
36
|
+
this.denom = 0x80;
|
|
37
|
+
this.nextDenom = 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Decode a cumulative value in the range [0, max).
|
|
42
|
+
*
|
|
43
|
+
* @param {number} max Exclusive upper bound for the decoded value.
|
|
44
|
+
* @returns {number} Arithmetic-coded cumulative value.
|
|
45
|
+
*/
|
|
46
|
+
decode(max) {
|
|
47
|
+
while (this.denom <= 0x800000) {
|
|
48
|
+
this.denom = this.denom << 8 >>> 0;
|
|
49
|
+
this.numer = (this.numer << 8 | this.stream[this.pos] << 7 & 0x80 | this.stream[this.pos + 1] >> 1 & 0x7f) >>> 0;
|
|
50
|
+
this.pos++;
|
|
51
|
+
}
|
|
52
|
+
this.nextDenom = Math.floor(this.denom / max);
|
|
53
|
+
return Math.min(Math.floor(this.numer / this.nextDenom), max - 1);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Commit a decoded range and shrink the arithmetic interval.
|
|
58
|
+
*
|
|
59
|
+
* @param {number} max Original range size.
|
|
60
|
+
* @param {number} val Range start to commit.
|
|
61
|
+
* @param {number} err Range width to commit.
|
|
62
|
+
* @returns {number} The committed value.
|
|
63
|
+
*/
|
|
64
|
+
commit(max, val, err) {
|
|
65
|
+
this.numer -= this.nextDenom * val;
|
|
66
|
+
if (val + err < max) this.denom = this.nextDenom * err;else this.denom -= this.nextDenom * val;
|
|
67
|
+
return val;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Decode and immediately commit a single-value range.
|
|
72
|
+
*
|
|
73
|
+
* @param {number} max Exclusive upper bound for the decoded value.
|
|
74
|
+
* @returns {number} Decoded value.
|
|
75
|
+
*/
|
|
76
|
+
decodeCommit(max) {
|
|
77
|
+
return this.commit(max, this.decode(max), 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Adaptive weighted symbol window used by Oodle1 dictionaries.
|
|
83
|
+
*/
|
|
84
|
+
class WeighWindow {
|
|
85
|
+
/**
|
|
86
|
+
* Create an adaptive window for values up to a maximum symbol.
|
|
87
|
+
*
|
|
88
|
+
* @param {number} maxValue Maximum symbol value represented by the window.
|
|
89
|
+
* @param {number} countCap Maximum number of weighted entries to retain.
|
|
90
|
+
*/
|
|
91
|
+
constructor(maxValue, countCap) {
|
|
92
|
+
this.weightTotal = 4;
|
|
93
|
+
this.countCap = countCap + 1 & 0xffff;
|
|
94
|
+
this.ranges = [0, 0x4000];
|
|
95
|
+
this.weights = [4];
|
|
96
|
+
this.values = [0];
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Reusable result carrier for {@link WeighWindow#tryDecode}, owned by
|
|
100
|
+
* this instance so repeated decode calls don't allocate a fresh object
|
|
101
|
+
* per symbol (the hottest allocation site in this decoder). Safe to
|
|
102
|
+
* reuse across calls: each result is fully consumed (read, and any
|
|
103
|
+
* `storeValue` follow-up applied) before this same instance's next
|
|
104
|
+
* `tryDecode` call, and every `decompressBlock` call site that needs
|
|
105
|
+
* more than one decoded value at once (`d3`/`d4`/`d5`) always reads
|
|
106
|
+
* from three distinct `WeighWindow` instances, never this one twice.
|
|
107
|
+
*/
|
|
108
|
+
this.result = {
|
|
109
|
+
newIndex: -1,
|
|
110
|
+
value: 0
|
|
111
|
+
};
|
|
112
|
+
this.threshIncrease = 4;
|
|
113
|
+
this.threshRangeRebuild = 8;
|
|
114
|
+
this.threshWeightRebuild = Math.max(256, Math.min(32 * maxValue, 15160));
|
|
115
|
+
this.threshIncreaseCap = maxValue > 64 ? Math.min(2 * maxValue, (this.threshWeightRebuild >> 1) - 32) : 128;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Recompute arithmetic ranges from the current symbol weights.
|
|
120
|
+
*
|
|
121
|
+
* @returns {void}
|
|
122
|
+
*/
|
|
123
|
+
rebuildRanges() {
|
|
124
|
+
const w = this.weights;
|
|
125
|
+
this.ranges.length = w.length + 1;
|
|
126
|
+
const rangeWeight = Math.floor(8 * 0x4000 / this.weightTotal);
|
|
127
|
+
let start = 0;
|
|
128
|
+
for (let i = 0; i < w.length; i++) {
|
|
129
|
+
this.ranges[i] = start;
|
|
130
|
+
start += Math.floor(w[i] * rangeWeight / 8);
|
|
131
|
+
}
|
|
132
|
+
this.ranges[w.length] = 0x4000;
|
|
133
|
+
if (this.threshIncrease > this.threshIncreaseCap >> 1) {
|
|
134
|
+
this.threshRangeRebuild = this.weightTotal + this.threshIncreaseCap;
|
|
135
|
+
} else {
|
|
136
|
+
this.threshIncrease *= 2;
|
|
137
|
+
this.threshRangeRebuild = this.weightTotal + this.threshIncrease;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Decay, compact, and reorder adaptive weights when the table grows stale.
|
|
143
|
+
*
|
|
144
|
+
* @returns {void}
|
|
145
|
+
*/
|
|
146
|
+
rebuildWeights() {
|
|
147
|
+
const w = this.weights,
|
|
148
|
+
v = this.values;
|
|
149
|
+
let total = 0;
|
|
150
|
+
for (let i = 0; i < w.length; i++) {
|
|
151
|
+
w[i] >>= 1;
|
|
152
|
+
total += w[i];
|
|
153
|
+
}
|
|
154
|
+
this.weightTotal = total;
|
|
155
|
+
for (let i = 1; i < w.length; i++) {
|
|
156
|
+
while (i < w.length && w[i] === 0) {
|
|
157
|
+
w[i] = w[w.length - 1];
|
|
158
|
+
w.pop();
|
|
159
|
+
v[i] = v[v.length - 1];
|
|
160
|
+
v.pop();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (w.length > 1) {
|
|
164
|
+
let mi = 1,
|
|
165
|
+
mw = 0;
|
|
166
|
+
for (let i = 1; i < w.length; i++) {
|
|
167
|
+
if (w[i] > mw) {
|
|
168
|
+
mw = w[i];
|
|
169
|
+
mi = i;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const l = w.length - 1;
|
|
173
|
+
[w[mi], w[l]] = [w[l], w[mi]];
|
|
174
|
+
[v[mi], v[l]] = [v[l], v[mi]];
|
|
175
|
+
}
|
|
176
|
+
if (w.length < this.countCap && w[0] === 0) {
|
|
177
|
+
w[0] = 1;
|
|
178
|
+
this.weightTotal++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Decode a symbol through this adaptive window.
|
|
184
|
+
*
|
|
185
|
+
* When `newIndex` is non-negative, the caller must decode and store a
|
|
186
|
+
* fresh literal value with {@link WeighWindow#storeValue}. Otherwise `value`
|
|
187
|
+
* is final.
|
|
188
|
+
*
|
|
189
|
+
* @param {Decoder} dec Arithmetic decoder to read from.
|
|
190
|
+
* @returns {{newIndex: number, value: number}} Decoded value or slot requiring a fresh literal.
|
|
191
|
+
*/
|
|
192
|
+
tryDecode(dec) {
|
|
193
|
+
if (this.weightTotal >= this.threshRangeRebuild) {
|
|
194
|
+
if (this.threshRangeRebuild >= this.threshWeightRebuild) this.rebuildWeights();
|
|
195
|
+
this.rebuildRanges();
|
|
196
|
+
}
|
|
197
|
+
const value = dec.decode(0x4000),
|
|
198
|
+
r = this.ranges;
|
|
199
|
+
let lo = 0,
|
|
200
|
+
hi = r.length;
|
|
201
|
+
while (lo < hi) {
|
|
202
|
+
const mid = lo + hi >> 1;
|
|
203
|
+
if (r[mid] <= value) lo = mid + 1;else hi = mid;
|
|
204
|
+
}
|
|
205
|
+
const index = lo - 1;
|
|
206
|
+
dec.commit(0x4000, r[index], r[index + 1] - r[index]);
|
|
207
|
+
this.weights[index]++;
|
|
208
|
+
this.weightTotal++;
|
|
209
|
+
const result = this.result;
|
|
210
|
+
if (index > 0) {
|
|
211
|
+
result.newIndex = -1;
|
|
212
|
+
result.value = this.values[index];
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
if (this.weights.length >= this.ranges.length && dec.decodeCommit(2) === 1) {
|
|
216
|
+
const i = this.ranges.length + dec.decodeCommit(this.weights.length - this.ranges.length + 1) - 1;
|
|
217
|
+
this.weights[i] += 2;
|
|
218
|
+
this.weightTotal += 2;
|
|
219
|
+
result.newIndex = -1;
|
|
220
|
+
result.value = this.values[i];
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
this.values.push(0);
|
|
224
|
+
this.weights.push(2);
|
|
225
|
+
this.weightTotal += 2;
|
|
226
|
+
if (this.weights.length === this.countCap) {
|
|
227
|
+
this.weightTotal -= this.weights[0];
|
|
228
|
+
this.weights[0] = 0;
|
|
229
|
+
}
|
|
230
|
+
result.newIndex = this.values.length - 1;
|
|
231
|
+
result.value = 0;
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Store a freshly decoded escape value in an adaptive window slot.
|
|
237
|
+
*
|
|
238
|
+
* @param {number} index Slot index returned by {@link WeighWindow#tryDecode}.
|
|
239
|
+
* @param {number} value Value to store.
|
|
240
|
+
* @returns {number} Stored value.
|
|
241
|
+
*/
|
|
242
|
+
storeValue(index, value) {
|
|
243
|
+
this.values[index] = value;
|
|
244
|
+
return value;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const BACKREF_SIZES = OODLE1_BACKREF_SIZES;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Per-segment Oodle1 dictionary and adaptive symbol windows.
|
|
251
|
+
*/
|
|
252
|
+
class Dictionary {
|
|
253
|
+
/**
|
|
254
|
+
* Create a dictionary from one decoded Oodle1 parameter block.
|
|
255
|
+
*
|
|
256
|
+
* @param {{decodedValueMax: number, backrefValueMax: number, decodedCount: number, highbitCount: number, sizesCount: number[]}} p Parameter block.
|
|
257
|
+
*/
|
|
258
|
+
constructor(p) {
|
|
259
|
+
this.decodedSize = 0;
|
|
260
|
+
this.backrefSize = 0;
|
|
261
|
+
this.decodedValueMax = p.decodedValueMax;
|
|
262
|
+
this.backrefValueMax = p.backrefValueMax;
|
|
263
|
+
this.lowbitValueMax = Math.min(p.backrefValueMax + 1, 4);
|
|
264
|
+
this.midbitValueMax = Math.min(Math.floor(p.backrefValueMax / 4) + 1, 256);
|
|
265
|
+
this.highbitValueMax = Math.floor(p.backrefValueMax / 1024) + 1;
|
|
266
|
+
this.lowbitWindow = new WeighWindow(this.lowbitValueMax - 1, this.lowbitValueMax);
|
|
267
|
+
this.highbitWindow = new WeighWindow(this.highbitValueMax - 1, p.highbitCount + 1);
|
|
268
|
+
this.midbitWindows = [];
|
|
269
|
+
for (let i = 0; i < this.highbitValueMax; i++) {
|
|
270
|
+
this.midbitWindows.push(new WeighWindow(this.midbitValueMax - 1, this.midbitValueMax));
|
|
271
|
+
}
|
|
272
|
+
this.decodedWindows = [];
|
|
273
|
+
for (let i = 0; i < 4; i++) {
|
|
274
|
+
this.decodedWindows.push(new WeighWindow(this.decodedValueMax - 1, p.decodedCount));
|
|
275
|
+
}
|
|
276
|
+
this.sizeWindows = [];
|
|
277
|
+
for (let i = 0; i < 4; i++) {
|
|
278
|
+
for (let j = 0; j < 16; j++) {
|
|
279
|
+
this.sizeWindows.push(new WeighWindow(64, p.sizesCount[3 - i]));
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
this.sizeWindows.push(new WeighWindow(64, p.sizesCount[0]));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Decode one literal or back-reference block into the output buffer.
|
|
287
|
+
*
|
|
288
|
+
* Back-references use byte-by-byte overlapping copies so offsets smaller than
|
|
289
|
+
* the copy length behave like the original LZ stream.
|
|
290
|
+
*
|
|
291
|
+
* @param {Decoder} dec Arithmetic decoder shared across all segments.
|
|
292
|
+
* @param {Uint8Array} out Output buffer with slack for overshoot copies.
|
|
293
|
+
* @param {number} pos Current output write offset.
|
|
294
|
+
* @returns {number} Number of bytes produced.
|
|
295
|
+
*/
|
|
296
|
+
decompressBlock(dec, out, pos) {
|
|
297
|
+
const sw = this.sizeWindows[this.backrefSize];
|
|
298
|
+
let d1 = sw.tryDecode(dec);
|
|
299
|
+
if (d1.newIndex >= 0) d1.value = sw.storeValue(d1.newIndex, dec.decodeCommit(65));
|
|
300
|
+
this.backrefSize = d1.value;
|
|
301
|
+
if (this.backrefSize > 0) {
|
|
302
|
+
const size = this.backrefSize < 61 ? this.backrefSize + 1 : BACKREF_SIZES[this.backrefSize - 61],
|
|
303
|
+
range = Math.min(this.backrefValueMax, this.decodedSize);
|
|
304
|
+
let d3 = this.lowbitWindow.tryDecode(dec);
|
|
305
|
+
if (d3.newIndex >= 0) d3.value = this.lowbitWindow.storeValue(d3.newIndex, dec.decodeCommit(this.lowbitValueMax));
|
|
306
|
+
let d4 = this.highbitWindow.tryDecode(dec);
|
|
307
|
+
if (d4.newIndex >= 0) d4.value = this.highbitWindow.storeValue(d4.newIndex, dec.decodeCommit(Math.floor(range / 1024) + 1));
|
|
308
|
+
const mw = this.midbitWindows[d4.value];
|
|
309
|
+
let d5 = mw.tryDecode(dec);
|
|
310
|
+
if (d5.newIndex >= 0) d5.value = mw.storeValue(d5.newIndex, dec.decodeCommit(Math.min(Math.floor(range / 4) + 1, 256)));
|
|
311
|
+
const offset = (d4.value << 10) + (d5.value << 2) + d3.value + 1;
|
|
312
|
+
this.decodedSize += size;
|
|
313
|
+
let src = pos - offset;
|
|
314
|
+
for (let i = 0; i < size; i++) {
|
|
315
|
+
out[pos + i] = out[src + i];
|
|
316
|
+
}
|
|
317
|
+
return size;
|
|
318
|
+
} else {
|
|
319
|
+
const dw = this.decodedWindows[pos & 3];
|
|
320
|
+
let d2 = dw.tryDecode(dec);
|
|
321
|
+
if (d2.newIndex >= 0) d2.value = dw.storeValue(d2.newIndex, dec.decodeCommit(this.decodedValueMax));
|
|
322
|
+
out[pos] = d2.value & 0xff;
|
|
323
|
+
this.decodedSize++;
|
|
324
|
+
return 1;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Read the three Oodle1 parameter blocks from the compressed section header.
|
|
331
|
+
*
|
|
332
|
+
* Each block is a 12-byte little-endian C bitfield record.
|
|
333
|
+
*
|
|
334
|
+
* @param {Uint8Array} bytes Compressed Oodle1 section bytes.
|
|
335
|
+
* @returns {{decodedValueMax: number, backrefValueMax: number, decodedCount: number, highbitCount: number, sizesCount: number[]}[]} Parsed parameter blocks.
|
|
336
|
+
*/
|
|
337
|
+
function readOodle1Parameters(bytes) {
|
|
338
|
+
const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength),
|
|
339
|
+
params = [];
|
|
340
|
+
for (let i = 0; i < 3; i++) {
|
|
341
|
+
const b = i * 12,
|
|
342
|
+
a = dv.getUint32(b, true),
|
|
343
|
+
c = dv.getUint32(b + 4, true);
|
|
344
|
+
params.push({
|
|
345
|
+
decodedValueMax: a & 0x1ff,
|
|
346
|
+
backrefValueMax: a >>> 9,
|
|
347
|
+
decodedCount: c & 0x1ff,
|
|
348
|
+
highbitCount: c >>> 19 & 0x1fff,
|
|
349
|
+
sizesCount: [bytes[b + 8], bytes[b + 9], bytes[b + 10], bytes[b + 11]]
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return params;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Decompress a Granny Oodle1 (section format 2) block.
|
|
357
|
+
*
|
|
358
|
+
* The compressed stream is padded so the arithmetic decoder's one-byte lookahead
|
|
359
|
+
* never reads out of bounds. Output is allocated with slack because a final
|
|
360
|
+
* back-reference may overshoot before the returned view is trimmed.
|
|
361
|
+
*
|
|
362
|
+
* @param {Uint8Array} bytes Compressed section bytes.
|
|
363
|
+
* @param {number} expandedSize Decompressed byte length.
|
|
364
|
+
* @param {{first16:number, first8:number}} stops Segment stop offsets from the section directory.
|
|
365
|
+
* @returns {Uint8Array} Exactly `expandedSize` bytes.
|
|
366
|
+
*/
|
|
367
|
+
function decompressOodle1(bytes, expandedSize, {
|
|
368
|
+
first16,
|
|
369
|
+
first8
|
|
370
|
+
}) {
|
|
371
|
+
const out = new Uint8Array(expandedSize + OODLE1_OUTPUT_SLACK);
|
|
372
|
+
if (bytes.length === 0 || expandedSize === 0) return out.subarray(0, expandedSize);
|
|
373
|
+
if (bytes.length < OODLE1_PARAMETER_BYTES) throw new Error("Oodle1 block too small for parameter header");
|
|
374
|
+
const params = readOodle1Parameters(bytes);
|
|
375
|
+
const stream = new Uint8Array(bytes.length - OODLE1_PARAMETER_BYTES + OODLE1_STREAM_PADDING);
|
|
376
|
+
stream.set(bytes.subarray(OODLE1_PARAMETER_BYTES));
|
|
377
|
+
const dec = new Decoder(stream);
|
|
378
|
+
const steps = [first16, first8, expandedSize];
|
|
379
|
+
let pos = 0;
|
|
380
|
+
for (let s = 0; s < 3; s++) {
|
|
381
|
+
const dict = new Dictionary(params[s]);
|
|
382
|
+
while (pos < steps[s]) pos += dict.decompressBlock(dec, out, pos);
|
|
383
|
+
}
|
|
384
|
+
return expandedSize === out.length ? out : out.subarray(0, expandedSize);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export { OODLE1_BACKREF_SIZES, OODLE1_OUTPUT_SLACK, OODLE1_PARAMETER_BYTES, OODLE1_STREAM_PADDING, decompressOodle1, readOodle1Parameters };
|
|
388
|
+
//# sourceMappingURL=oodle1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oodle1.js","sources":["../../../../../src/formats/gr2/core/oodle1.js"],"sourcesContent":["/**\n * Granny Oodle1 section decompressor.\n *\n * Ported from nwn2mdk gr2_decompress.cpp (Boost licence), derived from\n * berenm/xoreos-tools granny-decoder, and cross-checked against opengr2. The\n * codec uses an adaptive arithmetic coder over a 7-bit-per-byte stream, drives\n * adaptive frequency windows, and emits an LZ token stream. Sections decode in\n * up to three consecutive segments with fresh dictionaries sharing one bitstream.\n */\n\n/** Large back-reference sizes selected by Oodle1 size codes 61..64. */\nexport const OODLE1_BACKREF_SIZES = Object.freeze([ 128, 192, 256, 512 ]);\n\n/** Number of bytes occupied by the three Oodle1 parameter blocks. */\nexport const OODLE1_PARAMETER_BYTES = 36;\n\n/** Extra bytes appended to the arithmetic stream for decoder lookahead safety. */\nexport const OODLE1_STREAM_PADDING = 8;\n\n/** Extra output bytes reserved because final Oodle1 back-references may overshoot. */\nexport const OODLE1_OUTPUT_SLACK = 512;\n\n/**\n * Arithmetic decoder for the Oodle1 7-bit-per-byte bitstream.\n */\nclass Decoder\n{\n /**\n * Create an arithmetic decoder over a padded compressed stream.\n *\n * @param {Uint8Array} stream Compressed payload after the parameter header.\n */\n constructor(stream)\n {\n this.stream = stream;\n this.pos = 0;\n this.numer = stream[0] >> 1;\n this.denom = 0x80;\n this.nextDenom = 0;\n }\n\n /**\n * Decode a cumulative value in the range [0, max).\n *\n * @param {number} max Exclusive upper bound for the decoded value.\n * @returns {number} Arithmetic-coded cumulative value.\n */\n decode(max)\n {\n while (this.denom <= 0x800000)\n {\n this.denom = (this.denom << 8) >>> 0;\n this.numer = ((this.numer << 8)\n | ((this.stream[this.pos] << 7) & 0x80)\n | ((this.stream[this.pos + 1] >> 1) & 0x7f)) >>> 0;\n this.pos++;\n }\n this.nextDenom = Math.floor(this.denom / max);\n return Math.min(Math.floor(this.numer / this.nextDenom), max - 1);\n }\n\n /**\n * Commit a decoded range and shrink the arithmetic interval.\n *\n * @param {number} max Original range size.\n * @param {number} val Range start to commit.\n * @param {number} err Range width to commit.\n * @returns {number} The committed value.\n */\n commit(max, val, err)\n {\n this.numer -= this.nextDenom * val;\n if (val + err < max) this.denom = this.nextDenom * err;\n else this.denom -= this.nextDenom * val;\n return val;\n }\n\n /**\n * Decode and immediately commit a single-value range.\n *\n * @param {number} max Exclusive upper bound for the decoded value.\n * @returns {number} Decoded value.\n */\n decodeCommit(max)\n {\n return this.commit(max, this.decode(max), 1);\n }\n}\n\n/**\n * Adaptive weighted symbol window used by Oodle1 dictionaries.\n */\nclass WeighWindow\n{\n /**\n * Create an adaptive window for values up to a maximum symbol.\n *\n * @param {number} maxValue Maximum symbol value represented by the window.\n * @param {number} countCap Maximum number of weighted entries to retain.\n */\n constructor(maxValue, countCap)\n {\n this.weightTotal = 4;\n this.countCap = (countCap + 1) & 0xffff;\n this.ranges = [ 0, 0x4000 ];\n this.weights = [ 4 ];\n this.values = [ 0 ];\n\n /**\n * Reusable result carrier for {@link WeighWindow#tryDecode}, owned by\n * this instance so repeated decode calls don't allocate a fresh object\n * per symbol (the hottest allocation site in this decoder). Safe to\n * reuse across calls: each result is fully consumed (read, and any\n * `storeValue` follow-up applied) before this same instance's next\n * `tryDecode` call, and every `decompressBlock` call site that needs\n * more than one decoded value at once (`d3`/`d4`/`d5`) always reads\n * from three distinct `WeighWindow` instances, never this one twice.\n */\n this.result = { newIndex: -1, value: 0 };\n\n this.threshIncrease = 4;\n this.threshRangeRebuild = 8;\n this.threshWeightRebuild = Math.max(256, Math.min(32 * maxValue, 15160));\n this.threshIncreaseCap = maxValue > 64\n ? Math.min(2 * maxValue, (this.threshWeightRebuild >> 1) - 32)\n : 128;\n }\n\n /**\n * Recompute arithmetic ranges from the current symbol weights.\n *\n * @returns {void}\n */\n rebuildRanges()\n {\n const w = this.weights;\n this.ranges.length = w.length + 1;\n const rangeWeight = Math.floor((8 * 0x4000) / this.weightTotal);\n\n let start = 0;\n for (let i = 0; i < w.length; i++)\n {\n this.ranges[i] = start;\n start += Math.floor((w[i] * rangeWeight) / 8);\n }\n this.ranges[w.length] = 0x4000;\n\n if (this.threshIncrease > (this.threshIncreaseCap >> 1))\n {\n this.threshRangeRebuild = this.weightTotal + this.threshIncreaseCap;\n }\n else\n {\n this.threshIncrease *= 2;\n this.threshRangeRebuild = this.weightTotal + this.threshIncrease;\n }\n }\n\n /**\n * Decay, compact, and reorder adaptive weights when the table grows stale.\n *\n * @returns {void}\n */\n rebuildWeights()\n {\n const\n w = this.weights,\n v = this.values;\n\n let total = 0;\n for (let i = 0; i < w.length; i++)\n {\n w[i] >>= 1;\n total += w[i];\n }\n this.weightTotal = total;\n\n for (let i = 1; i < w.length; i++)\n {\n while (i < w.length && w[i] === 0)\n {\n w[i] = w[w.length - 1]; w.pop();\n v[i] = v[v.length - 1]; v.pop();\n }\n }\n\n if (w.length > 1)\n {\n let mi = 1, mw = 0;\n for (let i = 1; i < w.length; i++)\n {\n if (w[i] > mw)\n {\n mw = w[i];\n mi = i;\n }\n }\n const l = w.length - 1;\n [ w[mi], w[l] ] = [ w[l], w[mi] ];\n [ v[mi], v[l] ] = [ v[l], v[mi] ];\n }\n\n if (w.length < this.countCap && w[0] === 0)\n {\n w[0] = 1;\n this.weightTotal++;\n }\n }\n\n /**\n * Decode a symbol through this adaptive window.\n *\n * When `newIndex` is non-negative, the caller must decode and store a\n * fresh literal value with {@link WeighWindow#storeValue}. Otherwise `value`\n * is final.\n *\n * @param {Decoder} dec Arithmetic decoder to read from.\n * @returns {{newIndex: number, value: number}} Decoded value or slot requiring a fresh literal.\n */\n tryDecode(dec)\n {\n if (this.weightTotal >= this.threshRangeRebuild)\n {\n if (this.threshRangeRebuild >= this.threshWeightRebuild) this.rebuildWeights();\n this.rebuildRanges();\n }\n\n const\n value = dec.decode(0x4000),\n r = this.ranges;\n\n let lo = 0, hi = r.length;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (r[mid] <= value) lo = mid + 1; else hi = mid; }\n const index = lo - 1;\n dec.commit(0x4000, r[index], r[index + 1] - r[index]);\n\n this.weights[index]++;\n this.weightTotal++;\n\n const result = this.result;\n\n if (index > 0)\n {\n result.newIndex = -1;\n result.value = this.values[index];\n return result;\n }\n\n if (this.weights.length >= this.ranges.length && dec.decodeCommit(2) === 1)\n {\n const i = this.ranges.length + dec.decodeCommit(this.weights.length - this.ranges.length + 1) - 1;\n this.weights[i] += 2;\n this.weightTotal += 2;\n result.newIndex = -1;\n result.value = this.values[i];\n return result;\n }\n\n this.values.push(0);\n this.weights.push(2);\n this.weightTotal += 2;\n\n if (this.weights.length === this.countCap)\n {\n this.weightTotal -= this.weights[0];\n this.weights[0] = 0;\n }\n\n result.newIndex = this.values.length - 1;\n result.value = 0;\n return result;\n }\n\n /**\n * Store a freshly decoded escape value in an adaptive window slot.\n *\n * @param {number} index Slot index returned by {@link WeighWindow#tryDecode}.\n * @param {number} value Value to store.\n * @returns {number} Stored value.\n */\n storeValue(index, value)\n {\n this.values[index] = value;\n return value;\n }\n\n}\n\nconst BACKREF_SIZES = OODLE1_BACKREF_SIZES;\n\n/**\n * Per-segment Oodle1 dictionary and adaptive symbol windows.\n */\nclass Dictionary\n{\n /**\n * Create a dictionary from one decoded Oodle1 parameter block.\n *\n * @param {{decodedValueMax: number, backrefValueMax: number, decodedCount: number, highbitCount: number, sizesCount: number[]}} p Parameter block.\n */\n constructor(p)\n {\n this.decodedSize = 0;\n this.backrefSize = 0;\n this.decodedValueMax = p.decodedValueMax;\n this.backrefValueMax = p.backrefValueMax;\n this.lowbitValueMax = Math.min(p.backrefValueMax + 1, 4);\n this.midbitValueMax = Math.min(Math.floor(p.backrefValueMax / 4) + 1, 256);\n this.highbitValueMax = Math.floor(p.backrefValueMax / 1024) + 1;\n\n this.lowbitWindow = new WeighWindow(this.lowbitValueMax - 1, this.lowbitValueMax);\n this.highbitWindow = new WeighWindow(this.highbitValueMax - 1, p.highbitCount + 1);\n this.midbitWindows = [];\n\n for (let i = 0; i < this.highbitValueMax; i++)\n {\n this.midbitWindows.push(new WeighWindow(this.midbitValueMax - 1, this.midbitValueMax));\n }\n\n this.decodedWindows = [];\n for (let i = 0; i < 4; i++)\n {\n this.decodedWindows.push(new WeighWindow(this.decodedValueMax - 1, p.decodedCount));\n }\n\n this.sizeWindows = [];\n for (let i = 0; i < 4; i++)\n {\n for (let j = 0; j < 16; j++)\n {\n this.sizeWindows.push(new WeighWindow(64, p.sizesCount[3 - i]));\n }\n }\n\n this.sizeWindows.push(new WeighWindow(64, p.sizesCount[0]));\n }\n\n /**\n * Decode one literal or back-reference block into the output buffer.\n *\n * Back-references use byte-by-byte overlapping copies so offsets smaller than\n * the copy length behave like the original LZ stream.\n *\n * @param {Decoder} dec Arithmetic decoder shared across all segments.\n * @param {Uint8Array} out Output buffer with slack for overshoot copies.\n * @param {number} pos Current output write offset.\n * @returns {number} Number of bytes produced.\n */\n decompressBlock(dec, out, pos)\n {\n const sw = this.sizeWindows[this.backrefSize];\n let d1 = sw.tryDecode(dec);\n if (d1.newIndex >= 0) d1.value = sw.storeValue(d1.newIndex, dec.decodeCommit(65));\n this.backrefSize = d1.value;\n\n if (this.backrefSize > 0)\n {\n const\n size = this.backrefSize < 61 ? this.backrefSize + 1 : BACKREF_SIZES[this.backrefSize - 61],\n range = Math.min(this.backrefValueMax, this.decodedSize);\n\n let d3 = this.lowbitWindow.tryDecode(dec);\n if (d3.newIndex >= 0) d3.value = this.lowbitWindow.storeValue(d3.newIndex, dec.decodeCommit(this.lowbitValueMax));\n\n let d4 = this.highbitWindow.tryDecode(dec);\n if (d4.newIndex >= 0) d4.value = this.highbitWindow.storeValue(d4.newIndex, dec.decodeCommit(Math.floor(range / 1024) + 1));\n\n const mw = this.midbitWindows[d4.value];\n let d5 = mw.tryDecode(dec);\n if (d5.newIndex >= 0) d5.value = mw.storeValue(d5.newIndex, dec.decodeCommit(Math.min(Math.floor(range / 4) + 1, 256)));\n\n const offset = (d4.value << 10) + (d5.value << 2) + d3.value + 1;\n this.decodedSize += size;\n\n let src = pos - offset;\n for (let i = 0; i < size; i++)\n {\n out[pos + i] = out[src + i];\n }\n return size;\n }\n else\n {\n const dw = this.decodedWindows[pos & 3];\n let d2 = dw.tryDecode(dec);\n if (d2.newIndex >= 0) d2.value = dw.storeValue(d2.newIndex, dec.decodeCommit(this.decodedValueMax));\n out[pos] = d2.value & 0xff;\n this.decodedSize++;\n return 1;\n }\n }\n}\n\n/**\n * Read the three Oodle1 parameter blocks from the compressed section header.\n *\n * Each block is a 12-byte little-endian C bitfield record.\n *\n * @param {Uint8Array} bytes Compressed Oodle1 section bytes.\n * @returns {{decodedValueMax: number, backrefValueMax: number, decodedCount: number, highbitCount: number, sizesCount: number[]}[]} Parsed parameter blocks.\n */\nexport function readOodle1Parameters(bytes)\n{\n const\n dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength),\n params = [];\n\n for (let i = 0; i < 3; i++)\n {\n const\n b = i * 12,\n a = dv.getUint32(b, true),\n c = dv.getUint32(b + 4, true);\n\n params.push({\n decodedValueMax: a & 0x1ff,\n backrefValueMax: a >>> 9,\n decodedCount: c & 0x1ff,\n highbitCount: (c >>> 19) & 0x1fff,\n sizesCount: [ bytes[b + 8], bytes[b + 9], bytes[b + 10], bytes[b + 11] ]\n });\n }\n\n return params;\n}\n\n/**\n * Decompress a Granny Oodle1 (section format 2) block.\n *\n * The compressed stream is padded so the arithmetic decoder's one-byte lookahead\n * never reads out of bounds. Output is allocated with slack because a final\n * back-reference may overshoot before the returned view is trimmed.\n *\n * @param {Uint8Array} bytes Compressed section bytes.\n * @param {number} expandedSize Decompressed byte length.\n * @param {{first16:number, first8:number}} stops Segment stop offsets from the section directory.\n * @returns {Uint8Array} Exactly `expandedSize` bytes.\n */\nexport function decompressOodle1(bytes, expandedSize, { first16, first8 })\n{\n const out = new Uint8Array(expandedSize + OODLE1_OUTPUT_SLACK);\n if (bytes.length === 0 || expandedSize === 0) return out.subarray(0, expandedSize);\n if (bytes.length < OODLE1_PARAMETER_BYTES) throw new Error(\"Oodle1 block too small for parameter header\");\n\n const params = readOodle1Parameters(bytes);\n\n const stream = new Uint8Array(bytes.length - OODLE1_PARAMETER_BYTES + OODLE1_STREAM_PADDING);\n stream.set(bytes.subarray(OODLE1_PARAMETER_BYTES));\n const dec = new Decoder(stream);\n\n const steps = [ first16, first8, expandedSize ];\n let pos = 0;\n for (let s = 0; s < 3; s++)\n {\n const dict = new Dictionary(params[s]);\n while (pos < steps[s]) pos += dict.decompressBlock(dec, out, pos);\n }\n\n return expandedSize === out.length ? out : out.subarray(0, expandedSize);\n}\n\n/**\n * Frozen convenience namespace for Granny Oodle1 section decompression.\n *\n * The same constants and functions are also exported directly from oodle1.js.\n */\nexport const oodle1 = Object.freeze({\n BACKREF_SIZES: OODLE1_BACKREF_SIZES,\n PARAMETER_BYTES: OODLE1_PARAMETER_BYTES,\n STREAM_PADDING: OODLE1_STREAM_PADDING,\n OUTPUT_SLACK: OODLE1_OUTPUT_SLACK,\n readParameters: readOodle1Parameters,\n readOodle1Parameters,\n decompress: decompressOodle1,\n decompressOodle1\n});\n"],"names":["OODLE1_BACKREF_SIZES","Object","freeze","OODLE1_PARAMETER_BYTES","OODLE1_STREAM_PADDING","OODLE1_OUTPUT_SLACK","Decoder","constructor","stream","pos","numer","denom","nextDenom","decode","max","Math","floor","min","commit","val","err","decodeCommit","WeighWindow","maxValue","countCap","weightTotal","ranges","weights","values","result","newIndex","value","threshIncrease","threshRangeRebuild","threshWeightRebuild","threshIncreaseCap","rebuildRanges","w","length","rangeWeight","start","i","rebuildWeights","v","total","pop","mi","mw","l","tryDecode","dec","r","lo","hi","mid","index","push","storeValue","BACKREF_SIZES","Dictionary","p","decodedSize","backrefSize","decodedValueMax","backrefValueMax","lowbitValueMax","midbitValueMax","highbitValueMax","lowbitWindow","highbitWindow","highbitCount","midbitWindows","decodedWindows","decodedCount","sizeWindows","j","sizesCount","decompressBlock","out","sw","d1","size","range","d3","d4","d5","offset","src","dw","d2","readOodle1Parameters","bytes","dv","DataView","buffer","byteOffset","byteLength","params","b","a","getUint32","c","decompressOodle1","expandedSize","first16","first8","Uint8Array","subarray","Error","set","steps","s","dict"],"mappings":"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"}
|