@photivra/engine 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1085) hide show
  1. package/CHANGELOG.md +414 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/diffraction-provider.d.ts +30 -0
  236. package/dist/facade/diffraction-provider.js +127 -0
  237. package/dist/facade/diffraction-provider.js.map +1 -0
  238. package/dist/facade/host-yield.d.ts +7 -0
  239. package/dist/facade/host-yield.js +19 -0
  240. package/dist/facade/host-yield.js.map +1 -0
  241. package/dist/facade/scene-radiance.d.ts +117 -0
  242. package/dist/facade/scene-radiance.js +205 -0
  243. package/dist/facade/scene-radiance.js.map +1 -0
  244. package/dist/facade/simulate-capture.d.ts +363 -0
  245. package/dist/facade/simulate-capture.js +1281 -0
  246. package/dist/facade/simulate-capture.js.map +1 -0
  247. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  248. package/dist/gpu/chart-radiance-gpu.js +176 -0
  249. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  250. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  251. package/dist/gpu/image-kernel-accelerator.js +720 -0
  252. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  253. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  254. package/dist/gpu/image-kernel-execution.js +84 -0
  255. package/dist/gpu/image-kernel-execution.js.map +1 -0
  256. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  257. package/dist/gpu/sensor-stage-gpu.js +317 -0
  258. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  259. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  260. package/dist/gpu/temporal-sum-gpu.js +150 -0
  261. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  262. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  263. package/dist/gpu/webgpu-runtime.js +215 -0
  264. package/dist/gpu/webgpu-runtime.js.map +1 -0
  265. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  266. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  267. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  268. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  269. package/dist/gpu/wgsl-kernels.js +365 -0
  270. package/dist/gpu/wgsl-kernels.js.map +1 -0
  271. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  272. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  273. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  274. package/dist/index.d.ts +91 -25
  275. package/dist/index.js +60 -15
  276. package/dist/index.js.map +1 -1
  277. package/dist/motion/camera-rotation.d.ts +92 -40
  278. package/dist/motion/camera-rotation.js +84 -47
  279. package/dist/motion/camera-rotation.js.map +1 -1
  280. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  281. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  282. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  283. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  284. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  285. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  286. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  287. package/dist/motion/capture-rotation-trajectory.js +36 -26
  288. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  289. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  290. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  291. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  292. package/dist/motion/extended-object-projection.d.ts +19 -16
  293. package/dist/motion/extended-object-projection.js +38 -18
  294. package/dist/motion/extended-object-projection.js.map +1 -1
  295. package/dist/motion/projected-motion.d.ts +18 -17
  296. package/dist/motion/projected-motion.js +25 -17
  297. package/dist/motion/projected-motion.js.map +1 -1
  298. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  299. package/dist/motion/temporal-exposure-sum.js +141 -0
  300. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  301. package/dist/motion/video-sequence.d.ts +111 -0
  302. package/dist/motion/video-sequence.js +179 -0
  303. package/dist/motion/video-sequence.js.map +1 -0
  304. package/dist/optics/aperture.d.ts +14 -15
  305. package/dist/optics/aperture.js +13 -11
  306. package/dist/optics/aperture.js.map +1 -1
  307. package/dist/optics/atmospheric-haze.d.ts +83 -0
  308. package/dist/optics/atmospheric-haze.js +113 -0
  309. package/dist/optics/atmospheric-haze.js.map +1 -0
  310. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  311. package/dist/optics/brown-conrady-distortion.js +291 -0
  312. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  313. package/dist/optics/circle-of-confusion.d.ts +10 -10
  314. package/dist/optics/circle-of-confusion.js +15 -11
  315. package/dist/optics/circle-of-confusion.js.map +1 -1
  316. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  317. package/dist/optics/complex-pupil-psf.js +190 -98
  318. package/dist/optics/complex-pupil-psf.js.map +1 -1
  319. package/dist/optics/depth-of-field.d.ts +25 -15
  320. package/dist/optics/depth-of-field.js +67 -27
  321. package/dist/optics/depth-of-field.js.map +1 -1
  322. package/dist/optics/diffraction-psf-profile.d.ts +118 -0
  323. package/dist/optics/diffraction-psf-profile.js +252 -0
  324. package/dist/optics/diffraction-psf-profile.js.map +1 -0
  325. package/dist/optics/diffraction.d.ts +14 -13
  326. package/dist/optics/diffraction.js +14 -10
  327. package/dist/optics/diffraction.js.map +1 -1
  328. package/dist/optics/focus-breathing.d.ts +88 -27
  329. package/dist/optics/focus-breathing.js +114 -23
  330. package/dist/optics/focus-breathing.js.map +1 -1
  331. package/dist/optics/focus-state.d.ts +18 -18
  332. package/dist/optics/focus-state.js +21 -15
  333. package/dist/optics/focus-state.js.map +1 -1
  334. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  335. package/dist/optics/front-of-lens-filter.js +259 -88
  336. package/dist/optics/front-of-lens-filter.js.map +1 -1
  337. package/dist/optics/illumination-vignetting.d.ts +16 -17
  338. package/dist/optics/illumination-vignetting.js +40 -17
  339. package/dist/optics/illumination-vignetting.js.map +1 -1
  340. package/dist/optics/irradiance-convolution.d.ts +59 -0
  341. package/dist/optics/irradiance-convolution.js +138 -0
  342. package/dist/optics/irradiance-convolution.js.map +1 -0
  343. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  344. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  345. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  346. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  347. package/dist/optics/lens-psf-kernels.js +175 -0
  348. package/dist/optics/lens-psf-kernels.js.map +1 -0
  349. package/dist/optics/lens-psf-profile.d.ts +78 -46
  350. package/dist/optics/lens-psf-profile.js +335 -124
  351. package/dist/optics/lens-psf-profile.js.map +1 -1
  352. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  353. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  354. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  355. package/dist/optics/polygon-diffraction.d.ts +80 -23
  356. package/dist/optics/polygon-diffraction.js +130 -25
  357. package/dist/optics/polygon-diffraction.js.map +1 -1
  358. package/dist/optics/profile-contract.d.ts +5 -6
  359. package/dist/optics/profile-contract.js +14 -11
  360. package/dist/optics/profile-contract.js.map +1 -1
  361. package/dist/optics/psf-foundation.d.ts +23 -23
  362. package/dist/optics/psf-foundation.js +24 -21
  363. package/dist/optics/psf-foundation.js.map +1 -1
  364. package/dist/optics/pupil-vignetting.d.ts +118 -0
  365. package/dist/optics/pupil-vignetting.js +264 -0
  366. package/dist/optics/pupil-vignetting.js.map +1 -0
  367. package/dist/optics/radial-distortion.d.ts +34 -33
  368. package/dist/optics/radial-distortion.js +37 -30
  369. package/dist/optics/radial-distortion.js.map +1 -1
  370. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  371. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  372. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  373. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  374. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  375. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  376. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  377. package/dist/optics/sensor-aperture-rays.js +32 -14
  378. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  379. package/dist/optics/sensor-environment-query.d.ts +81 -16
  380. package/dist/optics/sensor-environment-query.js +145 -12
  381. package/dist/optics/sensor-environment-query.js.map +1 -1
  382. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  383. package/dist/optics/sensor-psf-quadrature.js +18 -11
  384. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  385. package/dist/optics/sensor-psf-support.d.ts +8 -6
  386. package/dist/optics/sensor-psf-support.js +8 -5
  387. package/dist/optics/sensor-psf-support.js.map +1 -1
  388. package/dist/optics/stray-light.d.ts +22 -19
  389. package/dist/optics/stray-light.js +18 -12
  390. package/dist/optics/stray-light.js.map +1 -1
  391. package/dist/optics/thin-lens.d.ts +10 -9
  392. package/dist/optics/thin-lens.js +12 -8
  393. package/dist/optics/thin-lens.js.map +1 -1
  394. package/dist/optics/zernike-wavefront.d.ts +154 -0
  395. package/dist/optics/zernike-wavefront.js +352 -0
  396. package/dist/optics/zernike-wavefront.js.map +1 -0
  397. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  398. package/dist/output/capture-corrected-sdr.js +16 -8
  399. package/dist/output/capture-corrected-sdr.js.map +1 -1
  400. package/dist/output/capture-geometry.d.ts +34 -36
  401. package/dist/output/capture-geometry.js +52 -32
  402. package/dist/output/capture-geometry.js.map +1 -1
  403. package/dist/output/capture-sdr.d.ts +7 -6
  404. package/dist/output/capture-sdr.js +11 -8
  405. package/dist/output/capture-sdr.js.map +1 -1
  406. package/dist/output/crop.d.ts +22 -6
  407. package/dist/output/crop.js +40 -6
  408. package/dist/output/crop.js.map +1 -1
  409. package/dist/output/geometric-transforms.d.ts +60 -23
  410. package/dist/output/geometric-transforms.js +111 -24
  411. package/dist/output/geometric-transforms.js.map +1 -1
  412. package/dist/output/lens-corrections.d.ts +27 -19
  413. package/dist/output/lens-corrections.js +29 -13
  414. package/dist/output/lens-corrections.js.map +1 -1
  415. package/dist/output/native-capture-sdr.d.ts +71 -16
  416. package/dist/output/native-capture-sdr.js +190 -33
  417. package/dist/output/native-capture-sdr.js.map +1 -1
  418. package/dist/output/png-encoder.d.ts +65 -0
  419. package/dist/output/png-encoder.js +461 -0
  420. package/dist/output/png-encoder.js.map +1 -0
  421. package/dist/output/print-contrast-reference.d.ts +10 -9
  422. package/dist/output/print-contrast-reference.js +10 -8
  423. package/dist/output/print-contrast-reference.js.map +1 -1
  424. package/dist/output/print-detail.d.ts +18 -17
  425. package/dist/output/print-detail.js +12 -10
  426. package/dist/output/print-detail.js.map +1 -1
  427. package/dist/output/print-jpeg.d.ts +26 -5
  428. package/dist/output/print-jpeg.js +117 -50
  429. package/dist/output/print-jpeg.js.map +1 -1
  430. package/dist/output/print-plan.d.ts +19 -19
  431. package/dist/output/print-plan.js +11 -10
  432. package/dist/output/print-plan.js.map +1 -1
  433. package/dist/output/print-region-statistics.d.ts +14 -15
  434. package/dist/output/print-region-statistics.js +11 -11
  435. package/dist/output/print-region-statistics.js.map +1 -1
  436. package/dist/output/sdr-rendering.d.ts +48 -10
  437. package/dist/output/sdr-rendering.js +114 -25
  438. package/dist/output/sdr-rendering.js.map +1 -1
  439. package/dist/output/subject-framing-crop.d.ts +6 -10
  440. package/dist/output/subject-framing-crop.js +23 -13
  441. package/dist/output/subject-framing-crop.js.map +1 -1
  442. package/dist/processing/demosaic.d.ts +90 -0
  443. package/dist/processing/demosaic.js +275 -0
  444. package/dist/processing/demosaic.js.map +1 -0
  445. package/dist/processing/denoise.d.ts +68 -0
  446. package/dist/processing/denoise.js +214 -0
  447. package/dist/processing/denoise.js.map +1 -0
  448. package/dist/processing/focus-stacking.d.ts +17 -0
  449. package/dist/processing/focus-stacking.js +80 -0
  450. package/dist/processing/focus-stacking.js.map +1 -0
  451. package/dist/processing/hdr.d.ts +54 -0
  452. package/dist/processing/hdr.js +172 -0
  453. package/dist/processing/hdr.js.map +1 -0
  454. package/dist/processing/image-ops.d.ts +66 -0
  455. package/dist/processing/image-ops.js +192 -0
  456. package/dist/processing/image-ops.js.map +1 -0
  457. package/dist/processing/panorama.d.ts +51 -0
  458. package/dist/processing/panorama.js +305 -0
  459. package/dist/processing/panorama.js.map +1 -0
  460. package/dist/processing/processing-task.d.ts +85 -0
  461. package/dist/processing/processing-task.js +164 -0
  462. package/dist/processing/processing-task.js.map +1 -0
  463. package/dist/processing/tone-mapping.d.ts +69 -0
  464. package/dist/processing/tone-mapping.js +310 -0
  465. package/dist/processing/tone-mapping.js.map +1 -0
  466. package/dist/schema/camera.d.ts +5 -4
  467. package/dist/schema/illumination-spectral.d.ts +13 -19
  468. package/dist/schema/illumination-spectral.js +23 -19
  469. package/dist/schema/illumination-spectral.js.map +1 -1
  470. package/dist/schema/illumination-temporal.d.ts +12 -15
  471. package/dist/schema/illumination-temporal.js +43 -28
  472. package/dist/schema/illumination-temporal.js.map +1 -1
  473. package/dist/schema/illumination.d.ts +5 -4
  474. package/dist/schema/illumination.js +55 -20
  475. package/dist/schema/illumination.js.map +1 -1
  476. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  477. package/dist/schema/scene-radiance-temporal.js +26 -23
  478. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  479. package/dist/schema/scene-radiance.d.ts +17 -17
  480. package/dist/schema/scene-radiance.js +56 -34
  481. package/dist/schema/scene-radiance.js.map +1 -1
  482. package/dist/schema/scene.d.ts +14 -13
  483. package/dist/schema/validation.d.ts +0 -1
  484. package/dist/schema/validation.js +17 -15
  485. package/dist/schema/validation.js.map +1 -1
  486. package/dist/sensor/accumulated-charge.d.ts +45 -64
  487. package/dist/sensor/accumulated-charge.js +41 -47
  488. package/dist/sensor/accumulated-charge.js.map +1 -1
  489. package/dist/sensor/architecture.d.ts +22 -25
  490. package/dist/sensor/architecture.js +17 -16
  491. package/dist/sensor/architecture.js.map +1 -1
  492. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  493. package/dist/sensor/camera-saturation-capacity.js +36 -34
  494. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  495. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  496. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  497. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  498. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  499. package/dist/sensor/capture-mode-timing.js +24 -21
  500. package/dist/sensor/capture-mode-timing.js.map +1 -1
  501. package/dist/sensor/capture-mode.d.ts +28 -30
  502. package/dist/sensor/capture-mode.js +33 -31
  503. package/dist/sensor/capture-mode.js.map +1 -1
  504. package/dist/sensor/color-sampling.d.ts +30 -33
  505. package/dist/sensor/color-sampling.js +32 -37
  506. package/dist/sensor/color-sampling.js.map +1 -1
  507. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  508. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  509. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  510. package/dist/sensor/dark-current.d.ts +53 -49
  511. package/dist/sensor/dark-current.js +87 -46
  512. package/dist/sensor/dark-current.js.map +1 -1
  513. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  514. package/dist/sensor/environment-photo-signal.js +127 -46
  515. package/dist/sensor/environment-photo-signal.js.map +1 -1
  516. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  517. package/dist/sensor/eqe-electron-rate.js +34 -14
  518. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  519. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  520. package/dist/sensor/eqe-local-exposure.js +15 -11
  521. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  522. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  523. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  524. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  525. package/dist/sensor/exposure-window.d.ts +48 -34
  526. package/dist/sensor/exposure-window.js +77 -36
  527. package/dist/sensor/exposure-window.js.map +1 -1
  528. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  529. package/dist/sensor/fixed-pattern-noise.js +166 -0
  530. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  531. package/dist/sensor/iso-gain.d.ts +44 -0
  532. package/dist/sensor/iso-gain.js +119 -0
  533. package/dist/sensor/iso-gain.js.map +1 -0
  534. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  535. package/dist/sensor/iso-signal-chain.js +52 -66
  536. package/dist/sensor/iso-signal-chain.js.map +1 -1
  537. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  538. package/dist/sensor/local-exposure-binding.js +22 -18
  539. package/dist/sensor/local-exposure-binding.js.map +1 -1
  540. package/dist/sensor/optical-stack.d.ts +36 -40
  541. package/dist/sensor/optical-stack.js +34 -37
  542. package/dist/sensor/optical-stack.js.map +1 -1
  543. package/dist/sensor/photon-energy.d.ts +22 -28
  544. package/dist/sensor/photon-energy.js +42 -34
  545. package/dist/sensor/photon-energy.js.map +1 -1
  546. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  547. package/dist/sensor/physical-charge-capacity.js +35 -36
  548. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  549. package/dist/sensor/pixel-pitch.d.ts +2 -3
  550. package/dist/sensor/pixel-pitch.js +4 -2
  551. package/dist/sensor/pixel-pitch.js.map +1 -1
  552. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  553. package/dist/sensor/radiometry-readiness.js +20 -17
  554. package/dist/sensor/radiometry-readiness.js.map +1 -1
  555. package/dist/sensor/raw-readout.d.ts +173 -83
  556. package/dist/sensor/raw-readout.js +425 -160
  557. package/dist/sensor/raw-readout.js.map +1 -1
  558. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  559. package/dist/sensor/raw-reconstruction.js +200 -47
  560. package/dist/sensor/raw-reconstruction.js.map +1 -1
  561. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  562. package/dist/sensor/readout-exposure-linkage.js +125 -27
  563. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  564. package/dist/sensor/readout-timing.d.ts +43 -44
  565. package/dist/sensor/readout-timing.js +38 -30
  566. package/dist/sensor/readout-timing.js.map +1 -1
  567. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  568. package/dist/sensor/response-application-compatibility.js +35 -34
  569. package/dist/sensor/response-application-compatibility.js.map +1 -1
  570. package/dist/sensor/response-operating-range.d.ts +26 -35
  571. package/dist/sensor/response-operating-range.js +40 -39
  572. package/dist/sensor/response-operating-range.js.map +1 -1
  573. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  574. package/dist/sensor/responsivity-photocurrent.js +57 -40
  575. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  576. package/dist/sensor/sampling-aperture.d.ts +21 -25
  577. package/dist/sensor/sampling-aperture.js +29 -28
  578. package/dist/sensor/sampling-aperture.js.map +1 -1
  579. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  580. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  581. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  582. package/dist/sensor/sensor-geometry.d.ts +28 -32
  583. package/dist/sensor/sensor-geometry.js +35 -20
  584. package/dist/sensor/sensor-geometry.js.map +1 -1
  585. package/dist/sensor/signal-noise.d.ts +14 -16
  586. package/dist/sensor/signal-noise.js +15 -13
  587. package/dist/sensor/signal-noise.js.map +1 -1
  588. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  589. package/dist/sensor/spatial-sample-reduction.js +39 -48
  590. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  591. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  592. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  593. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  594. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  595. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  596. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  597. package/dist/sensor/spectral-coverage.d.ts +6 -9
  598. package/dist/sensor/spectral-coverage.js +9 -6
  599. package/dist/sensor/spectral-coverage.js.map +1 -1
  600. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  601. package/dist/sensor/spectral-quadrature.js +38 -48
  602. package/dist/sensor/spectral-quadrature.js.map +1 -1
  603. package/dist/sensor/spectral-response.d.ts +53 -41
  604. package/dist/sensor/spectral-response.js +80 -47
  605. package/dist/sensor/spectral-response.js.map +1 -1
  606. package/dist/sensor/stochastic-seed.d.ts +50 -0
  607. package/dist/sensor/stochastic-seed.js +123 -0
  608. package/dist/sensor/stochastic-seed.js.map +1 -0
  609. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  610. package/dist/sensor/temporal-eqe-sum.js +5 -6
  611. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  612. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  613. package/dist/sensor/temporal-photo-signal.js +11 -10
  614. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  615. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  616. package/dist/sensor/temporal-sample-binding.js +3 -3
  617. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  618. package/dist/simulation/poc-simulation.d.ts +16 -16
  619. package/dist/simulation/poc-simulation.js +20 -15
  620. package/dist/simulation/poc-simulation.js.map +1 -1
  621. package/dist/stabilization/camera-shake.d.ts +42 -18
  622. package/dist/stabilization/camera-shake.js +43 -20
  623. package/dist/stabilization/camera-shake.js.map +1 -1
  624. package/dist/stabilization/system.d.ts +44 -41
  625. package/dist/stabilization/system.js +196 -108
  626. package/dist/stabilization/system.js.map +1 -1
  627. package/docs/AGENT_GUIDE.md +183 -0
  628. package/docs/API_REFERENCE.md +777 -2
  629. package/docs/QUICK_START.md +663 -0
  630. package/docs/USAGE.md +1719 -714
  631. package/docs/api/camera-equivalent-focal-length.md +6 -7
  632. package/docs/api/camera-field-of-view.md +16 -8
  633. package/docs/api/camera-lens-projection.md +246 -0
  634. package/docs/api/camera-projected-object-size.md +6 -5
  635. package/docs/api/capture-capture-export-metadata.md +10 -10
  636. package/docs/api/capture-dng-import.md +134 -0
  637. package/docs/api/capture-environment-raw-producer.md +17 -11
  638. package/docs/api/capture-export-jpeg.md +16 -0
  639. package/docs/api/capture-focus-control.md +25 -47
  640. package/docs/api/capture-linear-encoding.md +21 -12
  641. package/docs/api/capture-lossless-jpeg.md +49 -0
  642. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  643. package/docs/api/capture-native-environment-raw.md +161 -4
  644. package/docs/api/capture-native-raw-development.md +69 -8
  645. package/docs/api/capture-native-raw-dng.md +84 -0
  646. package/docs/api/capture-native-raw.md +21 -10
  647. package/docs/api/capture-packed-sensor-raw.md +156 -0
  648. package/docs/api/capture-photographic-export.md +69 -31
  649. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  650. package/docs/api/capture-raw-white-level.md +37 -0
  651. package/docs/api/capture-release-sequence.md +6 -7
  652. package/docs/api/capture-sensor-raw-frame.md +6 -6
  653. package/docs/api/capture-sensor-raw-producer.md +17 -11
  654. package/docs/api/capture-simulated-capture.md +15 -15
  655. package/docs/api/color-camera-color-matrix.md +103 -0
  656. package/docs/api/color-capture-color.md +22 -11
  657. package/docs/api/color-chromatic-adaptation.md +82 -0
  658. package/docs/api/color-color-difference.md +134 -0
  659. package/docs/api/color-color-matching-functions.md +259 -0
  660. package/docs/api/color-colorimetry-math.md +54 -0
  661. package/docs/api/color-gamut-mapping.md +72 -0
  662. package/docs/api/color-illuminants.md +280 -0
  663. package/docs/api/color-rgb-color-spaces.md +151 -0
  664. package/docs/api/color-sensor-color-development.md +27 -0
  665. package/docs/api/color-srgb-icc.md +2 -4
  666. package/docs/api/color-white-balance.md +95 -19
  667. package/docs/api/composition-image-formation-plan.md +124 -95
  668. package/docs/api/composition-plan-consumer.md +7 -7
  669. package/docs/api/core-calculation-result.md +18 -14
  670. package/docs/api/core-configuration-error.md +1 -1
  671. package/docs/api/core-image-formation.md +7 -7
  672. package/docs/api/core-scientific-assurance.md +12 -10
  673. package/docs/api/core-spectral-composition.md +14 -14
  674. package/docs/api/core-spectral.md +6 -6
  675. package/docs/api/core-validation.md +3 -3
  676. package/docs/api/core-version.md +7 -6
  677. package/docs/api/equipment-exposure-capabilities.md +11 -10
  678. package/docs/api/equipment-generic-tier-assets.md +7 -2
  679. package/docs/api/equipment-generic-tier-presets.md +6 -6
  680. package/docs/api/equipment-iso-capabilities.md +18 -18
  681. package/docs/api/equipment-metering-capabilities.md +6 -6
  682. package/docs/api/equipment-release-capabilities.md +4 -4
  683. package/docs/api/exports.json +2253 -3
  684. package/docs/api/exposure-exposure-duration-control.md +9 -9
  685. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  686. package/docs/api/exposure-exposure.md +10 -10
  687. package/docs/api/exposure-flash-ttl.md +182 -0
  688. package/docs/api/exposure-flash.md +183 -28
  689. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  690. package/docs/api/exposure-metering-target.md +9 -8
  691. package/docs/api/exposure-metering-temporal.md +8 -8
  692. package/docs/api/exposure-metering.md +69 -9
  693. package/docs/api/exposure-program-line.md +6 -5
  694. package/docs/api/facade-chart-radiance-batch.md +96 -0
  695. package/docs/api/facade-chart-scenes.md +240 -0
  696. package/docs/api/facade-scene-radiance.md +122 -0
  697. package/docs/api/facade-simulate-capture.md +397 -0
  698. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  699. package/docs/api/gpu-image-kernel-execution.md +152 -0
  700. package/docs/api/motion-camera-rotation.md +43 -26
  701. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  702. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  703. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  704. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  705. package/docs/api/motion-extended-object-projection.md +10 -8
  706. package/docs/api/motion-projected-motion.md +8 -8
  707. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  708. package/docs/api/motion-video-sequence.md +159 -0
  709. package/docs/api/optics-aperture.md +8 -8
  710. package/docs/api/optics-atmospheric-haze.md +104 -0
  711. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  712. package/docs/api/optics-circle-of-confusion.md +5 -4
  713. package/docs/api/optics-complex-pupil-psf.md +57 -16
  714. package/docs/api/optics-depth-of-field.md +12 -6
  715. package/docs/api/optics-diffraction-psf-profile.md +96 -0
  716. package/docs/api/optics-diffraction.md +8 -7
  717. package/docs/api/optics-focus-breathing.md +104 -16
  718. package/docs/api/optics-focus-state.md +9 -10
  719. package/docs/api/optics-front-of-lens-filter.md +72 -14
  720. package/docs/api/optics-illumination-vignetting.md +10 -10
  721. package/docs/api/optics-irradiance-convolution.md +95 -0
  722. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  723. package/docs/api/optics-lens-psf-kernels.md +72 -0
  724. package/docs/api/optics-lens-psf-profile.md +48 -26
  725. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  726. package/docs/api/optics-polygon-diffraction.md +78 -13
  727. package/docs/api/optics-profile-contract.md +4 -4
  728. package/docs/api/optics-psf-foundation.md +12 -12
  729. package/docs/api/optics-pupil-vignetting.md +132 -0
  730. package/docs/api/optics-radial-distortion.md +12 -12
  731. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  732. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  733. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  734. package/docs/api/optics-sensor-environment-query.md +52 -9
  735. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  736. package/docs/api/optics-stray-light.md +12 -11
  737. package/docs/api/optics-thin-lens.md +4 -3
  738. package/docs/api/optics-zernike-wavefront.md +229 -0
  739. package/docs/api/output-capture-corrected-sdr.md +10 -7
  740. package/docs/api/output-capture-geometry.md +35 -36
  741. package/docs/api/output-capture-sdr.md +4 -4
  742. package/docs/api/output-crop.md +7 -4
  743. package/docs/api/output-geometric-transforms.md +65 -19
  744. package/docs/api/output-lens-corrections.md +17 -15
  745. package/docs/api/output-native-capture-sdr.md +26 -13
  746. package/docs/api/output-png-encoder.md +105 -0
  747. package/docs/api/output-print-contrast-reference.md +8 -8
  748. package/docs/api/output-print-detail.md +14 -14
  749. package/docs/api/output-print-jpeg.md +22 -5
  750. package/docs/api/output-print-plan.md +18 -18
  751. package/docs/api/output-print-region-statistics.md +14 -14
  752. package/docs/api/output-sdr-rendering.md +52 -10
  753. package/docs/api/output-subject-framing-crop.md +5 -6
  754. package/docs/api/processing-demosaic.md +120 -0
  755. package/docs/api/processing-denoise.md +148 -0
  756. package/docs/api/processing-focus-stacking.md +41 -0
  757. package/docs/api/processing-hdr.md +113 -0
  758. package/docs/api/processing-panorama.md +82 -0
  759. package/docs/api/processing-processing-task.md +107 -0
  760. package/docs/api/processing-tone-mapping.md +142 -0
  761. package/docs/api/schema-camera.md +6 -4
  762. package/docs/api/schema-illumination-spectral.md +10 -11
  763. package/docs/api/schema-illumination-temporal.md +13 -15
  764. package/docs/api/schema-illumination.md +4 -4
  765. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  766. package/docs/api/schema-scene-radiance.md +18 -17
  767. package/docs/api/schema-scene.md +9 -9
  768. package/docs/api/schema-validation.md +1 -1
  769. package/docs/api/sensor-accumulated-charge.md +12 -20
  770. package/docs/api/sensor-architecture.md +15 -16
  771. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  772. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  773. package/docs/api/sensor-capture-mode-timing.md +9 -9
  774. package/docs/api/sensor-capture-mode.md +29 -30
  775. package/docs/api/sensor-color-sampling.md +31 -33
  776. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  777. package/docs/api/sensor-dark-current.md +30 -14
  778. package/docs/api/sensor-environment-photo-signal.md +13 -6
  779. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  780. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  781. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  782. package/docs/api/sensor-exposure-window.md +24 -24
  783. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  784. package/docs/api/sensor-iso-gain.md +63 -0
  785. package/docs/api/sensor-iso-signal-chain.md +13 -22
  786. package/docs/api/sensor-local-exposure-binding.md +12 -13
  787. package/docs/api/sensor-optical-stack.md +37 -40
  788. package/docs/api/sensor-photon-energy.md +10 -11
  789. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  790. package/docs/api/sensor-pixel-pitch.md +1 -1
  791. package/docs/api/sensor-radiometry-readiness.md +9 -9
  792. package/docs/api/sensor-raw-readout.md +118 -52
  793. package/docs/api/sensor-raw-reconstruction.md +97 -20
  794. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  795. package/docs/api/sensor-readout-timing.md +33 -35
  796. package/docs/api/sensor-response-application-compatibility.md +9 -11
  797. package/docs/api/sensor-response-operating-range.md +14 -18
  798. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  799. package/docs/api/sensor-sampling-aperture.md +22 -25
  800. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  801. package/docs/api/sensor-sensor-geometry.md +23 -24
  802. package/docs/api/sensor-signal-noise.md +10 -10
  803. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  804. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  805. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  806. package/docs/api/sensor-spectral-coverage.md +5 -5
  807. package/docs/api/sensor-spectral-quadrature.md +33 -35
  808. package/docs/api/sensor-spectral-response.md +28 -16
  809. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  810. package/docs/api/simulation-poc-simulation.md +17 -16
  811. package/docs/api/stabilization-camera-shake.md +29 -10
  812. package/docs/api/stabilization-system.md +25 -21
  813. package/docs/examples/production-request.json +3821 -2157
  814. package/docs/examples/simulate-capture.mjs +14 -0
  815. package/llms.txt +35 -0
  816. package/package.json +32 -11
  817. package/AGENTS.md +0 -674
  818. package/CONTRIBUTING.md +0 -76
  819. package/DCO +0 -33
  820. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  821. package/dist/camera/field-of-view.d.ts.map +0 -1
  822. package/dist/camera/projected-object-size.d.ts.map +0 -1
  823. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  824. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  825. package/dist/capture/export-jpeg.d.ts.map +0 -1
  826. package/dist/capture/export-tiff.d.ts.map +0 -1
  827. package/dist/capture/focus-control.d.ts.map +0 -1
  828. package/dist/capture/linear-encoding.d.ts.map +0 -1
  829. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  830. package/dist/capture/native-raw-development.d.ts.map +0 -1
  831. package/dist/capture/native-raw.d.ts.map +0 -1
  832. package/dist/capture/photographic-export.d.ts.map +0 -1
  833. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  834. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  835. package/dist/capture/release-sequence.d.ts.map +0 -1
  836. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  837. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  838. package/dist/capture/simulated-capture.d.ts.map +0 -1
  839. package/dist/color/capture-color.d.ts.map +0 -1
  840. package/dist/color/sensor-color-development.d.ts.map +0 -1
  841. package/dist/color/srgb-icc.d.ts.map +0 -1
  842. package/dist/color/srgb-transfer.d.ts.map +0 -1
  843. package/dist/color/white-balance.d.ts.map +0 -1
  844. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  845. package/dist/composition/plan-consumer.d.ts.map +0 -1
  846. package/dist/core/calculation-result.d.ts.map +0 -1
  847. package/dist/core/canonical-json.d.ts.map +0 -1
  848. package/dist/core/configuration-error.d.ts.map +0 -1
  849. package/dist/core/evidence-provenance.d.ts.map +0 -1
  850. package/dist/core/image-formation.d.ts.map +0 -1
  851. package/dist/core/owned-data.d.ts.map +0 -1
  852. package/dist/core/record-validation.d.ts.map +0 -1
  853. package/dist/core/scientific-assurance.d.ts.map +0 -1
  854. package/dist/core/spectral-composition.d.ts.map +0 -1
  855. package/dist/core/spectral.d.ts.map +0 -1
  856. package/dist/core/validation.d.ts.map +0 -1
  857. package/dist/core/version.d.ts.map +0 -1
  858. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  859. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  860. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  861. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  862. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  863. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  864. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  865. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  866. package/dist/exposure/exposure.d.ts.map +0 -1
  867. package/dist/exposure/flash.d.ts.map +0 -1
  868. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  869. package/dist/exposure/metering-target.d.ts.map +0 -1
  870. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  871. package/dist/exposure/metering.d.ts.map +0 -1
  872. package/dist/exposure/program-line.d.ts.map +0 -1
  873. package/dist/index.d.ts.map +0 -1
  874. package/dist/motion/camera-rotation.d.ts.map +0 -1
  875. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  876. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  877. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  878. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  879. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  880. package/dist/motion/projected-motion.d.ts.map +0 -1
  881. package/dist/optics/aperture.d.ts.map +0 -1
  882. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  883. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  884. package/dist/optics/depth-of-field.d.ts.map +0 -1
  885. package/dist/optics/diffraction.d.ts.map +0 -1
  886. package/dist/optics/focus-breathing.d.ts.map +0 -1
  887. package/dist/optics/focus-state.d.ts.map +0 -1
  888. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  889. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  890. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  891. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  892. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  893. package/dist/optics/profile-contract.d.ts.map +0 -1
  894. package/dist/optics/psf-foundation.d.ts.map +0 -1
  895. package/dist/optics/radial-distortion.d.ts.map +0 -1
  896. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  897. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  898. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  899. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  900. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  901. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  902. package/dist/optics/stray-light.d.ts.map +0 -1
  903. package/dist/optics/thin-lens.d.ts.map +0 -1
  904. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  905. package/dist/output/capture-geometry.d.ts.map +0 -1
  906. package/dist/output/capture-sdr.d.ts.map +0 -1
  907. package/dist/output/crop.d.ts.map +0 -1
  908. package/dist/output/geometric-transforms.d.ts.map +0 -1
  909. package/dist/output/lens-corrections.d.ts.map +0 -1
  910. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  911. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  912. package/dist/output/print-detail.d.ts.map +0 -1
  913. package/dist/output/print-jpeg.d.ts.map +0 -1
  914. package/dist/output/print-plan.d.ts.map +0 -1
  915. package/dist/output/print-region-statistics.d.ts.map +0 -1
  916. package/dist/output/sdr-rendering.d.ts.map +0 -1
  917. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  918. package/dist/schema/camera.d.ts.map +0 -1
  919. package/dist/schema/camera.js +0 -3
  920. package/dist/schema/camera.js.map +0 -1
  921. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  922. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  923. package/dist/schema/illumination.d.ts.map +0 -1
  924. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  925. package/dist/schema/scene-radiance.d.ts.map +0 -1
  926. package/dist/schema/scene.d.ts.map +0 -1
  927. package/dist/schema/scene.js +0 -3
  928. package/dist/schema/scene.js.map +0 -1
  929. package/dist/schema/validation.d.ts.map +0 -1
  930. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  931. package/dist/sensor/architecture.d.ts.map +0 -1
  932. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  933. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  934. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  935. package/dist/sensor/capture-mode.d.ts.map +0 -1
  936. package/dist/sensor/color-sampling.d.ts.map +0 -1
  937. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  938. package/dist/sensor/dark-current.d.ts.map +0 -1
  939. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  940. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  941. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  942. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  943. package/dist/sensor/exposure-window.d.ts.map +0 -1
  944. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  945. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  946. package/dist/sensor/optical-stack.d.ts.map +0 -1
  947. package/dist/sensor/photon-energy.d.ts.map +0 -1
  948. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  949. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  950. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  951. package/dist/sensor/raw-readout.d.ts.map +0 -1
  952. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  953. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  954. package/dist/sensor/readout-timing.d.ts.map +0 -1
  955. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  956. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  957. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  958. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  959. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  960. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  961. package/dist/sensor/signal-noise.d.ts.map +0 -1
  962. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  963. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  964. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  965. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  966. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  967. package/dist/sensor/spectral-response.d.ts.map +0 -1
  968. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  969. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  970. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  971. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  972. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  973. package/dist/stabilization/system.d.ts.map +0 -1
  974. package/docs/API_STYLE.md +0 -235
  975. package/docs/ARCHITECTURE.md +0 -356
  976. package/docs/AUTOMATION_COORDINATION.md +0 -190
  977. package/docs/CAPTURE_COLOR.md +0 -25
  978. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  979. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  980. package/docs/CAPTURE_SDR.md +0 -22
  981. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  982. package/docs/DEVELOPERS.md +0 -68
  983. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  984. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  985. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  986. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  987. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  988. package/docs/IMAGE_FORMATION.md +0 -247
  989. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  990. package/docs/MOTION_AND_SIGNAL.md +0 -250
  991. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  992. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  993. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  994. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  995. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  996. package/docs/PERFORMANCE_BASELINE.md +0 -56
  997. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  998. package/docs/PHYSICS_FOUNDATION.md +0 -426
  999. package/docs/POC_API.md +0 -278
  1000. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  1001. package/docs/POC_PROJECTION_REUSE.md +0 -124
  1002. package/docs/PRINT_195_196_REVIEW.md +0 -93
  1003. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  1004. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  1005. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  1006. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1007. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1008. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1009. package/docs/PRINT_PLANNING.md +0 -75
  1010. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1011. package/docs/PROCESSED_OUTPUT.md +0 -157
  1012. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1013. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1014. package/docs/PROVENANCE.md +0 -115
  1015. package/docs/PSF_FOUNDATION.md +0 -165
  1016. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1017. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1018. package/docs/RELEASE_1_0.md +0 -66
  1019. package/docs/RELEASE_1_0_1.md +0 -61
  1020. package/docs/RELEASE_1_1_0.md +0 -25
  1021. package/docs/RELEASE_1_2_0.md +0 -51
  1022. package/docs/RELEASE_1_3_0.md +0 -15
  1023. package/docs/RELEASE_1_4_0.md +0 -23
  1024. package/docs/RELEASE_1_5_0.md +0 -105
  1025. package/docs/RELEASE_AUDIT.md +0 -39
  1026. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1027. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1028. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1029. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1030. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1031. package/docs/SDR_RENDERING.md +0 -33
  1032. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1033. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1034. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1035. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1036. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1037. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1038. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1039. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1040. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1041. package/docs/SIMULATED_CAPTURE.md +0 -65
  1042. package/docs/STABILIZATION.md +0 -234
  1043. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1044. package/docs/TIER_ACCEPTANCE.md +0 -129
  1045. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1046. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1047. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1048. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1049. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1050. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1051. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1052. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1053. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1054. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1055. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1056. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1057. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1058. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1059. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1060. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1061. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1062. package/docs/validation/documentation-fragments.json +0 -212
  1063. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1064. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1065. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1069. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1071. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1072. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1073. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1074. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1075. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1076. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1077. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1078. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1079. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1080. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1081. package/docs/validation/print-detail-capabilities.json +0 -103
  1082. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1083. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1084. package/docs/validation/release-audit-inventory.json +0 -1306
  1085. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1,461 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Browser-safe PNG still-image encoder for 8- and 16-bit RGB, with explicit colour signalling for wide-gamut
