@carbonenginejs/runtime-resource 0.10.0 → 0.11.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.
Files changed (254) hide show
  1. package/dist/format/effect/effectPermutationGraph.js +257 -0
  2. package/dist/format/effect/effectPermutationGraph.js.map +1 -0
  3. package/dist/format/effect/effectReflectionPackage.js +636 -0
  4. package/dist/format/effect/effectReflectionPackage.js.map +1 -0
  5. package/dist/format/effect/sha256.js +114 -0
  6. package/dist/format/effect/sha256.js.map +1 -0
  7. package/dist/formats/dxbc/CjsDxbcFormat.js +142 -0
  8. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -0
  9. package/dist/formats/dxbc/core/DxbcReader.js +266 -0
  10. package/dist/formats/dxbc/core/DxbcReader.js.map +1 -0
  11. package/dist/formats/dxbc/core/container.js +169 -0
  12. package/dist/formats/dxbc/core/container.js.map +1 -0
  13. package/dist/formats/dxbc/core/decoder.js +789 -0
  14. package/dist/formats/dxbc/core/decoder.js.map +1 -0
  15. package/dist/formats/dxbc/core/errors.js +19 -0
  16. package/dist/formats/dxbc/core/errors.js.map +1 -0
  17. package/dist/formats/dxbc/core/helpers.js +220 -0
  18. package/dist/formats/dxbc/core/helpers.js.map +1 -0
  19. package/dist/formats/dxbc/core/opcodes.js +45 -0
  20. package/dist/formats/dxbc/core/opcodes.js.map +1 -0
  21. package/dist/formats/dxbc/core/program.js +91 -0
  22. package/dist/formats/dxbc/core/program.js.map +1 -0
  23. package/dist/formats/dxbc/core/signature.js +172 -0
  24. package/dist/formats/dxbc/core/signature.js.map +1 -0
  25. package/dist/formats/dxbc/index.js +2 -0
  26. package/dist/formats/dxbc/index.js.map +1 -0
  27. package/dist/formats/hlsl/CjsHlslFormat.js +254 -0
  28. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -0
  29. package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -0
  30. package/dist/formats/hlsl/core/HlslBinaryUtils.js.map +1 -0
  31. package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -0
  32. package/dist/formats/hlsl/core/HlslEffectReadError.js.map +1 -0
  33. package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -0
  34. package/dist/formats/hlsl/core/HlslEffectStateManager.js.map +1 -0
  35. package/dist/formats/hlsl/core/HlslReader.js +266 -0
  36. package/dist/formats/hlsl/core/HlslReader.js.map +1 -0
  37. package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -0
  38. package/dist/formats/hlsl/core/HlslRenderStateSetup.js.map +1 -0
  39. package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -0
  40. package/dist/formats/hlsl/core/HlslResourceSetDescription.js.map +1 -0
  41. package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -0
  42. package/dist/formats/hlsl/core/HlslShaderBytecode.js.map +1 -0
  43. package/dist/formats/hlsl/core/analysis.js +51 -0
  44. package/dist/formats/hlsl/core/analysis.js.map +1 -0
  45. package/dist/formats/hlsl/core/helpers.js +270 -0
  46. package/dist/formats/hlsl/core/helpers.js.map +1 -0
  47. package/dist/formats/hlsl/core/json.js +284 -0
  48. package/dist/formats/hlsl/core/json.js.map +1 -0
  49. package/dist/formats/hlsl/core/metadata.js +327 -0
  50. package/dist/formats/hlsl/core/metadata.js.map +1 -0
  51. package/dist/formats/hlsl/core/portableReflection.js +848 -0
  52. package/dist/formats/hlsl/core/portableReflection.js.map +1 -0
  53. package/dist/formats/hlsl/core/render-states.js +280 -0
  54. package/dist/formats/hlsl/core/render-states.js.map +1 -0
  55. package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -0
  56. package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js.map +1 -0
  57. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +294 -0
  58. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -0
  59. package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -0
  60. package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js.map +1 -0
  61. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -0
  62. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -0
  63. package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -0
  64. package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js.map +1 -0
  65. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +742 -0
  66. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -0
  67. package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -0
  68. package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js.map +1 -0
  69. package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -0
  70. package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js.map +1 -0
  71. package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -0
  72. package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js.map +1 -0
  73. package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -0
  74. package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js.map +1 -0
  75. package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -0
  76. package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js.map +1 -0
  77. package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -0
  78. package/dist/formats/hlsl/core/tr2/shader/HlslPass.js.map +1 -0
  79. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -0
  80. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js.map +1 -0
  81. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -0
  82. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js.map +1 -0
  83. package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -0
  84. package/dist/formats/hlsl/core/tr2/shader/HlslShader.js.map +1 -0
  85. package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -0
  86. package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js.map +1 -0
  87. package/dist/formats/hlsl/index.js +2 -0
  88. package/dist/formats/hlsl/index.js.map +1 -0
  89. package/dist/formats/hlsl/portable.js +2 -0
  90. package/dist/formats/hlsl/portable.js.map +1 -0
  91. package/dist/formats/index.js +4 -0
  92. package/dist/formats/index.js.map +1 -1
  93. package/dist/formats/webgl/CjsWebglFormat.js +221 -0
  94. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -0
  95. package/dist/formats/webgl/core/cewg/CewgPackage.js +339 -0
  96. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -0
  97. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +104 -0
  98. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +1 -0
  99. package/dist/formats/webgl/core/cewg/binary.js +101 -0
  100. package/dist/formats/webgl/core/cewg/binary.js.map +1 -0
  101. package/dist/formats/webgl/core/cewgCompleteness.js +81 -0
  102. package/dist/formats/webgl/core/cewgCompleteness.js.map +1 -0
  103. package/dist/formats/webgl/core/effectPackage.js +789 -0
  104. package/dist/formats/webgl/core/effectPackage.js.map +1 -0
  105. package/dist/formats/webgl/core/effectPackageValidation.js +331 -0
  106. package/dist/formats/webgl/core/effectPackageValidation.js.map +1 -0
  107. package/dist/formats/webgl/core/errors.js +27 -0
  108. package/dist/formats/webgl/core/errors.js.map +1 -0
  109. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2678 -0
  110. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -0
  111. package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -0
  112. package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js.map +1 -0
  113. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +428 -0
  114. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -0
  115. package/dist/formats/webgl/core/helpers.js +306 -0
  116. package/dist/formats/webgl/core/helpers.js.map +1 -0
  117. package/dist/formats/webgl/index.js +2 -0
  118. package/dist/formats/webgl/index.js.map +1 -0
  119. package/dist/formats/webgpu/CjsWebgpuFormat.js +376 -0
  120. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -0
  121. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +415 -0
  122. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +1 -0
  123. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +100 -0
  124. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +1 -0
  125. package/dist/formats/webgpu/core/cewgpu/binary.js +93 -0
  126. package/dist/formats/webgpu/core/cewgpu/binary.js.map +1 -0
  127. package/dist/formats/webgpu/core/cewgpu/tags.js +17 -0
  128. package/dist/formats/webgpu/core/cewgpu/tags.js.map +1 -0
  129. package/dist/formats/webgpu/core/effectAnalysis.js +82 -0
  130. package/dist/formats/webgpu/core/effectAnalysis.js.map +1 -0
  131. package/dist/formats/webgpu/core/effectBackendBodySet.js +305 -0
  132. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -0
  133. package/dist/formats/webgpu/core/effectPackageValidation.js +1078 -0
  134. package/dist/formats/webgpu/core/effectPackageValidation.js.map +1 -0
  135. package/dist/formats/webgpu/core/errors.js +20 -0
  136. package/dist/formats/webgpu/core/errors.js.map +1 -0
  137. package/dist/formats/webgpu/core/helpers.js +448 -0
  138. package/dist/formats/webgpu/core/helpers.js.map +1 -0
  139. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +223 -0
  140. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -0
  141. package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -0
  142. package/dist/formats/webgpu/core/ir/buildControlFlow.js.map +1 -0
  143. package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -0
  144. package/dist/formats/webgpu/core/ir/indexableTemps.js.map +1 -0
  145. package/dist/formats/webgpu/core/ir/inferValueTypes.js +454 -0
  146. package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -0
  147. package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -0
  148. package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js.map +1 -0
  149. package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -0
  150. package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js.map +1 -0
  151. package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -0
  152. package/dist/formats/webgpu/core/ir/sourceLanes.js.map +1 -0
  153. package/dist/formats/webgpu/core/packageEffect.js +300 -0
  154. package/dist/formats/webgpu/core/packageEffect.js.map +1 -0
  155. package/dist/formats/webgpu/core/packageEffectSelection.js +164 -0
  156. package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -0
  157. package/dist/formats/webgpu/core/packageMetadata.js +8 -0
  158. package/dist/formats/webgpu/core/packageMetadata.js.map +1 -0
  159. package/dist/formats/webgpu/core/schema.js +4 -0
  160. package/dist/formats/webgpu/core/schema.js.map +1 -0
  161. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +275 -0
  162. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -0
  163. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +182 -0
  164. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -0
  165. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +324 -0
  166. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -0
  167. package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -0
  168. package/dist/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -0
  169. package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -0
  170. package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js.map +1 -0
  171. package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -0
  172. package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -0
  173. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +754 -0
  174. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -0
  175. package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -0
  176. package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js.map +1 -0
  177. package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -0
  178. package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -0
  179. package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -0
  180. package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js.map +1 -0
  181. package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -0
  182. package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js.map +1 -0
  183. package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -0
  184. package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js.map +1 -0
  185. package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -0
  186. package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js.map +1 -0
  187. package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -0
  188. package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js.map +1 -0
  189. package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -0
  190. package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js.map +1 -0
  191. package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -0
  192. package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js.map +1 -0
  193. package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -0
  194. package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js.map +1 -0
  195. package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -0
  196. package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js.map +1 -0
  197. package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -0
  198. package/dist/formats/webgpu/core/wgsl/precisionControls.js.map +1 -0
  199. package/dist/formats/webgpu/core/wgsl/selectionPlans.js +758 -0
  200. package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -0
  201. package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -0
  202. package/dist/formats/webgpu/core/wgsl/uniformity.js.map +1 -0
  203. package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -0
  204. package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js.map +1 -0
  205. package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -0
  206. package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js.map +1 -0
  207. package/dist/formats/webgpu/index.js +2 -0
  208. package/dist/formats/webgpu/index.js.map +1 -0
  209. package/dist/resource/shader/Tr2EffectRes.js +159 -150
  210. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  211. package/dist/resource/shader/Tr2MaterialArea.js +23 -28
  212. package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
  213. package/dist/resource/shader/Tr2MaterialMesh.js +21 -27
  214. package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
  215. package/dist/resource/shader/Tr2MaterialRes.js +24 -29
  216. package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
  217. package/dist/resource/shader/Tr2Shader.js +45 -39
  218. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  219. package/dist/resource/shader/Tr2ShaderPermutation.js +30 -32
  220. package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
  221. package/dist/resource/shader/reflection/Tr2EffectConstant.js +113 -78
  222. package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
  223. package/dist/resource/shader/reflection/Tr2EffectDefine.js +17 -23
  224. package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
  225. package/dist/resource/shader/reflection/Tr2EffectDescription.js +23 -29
  226. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  227. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +44 -40
  228. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  229. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +82 -86
  230. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  231. package/dist/resource/shader/reflection/Tr2EffectResource.js +55 -61
  232. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  233. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +49 -45
  234. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  235. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +25 -30
  236. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  237. package/dist/resource/shader/reflection/Tr2Pass.js +30 -32
  238. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  239. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +21 -26
  240. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  241. package/docs/formats/README.md +4 -0
  242. package/docs/formats/provenance.md +11 -3
  243. package/docs/reference/classes/formats.md +440 -0
  244. package/format-notices/dxbc/LICENSE +21 -0
  245. package/format-notices/dxbc/NOTICE +20 -0
  246. package/format-notices/hlsl/LICENSE +21 -0
  247. package/format-notices/hlsl/NOTICE +25 -0
  248. package/format-notices/webgl/LICENSE +21 -0
  249. package/format-notices/webgl/NOTICE +35 -0
  250. package/format-notices/webgpu/LICENSE +21 -0
  251. package/format-notices/webgpu/NOTICE +31 -0
  252. package/package.json +6 -1
  253. package/dist/resource/shader/portableValidation.js +0 -461
  254. package/dist/resource/shader/portableValidation.js.map +0 -1