4
+ * and HDR output. Independently written from the W3C PNG Specification (Third Edition, W3C Recommendation
5
+ * 24 June 2025), RFC 1950 (zlib) and RFC 1951 (DEFLATE); no third-party encoder source and no dependency.
6
+ *
7
+ * - Colour: exactly one of an sRGB chunk (plus the gAMA/cHRM compatibility values the PNG specification
8
+ * lists), an iCCP embedded ICC profile, or a cICP chunk with ITU-T H.273 code points (BT.709/sRGB,
9
+ * Display P3, BT.2020 primaries; sRGB, BT.709 or linear transfer). PQ and HLG code points are not written:
10
+ * those transfer functions are not part of 2.0 (see THIRD_PARTY.md).
11
+ * - Static display metadata: mDCV (mastering display colour volume) and cLLI (MaxCLL/MaxFALL), only with cICP,
12
+ * as defined in the W3C PNG Third Edition and ITU-T H.265 Annex D (also SMPTE ST 2086 and CTA-861.3). The
13
+ * PNG specification allows mDCV with SDR encodings too, so both stay available for the remaining code points.
14
+ * - Compression: zlib with stored or fixed-Huffman DEFLATE blocks and a bounded greedy LZ77 matcher.
15
+ * Output bytes are a pure function of the input; no platform CompressionStream is used.
16
+ *
17
+ * The encoder writes the caller's integer code values unchanged. Converting linear light to an encoded
18
+ * signal (for example sRGB) and choosing a gamut mapping is the caller's job.
19
+ * @see docs/IMPORT_AND_PNG.md for chunk layouts, code points and limits.
20
+ */
21
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
22
+ export const PNG_ENCODER_ID = "photivra-png-rgb-v1";
23
+ /** Limits, checked before allocation. 100 MP (megapixels) of 16-bit RGB is about 600 MB of filtered scanlines. */
24
+ export const PNG_ENCODER_LIMITS = Object.freeze({ maximumDimension: 65535, maximumPixels: 100_000_000, maximumIccProfileBytes: 4_000_000 });
25
+ // Maps, not plain objects: a lookup must never reach Object.prototype names such as "constructor" or "toString".
26
+ const PRIMARIES = new Map([["bt709", 1], ["display-p3", 12], ["bt2020", 9]]);
27
+ const TRANSFER = new Map([["bt709", 1], ["linear", 8], ["srgb", 13]]);
28
+ const INTENT = new Map([["perceptual", 0], ["relative-colorimetric", 1], ["saturation", 2], ["absolute-colorimetric", 3]]);
29
+ const COLOUR_ENCODING_FIELDS = Object.freeze({
30
+ srgb: ["kind", "renderingIntent"], icc: ["kind", "profileName", "profile"], cicp: ["kind", "primaries", "transfer", "fullRange"]
31
+ });
32
+ function fail(message) { throw new InvalidConfigurationError("PNG encoder: " + message); }
33
+ /** Growable byte sink; doubles capacity as needed. */
34
+ class ByteSink {
35
+ bytes = new Uint8Array(1 << 16);
36
+ length = 0;
37
+ reserve(count) {
38
+ if (this.length + count <= this.bytes.length)
39
+ return;
40
+ let size = this.bytes.length * 2;
41
+ while (size < this.length + count)
42
+ size *= 2;
43
+ const grown = new Uint8Array(size);
44
+ grown.set(this.bytes.subarray(0, this.length));
45
+ this.bytes = grown;
46
+ }
47
+ push(...values) { this.reserve(values.length); for (const v of values)
48
+ this.bytes[this.length++] = v; }
49
+ append(data) { this.reserve(data.length); this.bytes.set(data, this.length); this.length += data.length; }
50
+ u32(v) { this.push(v >>> 24, (v >>> 16) & 255, (v >>> 8) & 255, v & 255); }
51
+ result() { return this.bytes.slice(0, this.length); }
52
+ }
53
+ let crcTable;
54
+ /** CRC-32 (ISO 3309 / ITU-T V.42 polynomial 0xEDB88320, reflected), as specified for PNG chunks. */
55
+ export function pngCrc32(data, initial = 0) {
56
+ const table = crcTable ??= Uint32Array.from({ length: 256 }, (_, n) => { let c = n; for (let k = 0; k < 8; k++)
57
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; return c >>> 0; });
58
+ let c = ~initial >>> 0;
59
+ for (let i = 0; i < data.length; i++)
60
+ c = table[(c ^ data[i]) & 255] ^ (c >>> 8);
61
+ return ~c >>> 0;
62
+ }
63
+ function adler32(data) {
64
+ let a = 1, b = 0;
65
+ for (let i = 0; i < data.length;) {
66
+ const end = Math.min(data.length, i + 5552); // largest run that cannot overflow before the modulo (RFC 1950)
67
+ for (; i < end; i++) {
68
+ a += data[i];
69
+ b += a;
70
+ }
71
+ a %= 65521;
72
+ b %= 65521;
73
+ }
74
+ return ((b << 16) | a) >>> 0;
75
+ }
76
+ const LENGTH_BASE = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];
77
+ const LENGTH_EXTRA = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];
78
+ const DIST_BASE = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];
79
+ const DIST_EXTRA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];
80
+ const DEFLATE_WINDOW = 32768;
81
+ /** Huffman codes are defined MSB-first (RFC 1951 §3.1.1); the stream is LSB-first, so codes are stored bit-reversed. */
82
+ function reverseBits(code, length) { let r = 0; for (let i = 0; i < length; i++)
83
+ r = (r << 1) | ((code >> i) & 1); return r; }
84
+ let fixedTables;
85
+ /** Built once: the same codes the per-symbol definition gives, precomputed and pre-reversed. */
86
+ function fixedHuffmanTables() {
87
+ if (fixedTables)
88
+ return fixedTables;
89
+ const literalCode = new Uint16Array(288), literalBits = new Uint8Array(288);
90
+ for (let symbol = 0; symbol < 288; symbol++) {
91
+ const [code, bits] = symbol < 144 ? [0x30 + symbol, 8] : symbol < 256 ? [0x190 + symbol - 144, 9] : symbol < 280 ? [symbol - 256, 7] : [0xc0 + symbol - 280, 8];
92
+ literalCode[symbol] = reverseBits(code, bits);
93
+ literalBits[symbol] = bits;
94
+ }
95
+ const lengthCode = new Uint16Array(259), lengthBits = new Uint8Array(259);
96
+ for (let length = 3, l = 0; length <= 258; length++) {
97
+ while (l < 28 && LENGTH_BASE[l + 1] <= length)
98
+ l++; // largest l with LENGTH_BASE[l] <= length
99
+ const symbol = 257 + l, bits = literalBits[symbol];
100
+ lengthCode[length] = literalCode[symbol] | ((length - LENGTH_BASE[l]) << bits);
101
+ lengthBits[length] = bits + LENGTH_EXTRA[l];
102
+ }
103
+ const distanceCode = new Uint32Array(DEFLATE_WINDOW + 1), distanceBits = new Uint8Array(DEFLATE_WINDOW + 1);
104
+ for (let distance = 1, d = 0; distance <= DEFLATE_WINDOW; distance++) {
105
+ while (d < 29 && DIST_BASE[d + 1] <= distance)
106
+ d++;
107
+ distanceCode[distance] = reverseBits(d, 5) | ((distance - DIST_BASE[d]) << 5);
108
+ distanceBits[distance] = 5 + DIST_EXTRA[d];
109
+ }
110
+ fixedTables = { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits };
111
+ return fixedTables;
112
+ }
113
+ /**
114
+ * zlib stream (RFC 1950: CMF 0x78 = deflate with 32 KiB window, FLG 0x01, Adler-32 trailer) holding stored
115
+ * blocks or one fixed-Huffman block. LZ77 is greedy with a 3-byte hash and at most 64 chain probes.
116
+ */
117
+ export function deflateZlib(data, mode) {
118
+ const n = data.length;
119
+ // Exact upper bound: a fixed-Huffman literal is at most 9 bits and a match of length L >= 3 at most 25 bits
120
+ // per 3 bytes, so the block needs at most 9 bits per input byte plus 3 header and 7 end-of-block bits.
121
+ const capacity = 2 + 4 + (mode === "stored" ? n + 5 * Math.max(1, Math.ceil(n / 65535)) : Math.ceil((9 * n + 10) / 8));
122
+ const out = new Uint8Array(capacity);
123
+ let pos = 0;
124
+ out[pos++] = 0x78;
125
+ out[pos++] = 0x01;
126
+ if (mode === "stored") {
127
+ if (n === 0) {
128
+ out[pos++] = 1;
129
+ out[pos++] = 0;
130
+ out[pos++] = 0;
131
+ out[pos++] = 255;
132
+ out[pos++] = 255;
133
+ }
134
+ for (let i = 0; i < n; i += 65535) {
135
+ const len = Math.min(65535, n - i);
136
+ out[pos++] = i + len >= n ? 1 : 0;
137
+ out[pos++] = len & 255;
138
+ out[pos++] = len >> 8;
139
+ out[pos++] = ~len & 255;
140
+ out[pos++] = (~len >> 8) & 255;
141
+ out.set(data.subarray(i, i + len), pos);
142
+ pos += len;
143
+ }
144
+ }
145
+ else {
146
+ const { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits } = fixedHuffmanTables();
147
+ // LSB-first bit accumulator; at most 7 bits stay pending, and no single write exceeds 18 bits.
148
+ let accumulator = 0b011, bits = 3; // BFINAL = 1, BTYPE = 01 (fixed Huffman)
149
+ const window = DEFLATE_WINDOW, mask = window - 1, head = new Int32Array(1 << 15).fill(-1), previous = new Int32Array(window).fill(-1);
150
+ // Hash of the 3 bytes at i: ((data[i] << 10) ^ (data[i + 1] << 5) ^ data[i + 2]) & 0x7fff. It rolls exactly as
151
+ // h(i + 1) = ((h(i) << 5) ^ data[i + 3]) & 0x7fff, because the mask drops every bit of data[i] after the shift.
152
+ const hashed = n - 2; // positions i < hashed have three bytes to hash
153
+ let h = n >= 2 ? ((data[0] << 5) ^ data[1]) & 0x7fff : 0;
154
+ for (let i = 0; i < n;) {
155
+ let bestLength = 0, bestDistance = 0;
156
+ if (i < hashed) {
157
+ h = ((h << 5) ^ data[i + 2]) & 0x7fff;
158
+ const limit = Math.min(258, n - i);
159
+ for (let candidate = head[h], probes = 0; candidate >= 0 && i - candidate <= window && probes < 64; candidate = previous[candidate & mask], probes++) {
160
+ if (candidate >= i)
161
+ break;
162
+ // A candidate that differs at index bestLength cannot be longer than the current best.
163
+ if (data[candidate + bestLength] !== data[i + bestLength])
164
+ continue;
165
+ let length = 0;
166
+ while (length < limit && data[candidate + length] === data[i + length])
167
+ length++;
168
+ if (length > bestLength) {
169
+ bestLength = length;
170
+ bestDistance = i - candidate;
171
+ if (length === limit)
172
+ break;
173
+ }
174
+ }
175
+ previous[i & mask] = head[h];
176
+ head[h] = i;
177
+ }
178
+ if (bestLength >= 3) {
179
+ accumulator |= lengthCode[bestLength] << bits;
180
+ bits += lengthBits[bestLength];
181
+ while (bits >= 8) {
182
+ out[pos++] = accumulator & 255;
183
+ accumulator >>>= 8;
184
+ bits -= 8;
185
+ }
186
+ accumulator |= distanceCode[bestDistance] << bits;
187
+ bits += distanceBits[bestDistance];
188
+ const end = i + bestLength;
189
+ for (i++; i < end; i++) {
190
+ if (i < hashed) {
191
+ h = ((h << 5) ^ data[i + 2]) & 0x7fff;
192
+ previous[i & mask] = head[h];
193
+ head[h] = i;
194
+ }
195
+ }
196
+ }
197
+ else {
198
+ const symbol = data[i++];
199
+ accumulator |= literalCode[symbol] << bits;
200
+ bits += literalBits[symbol];
201
+ }
202
+ while (bits >= 8) {
203
+ out[pos++] = accumulator & 255;
204
+ accumulator >>>= 8;
205
+ bits -= 8;
206
+ }
207
+ }
208
+ accumulator |= literalCode[256] << bits;
209
+ bits += literalBits[256];
210
+ while (bits > 0) {
211
+ out[pos++] = accumulator & 255;
212
+ accumulator >>>= 8;
213
+ bits -= 8;
214
+ } // flush and byte-align
215
+ }
216
+ const adler = adler32(data);
217
+ out[pos++] = adler >>> 24;
218
+ out[pos++] = (adler >>> 16) & 255;
219
+ out[pos++] = (adler >>> 8) & 255;
220
+ out[pos++] = adler & 255;
221
+ return out.slice(0, pos);
222
+ }
223
+ /** Writes PNG filter `type` (0–4, PNG specification §9.2) of `raw` against `prior` into `target`. */
224
+ function filterRow(type, raw, prior, target, rowBytes, bpp) {
225
+ const head = Math.min(bpp, rowBytes);
226
+ switch (type) {
227
+ case 0:
228
+ target.set(raw.subarray(0, rowBytes));
229
+ return;
230
+ case 1:
231
+ for (let i = 0; i < head; i++)
232
+ target[i] = raw[i];
233
+ for (let i = bpp; i < rowBytes; i++)
234
+ target[i] = (raw[i] - raw[i - bpp]) & 255;
235
+ return;
236
+ case 2:
237
+ for (let i = 0; i < rowBytes; i++)
238
+ target[i] = (raw[i] - prior[i]) & 255;
239
+ return;
240
+ case 3:
241
+ for (let i = 0; i < head; i++)
242
+ target[i] = (raw[i] - (prior[i] >> 1)) & 255;
243
+ for (let i = bpp; i < rowBytes; i++)
244
+ target[i] = (raw[i] - ((raw[i - bpp] + prior[i]) >> 1)) & 255;
245
+ return;
246
+ default:
247
+ // Paeth with a = c = 0 in the first pixel predicts b.
248
+ for (let i = 0; i < head; i++)
249
+ target[i] = (raw[i] - prior[i]) & 255;
250
+ for (let i = bpp; i < rowBytes; i++) {
251
+ const a = raw[i - bpp], b = prior[i], c = prior[i - bpp], p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);
252
+ target[i] = (raw[i] - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255;
253
+ }
254
+ }
255
+ }
256
+ /** |v| of a filtered byte v read as a signed byte (two's complement), for the §12.7 heuristic. */
257
+ const SIGNED_BYTE_MAGNITUDE = Uint8Array.from({ length: 256 }, (_, v) => (v < 128 ? v : 256 - v));
258
+ /** Sum of |signed byte| of filter `type` applied to a row (PNG specification §12.7), without writing the row. */
259
+ function filterCost(type, raw, prior, rowBytes, bpp) {
260
+ const head = Math.min(bpp, rowBytes), magnitude = SIGNED_BYTE_MAGNITUDE;
261
+ let sum = 0;
262
+ switch (type) {
263
+ case 0:
264
+ for (let i = 0; i < rowBytes; i++)
265
+ sum += magnitude[raw[i]];
266
+ return sum;
267
+ case 1:
268
+ for (let i = 0; i < head; i++)
269
+ sum += magnitude[raw[i]];
270
+ for (let i = bpp; i < rowBytes; i++)
271
+ sum += magnitude[(raw[i] - raw[i - bpp]) & 255];
272
+ return sum;
273
+ case 2:
274
+ for (let i = 0; i < rowBytes; i++)
275
+ sum += magnitude[(raw[i] - prior[i]) & 255];
276
+ return sum;
277
+ case 3:
278
+ for (let i = 0; i < head; i++)
279
+ sum += magnitude[(raw[i] - (prior[i] >> 1)) & 255];
280
+ for (let i = bpp; i < rowBytes; i++)
281
+ sum += magnitude[(raw[i] - ((raw[i - bpp] + prior[i]) >> 1)) & 255];
282
+ return sum;
283
+ default:
284
+ for (let i = 0; i < head; i++)
285
+ sum += magnitude[(raw[i] - prior[i]) & 255];
286
+ for (let i = bpp; i < rowBytes; i++) {
287
+ const a = raw[i - bpp], b = prior[i], c = prior[i - bpp], p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);
288
+ sum += magnitude[(raw[i] - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255];
289
+ }
290
+ return sum;
291
+ }
292
+ }
293
+ function requireFields(value, allowed, name) {
294
+ if (value === null || typeof value !== "object" || Array.isArray(value))
295
+ fail(name + " must be an object.");
296
+ for (const key of Object.keys(value))
297
+ if (!allowed.includes(key))
298
+ fail("unknown " + name + " field.");
299
+ }
300
+ function finite(value, minimum, maximum, message) {
301
+ if (typeof value !== "number" || !Number.isFinite(value) || value < minimum || value > maximum)
302
+ fail(message);
303
+ return value;
304
+ }
305
+ /**
306
+ * Encode an RGB still image as PNG (colour type 2, no interlace). Samples are written unchanged; 16-bit
307
+ * samples are stored big-endian as PNG requires. Throws `InvalidConfigurationError` for any invalid or
308
+ * inconsistent field before allocating the scanline buffer.
309
+ */
310
+ export function serializePngImage(input) {
311
+ if (input === null || typeof input !== "object")
312
+ fail("input must be an object.");
313
+ for (const key of Object.keys(input))
314
+ if (!["width", "height", "bitDepth", "samples", "colourEncoding", "masteringDisplay", "contentLightLevel", "compression", "filter"].includes(key))
315
+ fail("unknown input field.");
316
+ const { width, height, bitDepth, samples } = input;
317
+ if (![width, height].every((v) => Number.isSafeInteger(v) && v >= 1 && v <= PNG_ENCODER_LIMITS.maximumDimension) || width * height > PNG_ENCODER_LIMITS.maximumPixels)
318
+ fail("dimensions are out of range.");
319
+ if (bitDepth !== 8 && bitDepth !== 16)
320
+ fail("bitDepth must be 8 or 16.");
321
+ if (bitDepth === 8 ? !(samples instanceof Uint8Array) : !(samples instanceof Uint16Array))
322
+ fail("samples must be a Uint8Array for 8-bit or a Uint16Array for 16-bit.");
323
+ if (samples.length !== width * height * 3)
324
+ fail("samples must hold width x height RGB triples.");
325
+ const compression = input.compression ?? "fixed-huffman", filter = input.filter ?? "adaptive";
326
+ if (compression !== "stored" && compression !== "fixed-huffman")
327
+ fail("unknown compression.");
328
+ const filters = ["none", "sub", "up", "average", "paeth", "adaptive"];
329
+ if (!filters.includes(filter))
330
+ fail("unknown filter.");
331
+ const colour = input.colourEncoding;
332
+ if (colour === null || typeof colour !== "object")
333
+ fail("colourEncoding is required.");
334
+ const colourFields = typeof colour.kind === "string" && Object.hasOwn(COLOUR_ENCODING_FIELDS, colour.kind) ? COLOUR_ENCODING_FIELDS[colour.kind] : undefined;
335
+ if (colourFields === undefined)
336
+ fail("unknown colourEncoding kind.");
337
+ for (const key of Object.keys(colour))
338
+ if (!colourFields.includes(key))
339
+ fail("unknown colourEncoding field.");
340
+ if (input.masteringDisplay !== undefined)
341
+ requireFields(input.masteringDisplay, ["redXy", "greenXy", "blueXy", "whiteXy", "maximumLuminanceCdPerSquareMeter", "minimumLuminanceCdPerSquareMeter"], "masteringDisplay");
342
+ if (input.contentLightLevel !== undefined)
343
+ requireFields(input.contentLightLevel, ["maximumContentLightLevelCdPerSquareMeter", "maximumFrameAverageLightLevelCdPerSquareMeter"], "contentLightLevel");
344
+ const chunks = [];
345
+ const ihdr = new Uint8Array(13), view = new DataView(ihdr.buffer);
346
+ view.setUint32(0, width);
347
+ view.setUint32(4, height);
348
+ ihdr[8] = bitDepth;
349
+ ihdr[9] = 2; // colour type 2: truecolour
350
+ chunks.push({ type: "IHDR", data: ihdr });
351
+ if (colour.kind === "cicp") {
352
+ const p = PRIMARIES.get(colour.primaries), t = TRANSFER.get(colour.transfer);
353
+ if (p === undefined || t === undefined || typeof colour.fullRange !== "boolean")
354
+ fail("unknown cICP primaries or transfer.");
355
+ // MatrixCoefficients 0 (identity/RGB) is the only value PNG permits.
356
+ chunks.push({ type: "cICP", data: Uint8Array.of(p, t, 0, colour.fullRange ? 1 : 0) });
357
+ }
358
+ else if (colour.kind === "icc") {
359
+ const name = colour.profileName, profile = colour.profile;
360
+ if (typeof name !== "string" || !/^[\x20-\x7e\xa1-\xff]{1,79}$/.test(name) || name.startsWith(" ") || name.endsWith(" ") || name.includes(" "))
361
+ fail("ICC profile name must be 1-79 Latin-1 characters without leading, trailing or repeated spaces.");
362
+ if (!(profile instanceof Uint8Array) || profile.length < 132 || profile.length > PNG_ENCODER_LIMITS.maximumIccProfileBytes ||
363
+ new DataView(profile.buffer, profile.byteOffset, profile.byteLength).getUint32(0) !== profile.length)
364
+ fail("ICC profile must be a complete profile whose header size matches its length.");
365
+ const compressed = deflateZlib(profile, compression), data = new Uint8Array(name.length + 2 + compressed.length);
366
+ for (let i = 0; i < name.length; i++)
367
+ data[i] = name.charCodeAt(i);
368
+ data.set(compressed, name.length + 2); // NUL separator and compression method 0 are already zero
369
+ chunks.push({ type: "iCCP", data });
370
+ }
371
+ else if (colour.kind === "srgb") {
372
+ const intent = INTENT.get(colour.renderingIntent);
373
+ if (intent === undefined)
374
+ fail("unknown sRGB rendering intent.");
375
+ // PNG Third Edition Table 17: the only gAMA/cHRM values to accompany sRGB.
376
+ const gama = new Uint8Array(4);
377
+ new DataView(gama.buffer).setUint32(0, 45455);
378
+ const chrm = new Uint8Array(32), c = new DataView(chrm.buffer);
379
+ [31270, 32900, 64000, 33000, 30000, 60000, 15000, 6000].forEach((v, i) => c.setUint32(i * 4, v));
380
+ chunks.push({ type: "sRGB", data: Uint8Array.of(intent) }, { type: "gAMA", data: gama }, { type: "cHRM", data: chrm });
381
+ }
382
+ else
383
+ fail("unknown colourEncoding kind.");
384
+ if ((input.masteringDisplay || input.contentLightLevel) && colour.kind !== "cicp")
385
+ fail("mDCV and cLLI metadata require a cICP colour encoding.");
386
+ if (input.masteringDisplay) {
387
+ const m = input.masteringDisplay, data = new Uint8Array(24), d = new DataView(data.buffer);
388
+ [m.redXy, m.greenXy, m.blueXy, m.whiteXy].forEach((xy, i) => {
389
+ if (!Array.isArray(xy) || xy.length !== 2)
390
+ fail("mastering chromaticities must be [x, y] pairs.");
391
+ // Stored value = chromaticity / 0.00002, a PNG two-byte unsigned integer.
392
+ for (let k = 0; k < 2; k++)
393
+ d.setUint16(i * 4 + k * 2, Math.round(finite(xy[k], 0, 1.3107, "mastering chromaticity must be in 0..1.3107.") * 50000));
394
+ });
395
+ const max = finite(m.maximumLuminanceCdPerSquareMeter, 0, 429496.7295, "mastering luminance is out of range."), min = finite(m.minimumLuminanceCdPerSquareMeter, 0, 429496.7295, "mastering luminance is out of range.");
396
+ if (min >= max)
397
+ fail("mastering minimum luminance must be below the maximum.");
398
+ d.setUint32(16, Math.round(max * 10000));
399
+ d.setUint32(20, Math.round(min * 10000)); // divisor 0.0001 cd/m²
400
+ chunks.push({ type: "mDCV", data });
401
+ }
402
+ if (input.contentLightLevel) {
403
+ const l = input.contentLightLevel, data = new Uint8Array(8), d = new DataView(data.buffer);
404
+ const cll = finite(l.maximumContentLightLevelCdPerSquareMeter, 0, 429496.7295, "content light level is out of range."), fall = finite(l.maximumFrameAverageLightLevelCdPerSquareMeter, 0, 429496.7295, "content light level is out of range.");
405
+ if (cll !== 0 && fall > cll)
406
+ fail("MaxFALL cannot exceed MaxCLL.");
407
+ d.setUint32(0, Math.round(cll * 10000));
408
+ d.setUint32(4, Math.round(fall * 10000));
409
+ chunks.push({ type: "cLLI", data });
410
+ }
411
+ // Scanlines: one filter-type byte then big-endian samples; bpp = bytes per complete pixel.
412
+ const bpp = bitDepth === 8 ? 3 : 6, rowBytes = width * bpp;
413
+ let raw = new Uint8Array(rowBytes), prior = new Uint8Array(rowBytes);
414
+ const filtered = new Uint8Array(height * (rowBytes + 1)), fixedType = filters.indexOf(filter);
415
+ for (let y = 0; y < height; y++) {
416
+ const base = y * width * 3;
417
+ if (bitDepth === 8)
418
+ raw.set(samples.subarray(base, base + width * 3));
419
+ else
420
+ for (let i = 0; i < width * 3; i++) {
421
+ const v = samples[base + i];
422
+ raw[i * 2] = v >> 8;
423
+ raw[i * 2 + 1] = v & 255;
424
+ }
425
+ const row = y * (rowBytes + 1) + 1;
426
+ let type = fixedType;
427
+ if (filter === "adaptive") {
428
+ // PNG specification §12.7 heuristic: choose the type with the minimum sum of |signed byte| (ties: lowest type).
429
+ let best = Infinity;
430
+ for (let t = 0; t <= 4; t++) {
431
+ const sum = filterCost(t, raw, prior, rowBytes, bpp);
432
+ if (sum < best) {
433
+ best = sum;
434
+ type = t;
435
+ }
436
+ }
437
+ }
438
+ filtered[row - 1] = type;
439
+ filterRow(type, raw, prior, filtered.subarray(row, row + rowBytes), rowBytes, bpp);
440
+ const done = prior;
441
+ prior = raw;
442
+ raw = done; // this row is the next row's prior
443
+ }
444
+ const idat = deflateZlib(filtered, compression);
445
+ const out = new ByteSink();
446
+ out.push(137, 80, 78, 71, 13, 10, 26, 10);
447
+ const writeChunk = (type, data) => {
448
+ const typeBytes = Uint8Array.from(type, (ch) => ch.charCodeAt(0));
449
+ out.u32(data.length);
450
+ out.append(typeBytes);
451
+ out.append(data);
452
+ out.u32(pngCrc32(data, pngCrc32(typeBytes)));
453
+ };
454
+ for (const chunk of chunks)
455
+ writeChunk(chunk.type, chunk.data);
456
+ for (let i = 0; i < idat.length; i += 1 << 20)
457
+ writeChunk("IDAT", idat.subarray(i, Math.min(idat.length, i + (1 << 20))));
458
+ writeChunk("IEND", new Uint8Array(0));
459
+ return out.result();
460
+ }
461
+ //# sourceMappingURL=png-encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png-encoder.js","sourceRoot":"","sources":["../../src/output/png-encoder.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,CAAC,MAAM,cAAc,GAAG,qBAA8B,CAAC;AAC7D,kHAAkH;AAClH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAC;AAuC5I,iHAAiH;AACjH,MAAM,SAAS,GAAgC,IAAI,GAAG,CAA2B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpI,MAAM,QAAQ,GAAgC,IAAI,GAAG,CAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5H,MAAM,MAAM,GAAgC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxJ,MAAM,sBAAsB,GAAgD,MAAM,CAAC,MAAM,CAAC;IACxF,IAAI,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC;CACjI,CAAC,CAAC;AACH,SAAS,IAAI,CAAC,OAAe,IAAW,MAAM,IAAI,yBAAyB,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEzG,sDAAsD;AACtD,MAAM,QAAQ;IACZ,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAa;QACnB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QACrD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAAC,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK;YAAE,IAAI,IAAI,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,GAAG,MAAgB,IAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvH,MAAM,CAAC,IAAgB,IAAU,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5H,GAAG,CAAC,CAAS,IAAU,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,KAAiB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAClE;AAED,IAAI,QAAiC,CAAC;AACtC,oGAAoG;AACpG,MAAM,UAAU,QAAQ,CAAC,IAAgB,EAAE,OAAO,GAAG,CAAC;IACpD,MAAM,KAAK,GAAG,QAAQ,KAAK,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjL,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AACD,SAAS,OAAO,CAAC,IAAgB;IAC/B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,gEAAgE;QAC7G,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAC/C,CAAC,IAAI,KAAK,CAAC;QAAC,CAAC,IAAI,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACxI,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7G,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACjK,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACtH,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B,wHAAwH;AACxH,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc,IAAY,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;IAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAUtJ,IAAI,WAA2C,CAAC;AAChD,gGAAgG;AAChG,SAAS,kBAAkB;IACzB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5E,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAChK,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5E,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1E,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,GAAG,CAAC,CAAE,IAAI,MAAM;YAAE,CAAC,EAAE,CAAC,CAAC,0CAA0C;QAC/F,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,MAAM,CAAE,CAAC;QACpD,UAAU,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAE,GAAG,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,CAAC,CAAC;QAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;IACjI,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAC5G,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC;QACrE,OAAO,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,IAAI,QAAQ;YAAE,CAAC,EAAE,CAAC;QACpD,YAAY,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;IAC9H,CAAC;IACD,WAAW,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;IAC/F,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB,EAAE,IAAgC;IAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,4GAA4G;IAC5G,uGAAuG;IACvG,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvH,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACrC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAAC,CAAC;QACpG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YAC1I,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YAAC,GAAG,IAAI,GAAG,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC9G,+FAA+F;QAC/F,IAAI,WAAW,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,yCAAyC;QAC5E,MAAM,MAAM,GAAG,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtI,+GAA+G;QAC/G,gHAAgH;QAChH,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,gDAAgD;QACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;YACvB,IAAI,UAAU,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;gBACf,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC;gBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnC,KAAK,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,MAAM,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAE,EAAE,MAAM,EAAE,EAAE,CAAC;oBACvJ,IAAI,SAAS,IAAI,CAAC;wBAAE,MAAM;oBAC1B,uFAAuF;oBACvF,IAAI,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC;wBAAE,SAAS;oBACpE,IAAI,MAAM,GAAG,CAAC,CAAC;oBAAC,OAAO,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;wBAAE,MAAM,EAAE,CAAC;oBACjG,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;wBAAC,UAAU,GAAG,MAAM,CAAC;wBAAC,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC;wBAAC,IAAI,MAAM,KAAK,KAAK;4BAAE,MAAM;oBAAC,CAAC;gBAC9G,CAAC;gBACD,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,WAAW,IAAI,UAAU,CAAC,UAAU,CAAE,IAAI,IAAI,CAAC;gBAAC,IAAI,IAAI,UAAU,CAAC,UAAU,CAAE,CAAC;gBAChF,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;oBAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC;oBAAC,WAAW,MAAM,CAAC,CAAC;oBAAC,IAAI,IAAI,CAAC,CAAC;gBAAC,CAAC;gBACpF,WAAW,IAAI,YAAY,CAAC,YAAY,CAAE,IAAI,IAAI,CAAC;gBAAC,IAAI,IAAI,YAAY,CAAC,YAAY,CAAE,CAAC;gBACxF,MAAM,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;gBAC3B,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;wBAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC;wBAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;wBAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;gBACzG,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAE,CAAC;gBAC1B,WAAW,IAAI,WAAW,CAAC,MAAM,CAAE,IAAI,IAAI,CAAC;gBAAC,IAAI,IAAI,WAAW,CAAC,MAAM,CAAE,CAAC;YAC5E,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC;gBAAC,WAAW,MAAM,CAAC,CAAC;gBAAC,IAAI,IAAI,CAAC,CAAC;YAAC,CAAC;QACtF,CAAC;QACD,WAAW,IAAI,WAAW,CAAC,GAAG,CAAE,IAAI,IAAI,CAAC;QAAC,IAAI,IAAI,WAAW,CAAC,GAAG,CAAE,CAAC;QACpE,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC;YAAC,WAAW,MAAM,CAAC,CAAC;YAAC,IAAI,IAAI,CAAC,CAAC;QAAC,CAAC,CAAC,uBAAuB;IAC7G,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;IACzH,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,SAAS,SAAS,CAAC,IAAY,EAAE,GAAe,EAAE,KAAiB,EAAE,MAAkB,EAAE,QAAgB,EAAE,GAAW;IACpH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YAAC,OAAO;QACtD,KAAK,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;YACnD,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC,GAAG,GAAG,CAAC;YACjF,OAAO;QACT,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC;YAAC,OAAO;QAC3F,KAAK,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC9E,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACtG,OAAO;QACT;YACE,sDAAsD;YACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC;YACvE,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7I,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC9E,CAAC;IACL,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAElG,iHAAiH;AACjH,SAAS,UAAU,CAAC,IAAY,EAAE,GAAe,EAAE,KAAiB,EAAE,QAAgB,EAAE,GAAW;IACjG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC;IACxE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAE,CAAC;YAAC,OAAO,GAAG,CAAC;QAClF,KAAK,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAE,CAAE,CAAC;YAC1D,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC,GAAG,GAAG,CAAE,CAAC;YACxF,OAAO,GAAG,CAAC;QACb,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAE,CAAC;YAAC,OAAO,GAAG,CAAC;QACtG,KAAK,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC;YACrF,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC;YAC7G,OAAO,GAAG,CAAC;QACb;YACE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAE,CAAC;YAC9E,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7I,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC;YACrF,CAAC;YACD,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,OAA0B,EAAE,IAAY;IAC7E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC;IAC5G,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe,EAAE,OAAe;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO;QAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9G,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtN,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACnD,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,KAAK,GAAG,MAAM,GAAG,kBAAkB,CAAC,aAAa;QAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5M,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,EAAE;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzE,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC;QAAE,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACvK,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;IAC9F,IAAI,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,eAAe;QAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;IAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9J,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9G,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAAE,aAAa,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,kCAAkC,EAAE,kCAAkC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACvN,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS;QAAE,aAAa,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,0CAA0C,EAAE,+CAA+C,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAEtM,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;IAClH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC7H,qEAAqE;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,gGAAgG,CAAC,CAAC;QACxP,IAAI,CAAC,CAAC,OAAO,YAAY,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC,sBAAsB;YACxH,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC7L,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACjH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0DAA0D;QACjG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACjE,2EAA2E;QAC3E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzH,CAAC;;QAAM,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAClJ,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAClG,0EAA0E;YAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,MAAM,EAAE,8CAA8C,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACxJ,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAAC,EAAE,WAAW,EAAE,sCAAsC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAAC,EAAE,WAAW,EAAE,sCAAsC,CAAC,CAAC;QACzN,IAAI,GAAG,IAAI,GAAG;YAAE,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC/E,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAC3G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,wCAAwC,EAAE,CAAC,EAAE,WAAW,EAAE,sCAAsC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,6CAA6C,EAAE,CAAC,EAAE,WAAW,EAAE,sCAAsC,CAAC,CAAC;QAC/O,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG;YAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,2FAA2F;IAC3F,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC;IAC3D,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC3B,IAAI,QAAQ,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,CAAE,OAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;;YACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;gBAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAAC,CAAC;QACzH,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,SAAS,CAAC;QACrB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,gHAAgH;YAChH,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACrD,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;oBAAC,IAAI,GAAG,GAAG,CAAC;oBAAC,IAAI,GAAG,CAAC,CAAC;gBAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,KAAK,CAAC;QAAC,KAAK,GAAG,GAAG,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,CAAC,mCAAmC;IAClF,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAgB,EAAQ,EAAE;QAC1D,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1H,UAAU,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;AACtB,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Browser-safe PNG still-image encoder for 8- and 16-bit RGB, with explicit colour signalling for wide-gamut\n * and HDR output. Independently written from the W3C PNG Specification (Third Edition, W3C Recommendation\n * 24 June 2025), RFC 1950 (zlib) and RFC 1951 (DEFLATE); no third-party encoder source and no dependency.\n *\n * - Colour: exactly one of an sRGB chunk (plus the gAMA/cHRM compatibility values the PNG specification\n * lists), an iCCP embedded ICC profile, or a cICP chunk with ITU-T H.273 code points (BT.709/sRGB,\n * Display P3, BT.2020 primaries; sRGB, BT.709 or linear transfer). PQ and HLG code points are not written:\n * those transfer functions are not part of 2.0 (see THIRD_PARTY.md).\n * - Static display metadata: mDCV (mastering display colour volume) and cLLI (MaxCLL/MaxFALL), only with cICP,\n * as defined in the W3C PNG Third Edition and ITU-T H.265 Annex D (also SMPTE ST 2086 and CTA-861.3). The\n * PNG specification allows mDCV with SDR encodings too, so both stay available for the remaining code points.\n * - Compression: zlib with stored or fixed-Huffman DEFLATE blocks and a bounded greedy LZ77 matcher.\n * Output bytes are a pure function of the input; no platform CompressionStream is used.\n *\n * The encoder writes the caller's integer code values unchanged. Converting linear light to an encoded\n * signal (for example sRGB) and choosing a gamut mapping is the caller's job.\n * @see docs/IMPORT_AND_PNG.md for chunk layouts, code points and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport const PNG_ENCODER_ID = \"photivra-png-rgb-v1\" as const;\n/** Limits, checked before allocation. 100 MP (megapixels) of 16-bit RGB is about 600 MB of filtered scanlines. */\nexport const PNG_ENCODER_LIMITS = Object.freeze({ maximumDimension: 65535, maximumPixels: 100_000_000, maximumIccProfileBytes: 4_000_000 });\n\n/** ITU-T H.273 ColourPrimaries: bt709 = 1 (also sRGB), display-p3 = 12 (P3 primaries with D65 white; W3C CSS Color 4, also SMPTE EG 432-1), bt2020 = 9 (BT.2020). */\nexport type PngCicpPrimaries = \"bt709\" | \"display-p3\" | \"bt2020\";\n/** ITU-T H.273 TransferCharacteristics: bt709 = 1, linear = 8, srgb = 13 (sRGB). PQ (16) and HLG (18) are not offered in 2.0. */\nexport type PngCicpTransfer = \"bt709\" | \"linear\" | \"srgb\";\nexport type PngColourEncoding =\n | { kind: \"srgb\"; renderingIntent: \"perceptual\" | \"relative-colorimetric\" | \"saturation\" | \"absolute-colorimetric\" }\n | { kind: \"icc\"; profileName: string; profile: Uint8Array }\n | { kind: \"cicp\"; primaries: PngCicpPrimaries; transfer: PngCicpTransfer; fullRange: boolean };\n/** Mastering display colour volume (W3C PNG mDCV; ITU-T H.265 Annex D SEI; also SMPTE ST 2086): CIE 1931 xy chromaticities and luminance in cd/m². */\nexport interface PngMasteringDisplay {\n redXy: readonly [number, number];\n greenXy: readonly [number, number];\n blueXy: readonly [number, number];\n whiteXy: readonly [number, number];\n maximumLuminanceCdPerSquareMeter: number;\n minimumLuminanceCdPerSquareMeter: number;\n}\n/** Content light level in cd/m² (W3C PNG cLLI; ITU-T H.265 content light level SEI; also CTA-861.3); 0 means unknown. */\nexport interface PngContentLightLevel {\n maximumContentLightLevelCdPerSquareMeter: number;\n maximumFrameAverageLightLevelCdPerSquareMeter: number;\n}\nexport interface PngEncodeInput {\n width: number;\n height: number;\n bitDepth: 8 | 16;\n /** Interleaved RGB code values, row-major; Uint8Array for 8-bit, Uint16Array for 16-bit. */\n samples: Uint8Array | Uint16Array;\n colourEncoding: PngColourEncoding;\n masteringDisplay?: PngMasteringDisplay;\n contentLightLevel?: PngContentLightLevel;\n /** Default \"fixed-huffman\". */\n compression?: \"stored\" | \"fixed-huffman\";\n /** PNG filter type 0..4 for every row, or the specification's minimum-sum-of-absolute-differences heuristic. Default \"adaptive\". */\n filter?: \"none\" | \"sub\" | \"up\" | \"average\" | \"paeth\" | \"adaptive\";\n}\n\n// Maps, not plain objects: a lookup must never reach Object.prototype names such as \"constructor\" or \"toString\".\nconst PRIMARIES: ReadonlyMap<string, number> = new Map<PngCicpPrimaries, number>([[\"bt709\", 1], [\"display-p3\", 12], [\"bt2020\", 9]]);\nconst TRANSFER: ReadonlyMap<string, number> = new Map<PngCicpTransfer, number>([[\"bt709\", 1], [\"linear\", 8], [\"srgb\", 13]]);\nconst INTENT: ReadonlyMap<string, number> = new Map([[\"perceptual\", 0], [\"relative-colorimetric\", 1], [\"saturation\", 2], [\"absolute-colorimetric\", 3]]);\nconst COLOUR_ENCODING_FIELDS: Readonly<Record<string, readonly string[]>> = Object.freeze({\n srgb: [\"kind\", \"renderingIntent\"], icc: [\"kind\", \"profileName\", \"profile\"], cicp: [\"kind\", \"primaries\", \"transfer\", \"fullRange\"]\n});\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"PNG encoder: \" + message); }\n\n/** Growable byte sink; doubles capacity as needed. */\nclass ByteSink {\n bytes = new Uint8Array(1 << 16); length = 0;\n reserve(count: number): void {\n if (this.length + count <= this.bytes.length) return;\n let size = this.bytes.length * 2; while (size < this.length + count) size *= 2;\n const grown = new Uint8Array(size); grown.set(this.bytes.subarray(0, this.length)); this.bytes = grown;\n }\n push(...values: number[]): void { this.reserve(values.length); for (const v of values) this.bytes[this.length++] = v; }\n append(data: Uint8Array): void { this.reserve(data.length); this.bytes.set(data, this.length); this.length += data.length; }\n u32(v: number): void { this.push(v >>> 24, (v >>> 16) & 255, (v >>> 8) & 255, v & 255); }\n result(): Uint8Array { return this.bytes.slice(0, this.length); }\n}\n\nlet crcTable: Uint32Array | undefined;\n/** CRC-32 (ISO 3309 / ITU-T V.42 polynomial 0xEDB88320, reflected), as specified for PNG chunks. */\nexport function pngCrc32(data: Uint8Array, initial = 0): number {\n const table = crcTable ??= Uint32Array.from({ length: 256 }, (_, n) => { let c = n; for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; return c >>> 0; });\n let c = ~initial >>> 0;\n for (let i = 0; i < data.length; i++) c = table[(c ^ data[i]!) & 255]! ^ (c >>> 8);\n return ~c >>> 0;\n}\nfunction adler32(data: Uint8Array): number {\n let a = 1, b = 0;\n for (let i = 0; i < data.length;) {\n const end = Math.min(data.length, i + 5552); // largest run that cannot overflow before the modulo (RFC 1950)\n for (; i < end; i++) { a += data[i]!; b += a; }\n a %= 65521; b %= 65521;\n }\n return ((b << 16) | a) >>> 0;\n}\n\nconst LENGTH_BASE = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];\nconst LENGTH_EXTRA = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\nconst DIST_BASE = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];\nconst DIST_EXTRA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\nconst DEFLATE_WINDOW = 32768;\n\n/** Huffman codes are defined MSB-first (RFC 1951 §3.1.1); the stream is LSB-first, so codes are stored bit-reversed. */\nfunction reverseBits(code: number, length: number): number { let r = 0; for (let i = 0; i < length; i++) r = (r << 1) | ((code >> i) & 1); return r; }\n\ninterface FixedHuffmanTables {\n /** Bit-reversed RFC 1951 §3.2.6 fixed literal/length codes and their lengths, symbols 0–287. */\n literalCode: Uint16Array; literalBits: Uint8Array;\n /** Per match length 3–258: reversed length code with its extra bits appended, and the total bit count. */\n lengthCode: Uint16Array; lengthBits: Uint8Array;\n /** Per distance 1–32768: reversed 5-bit distance code with its extra bits appended, and the total bit count. */\n distanceCode: Uint32Array; distanceBits: Uint8Array;\n}\nlet fixedTables: FixedHuffmanTables | undefined;\n/** Built once: the same codes the per-symbol definition gives, precomputed and pre-reversed. */\nfunction fixedHuffmanTables(): FixedHuffmanTables {\n if (fixedTables) return fixedTables;\n const literalCode = new Uint16Array(288), literalBits = new Uint8Array(288);\n for (let symbol = 0; symbol < 288; symbol++) {\n const [code, bits] = symbol < 144 ? [0x30 + symbol, 8] : symbol < 256 ? [0x190 + symbol - 144, 9] : symbol < 280 ? [symbol - 256, 7] : [0xc0 + symbol - 280, 8];\n literalCode[symbol] = reverseBits(code, bits); literalBits[symbol] = bits;\n }\n const lengthCode = new Uint16Array(259), lengthBits = new Uint8Array(259);\n for (let length = 3, l = 0; length <= 258; length++) {\n while (l < 28 && LENGTH_BASE[l + 1]! <= length) l++; // largest l with LENGTH_BASE[l] <= length\n const symbol = 257 + l, bits = literalBits[symbol]!;\n lengthCode[length] = literalCode[symbol]! | ((length - LENGTH_BASE[l]!) << bits); lengthBits[length] = bits + LENGTH_EXTRA[l]!;\n }\n const distanceCode = new Uint32Array(DEFLATE_WINDOW + 1), distanceBits = new Uint8Array(DEFLATE_WINDOW + 1);\n for (let distance = 1, d = 0; distance <= DEFLATE_WINDOW; distance++) {\n while (d < 29 && DIST_BASE[d + 1]! <= distance) d++;\n distanceCode[distance] = reverseBits(d, 5) | ((distance - DIST_BASE[d]!) << 5); distanceBits[distance] = 5 + DIST_EXTRA[d]!;\n }\n fixedTables = { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits };\n return fixedTables;\n}\n\n/**\n * zlib stream (RFC 1950: CMF 0x78 = deflate with 32 KiB window, FLG 0x01, Adler-32 trailer) holding stored\n * blocks or one fixed-Huffman block. LZ77 is greedy with a 3-byte hash and at most 64 chain probes.\n */\nexport function deflateZlib(data: Uint8Array, mode: \"stored\" | \"fixed-huffman\"): Uint8Array {\n const n = data.length;\n // Exact upper bound: a fixed-Huffman literal is at most 9 bits and a match of length L >= 3 at most 25 bits\n // per 3 bytes, so the block needs at most 9 bits per input byte plus 3 header and 7 end-of-block bits.\n const capacity = 2 + 4 + (mode === \"stored\" ? n + 5 * Math.max(1, Math.ceil(n / 65535)) : Math.ceil((9 * n + 10) / 8));\n const out = new Uint8Array(capacity);\n let pos = 0;\n out[pos++] = 0x78; out[pos++] = 0x01;\n if (mode === \"stored\") {\n if (n === 0) { out[pos++] = 1; out[pos++] = 0; out[pos++] = 0; out[pos++] = 255; out[pos++] = 255; }\n for (let i = 0; i < n; i += 65535) {\n const len = Math.min(65535, n - i);\n out[pos++] = i + len >= n ? 1 : 0; out[pos++] = len & 255; out[pos++] = len >> 8; out[pos++] = ~len & 255; out[pos++] = (~len >> 8) & 255;\n out.set(data.subarray(i, i + len), pos); pos += len;\n }\n } else {\n const { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits } = fixedHuffmanTables();\n // LSB-first bit accumulator; at most 7 bits stay pending, and no single write exceeds 18 bits.\n let accumulator = 0b011, bits = 3; // BFINAL = 1, BTYPE = 01 (fixed Huffman)\n const window = DEFLATE_WINDOW, mask = window - 1, head = new Int32Array(1 << 15).fill(-1), previous = new Int32Array(window).fill(-1);\n // Hash of the 3 bytes at i: ((data[i] << 10) ^ (data[i + 1] << 5) ^ data[i + 2]) & 0x7fff. It rolls exactly as\n // h(i + 1) = ((h(i) << 5) ^ data[i + 3]) & 0x7fff, because the mask drops every bit of data[i] after the shift.\n const hashed = n - 2; // positions i < hashed have three bytes to hash\n let h = n >= 2 ? ((data[0]! << 5) ^ data[1]!) & 0x7fff : 0;\n for (let i = 0; i < n;) {\n let bestLength = 0, bestDistance = 0;\n if (i < hashed) {\n h = ((h << 5) ^ data[i + 2]!) & 0x7fff;\n const limit = Math.min(258, n - i);\n for (let candidate = head[h]!, probes = 0; candidate >= 0 && i - candidate <= window && probes < 64; candidate = previous[candidate & mask]!, probes++) {\n if (candidate >= i) break;\n // A candidate that differs at index bestLength cannot be longer than the current best.\n if (data[candidate + bestLength] !== data[i + bestLength]) continue;\n let length = 0; while (length < limit && data[candidate + length] === data[i + length]) length++;\n if (length > bestLength) { bestLength = length; bestDistance = i - candidate; if (length === limit) break; }\n }\n previous[i & mask] = head[h]!; head[h] = i;\n }\n if (bestLength >= 3) {\n accumulator |= lengthCode[bestLength]! << bits; bits += lengthBits[bestLength]!;\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n accumulator |= distanceCode[bestDistance]! << bits; bits += distanceBits[bestDistance]!;\n const end = i + bestLength;\n for (i++; i < end; i++) {\n if (i < hashed) { h = ((h << 5) ^ data[i + 2]!) & 0x7fff; previous[i & mask] = head[h]!; head[h] = i; }\n }\n } else {\n const symbol = data[i++]!;\n accumulator |= literalCode[symbol]! << bits; bits += literalBits[symbol]!;\n }\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n }\n accumulator |= literalCode[256]! << bits; bits += literalBits[256]!;\n while (bits > 0) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; } // flush and byte-align\n }\n const adler = adler32(data);\n out[pos++] = adler >>> 24; out[pos++] = (adler >>> 16) & 255; out[pos++] = (adler >>> 8) & 255; out[pos++] = adler & 255;\n return out.slice(0, pos);\n}\n\n/** Writes PNG filter `type` (0–4, PNG specification §9.2) of `raw` against `prior` into `target`. */\nfunction filterRow(type: number, raw: Uint8Array, prior: Uint8Array, target: Uint8Array, rowBytes: number, bpp: number): void {\n const head = Math.min(bpp, rowBytes);\n switch (type) {\n case 0: target.set(raw.subarray(0, rowBytes)); return;\n case 1:\n for (let i = 0; i < head; i++) target[i] = raw[i]!;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - raw[i - bpp]!) & 255;\n return;\n case 2: for (let i = 0; i < rowBytes; i++) target[i] = (raw[i]! - prior[i]!) & 255; return;\n case 3:\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - (prior[i]! >> 1)) & 255;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255;\n return;\n default:\n // Paeth with a = c = 0 in the first pixel predicts b.\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - prior[i]!) & 255;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n target[i] = (raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255;\n }\n }\n}\n\n/** |v| of a filtered byte v read as a signed byte (two's complement), for the §12.7 heuristic. */\nconst SIGNED_BYTE_MAGNITUDE = Uint8Array.from({ length: 256 }, (_, v) => (v < 128 ? v : 256 - v));\n\n/** Sum of |signed byte| of filter `type` applied to a row (PNG specification §12.7), without writing the row. */\nfunction filterCost(type: number, raw: Uint8Array, prior: Uint8Array, rowBytes: number, bpp: number): number {\n const head = Math.min(bpp, rowBytes), magnitude = SIGNED_BYTE_MAGNITUDE;\n let sum = 0;\n switch (type) {\n case 0: for (let i = 0; i < rowBytes; i++) sum += magnitude[raw[i]!]!; return sum;\n case 1:\n for (let i = 0; i < head; i++) sum += magnitude[raw[i]!]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - raw[i - bpp]!) & 255]!;\n return sum;\n case 2: for (let i = 0; i < rowBytes; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!; return sum;\n case 3:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - (prior[i]! >> 1)) & 255]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255]!;\n return sum;\n default:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n sum += magnitude[(raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255]!;\n }\n return sum;\n }\n}\n\nfunction requireFields(value: unknown, allowed: readonly string[], name: string): void {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) fail(name + \" must be an object.\");\n for (const key of Object.keys(value)) if (!allowed.includes(key)) fail(\"unknown \" + name + \" field.\");\n}\n\nfunction finite(value: number, minimum: number, maximum: number, message: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < minimum || value > maximum) fail(message);\n return value;\n}\n\n/**\n * Encode an RGB still image as PNG (colour type 2, no interlace). Samples are written unchanged; 16-bit\n * samples are stored big-endian as PNG requires. Throws `InvalidConfigurationError` for any invalid or\n * inconsistent field before allocating the scanline buffer.\n */\nexport function serializePngImage(input: PngEncodeInput): Uint8Array {\n if (input === null || typeof input !== \"object\") fail(\"input must be an object.\");\n for (const key of Object.keys(input)) if (![\"width\", \"height\", \"bitDepth\", \"samples\", \"colourEncoding\", \"masteringDisplay\", \"contentLightLevel\", \"compression\", \"filter\"].includes(key)) fail(\"unknown input field.\");\n const { width, height, bitDepth, samples } = input;\n if (![width, height].every((v) => Number.isSafeInteger(v) && v >= 1 && v <= PNG_ENCODER_LIMITS.maximumDimension) || width * height > PNG_ENCODER_LIMITS.maximumPixels) fail(\"dimensions are out of range.\");\n if (bitDepth !== 8 && bitDepth !== 16) fail(\"bitDepth must be 8 or 16.\");\n if (bitDepth === 8 ? !(samples instanceof Uint8Array) : !(samples instanceof Uint16Array)) fail(\"samples must be a Uint8Array for 8-bit or a Uint16Array for 16-bit.\");\n if (samples.length !== width * height * 3) fail(\"samples must hold width x height RGB triples.\");\n const compression = input.compression ?? \"fixed-huffman\", filter = input.filter ?? \"adaptive\";\n if (compression !== \"stored\" && compression !== \"fixed-huffman\") fail(\"unknown compression.\");\n const filters = [\"none\", \"sub\", \"up\", \"average\", \"paeth\", \"adaptive\"] as const;\n if (!filters.includes(filter)) fail(\"unknown filter.\");\n const colour = input.colourEncoding;\n if (colour === null || typeof colour !== \"object\") fail(\"colourEncoding is required.\");\n const colourFields = typeof colour.kind === \"string\" && Object.hasOwn(COLOUR_ENCODING_FIELDS, colour.kind) ? COLOUR_ENCODING_FIELDS[colour.kind]! : undefined;\n if (colourFields === undefined) fail(\"unknown colourEncoding kind.\");\n for (const key of Object.keys(colour)) if (!colourFields.includes(key)) fail(\"unknown colourEncoding field.\");\n if (input.masteringDisplay !== undefined) requireFields(input.masteringDisplay, [\"redXy\", \"greenXy\", \"blueXy\", \"whiteXy\", \"maximumLuminanceCdPerSquareMeter\", \"minimumLuminanceCdPerSquareMeter\"], \"masteringDisplay\");\n if (input.contentLightLevel !== undefined) requireFields(input.contentLightLevel, [\"maximumContentLightLevelCdPerSquareMeter\", \"maximumFrameAverageLightLevelCdPerSquareMeter\"], \"contentLightLevel\");\n\n const chunks: { type: string; data: Uint8Array }[] = [];\n const ihdr = new Uint8Array(13), view = new DataView(ihdr.buffer);\n view.setUint32(0, width); view.setUint32(4, height); ihdr[8] = bitDepth; ihdr[9] = 2; // colour type 2: truecolour\n chunks.push({ type: \"IHDR\", data: ihdr });\n if (colour.kind === \"cicp\") {\n const p = PRIMARIES.get(colour.primaries), t = TRANSFER.get(colour.transfer);\n if (p === undefined || t === undefined || typeof colour.fullRange !== \"boolean\") fail(\"unknown cICP primaries or transfer.\");\n // MatrixCoefficients 0 (identity/RGB) is the only value PNG permits.\n chunks.push({ type: \"cICP\", data: Uint8Array.of(p, t, 0, colour.fullRange ? 1 : 0) });\n } else if (colour.kind === \"icc\") {\n const name = colour.profileName, profile = colour.profile;\n if (typeof name !== \"string\" || !/^[\\x20-\\x7e\\xa1-\\xff]{1,79}$/.test(name) || name.startsWith(\" \") || name.endsWith(\" \") || name.includes(\" \")) fail(\"ICC profile name must be 1-79 Latin-1 characters without leading, trailing or repeated spaces.\");\n if (!(profile instanceof Uint8Array) || profile.length < 132 || profile.length > PNG_ENCODER_LIMITS.maximumIccProfileBytes ||\n new DataView(profile.buffer, profile.byteOffset, profile.byteLength).getUint32(0) !== profile.length) fail(\"ICC profile must be a complete profile whose header size matches its length.\");\n const compressed = deflateZlib(profile, compression), data = new Uint8Array(name.length + 2 + compressed.length);\n for (let i = 0; i < name.length; i++) data[i] = name.charCodeAt(i);\n data.set(compressed, name.length + 2); // NUL separator and compression method 0 are already zero\n chunks.push({ type: \"iCCP\", data });\n } else if (colour.kind === \"srgb\") {\n const intent = INTENT.get(colour.renderingIntent);\n if (intent === undefined) fail(\"unknown sRGB rendering intent.\");\n // PNG Third Edition Table 17: the only gAMA/cHRM values to accompany sRGB.\n const gama = new Uint8Array(4); new DataView(gama.buffer).setUint32(0, 45455);\n const chrm = new Uint8Array(32), c = new DataView(chrm.buffer);\n [31270, 32900, 64000, 33000, 30000, 60000, 15000, 6000].forEach((v, i) => c.setUint32(i * 4, v));\n chunks.push({ type: \"sRGB\", data: Uint8Array.of(intent) }, { type: \"gAMA\", data: gama }, { type: \"cHRM\", data: chrm });\n } else fail(\"unknown colourEncoding kind.\");\n if ((input.masteringDisplay || input.contentLightLevel) && colour.kind !== \"cicp\") fail(\"mDCV and cLLI metadata require a cICP colour encoding.\");\n if (input.masteringDisplay) {\n const m = input.masteringDisplay, data = new Uint8Array(24), d = new DataView(data.buffer);\n [m.redXy, m.greenXy, m.blueXy, m.whiteXy].forEach((xy, i) => {\n if (!Array.isArray(xy) || xy.length !== 2) fail(\"mastering chromaticities must be [x, y] pairs.\");\n // Stored value = chromaticity / 0.00002, a PNG two-byte unsigned integer.\n for (let k = 0; k < 2; k++) d.setUint16(i * 4 + k * 2, Math.round(finite(xy[k]!, 0, 1.3107, \"mastering chromaticity must be in 0..1.3107.\") * 50000));\n });\n const max = finite(m.maximumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\"), min = finite(m.minimumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\");\n if (min >= max) fail(\"mastering minimum luminance must be below the maximum.\");\n d.setUint32(16, Math.round(max * 10000)); d.setUint32(20, Math.round(min * 10000)); // divisor 0.0001 cd/m²\n chunks.push({ type: \"mDCV\", data });\n }\n if (input.contentLightLevel) {\n const l = input.contentLightLevel, data = new Uint8Array(8), d = new DataView(data.buffer);\n const cll = finite(l.maximumContentLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\"), fall = finite(l.maximumFrameAverageLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\");\n if (cll !== 0 && fall > cll) fail(\"MaxFALL cannot exceed MaxCLL.\");\n d.setUint32(0, Math.round(cll * 10000)); d.setUint32(4, Math.round(fall * 10000));\n chunks.push({ type: \"cLLI\", data });\n }\n\n // Scanlines: one filter-type byte then big-endian samples; bpp = bytes per complete pixel.\n const bpp = bitDepth === 8 ? 3 : 6, rowBytes = width * bpp;\n let raw = new Uint8Array(rowBytes), prior = new Uint8Array(rowBytes);\n const filtered = new Uint8Array(height * (rowBytes + 1)), fixedType = filters.indexOf(filter);\n for (let y = 0; y < height; y++) {\n const base = y * width * 3;\n if (bitDepth === 8) raw.set((samples as Uint8Array).subarray(base, base + width * 3));\n else for (let i = 0; i < width * 3; i++) { const v = samples[base + i]!; raw[i * 2] = v >> 8; raw[i * 2 + 1] = v & 255; }\n const row = y * (rowBytes + 1) + 1;\n let type = fixedType;\n if (filter === \"adaptive\") {\n // PNG specification §12.7 heuristic: choose the type with the minimum sum of |signed byte| (ties: lowest type).\n let best = Infinity;\n for (let t = 0; t <= 4; t++) {\n const sum = filterCost(t, raw, prior, rowBytes, bpp);\n if (sum < best) { best = sum; type = t; }\n }\n }\n filtered[row - 1] = type; filterRow(type, raw, prior, filtered.subarray(row, row + rowBytes), rowBytes, bpp);\n const done = prior; prior = raw; raw = done; // this row is the next row's prior\n }\n const idat = deflateZlib(filtered, compression);\n\n const out = new ByteSink();\n out.push(137, 80, 78, 71, 13, 10, 26, 10);\n const writeChunk = (type: string, data: Uint8Array): void => {\n const typeBytes = Uint8Array.from(type, (ch) => ch.charCodeAt(0));\n out.u32(data.length); out.append(typeBytes); out.append(data);\n out.u32(pngCrc32(data, pngCrc32(typeBytes)));\n };\n for (const chunk of chunks) writeChunk(chunk.type, chunk.data);\n for (let i = 0; i < idat.length; i += 1 << 20) writeChunk(\"IDAT\", idat.subarray(i, Math.min(idat.length, i + (1 << 20))));\n writeChunk(\"IEND\", new Uint8Array(0));\n return out.result();\n}\n"]}
@@ -1,24 +1,26 @@
1
- /** Static D65 neutral Gabor detection reference; no photographic visibility verdict.
1
+ /** Contrast detection threshold for a static, neutral (D65 white) Gabor patch, from the castleCSF
2
+ * contrast sensitivity function (CSF) model. A Gabor patch is a sine grating under a Gaussian envelope.
3
+ * It does not say whether detail in a photograph will be visible.
2
4
  * @see docs/PRINT_CONTRAST_REFERENCE.md for exact source, applicability and review gates.
3
5
  */
4
6
  import { type CalculationResult } from "../core/calculation-result.js";
5
7
  export declare const PRINT_CONTRAST_REFERENCE_MODEL_VERSION: "0.1.0";
6
- /** Exact MIT-licensed numerical-model source, not a local calibration identity. */
8
+ /** Identifies the exact MIT-licensed model source. It is not a local calibration. */
7
9
  export declare const PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION: "f4b0b722af83001d7af979281e06ca642d36e4e8";
8
- /** Narrow reference stimulus, separate from any measured photographic ROI.
9
- * Positive but out-of-domain quantities return unsupported rather than extrapolation.
10
+ /** The narrow reference stimulus. It is separate from any measured photographic region of interest (ROI).
11
+ * Positive values outside the model's range return "unsupported" instead of being extrapolated.
10
12
  */
11
13
  export interface PrintContrastReferenceInput {
12
14
  referenceId: string;
13
15
  stimulus: "static-neutral-d65-gabor";
14
16
  observer: "published-binocular-natural-pupil-reference";
15
- /** Uniform D65 background/carrier mean; not the average of a finite photographic ROI. */
17
+ /** Mean luminance of the uniform D65 background and grating. Not the average of a photographic ROI. */
16
18
  meanLuminanceCdPerSquareMeter: number;
17
19
  spatialFrequencyCyclesPerDegree: number;
18
20
  gaussianEnvelopeSigmaDegrees: number;
19
21
  temporalFrequencyHz: number;
20
22
  eccentricityDegrees: number;
21
- /** Neutral carrier fractional amplitude before the Gaussian envelope; not arbitrary ROI extrema. */
23
+ /** Fractional amplitude of the neutral grating before the Gaussian envelope. Not taken from ROI minimum and maximum values. */
22
24
  modulationMichelson: number;
23
25
  }
24
26
  export interface PrintContrastReference {
@@ -40,8 +42,7 @@ export interface PrintContrastReference {
40
42
  uncertainty: "not-quantified";
41
43
  overallPrintVerdict: "not-offered";
42
44
  }
43
- /** Strictly parse/copy explicit reference conditions; no defaults infer an observer. */
45
+ /** Strictly parses and copies the explicit reference conditions. No defaults are filled in to imply an observer. */
44
46
  export declare function parsePrintContrastReferenceInput(value: unknown): PrintContrastReferenceInput;
45
- /** Estimate the restricted published-model threshold; no individual invisibility claim. */
47
+ /** Estimates the detection threshold from the published model, within its limited range. It does not claim that detail is invisible to any particular person. */
46
48
  export declare function calculatePrintContrastReference(value: PrintContrastReferenceInput): CalculationResult<PrintContrastReference>;
47
- //# sourceMappingURL=print-contrast-reference.d.ts.map