@@ -0,0 +1,266 @@
1
+ import { DxbcReadError } from './errors.js';
2
+ import { asUint8Array } from '@carbonenginejs/runtime-utils/bytes';
3
+
4
+ const textDecoder = new TextDecoder("utf-8", {
5
+ fatal: false
6
+ });
7
+
8
+ /**
9
+ * Little-endian binary reader with optional shared string-table references.
10
+ */
11
+ class DxbcReader {
12
+ /**
13
+ * Creates a reader over a byte payload and optional shared string table.
14
+ *
15
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Source payload.
16
+ * @param {object} [options] Reader bounds and metadata.
17
+ * @param {number} [options.offset] Initial byte offset.
18
+ * @param {number} [options.end] Exclusive end offset.
19
+ * @param {string} [options.source] Source name used in error details.
20
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} [options.stringTable] Effect string table.
21
+ * @param {number} [options.stringTableSize] Valid string-table byte count.
22
+ */
23
+ constructor(bytes, options = {}) {
24
+ this.bytes = asUint8Array(bytes);
25
+ this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);
26
+ this.offset = Number(options.offset) || 0;
27
+ this.end = Number.isInteger(options.end) ? options.end : this.bytes.length;
28
+ this.source = options.source || "memory";
29
+ this.stringTable = options.stringTable ? asUint8Array(options.stringTable) : null;
30
+ this.stringTableSize = Number.isInteger(options.stringTableSize) ? options.stringTableSize : this.stringTable ? this.stringTable.length : 0;
31
+ }
32
+
33
+ /**
34
+ * Attaches or replaces the effect string table used by string and blob reads.
35
+ *
36
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes String-table bytes.
37
+ * @param {number|null} [size] Valid string-table byte count.
38
+ */
39
+ SetStringTable(bytes, size = null) {
40
+ this.stringTable = asUint8Array(bytes);
41
+ this.stringTableSize = Number.isInteger(size) ? size : this.stringTable.length;
42
+ }
43
+
44
+ /**
45
+ * Returns the unread byte count inside the configured reader bounds.
46
+ *
47
+ * @returns {number} Remaining bytes.
48
+ */
49
+ get remaining() {
50
+ return this.end - this.offset;
51
+ }
52
+
53
+ /**
54
+ * Advances the reader by a fixed number of bytes.
55
+ *
56
+ * @param {number} size Byte count to skip.
57
+ */
58
+ Skip(size) {
59
+ this._require(size);
60
+ this.offset += size;
61
+ }
62
+
63
+ /**
64
+ * Reads a byte range from the main payload.
65
+ *
66
+ * @param {number} size Byte count to read.
67
+ * @returns {Uint8Array} View over the read bytes.
68
+ */
69
+ ReadRaw(size) {
70
+ this._require(size);
71
+ const start = this.offset;
72
+ this.offset += size;
73
+ return this.bytes.subarray(start, start + size);
74
+ }
75
+
76
+ /**
77
+ * Reads an unsigned 8-bit integer.
78
+ *
79
+ * @returns {number} Integer value.
80
+ */
81
+ readUint8() {
82
+ this._require(1);
83
+ const value = this.view.getUint8(this.offset);
84
+ this.offset += 1;
85
+ return value;
86
+ }
87
+
88
+ /**
89
+ * Reads a little-endian unsigned 16-bit integer.
90
+ *
91
+ * @returns {number} Integer value.
92
+ */
93
+ readUint16() {
94
+ this._require(2);
95
+ const value = this.view.getUint16(this.offset, true);
96
+ this.offset += 2;
97
+ return value;
98
+ }
99
+
100
+ /**
101
+ * Reads a little-endian unsigned 32-bit integer.
102
+ *
103
+ * @returns {number} Integer value.
104
+ */
105
+ readUint32() {
106
+ this._require(4);
107
+ const value = this.view.getUint32(this.offset, true);
108
+ this.offset += 4;
109
+ return value;
110
+ }
111
+
112
+ /**
113
+ * Reads a little-endian signed 32-bit integer.
114
+ *
115
+ * @returns {number} Integer value.
116
+ */
117
+ readInt32() {
118
+ this._require(4);
119
+ const value = this.view.getInt32(this.offset, true);
120
+ this.offset += 4;
121
+ return value;
122
+ }
123
+
124
+ /**
125
+ * Reads a little-endian 32-bit float.
126
+ *
127
+ * @returns {number} Float value.
128
+ */
129
+ readFloat32() {
130
+ this._require(4);
131
+ const value = this.view.getFloat32(this.offset, true);
132
+ this.offset += 4;
133
+ return value;
134
+ }
135
+
136
+ /**
137
+ * Reads Carbon's byte-sized boolean encoding.
138
+ *
139
+ * @returns {boolean} Boolean value.
140
+ */
141
+ ReadBool() {
142
+ return this.readUint8() !== 0;
143
+ }
144
+
145
+ /**
146
+ * Reads a string-table offset and resolves it to a UTF-8 string.
147
+ *
148
+ * @param {number} [sizeHint] Optional maximum byte span for bounds checking.
149
+ * @returns {string} Decoded string.
150
+ */
151
+ ReadString(sizeHint = 0) {
152
+ const offset = this.readUint32();
153
+ return this.ReadStringAt(offset, sizeHint);
154
+ }
155
+
156
+ /**
157
+ * Reads an optional string-table offset, returning null for zero-length fields.
158
+ *
159
+ * @param {number} length Source field length.
160
+ * @returns {string|null} Decoded string or null.
161
+ */
162
+ ReadStringOptional(length) {
163
+ const offset = this.readUint32();
164
+ if (length === 0) {
165
+ return null;
166
+ }
167
+ return this.ReadStringAt(offset, length);
168
+ }
169
+
170
+ /**
171
+ * Reads a string-table blob offset and returns the referenced byte range.
172
+ *
173
+ * @param {number} size Blob byte count.
174
+ * @returns {{offset:number,bytes:Uint8Array}} Blob location and bytes.
175
+ */
176
+ ReadTableBlob(size) {
177
+ const offset = this.readUint32();
178
+ this._requireStringTable(offset, size);
179
+ return {
180
+ offset,
181
+ bytes: this.stringTable.subarray(offset, offset + size)
182
+ };
183
+ }
184
+
185
+ /**
186
+ * Reads a possibly empty string-table blob reference.
187
+ *
188
+ * @param {number} size Blob byte count.
189
+ * @returns {{offset:number,bytes:Uint8Array}} Blob location and bytes.
190
+ */
191
+ ReadTableBlobOptional(size) {
192
+ const offset = this.readUint32();
193
+ if (size === 0) {
194
+ return {
195
+ offset,
196
+ bytes: new Uint8Array(0)
197
+ };
198
+ }
199
+ this._requireStringTable(offset, size);
200
+ return {
201
+ offset,
202
+ bytes: this.stringTable.subarray(offset, offset + size)
203
+ };
204
+ }
205
+
206
+ /**
207
+ * Resolves a string table offset to a null-terminated UTF-8 string.
208
+ *
209
+ * @param {number} offset String-table byte offset.
210
+ * @param {number} [sizeHint] Optional maximum byte span for bounds checking.
211
+ * @returns {string} Decoded string.
212
+ */
213
+ ReadStringAt(offset, sizeHint = 0) {
214
+ this._requireStringTable(offset, sizeHint);
215
+ let end = offset;
216
+ while (end < this.stringTableSize && this.stringTable[end] !== 0) {
217
+ end += 1;
218
+ }
219
+ return textDecoder.decode(this.stringTable.subarray(offset, end));
220
+ }
221
+
222
+ /**
223
+ * Ensures the requested read fits inside the configured payload bounds.
224
+ *
225
+ * @param {number} size Requested byte count.
226
+ * @private
227
+ */
228
+ _require(size) {
229
+ if (!Number.isInteger(size) || size < 0 || this.offset + size > this.end) {
230
+ throw new DxbcReadError("Unexpected end of effect data", {
231
+ source: this.source,
232
+ offset: this.offset,
233
+ requested: size,
234
+ end: this.end
235
+ });
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Ensures a string-table offset and optional span are valid.
241
+ *
242
+ * @param {number} offset String-table byte offset.
243
+ * @param {number} [sizeHint] Optional byte span for bounds checking.
244
+ * @private
245
+ */
246
+ _requireStringTable(offset, sizeHint = 0) {
247
+ const size = Number(sizeHint) || 0;
248
+ if (!this.stringTable) {
249
+ throw new DxbcReadError("Missing effect string table", {
250
+ source: this.source,
251
+ offset
252
+ });
253
+ }
254
+ if (!Number.isInteger(offset) || offset < 0 || offset >= this.stringTableSize || offset + size > this.stringTableSize) {
255
+ throw new DxbcReadError("Invalid string-table offset", {
256
+ source: this.source,
257
+ offset,
258
+ sizeHint: size,
259
+ stringTableSize: this.stringTableSize
260
+ });
261
+ }
262
+ }
263
+ }
264
+
265
+ export { DxbcReader };
266
+ //# sourceMappingURL=DxbcReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DxbcReader.js","sources":["../../../../../src/formats/dxbc/core/DxbcReader.js"],"sourcesContent":["import { DxbcReadError } from \"./errors.js\";\nimport { asUint8Array } from \"@carbonenginejs/runtime-utils/bytes\";\n\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: false });\n\n/**\n * Little-endian binary reader with optional shared string-table references.\n */\nexport class DxbcReader\n{\n /**\n * Creates a reader over a byte payload and optional shared string table.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Source payload.\n * @param {object} [options] Reader bounds and metadata.\n * @param {number} [options.offset] Initial byte offset.\n * @param {number} [options.end] Exclusive end offset.\n * @param {string} [options.source] Source name used in error details.\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} [options.stringTable] Effect string table.\n * @param {number} [options.stringTableSize] Valid string-table byte count.\n */\n constructor(bytes, options = {})\n {\n this.bytes = asUint8Array(bytes);\n this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);\n this.offset = Number(options.offset) || 0;\n this.end = Number.isInteger(options.end) ? options.end : this.bytes.length;\n this.source = options.source || \"memory\";\n this.stringTable = options.stringTable ? asUint8Array(options.stringTable) : null;\n this.stringTableSize = Number.isInteger(options.stringTableSize)\n ? options.stringTableSize\n : (this.stringTable ? this.stringTable.length : 0);\n }\n\n /**\n * Attaches or replaces the effect string table used by string and blob reads.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes String-table bytes.\n * @param {number|null} [size] Valid string-table byte count.\n */\n SetStringTable(bytes, size = null)\n {\n this.stringTable = asUint8Array(bytes);\n this.stringTableSize = Number.isInteger(size) ? size : this.stringTable.length;\n }\n\n /**\n * Returns the unread byte count inside the configured reader bounds.\n *\n * @returns {number} Remaining bytes.\n */\n get remaining()\n {\n return this.end - this.offset;\n }\n\n /**\n * Advances the reader by a fixed number of bytes.\n *\n * @param {number} size Byte count to skip.\n */\n Skip(size)\n {\n this._require(size);\n this.offset += size;\n }\n\n /**\n * Reads a byte range from the main payload.\n *\n * @param {number} size Byte count to read.\n * @returns {Uint8Array} View over the read bytes.\n */\n ReadRaw(size)\n {\n this._require(size);\n const start = this.offset;\n this.offset += size;\n return this.bytes.subarray(start, start + size);\n }\n\n /**\n * Reads an unsigned 8-bit integer.\n *\n * @returns {number} Integer value.\n */\n readUint8()\n {\n this._require(1);\n const value = this.view.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n /**\n * Reads a little-endian unsigned 16-bit integer.\n *\n * @returns {number} Integer value.\n */\n readUint16()\n {\n this._require(2);\n const value = this.view.getUint16(this.offset, true);\n this.offset += 2;\n return value;\n }\n\n /**\n * Reads a little-endian unsigned 32-bit integer.\n *\n * @returns {number} Integer value.\n */\n readUint32()\n {\n this._require(4);\n const value = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n /**\n * Reads a little-endian signed 32-bit integer.\n *\n * @returns {number} Integer value.\n */\n readInt32()\n {\n this._require(4);\n const value = this.view.getInt32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n /**\n * Reads a little-endian 32-bit float.\n *\n * @returns {number} Float value.\n */\n readFloat32()\n {\n this._require(4);\n const value = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n /**\n * Reads Carbon's byte-sized boolean encoding.\n *\n * @returns {boolean} Boolean value.\n */\n ReadBool()\n {\n return this.readUint8() !== 0;\n }\n\n /**\n * Reads a string-table offset and resolves it to a UTF-8 string.\n *\n * @param {number} [sizeHint] Optional maximum byte span for bounds checking.\n * @returns {string} Decoded string.\n */\n ReadString(sizeHint = 0)\n {\n const offset = this.readUint32();\n return this.ReadStringAt(offset, sizeHint);\n }\n\n /**\n * Reads an optional string-table offset, returning null for zero-length fields.\n *\n * @param {number} length Source field length.\n * @returns {string|null} Decoded string or null.\n */\n ReadStringOptional(length)\n {\n const offset = this.readUint32();\n if (length === 0)\n {\n return null;\n }\n return this.ReadStringAt(offset, length);\n }\n\n /**\n * Reads a string-table blob offset and returns the referenced byte range.\n *\n * @param {number} size Blob byte count.\n * @returns {{offset:number,bytes:Uint8Array}} Blob location and bytes.\n */\n ReadTableBlob(size)\n {\n const offset = this.readUint32();\n this._requireStringTable(offset, size);\n return {\n offset,\n bytes: this.stringTable.subarray(offset, offset + size)\n };\n }\n\n /**\n * Reads a possibly empty string-table blob reference.\n *\n * @param {number} size Blob byte count.\n * @returns {{offset:number,bytes:Uint8Array}} Blob location and bytes.\n */\n ReadTableBlobOptional(size)\n {\n const offset = this.readUint32();\n if (size === 0)\n {\n return {\n offset,\n bytes: new Uint8Array(0)\n };\n }\n this._requireStringTable(offset, size);\n return {\n offset,\n bytes: this.stringTable.subarray(offset, offset + size)\n };\n }\n\n /**\n * Resolves a string table offset to a null-terminated UTF-8 string.\n *\n * @param {number} offset String-table byte offset.\n * @param {number} [sizeHint] Optional maximum byte span for bounds checking.\n * @returns {string} Decoded string.\n */\n ReadStringAt(offset, sizeHint = 0)\n {\n this._requireStringTable(offset, sizeHint);\n let end = offset;\n while (end < this.stringTableSize && this.stringTable[end] !== 0)\n {\n end += 1;\n }\n return textDecoder.decode(this.stringTable.subarray(offset, end));\n }\n\n /**\n * Ensures the requested read fits inside the configured payload bounds.\n *\n * @param {number} size Requested byte count.\n * @private\n */\n _require(size)\n {\n if (!Number.isInteger(size) || size < 0 || this.offset + size > this.end)\n {\n throw new DxbcReadError(\"Unexpected end of effect data\", {\n source: this.source,\n offset: this.offset,\n requested: size,\n end: this.end\n });\n }\n }\n\n /**\n * Ensures a string-table offset and optional span are valid.\n *\n * @param {number} offset String-table byte offset.\n * @param {number} [sizeHint] Optional byte span for bounds checking.\n * @private\n */\n _requireStringTable(offset, sizeHint = 0)\n {\n const size = Number(sizeHint) || 0;\n if (!this.stringTable)\n {\n throw new DxbcReadError(\"Missing effect string table\", {\n source: this.source,\n offset\n });\n }\n if (!Number.isInteger(offset) || offset < 0 || offset >= this.stringTableSize || offset + size > this.stringTableSize)\n {\n throw new DxbcReadError(\"Invalid string-table offset\", {\n source: this.source,\n offset,\n sizeHint: size,\n stringTableSize: this.stringTableSize\n });\n }\n }\n}\n"],"names":["textDecoder","TextDecoder","fatal","DxbcReader","constructor","bytes","options","asUint8Array","view","DataView","buffer","byteOffset","byteLength","offset","Number","end","isInteger","length","source","stringTable","stringTableSize","SetStringTable","size","remaining","Skip","_require","ReadRaw","start","subarray","readUint8","value","getUint8","readUint16","getUint16","readUint32","getUint32","readInt32","getInt32","readFloat32","getFloat32","ReadBool","ReadString","sizeHint","ReadStringAt","ReadStringOptional","ReadTableBlob","_requireStringTable","ReadTableBlobOptional","Uint8Array","decode","DxbcReadError","requested"],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import { asUint8Array } from '@carbonenginejs/runtime-utils/bytes';
2
+ import { DxbcReader } from './DxbcReader.js';
3
+ import { DxbcReadError } from './errors.js';
4
+
5
+ const DXBC_HEADER_SIZE = 32;
6
+ const DXBC_CHUNK_HEADER_SIZE = 8;
7
+ const DXBC_MAGIC = new Uint8Array([0x44, 0x58, 0x42, 0x43]);
8
+ const fourCCDecoder = new TextDecoder("latin1");
9
+
10
+ /**
11
+ * DirectX shader bytecode container reader.
12
+ *
13
+ * Splits a DXBC blob into its chunk directory without interpreting chunk
14
+ * payloads, so stripped containers (for example Carbon blobs without `RDEF`)
15
+ * parse the same way as fully reflected ones.
16
+ */
17
+ class DxbcContainer {
18
+ /**
19
+ * Creates an empty container; call a read entry point to populate it from bytes.
20
+ */
21
+ constructor() {
22
+ this.bytes = new Uint8Array(0);
23
+ this.checksum = new Uint8Array(0);
24
+ this.version = 0;
25
+ this.totalSize = 0;
26
+ this.chunks = [];
27
+ this.source = "memory";
28
+ }
29
+
30
+ /**
31
+ * Checks whether a byte payload starts with the DXBC container magic.
32
+ *
33
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Candidate payload.
34
+ * @returns {boolean} True when the payload looks like DXBC.
35
+ */
36
+ static IsDxbc(bytes) {
37
+ const data = asUint8Array(bytes);
38
+ return data.length >= DXBC_MAGIC.length && DXBC_MAGIC.every((byte, index) => data[index] === byte);
39
+ }
40
+
41
+ /**
42
+ * Reads the container header and chunk directory.
43
+ *
44
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes DXBC payload.
45
+ * @param {object} [options] Read options.
46
+ * @param {string} [options.source] Source name used in error details.
47
+ * @returns {DxbcContainer} This container.
48
+ */
49
+ Read(bytes, options = {}) {
50
+ this.bytes = asUint8Array(bytes);
51
+ this.source = options.source || "memory";
52
+ if (!DxbcContainer.IsDxbc(this.bytes)) {
53
+ throw new DxbcReadError("Missing DXBC container magic", {
54
+ source: this.source,
55
+ length: this.bytes.length
56
+ });
57
+ }
58
+ if (this.bytes.length < DXBC_HEADER_SIZE) {
59
+ throw new DxbcReadError("DXBC payload is smaller than the container header", {
60
+ source: this.source,
61
+ length: this.bytes.length
62
+ });
63
+ }
64
+ const reader = new DxbcReader(this.bytes, {
65
+ source: this.source,
66
+ offset: DXBC_MAGIC.length
67
+ });
68
+ this.checksum = reader.ReadRaw(16).slice();
69
+ this.version = reader.readUint32();
70
+ this.totalSize = reader.readUint32();
71
+ if (this.totalSize > this.bytes.length) {
72
+ throw new DxbcReadError("DXBC container size exceeds the payload", {
73
+ source: this.source,
74
+ totalSize: this.totalSize,
75
+ length: this.bytes.length
76
+ });
77
+ }
78
+ const chunkCount = reader.readUint32();
79
+ if (DXBC_HEADER_SIZE + chunkCount * 4 > this.totalSize) {
80
+ throw new DxbcReadError("DXBC chunk directory exceeds the container size", {
81
+ source: this.source,
82
+ chunkCount,
83
+ totalSize: this.totalSize
84
+ });
85
+ }
86
+ this.chunks = [];
87
+ for (let index = 0; index < chunkCount; index += 1) {
88
+ const offset = reader.readUint32();
89
+ this.chunks.push(this._readChunkAt(offset, index));
90
+ }
91
+ return this;
92
+ }
93
+
94
+ /**
95
+ * Finds a chunk by its four-character code.
96
+ *
97
+ * @param {string} fourCC Chunk identifier such as `"SHEX"` or `"ISGN"`.
98
+ * @returns {{fourCC:string,offset:number,size:number,bytes:Uint8Array}|null} Chunk record or null.
99
+ */
100
+ getChunk(fourCC) {
101
+ return this.chunks.find(chunk => chunk.fourCC === fourCC) || null;
102
+ }
103
+
104
+ /**
105
+ * Returns serializable container metadata while omitting chunk payload bytes.
106
+ *
107
+ * @returns {object} JSON-safe container summary.
108
+ */
109
+ toJSON() {
110
+ return {
111
+ source: this.source,
112
+ version: this.version,
113
+ totalSize: this.totalSize,
114
+ chunks: this.chunks.map(({
115
+ fourCC,
116
+ offset,
117
+ size
118
+ }) => ({
119
+ fourCC,
120
+ offset,
121
+ size
122
+ }))
123
+ };
124
+ }
125
+
126
+ /**
127
+ * Reads one chunk header and bounds-checks its payload.
128
+ *
129
+ * @param {number} offset Chunk offset from the container start.
130
+ * @param {number} index Chunk directory index used in error details.
131
+ * @returns {{fourCC:string,offset:number,size:number,bytes:Uint8Array}} Chunk record.
132
+ * @private
133
+ */
134
+ _readChunkAt(offset, index) {
135
+ if (offset + DXBC_CHUNK_HEADER_SIZE > this.totalSize) {
136
+ throw new DxbcReadError("DXBC chunk header lies outside the container", {
137
+ source: this.source,
138
+ chunkIndex: index,
139
+ offset,
140
+ totalSize: this.totalSize
141
+ });
142
+ }
143
+ const reader = new DxbcReader(this.bytes, {
144
+ source: this.source,
145
+ offset
146
+ });
147
+ const fourCC = fourCCDecoder.decode(reader.ReadRaw(4));
148
+ const size = reader.readUint32();
149
+ if (offset + DXBC_CHUNK_HEADER_SIZE + size > this.totalSize) {
150
+ throw new DxbcReadError("DXBC chunk payload lies outside the container", {
151
+ source: this.source,
152
+ chunkIndex: index,
153
+ fourCC,
154
+ offset,
155
+ size,
156
+ totalSize: this.totalSize
157
+ });
158
+ }
159
+ return {
160
+ fourCC,
161
+ offset,
162
+ size,
163
+ bytes: this.bytes.subarray(offset + DXBC_CHUNK_HEADER_SIZE, offset + DXBC_CHUNK_HEADER_SIZE + size)
164
+ };
165
+ }
166
+ }
167
+
168
+ export { DxbcContainer };
169
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sources":["../../../../../src/formats/dxbc/core/container.js"],"sourcesContent":["import { asUint8Array } from \"@carbonenginejs/runtime-utils/bytes\";\nimport { DxbcReader } from \"./DxbcReader.js\";\nimport { DxbcReadError } from \"./errors.js\";\n\nconst DXBC_HEADER_SIZE = 32;\nconst DXBC_CHUNK_HEADER_SIZE = 8;\nconst DXBC_MAGIC = new Uint8Array([ 0x44, 0x58, 0x42, 0x43 ]);\n\nconst fourCCDecoder = new TextDecoder(\"latin1\");\n\n/**\n * DirectX shader bytecode container reader.\n *\n * Splits a DXBC blob into its chunk directory without interpreting chunk\n * payloads, so stripped containers (for example Carbon blobs without `RDEF`)\n * parse the same way as fully reflected ones.\n */\nexport class DxbcContainer\n{\n /**\n * Creates an empty container; call a read entry point to populate it from bytes.\n */\n constructor()\n {\n this.bytes = new Uint8Array(0);\n this.checksum = new Uint8Array(0);\n this.version = 0;\n this.totalSize = 0;\n this.chunks = [];\n this.source = \"memory\";\n }\n\n /**\n * Checks whether a byte payload starts with the DXBC container magic.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Candidate payload.\n * @returns {boolean} True when the payload looks like DXBC.\n */\n static IsDxbc(bytes)\n {\n const data = asUint8Array(bytes);\n return data.length >= DXBC_MAGIC.length && DXBC_MAGIC.every((byte, index) => data[index] === byte);\n }\n\n /**\n * Reads the container header and chunk directory.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes DXBC payload.\n * @param {object} [options] Read options.\n * @param {string} [options.source] Source name used in error details.\n * @returns {DxbcContainer} This container.\n */\n Read(bytes, options = {})\n {\n this.bytes = asUint8Array(bytes);\n this.source = options.source || \"memory\";\n\n if (!DxbcContainer.IsDxbc(this.bytes))\n {\n throw new DxbcReadError(\"Missing DXBC container magic\", {\n source: this.source,\n length: this.bytes.length\n });\n }\n if (this.bytes.length < DXBC_HEADER_SIZE)\n {\n throw new DxbcReadError(\"DXBC payload is smaller than the container header\", {\n source: this.source,\n length: this.bytes.length\n });\n }\n\n const reader = new DxbcReader(this.bytes, { source: this.source, offset: DXBC_MAGIC.length });\n this.checksum = reader.ReadRaw(16).slice();\n this.version = reader.readUint32();\n this.totalSize = reader.readUint32();\n if (this.totalSize > this.bytes.length)\n {\n throw new DxbcReadError(\"DXBC container size exceeds the payload\", {\n source: this.source,\n totalSize: this.totalSize,\n length: this.bytes.length\n });\n }\n\n const chunkCount = reader.readUint32();\n if (DXBC_HEADER_SIZE + chunkCount * 4 > this.totalSize)\n {\n throw new DxbcReadError(\"DXBC chunk directory exceeds the container size\", {\n source: this.source,\n chunkCount,\n totalSize: this.totalSize\n });\n }\n\n this.chunks = [];\n for (let index = 0; index < chunkCount; index += 1)\n {\n const offset = reader.readUint32();\n this.chunks.push(this._readChunkAt(offset, index));\n }\n return this;\n }\n\n /**\n * Finds a chunk by its four-character code.\n *\n * @param {string} fourCC Chunk identifier such as `\"SHEX\"` or `\"ISGN\"`.\n * @returns {{fourCC:string,offset:number,size:number,bytes:Uint8Array}|null} Chunk record or null.\n */\n getChunk(fourCC)\n {\n return this.chunks.find((chunk) => chunk.fourCC === fourCC) || null;\n }\n\n /**\n * Returns serializable container metadata while omitting chunk payload bytes.\n *\n * @returns {object} JSON-safe container summary.\n */\n toJSON()\n {\n return {\n source: this.source,\n version: this.version,\n totalSize: this.totalSize,\n chunks: this.chunks.map(({ fourCC, offset, size }) => ({ fourCC, offset, size }))\n };\n }\n\n /**\n * Reads one chunk header and bounds-checks its payload.\n *\n * @param {number} offset Chunk offset from the container start.\n * @param {number} index Chunk directory index used in error details.\n * @returns {{fourCC:string,offset:number,size:number,bytes:Uint8Array}} Chunk record.\n * @private\n */\n _readChunkAt(offset, index)\n {\n if (offset + DXBC_CHUNK_HEADER_SIZE > this.totalSize)\n {\n throw new DxbcReadError(\"DXBC chunk header lies outside the container\", {\n source: this.source,\n chunkIndex: index,\n offset,\n totalSize: this.totalSize\n });\n }\n const reader = new DxbcReader(this.bytes, { source: this.source, offset });\n const fourCC = fourCCDecoder.decode(reader.ReadRaw(4));\n const size = reader.readUint32();\n if (offset + DXBC_CHUNK_HEADER_SIZE + size > this.totalSize)\n {\n throw new DxbcReadError(\"DXBC chunk payload lies outside the container\", {\n source: this.source,\n chunkIndex: index,\n fourCC,\n offset,\n size,\n totalSize: this.totalSize\n });\n }\n return {\n fourCC,\n offset,\n size,\n bytes: this.bytes.subarray(offset + DXBC_CHUNK_HEADER_SIZE, offset + DXBC_CHUNK_HEADER_SIZE + size)\n };\n }\n}\n"],"names":["DXBC_HEADER_SIZE","DXBC_CHUNK_HEADER_SIZE","DXBC_MAGIC","Uint8Array","fourCCDecoder","TextDecoder","DxbcContainer","constructor","bytes","checksum","version","totalSize","chunks","source","IsDxbc","data","asUint8Array","length","every","byte","index","Read","options","DxbcReadError","reader","DxbcReader","offset","ReadRaw","slice","readUint32","chunkCount","push","_readChunkAt","getChunk","fourCC","find","chunk","toJSON","map","size","chunkIndex","decode","subarray"],"mappings":"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"}