@photivra/engine 1.4.0 → 2.0.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 (1074) hide show
  1. package/CHANGELOG.md +401 -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 +118 -5
  56. package/dist/capture/native-raw-development.js +224 -59
  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 +67 -10
  62. package/dist/capture/native-raw.js +90 -24
  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/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -4
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +23 -8
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DEVELOPERS.md +0 -68
  975. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  976. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  977. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  978. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  979. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  980. package/docs/IMAGE_FORMATION.md +0 -247
  981. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  982. package/docs/MOTION_AND_SIGNAL.md +0 -250
  983. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  984. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  985. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  986. package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
  987. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  988. package/docs/PERFORMANCE_BASELINE.md +0 -56
  989. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  990. package/docs/PHYSICS_FOUNDATION.md +0 -426
  991. package/docs/POC_API.md +0 -278
  992. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  993. package/docs/POC_PROJECTION_REUSE.md +0 -124
  994. package/docs/PRINT_195_196_REVIEW.md +0 -93
  995. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  996. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  997. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  998. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  999. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1000. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1001. package/docs/PRINT_PLANNING.md +0 -75
  1002. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1003. package/docs/PROCESSED_OUTPUT.md +0 -157
  1004. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1005. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1006. package/docs/PROVENANCE.md +0 -115
  1007. package/docs/PSF_FOUNDATION.md +0 -165
  1008. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1009. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1010. package/docs/RELEASE_1_0.md +0 -66
  1011. package/docs/RELEASE_1_0_1.md +0 -61
  1012. package/docs/RELEASE_1_1_0.md +0 -25
  1013. package/docs/RELEASE_1_2_0.md +0 -51
  1014. package/docs/RELEASE_1_3_0.md +0 -15
  1015. package/docs/RELEASE_1_4_0.md +0 -23
  1016. package/docs/RELEASE_AUDIT.md +0 -39
  1017. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1018. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1019. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1020. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1021. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1022. package/docs/SDR_RENDERING.md +0 -33
  1023. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1024. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1025. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1026. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1027. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1028. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1029. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1030. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1031. package/docs/SIMULATED_CAPTURE.md +0 -65
  1032. package/docs/STABILIZATION.md +0 -234
  1033. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1034. package/docs/TIER_ACCEPTANCE.md +0 -129
  1035. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1036. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1037. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1038. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1039. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1040. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1041. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1042. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1043. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1044. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1045. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1046. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1047. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1048. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1049. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1050. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1051. package/docs/validation/documentation-fragments.json +0 -212
  1052. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1053. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1054. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1055. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1056. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1057. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1058. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1061. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1062. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1065. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1067. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1068. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1069. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1070. package/docs/validation/print-detail-capabilities.json +0 -103
  1071. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1072. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1073. package/docs/validation/release-audit-inventory.json +0 -1306
  1074. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1,214 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Image-domain denoising, sharpening and synthetic film grain on linear or developed RGB:
4
+ * - Bilateral filter (Tomasi & Manduchi, ICCV 1998): Gaussian spatial and Gaussian range weights,
5
+ * range distance Euclidean over the three channels of the supplied data.
6
+ * - Non-local means (Buades, Coll & Morel, CVPR 2005): weights exp(−max(d² − 2σ², 0)/h²), where d² is
7
+ * the mean squared difference of (2f+1)² patches over all channels. This is the uniform-patch form
8
+ * with the known-noise offset from Buades et al., IPOL 2011; σ = 0 gives the 2005 form with a
9
+ * uniform patch kernel. The centre pixel gets the largest weight in its search window.
10
+ * - Unsharp masking: out = in + amount·(in − G_σ ⊗ in) where |in − G_σ ⊗ in| > threshold.
11
+ * - Synthetic film grain: an aesthetic, deterministic, signal-dependent texture. It is NOT a physical
12
+ * film model (no silver-halide grain statistics, dye clouds or film characteristic curve).
13
+ * Noise in linear RAW-derived data depends on the signal level, but these filters use one global set of
14
+ * parameters.
15
+ * @see docs/PROCESSING.md for equations, sources and limits.
16
+ */
17
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
18
+ import { createDeterministicUniformStream, deriveNativeSiteStreamSeedUint32, sampleDeterministicStandardNormal } from "../sensor/stochastic-seed.js";
19
+ import { convolveRows, convolveSeparable, gaussianKernel, reflect } from "./image-ops.js";
20
+ import { createProcessingTask, finiteRows, maximumWorkingBytes, optionalFiniteIn, optionalIntegerIn, processingProvenance, requireEnum, requireFiniteIn, requireImage, requireOptions } from "./processing-task.js";
21
+ /** Brute-force bilateral filter (window radius ⌈3σ_s⌉, reflect-101 borders). */
22
+ export function createBilateralFilterTask(input, provider) {
23
+ const r = requireOptions(input, ["image", "spatialSigmaPixels", "rangeSigma", "maximumWorkingBytes"], "createBilateralFilterTask input");
24
+ const image = requireImage(r.image, "image"), sigmaS = requireFiniteIn(r.spatialSigmaPixels, "spatialSigmaPixels", 0, 64, true);
25
+ const sigmaR = requireFiniteIn(r.rangeSigma, "rangeSigma", 0, 1e30, true), W = image.width, H = image.height, rad = Math.ceil(3 * sigmaS);
26
+ const spatial = new Float64Array((2 * rad + 1) ** 2);
27
+ for (let dy = -rad; dy <= rad; dy++)
28
+ for (let dx = -rad; dx <= rad; dx++)
29
+ spatial[(dy + rad) * (2 * rad + 1) + dx + rad] = Math.exp(-(dx * dx + dy * dy) / (2 * sigmaS * sigmaS));
30
+ return createProcessingTask({
31
+ provider, totalTileCount: 2 * H, estimatedWorkingBytes: W * H * 12, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),
32
+ body: function* () {
33
+ yield* finiteRows(image.data, W, H, 3, "image");
34
+ const d = image.data, out = new Float32Array(3 * W * H), k = 1 / (2 * sigmaR * sigmaR);
35
+ for (let y = 0; y < H; y++) {
36
+ for (let x = 0; x < W; x++) {
37
+ const i = 3 * (y * W + x), r0 = d[i], g0 = d[i + 1], b0 = d[i + 2];
38
+ let ws = 0, sr = 0, sg = 0, sb = 0;
39
+ for (let dy = -rad; dy <= rad; dy++) {
40
+ const row = reflect(y + dy, H) * W;
41
+ for (let dx = -rad; dx <= rad; dx++) {
42
+ const j = 3 * (row + reflect(x + dx, W)), R = d[j], G = d[j + 1], B = d[j + 2];
43
+ const w = spatial[(dy + rad) * (2 * rad + 1) + dx + rad] * Math.exp(-((R - r0) ** 2 + (G - g0) ** 2 + (B - b0) ** 2) * k);
44
+ ws += w;
45
+ sr += w * R;
46
+ sg += w * G;
47
+ sb += w * B;
48
+ }
49
+ }
50
+ out[i] = sr / ws;
51
+ out[i + 1] = sg / ws;
52
+ out[i + 2] = sb / ws;
53
+ }
54
+ yield;
55
+ }
56
+ return { width: W, height: H, data: out, provenance: processingProvenance("denoise-bilateral-tomasi-manduchi-1998", [
57
+ "Gaussian spatial (sigma " + sigmaS + " px, radius " + rad + ") times Gaussian range weight on Euclidean RGB distance (sigma " + sigmaR + ").",
58
+ "Range distance in the supplied data's units, not CIELAB; reflect-101 borders; one global parameter set (noise is not modelled per pixel)."
59
+ ]) };
60
+ }
61
+ });
62
+ }
63
+ /** Non-local means (Buades, Coll & Morel 2005), offset-major with box-filtered patch distances. */
64
+ export function createNonLocalMeansTask(input, provider) {
65
+ const r = requireOptions(input, ["image", "filteringParameter", "noiseStandardDeviation", "patchRadius", "searchRadius", "maximumWorkingBytes"], "createNonLocalMeansTask input");
66
+ const image = requireImage(r.image, "image"), h = requireFiniteIn(r.filteringParameter, "filteringParameter", 0, 1e30, true);
67
+ const sigma = optionalFiniteIn(r.noiseStandardDeviation, 0, "noiseStandardDeviation", 0, 1e30);
68
+ const f = optionalIntegerIn(r.patchRadius, 1, "patchRadius", 0, 16), sr = optionalIntegerIn(r.searchRadius, 5, "searchRadius", 1, 32);
69
+ const W = image.width, H = image.height, n = W * H, offsets = (2 * sr + 1) ** 2 - 1;
70
+ const box = new Float64Array(2 * f + 1).fill(1 / (2 * f + 1));
71
+ return createProcessingTask({
72
+ provider, totalTileCount: H + offsets * (2 * H + convolveRows(H)) + H, estimatedWorkingBytes: n * (12 + 4 * 5 + 12),
73
+ maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),
74
+ body: function* () {
75
+ yield* finiteRows(image.data, W, H, 3, "image");
76
+ const d = image.data, acc = new Float32Array(3 * n), wsum = new Float32Array(n), wmax = new Float32Array(n);
77
+ const diff = new Float32Array(n), tmp = new Float32Array(n), dist = new Float32Array(n), inv = 1 / (h * h), offset2 = 2 * sigma * sigma;
78
+ for (let oy = -sr; oy <= sr; oy++)
79
+ for (let ox = -sr; ox <= sr; ox++) {
80
+ if (ox === 0 && oy === 0)
81
+ continue;
82
+ for (let y = 0; y < H; y++) {
83
+ const yy = reflect(y + oy, H) * W;
84
+ for (let x = 0; x < W; x++) {
85
+ const i = 3 * (y * W + x), j = 3 * (yy + reflect(x + ox, W));
86
+ diff[y * W + x] = ((d[i] - d[j]) ** 2 + (d[i + 1] - d[j + 1]) ** 2 + (d[i + 2] - d[j + 2]) ** 2) / 3;
87
+ }
88
+ yield;
89
+ }
90
+ yield* convolveSeparable(diff, W, H, 1, box, tmp, dist);
91
+ for (let y = 0; y < H; y++) {
92
+ const yy = reflect(y + oy, H) * W;
93
+ for (let x = 0; x < W; x++) {
94
+ const p = y * W + x, j = 3 * (yy + reflect(x + ox, W)), w = Math.exp(-Math.max(dist[p] - offset2, 0) * inv);
95
+ acc[3 * p] = acc[3 * p] + w * d[j];
96
+ acc[3 * p + 1] = acc[3 * p + 1] + w * d[j + 1];
97
+ acc[3 * p + 2] = acc[3 * p + 2] + w * d[j + 2];
98
+ wsum[p] = wsum[p] + w;
99
+ if (w > wmax[p])
100
+ wmax[p] = w;
101
+ }
102
+ yield;
103
+ }
104
+ }
105
+ const out = new Float32Array(3 * n);
106
+ for (let y = 0; y < H; y++) {
107
+ for (let p = y * W; p < (y + 1) * W; p++) {
108
+ const wc = wmax[p], total = wsum[p] + wc;
109
+ for (let c = 0; c < 3; c++)
110
+ out[3 * p + c] = total > 0 ? (acc[3 * p + c] + wc * d[3 * p + c]) / total : d[3 * p + c];
111
+ }
112
+ yield;
113
+ }
114
+ return { width: W, height: H, data: out, provenance: processingProvenance("denoise-non-local-means-buades-2005", [
115
+ "Weights exp(-max(d^2 - 2 sigma^2, 0)/h^2); d^2 = mean squared difference over a uniform (2f+1)^2 patch and all channels.",
116
+ "Search window (2r+1)^2 with reflect-101 borders; centre weight = largest other weight.",
117
+ "One global h and sigma; signal-dependent RAW noise needs a variance-stabilizing transform not applied here."
118
+ ]) };
119
+ }
120
+ });
121
+ }
122
+ /** Unsharp masking: in + amount·(in − G_σ ⊗ in) where the detail exceeds the threshold. */
123
+ export function createUnsharpMaskTask(input, provider) {
124
+ const r = requireOptions(input, ["image", "radiusSigmaPixels", "amount", "threshold", "maximumWorkingBytes"], "createUnsharpMaskTask input");
125
+ const image = requireImage(r.image, "image"), sigma = requireFiniteIn(r.radiusSigmaPixels, "radiusSigmaPixels", 0, 256, true);
126
+ const amount = requireFiniteIn(r.amount, "amount", 0, 100), threshold = optionalFiniteIn(r.threshold, 0, "threshold", 0, 1e30);
127
+ const W = image.width, H = image.height, kernel = gaussianKernel(sigma);
128
+ return createProcessingTask({
129
+ provider, totalTileCount: H + convolveRows(H) + H, estimatedWorkingBytes: W * H * 36, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),
130
+ body: function* () {
131
+ yield* finiteRows(image.data, W, H, 3, "image");
132
+ const d = image.data, blur = new Float32Array(d.length), tmp = new Float32Array(d.length), out = new Float32Array(d.length);
133
+ yield* convolveSeparable(d, W, H, 3, kernel, tmp, blur);
134
+ for (let y = 0; y < H; y++) {
135
+ for (let i = 3 * y * W; i < 3 * (y + 1) * W; i++) {
136
+ const detail = d[i] - blur[i];
137
+ out[i] = Math.abs(detail) > threshold ? d[i] + amount * detail : d[i];
138
+ }
139
+ yield;
140
+ }
141
+ return { width: W, height: H, data: out, provenance: processingProvenance("sharpen-unsharp-mask", [
142
+ "out = in + amount (in - G_sigma * in) per component where |in - G_sigma * in| > threshold; sigma " + sigma + " px, reflect-101 borders.",
143
+ "Output is not clipped; overshoot (halo) at edges is inherent to unsharp masking."
144
+ ]) };
145
+ }
146
+ });
147
+ }
148
+ /** Random-stream id for synthetic grain. Different from every RAW charge, read-noise and fixed-pattern stream. */
149
+ export const SYNTHETIC_FILM_GRAIN_STREAM_ID = 64;
150
+ /**
151
+ * Adds deterministic synthetic grain:
152
+ * 1. Unit-variance Gaussian white noise per pixel. It is seeded by the absolute pixel index, so tiling
153
+ * never changes it.
154
+ * 2. Optionally blurred by a Gaussian with σ = grain size, then renormalized to unit variance.
155
+ * 3. Scaled by a(v) = intensity·2√(v(1 − v)): zero at black and white, `intensity` at mid-grey.
156
+ * 4. Clipped to [0, 1].
157
+ * It is labelled synthetic and aesthetic. It is never a film model.
158
+ */
159
+ export function createSyntheticFilmGrainTask(input, provider) {
160
+ const r = requireOptions(input, ["image", "seedUint32", "intensity", "grainSizePixels", "mode", "maximumWorkingBytes"], "createSyntheticFilmGrainTask input");
161
+ const image = requireImage(r.image, "image");
162
+ if (typeof r.seedUint32 !== "number" || !Number.isInteger(r.seedUint32) || r.seedUint32 < 0 || r.seedUint32 > 0xffffffff) {
163
+ throw new InvalidConfigurationError("seedUint32 must be a uint32 integer.");
164
+ }
165
+ const seed = r.seedUint32, intensity = requireFiniteIn(r.intensity, "intensity", 0, 1), size = optionalFiniteIn(r.grainSizePixels, 0.7, "grainSizePixels", 0, 64);
166
+ const mode = requireEnum(r.mode, ["monochrome", "per-channel"], "mode", "monochrome"), channels = mode === "monochrome" ? 1 : 3;
167
+ const W = image.width, H = image.height, n = W * H, kernel = gaussianKernel(size);
168
+ let k2 = 0;
169
+ for (const v of kernel)
170
+ k2 += v * v;
171
+ return createProcessingTask({
172
+ provider, totalTileCount: 3 * H + convolveRows(H), estimatedWorkingBytes: n * channels * 12 + n * 12, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),
173
+ body: function* () {
174
+ yield* finiteRows(image.data, W, H, 3, "image", 0);
175
+ const noise = new Float32Array(n * channels), tmp = new Float32Array(n * channels), field = new Float32Array(n * channels);
176
+ for (let y = 0; y < H; y++) {
177
+ for (let p = y * W; p < (y + 1) * W; p++) {
178
+ const stream = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, p, SYNTHETIC_FILM_GRAIN_STREAM_ID));
179
+ for (let c = 0; c < channels; c++)
180
+ noise[p * channels + c] = sampleDeterministicStandardNormal(stream);
181
+ }
182
+ yield;
183
+ }
184
+ // Blurred white noise has variance (Σk²)² for a separable kernel; dividing by Σk² restores unit variance.
185
+ yield* convolveSeparable(noise, W, H, channels, kernel, tmp, field);
186
+ const d = image.data, out = new Float32Array(3 * n);
187
+ let clipped = 0;
188
+ for (let y = 0; y < H; y++) {
189
+ for (let p = y * W; p < (y + 1) * W; p++)
190
+ for (let c = 0; c < 3; c++) {
191
+ const v = Math.min(d[3 * p + c], 1), a = intensity * 2 * Math.sqrt(v * (1 - v));
192
+ let o = v + a * field[p * channels + (channels === 1 ? 0 : c)] / k2;
193
+ if (o < 0) {
194
+ o = 0;
195
+ clipped++;
196
+ }
197
+ else if (o > 1) {
198
+ o = 1;
199
+ clipped++;
200
+ }
201
+ out[3 * p + c] = o;
202
+ }
203
+ yield;
204
+ }
205
+ return { width: W, height: H, data: out, syntheticAesthetic: true, physicalFilmModel: false, clippedSampleCount: clipped,
206
+ provenance: processingProvenance("synthetic-aesthetic-film-grain", [
207
+ "Synthetic aesthetic texture only: not a physical film, silver-halide or dye-cloud model.",
208
+ "Deterministic per-pixel Gaussian noise (seed " + seed + ", stream " + SYNTHETIC_FILM_GRAIN_STREAM_ID + "), Gaussian-correlated (sigma " + size + " px), unit variance.",
209
+ "Amplitude intensity*2*sqrt(v(1-v)) on encoded values; output clipped to [0, 1]."
210
+ ]) };
211
+ }
212
+ });
213
+ }
214
+ //# sourceMappingURL=denoise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"denoise.js","sourceRoot":"","sources":["../../src/processing/denoise.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,gCAAgC,EAAE,gCAAgC,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AACrJ,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EACL,oBAAoB,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAC9I,YAAY,EAAE,cAAc,EAE7B,MAAM,sBAAsB,CAAC;AAc9B,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,KAA2B,EAAE,QAA4B;IACjG,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,iCAAiC,CAAC,CAAC;IACzI,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAChI,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAC1I,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QAAE,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YAAE,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAClL,OAAO,oBAAoB,CAAC;QAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACnI,IAAI,EAAE,QAAQ,CAAC;YACb,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;YACvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;oBACtE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBACnC,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;wBACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;wBACnC,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;4BACpC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;4BAClF,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;4BAC3H,EAAE,IAAI,CAAC,CAAC;4BAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;4BAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;4BAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;wBACjD,CAAC;oBACH,CAAC;oBACD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;oBAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;oBAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC/D,CAAC;gBACD,KAAK,CAAC;YACR,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,oBAAoB,CAAC,wCAAwC,EAAE;oBAClH,0BAA0B,GAAG,MAAM,GAAG,cAAc,GAAG,GAAG,GAAG,iEAAiE,GAAG,MAAM,GAAG,IAAI;oBAC9I,2IAA2I;iBAAC,CAAC,EAAE,CAAC;QACpJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAeD,mGAAmG;AACnG,MAAM,UAAU,uBAAuB,CAAC,KAAyB,EAAE,QAA4B;IAC7F,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,CAAC,EAC7I,+BAA+B,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/F,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACtI,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,oBAAoB,CAAC;QAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,qBAAqB,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnH,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC/D,IAAI,EAAE,QAAQ,CAAC;YACb,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5G,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;YACxI,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;gBAAE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;oBACrE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;wBAAE,SAAS;oBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;wBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;4BAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAC7G,CAAC;wBACD,KAAK,CAAC;oBACR,CAAC;oBACD,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;wBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,OAAO,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;4BAC7G,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;4BAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;4BAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;4BACzI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;4BAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE;gCAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACxD,CAAC;wBACD,KAAK,CAAC;oBACR,CAAC;gBACH,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC;oBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;wBAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;gBAC1H,CAAC;gBACD,KAAK,CAAC;YACR,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,oBAAoB,CAAC,qCAAqC,EAAE;oBAC/G,0HAA0H;oBAC1H,wFAAwF;oBACxF,6GAA6G;iBAAC,CAAC,EAAE,CAAC;QACtH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAWD,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,KAAuB,EAAE,QAA4B;IACzF,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC7I,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9H,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/H,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,oBAAoB,CAAC;QAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACrJ,IAAI,EAAE,QAAQ,CAAC;YACb,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5H,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;oBAChC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;gBAC1E,CAAC;gBACD,KAAK,CAAC;YACR,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,oBAAoB,CAAC,sBAAsB,EAAE;oBAChG,mGAAmG,GAAG,KAAK,GAAG,2BAA2B;oBACzI,kFAAkF;iBAAC,CAAC,EAAE,CAAC;QAC3F,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,kHAAkH;AAClH,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAW,CAAC;AAuB1D;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAA8B,EAAE,QAA4B;IACvG,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,oCAAoC,CAAC,CAAC;IAC9J,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,UAAU,EAAE,CAAC;QACzH,MAAM,IAAI,yBAAyB,CAAC,sCAAsC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClK,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,CAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzI,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,oBAAoB,CAAC;QAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,GAAG,QAAQ,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACrK,IAAI,EAAE,QAAQ,CAAC;YACb,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC3H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,MAAM,GAAG,gCAAgC,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC,CAAC;oBAC3H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;wBAAE,KAAK,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,iCAAiC,CAAC,MAAM,CAAC,CAAC;gBACzG,CAAC;gBACD,KAAK,CAAC;YACR,CAAC;YACD,0GAA0G;YAC1G,KAAK,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACjF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC;wBACrE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BAAC,CAAC,GAAG,CAAC,CAAC;4BAAC,OAAO,EAAE,CAAC;wBAAC,CAAC;6BAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BAAC,CAAC,GAAG,CAAC,CAAC;4BAAC,OAAO,EAAE,CAAC;wBAAC,CAAC;wBACtE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACrB,CAAC;gBACD,KAAK,CAAC;YACR,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO;gBACtH,UAAU,EAAE,oBAAoB,CAAC,gCAAgC,EAAE;oBACjE,0FAA0F;oBAC1F,+CAA+C,GAAG,IAAI,GAAG,WAAW,GAAG,8BAA8B,GAAG,gCAAgC,GAAG,IAAI,GAAG,sBAAsB;oBACxK,iFAAiF;iBAAC,CAAC,EAAE,CAAC;QAC5F,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Image-domain denoising, sharpening and synthetic film grain on linear or developed RGB:\n * - Bilateral filter (Tomasi & Manduchi, ICCV 1998): Gaussian spatial and Gaussian range weights,\n * range distance Euclidean over the three channels of the supplied data.\n * - Non-local means (Buades, Coll & Morel, CVPR 2005): weights exp(−max(d² − 2σ², 0)/h²), where d² is\n * the mean squared difference of (2f+1)² patches over all channels. This is the uniform-patch form\n * with the known-noise offset from Buades et al., IPOL 2011; σ = 0 gives the 2005 form with a\n * uniform patch kernel. The centre pixel gets the largest weight in its search window.\n * - Unsharp masking: out = in + amount·(in − G_σ ⊗ in) where |in − G_σ ⊗ in| > threshold.\n * - Synthetic film grain: an aesthetic, deterministic, signal-dependent texture. It is NOT a physical\n * film model (no silver-halide grain statistics, dye clouds or film characteristic curve).\n * Noise in linear RAW-derived data depends on the signal level, but these filters use one global set of\n * parameters.\n * @see docs/PROCESSING.md for equations, sources and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { createDeterministicUniformStream, deriveNativeSiteStreamSeedUint32, sampleDeterministicStandardNormal } from \"../sensor/stochastic-seed.js\";\nimport { convolveRows, convolveSeparable, gaussianKernel, reflect } from \"./image-ops.js\";\nimport {\n createProcessingTask, finiteRows, maximumWorkingBytes, optionalFiniteIn, optionalIntegerIn, processingProvenance, requireEnum, requireFiniteIn,\n requireImage, requireOptions,\n type ProcessingBody, type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask\n} from \"./processing-task.js\";\n\nexport interface ProcessedRgbImage extends ProcessingRgbImage {\n provenance: ProcessingProvenance;\n}\n\nexport interface BilateralFilterInput {\n image: ProcessingRgbImage;\n spatialSigmaPixels: number;\n /** Range σ in the units of the image values. */\n rangeSigma: number;\n maximumWorkingBytes?: number;\n}\n\n/** Brute-force bilateral filter (window radius ⌈3σ_s⌉, reflect-101 borders). */\nexport function createBilateralFilterTask(input: BilateralFilterInput, provider: ProcessingProvider): ProcessingTask<ProcessedRgbImage> {\n const r = requireOptions(input, [\"image\", \"spatialSigmaPixels\", \"rangeSigma\", \"maximumWorkingBytes\"], \"createBilateralFilterTask input\");\n const image = requireImage(r.image, \"image\"), sigmaS = requireFiniteIn(r.spatialSigmaPixels, \"spatialSigmaPixels\", 0, 64, true);\n const sigmaR = requireFiniteIn(r.rangeSigma, \"rangeSigma\", 0, 1e30, true), W = image.width, H = image.height, rad = Math.ceil(3 * sigmaS);\n const spatial = new Float64Array((2 * rad + 1) ** 2);\n for (let dy = -rad; dy <= rad; dy++) for (let dx = -rad; dx <= rad; dx++) spatial[(dy + rad) * (2 * rad + 1) + dx + rad] = Math.exp(-(dx * dx + dy * dy) / (2 * sigmaS * sigmaS));\n return createProcessingTask({\n provider, totalTileCount: 2 * H, estimatedWorkingBytes: W * H * 12, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),\n body: function* (): ProcessingBody<ProcessedRgbImage> {\n yield* finiteRows(image.data, W, H, 3, \"image\");\n const d = image.data, out = new Float32Array(3 * W * H), k = 1 / (2 * sigmaR * sigmaR);\n for (let y = 0; y < H; y++) {\n for (let x = 0; x < W; x++) {\n const i = 3 * (y * W + x), r0 = d[i]!, g0 = d[i + 1]!, b0 = d[i + 2]!;\n let ws = 0, sr = 0, sg = 0, sb = 0;\n for (let dy = -rad; dy <= rad; dy++) {\n const row = reflect(y + dy, H) * W;\n for (let dx = -rad; dx <= rad; dx++) {\n const j = 3 * (row + reflect(x + dx, W)), R = d[j]!, G = d[j + 1]!, B = d[j + 2]!;\n const w = spatial[(dy + rad) * (2 * rad + 1) + dx + rad]! * Math.exp(-((R - r0) ** 2 + (G - g0) ** 2 + (B - b0) ** 2) * k);\n ws += w; sr += w * R; sg += w * G; sb += w * B;\n }\n }\n out[i] = sr / ws; out[i + 1] = sg / ws; out[i + 2] = sb / ws;\n }\n yield;\n }\n return { width: W, height: H, data: out, provenance: processingProvenance(\"denoise-bilateral-tomasi-manduchi-1998\", [\n \"Gaussian spatial (sigma \" + sigmaS + \" px, radius \" + rad + \") times Gaussian range weight on Euclidean RGB distance (sigma \" + sigmaR + \").\",\n \"Range distance in the supplied data's units, not CIELAB; reflect-101 borders; one global parameter set (noise is not modelled per pixel).\"]) };\n }\n });\n}\n\nexport interface NonLocalMeansInput {\n image: ProcessingRgbImage;\n /** Filtering parameter h (image units). */\n filteringParameter: number;\n /** Known noise standard deviation σ (image units); default 0. */\n noiseStandardDeviation?: number;\n /** Patch radius f (patch (2f+1)²); default 1. */\n patchRadius?: number;\n /** Search-window radius r ((2r+1)² candidates); default 5. */\n searchRadius?: number;\n maximumWorkingBytes?: number;\n}\n\n/** Non-local means (Buades, Coll & Morel 2005), offset-major with box-filtered patch distances. */\nexport function createNonLocalMeansTask(input: NonLocalMeansInput, provider: ProcessingProvider): ProcessingTask<ProcessedRgbImage> {\n const r = requireOptions(input, [\"image\", \"filteringParameter\", \"noiseStandardDeviation\", \"patchRadius\", \"searchRadius\", \"maximumWorkingBytes\"],\n \"createNonLocalMeansTask input\");\n const image = requireImage(r.image, \"image\"), h = requireFiniteIn(r.filteringParameter, \"filteringParameter\", 0, 1e30, true);\n const sigma = optionalFiniteIn(r.noiseStandardDeviation, 0, \"noiseStandardDeviation\", 0, 1e30);\n const f = optionalIntegerIn(r.patchRadius, 1, \"patchRadius\", 0, 16), sr = optionalIntegerIn(r.searchRadius, 5, \"searchRadius\", 1, 32);\n const W = image.width, H = image.height, n = W * H, offsets = (2 * sr + 1) ** 2 - 1;\n const box = new Float64Array(2 * f + 1).fill(1 / (2 * f + 1));\n return createProcessingTask({\n provider, totalTileCount: H + offsets * (2 * H + convolveRows(H)) + H, estimatedWorkingBytes: n * (12 + 4 * 5 + 12),\n maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),\n body: function* (): ProcessingBody<ProcessedRgbImage> {\n yield* finiteRows(image.data, W, H, 3, \"image\");\n const d = image.data, acc = new Float32Array(3 * n), wsum = new Float32Array(n), wmax = new Float32Array(n);\n const diff = new Float32Array(n), tmp = new Float32Array(n), dist = new Float32Array(n), inv = 1 / (h * h), offset2 = 2 * sigma * sigma;\n for (let oy = -sr; oy <= sr; oy++) for (let ox = -sr; ox <= sr; ox++) {\n if (ox === 0 && oy === 0) continue;\n for (let y = 0; y < H; y++) {\n const yy = reflect(y + oy, H) * W;\n for (let x = 0; x < W; x++) {\n const i = 3 * (y * W + x), j = 3 * (yy + reflect(x + ox, W));\n diff[y * W + x] = ((d[i]! - d[j]!) ** 2 + (d[i + 1]! - d[j + 1]!) ** 2 + (d[i + 2]! - d[j + 2]!) ** 2) / 3;\n }\n yield;\n }\n yield* convolveSeparable(diff, W, H, 1, box, tmp, dist);\n for (let y = 0; y < H; y++) {\n const yy = reflect(y + oy, H) * W;\n for (let x = 0; x < W; x++) {\n const p = y * W + x, j = 3 * (yy + reflect(x + ox, W)), w = Math.exp(-Math.max(dist[p]! - offset2, 0) * inv);\n acc[3 * p] = acc[3 * p]! + w * d[j]!; acc[3 * p + 1] = acc[3 * p + 1]! + w * d[j + 1]!; acc[3 * p + 2] = acc[3 * p + 2]! + w * d[j + 2]!;\n wsum[p] = wsum[p]! + w; if (w > wmax[p]!) wmax[p] = w;\n }\n yield;\n }\n }\n const out = new Float32Array(3 * n);\n for (let y = 0; y < H; y++) {\n for (let p = y * W; p < (y + 1) * W; p++) {\n const wc = wmax[p]!, total = wsum[p]! + wc;\n for (let c = 0; c < 3; c++) out[3 * p + c] = total > 0 ? (acc[3 * p + c]! + wc * d[3 * p + c]!) / total : d[3 * p + c]!;\n }\n yield;\n }\n return { width: W, height: H, data: out, provenance: processingProvenance(\"denoise-non-local-means-buades-2005\", [\n \"Weights exp(-max(d^2 - 2 sigma^2, 0)/h^2); d^2 = mean squared difference over a uniform (2f+1)^2 patch and all channels.\",\n \"Search window (2r+1)^2 with reflect-101 borders; centre weight = largest other weight.\",\n \"One global h and sigma; signal-dependent RAW noise needs a variance-stabilizing transform not applied here.\"]) };\n }\n });\n}\n\nexport interface UnsharpMaskInput {\n image: ProcessingRgbImage;\n radiusSigmaPixels: number;\n amount: number;\n /** Detail magnitude below which a component is left unchanged; default 0. */\n threshold?: number;\n maximumWorkingBytes?: number;\n}\n\n/** Unsharp masking: in + amount·(in − G_σ ⊗ in) where the detail exceeds the threshold. */\nexport function createUnsharpMaskTask(input: UnsharpMaskInput, provider: ProcessingProvider): ProcessingTask<ProcessedRgbImage> {\n const r = requireOptions(input, [\"image\", \"radiusSigmaPixels\", \"amount\", \"threshold\", \"maximumWorkingBytes\"], \"createUnsharpMaskTask input\");\n const image = requireImage(r.image, \"image\"), sigma = requireFiniteIn(r.radiusSigmaPixels, \"radiusSigmaPixels\", 0, 256, true);\n const amount = requireFiniteIn(r.amount, \"amount\", 0, 100), threshold = optionalFiniteIn(r.threshold, 0, \"threshold\", 0, 1e30);\n const W = image.width, H = image.height, kernel = gaussianKernel(sigma);\n return createProcessingTask({\n provider, totalTileCount: H + convolveRows(H) + H, estimatedWorkingBytes: W * H * 36, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),\n body: function* (): ProcessingBody<ProcessedRgbImage> {\n yield* finiteRows(image.data, W, H, 3, \"image\");\n const d = image.data, blur = new Float32Array(d.length), tmp = new Float32Array(d.length), out = new Float32Array(d.length);\n yield* convolveSeparable(d, W, H, 3, kernel, tmp, blur);\n for (let y = 0; y < H; y++) {\n for (let i = 3 * y * W; i < 3 * (y + 1) * W; i++) {\n const detail = d[i]! - blur[i]!;\n out[i] = Math.abs(detail) > threshold ? d[i]! + amount * detail : d[i]!;\n }\n yield;\n }\n return { width: W, height: H, data: out, provenance: processingProvenance(\"sharpen-unsharp-mask\", [\n \"out = in + amount (in - G_sigma * in) per component where |in - G_sigma * in| > threshold; sigma \" + sigma + \" px, reflect-101 borders.\",\n \"Output is not clipped; overshoot (halo) at edges is inherent to unsharp masking.\"]) };\n }\n });\n}\n\n/** Random-stream id for synthetic grain. Different from every RAW charge, read-noise and fixed-pattern stream. */\nexport const SYNTHETIC_FILM_GRAIN_STREAM_ID = 64 as const;\n\nexport interface SyntheticFilmGrainInput {\n /** Display-referred (encoded) RGB with values in [0, 1]. */\n image: ProcessingRgbImage;\n /** uint32 seed; equal seeds reproduce the grain exactly. */\n seedUint32: number;\n /** Grain standard deviation at mid-grey (value 0.5), in encoded units. */\n intensity: number;\n /** Spatial correlation σ of the grain in pixels; 0 = per-pixel white grain. Default 0.7. */\n grainSizePixels?: number;\n /** `monochrome` (default) adds one grain field to all channels; `per-channel` uses three. */\n mode?: \"monochrome\" | \"per-channel\";\n maximumWorkingBytes?: number;\n}\n\nexport interface SyntheticFilmGrainOutput extends ProcessedRgbImage {\n /** Always true: the grain is an aesthetic texture, not a physical film model. */\n syntheticAesthetic: true;\n physicalFilmModel: false;\n clippedSampleCount: number;\n}\n\n/**\n * Adds deterministic synthetic grain:\n * 1. Unit-variance Gaussian white noise per pixel. It is seeded by the absolute pixel index, so tiling\n * never changes it.\n * 2. Optionally blurred by a Gaussian with σ = grain size, then renormalized to unit variance.\n * 3. Scaled by a(v) = intensity·2√(v(1 − v)): zero at black and white, `intensity` at mid-grey.\n * 4. Clipped to [0, 1].\n * It is labelled synthetic and aesthetic. It is never a film model.\n */\nexport function createSyntheticFilmGrainTask(input: SyntheticFilmGrainInput, provider: ProcessingProvider): ProcessingTask<SyntheticFilmGrainOutput> {\n const r = requireOptions(input, [\"image\", \"seedUint32\", \"intensity\", \"grainSizePixels\", \"mode\", \"maximumWorkingBytes\"], \"createSyntheticFilmGrainTask input\");\n const image = requireImage(r.image, \"image\");\n if (typeof r.seedUint32 !== \"number\" || !Number.isInteger(r.seedUint32) || r.seedUint32 < 0 || r.seedUint32 > 0xffffffff) {\n throw new InvalidConfigurationError(\"seedUint32 must be a uint32 integer.\");\n }\n const seed = r.seedUint32, intensity = requireFiniteIn(r.intensity, \"intensity\", 0, 1), size = optionalFiniteIn(r.grainSizePixels, 0.7, \"grainSizePixels\", 0, 64);\n const mode = requireEnum(r.mode, [\"monochrome\", \"per-channel\"] as const, \"mode\", \"monochrome\"), channels = mode === \"monochrome\" ? 1 : 3;\n const W = image.width, H = image.height, n = W * H, kernel = gaussianKernel(size);\n let k2 = 0;\n for (const v of kernel) k2 += v * v;\n return createProcessingTask({\n provider, totalTileCount: 3 * H + convolveRows(H), estimatedWorkingBytes: n * channels * 12 + n * 12, maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),\n body: function* (): ProcessingBody<SyntheticFilmGrainOutput> {\n yield* finiteRows(image.data, W, H, 3, \"image\", 0);\n const noise = new Float32Array(n * channels), tmp = new Float32Array(n * channels), field = new Float32Array(n * channels);\n for (let y = 0; y < H; y++) {\n for (let p = y * W; p < (y + 1) * W; p++) {\n const stream = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, p, SYNTHETIC_FILM_GRAIN_STREAM_ID));\n for (let c = 0; c < channels; c++) noise[p * channels + c] = sampleDeterministicStandardNormal(stream);\n }\n yield;\n }\n // Blurred white noise has variance (Σk²)² for a separable kernel; dividing by Σk² restores unit variance.\n yield* convolveSeparable(noise, W, H, channels, kernel, tmp, field);\n const d = image.data, out = new Float32Array(3 * n);\n let clipped = 0;\n for (let y = 0; y < H; y++) {\n for (let p = y * W; p < (y + 1) * W; p++) for (let c = 0; c < 3; c++) {\n const v = Math.min(d[3 * p + c]!, 1), a = intensity * 2 * Math.sqrt(v * (1 - v));\n let o = v + a * field[p * channels + (channels === 1 ? 0 : c)]! / k2;\n if (o < 0) { o = 0; clipped++; } else if (o > 1) { o = 1; clipped++; }\n out[3 * p + c] = o;\n }\n yield;\n }\n return { width: W, height: H, data: out, syntheticAesthetic: true, physicalFilmModel: false, clippedSampleCount: clipped,\n provenance: processingProvenance(\"synthetic-aesthetic-film-grain\", [\n \"Synthetic aesthetic texture only: not a physical film, silver-halide or dye-cloud model.\",\n \"Deterministic per-pixel Gaussian noise (seed \" + seed + \", stream \" + SYNTHETIC_FILM_GRAIN_STREAM_ID + \"), Gaussian-correlated (sigma \" + size + \" px), unit variance.\",\n \"Amplitude intensity*2*sqrt(v(1-v)) on encoded values; output clipped to [0, 1].\"]) };\n }\n });\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import { type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask } from "./processing-task.js";
2
+ export interface FocusStackInput {
3
+ /** Registered frames of one scene, ordered by focus distance (any consistent order). */
4
+ frames: readonly ProcessingRgbImage[];
5
+ /** σ (pixels) of the Gaussian window averaging the squared Laplacian; default 2. */
6
+ sharpnessSigmaPixels?: number;
7
+ /** Pyramid levels for seam-free blending; default down to a 1-pixel side (at most 10). */
8
+ pyramidLevels?: number;
9
+ maximumWorkingBytes?: number;
10
+ }
11
+ export interface FocusStackOutput extends ProcessingRgbImage {
12
+ /** Index of the sharpest frame per pixel (the blending selection). */
13
+ selectedFrameIndex: Uint8Array;
14
+ provenance: ProcessingProvenance;
15
+ }
16
+ /** Laplacian-energy focus stacking with Laplacian-pyramid blending. */
17
+ export declare function createFocusStackTask(input: FocusStackInput, provider: ProcessingProvider): ProcessingTask<FocusStackOutput>;
@@ -0,0 +1,80 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Focus stacking: combines aligned (registered) frames focused at different distances into one sharp
4
+ * image.
5
+ *
6
+ * - Sharpness for each frame and pixel is the locally averaged Laplacian energy S_k = G_σ ⊗ (∇²Y_k)²
7
+ * of the Rec.709-weighted luma Y. This is a Laplacian-based focus measure (see Nayar & Nakagawa 1994,
8
+ * and the survey by Pertuz, Puig & García 2013).
9
+ * - Each pixel picks the sharpest frame; a tie picks the lowest index.
10
+ * - The selection masks blend the frames with Laplacian pyramids (Burt & Adelson 1983; pyramid image
11
+ * fusion as in Burt & Kolczynski 1993). This hides the seams between selections at every scale.
12
+ *
13
+ * Not done: frame alignment, magnification (focus-breathing) correction and depth estimation. The
14
+ * index map only says which frame was picked; it is not calibrated depth.
15
+ * @see docs/PROCESSING.md for equations, sources and limits.
16
+ */
17
+ import { autoLevels, collapse, collapseRows, convolveRows, convolveSeparable, gaussianKernel, gaussianPyramid, gaussianPyramidRows, laplacianPyramid, laplacianPyramidRows, luminanceWeights, pyramidBytes, reflect } from "./image-ops.js";
18
+ import { createProcessingTask, finiteRows, maximumWorkingBytes, optionalFiniteIn, optionalIntegerIn, processingProvenance, requireImageList, requireOptions } from "./processing-task.js";
19
+ /** Laplacian-energy focus stacking with Laplacian-pyramid blending. */
20
+ export function createFocusStackTask(input, provider) {
21
+ const r = requireOptions(input, ["frames", "sharpnessSigmaPixels", "pyramidLevels", "maximumWorkingBytes"], "createFocusStackTask input");
22
+ const frames = requireImageList(r.frames, "frames", 1), W = frames[0].width, H = frames[0].height, n = W * H, K = frames.length;
23
+ const sigma = optionalFiniteIn(r.sharpnessSigmaPixels, 2, "sharpnessSigmaPixels", 0, 1000);
24
+ const levels = optionalIntegerIn(r.pyramidLevels, autoLevels(W, H, 10), "pyramidLevels", 1, autoLevels(W, H, 32));
25
+ const kernel = gaussianKernel(sigma);
26
+ const total = K * H + K * (H + convolveRows(H)) + K * (laplacianPyramidRows(W, H, levels) + gaussianPyramidRows(W, H, levels) + H) + collapseRows(W, H, levels);
27
+ return createProcessingTask({
28
+ provider, totalTileCount: total, estimatedWorkingBytes: n * 4 * 4 + n + 2 * pyramidBytes(W, H, 3, levels) + 2 * pyramidBytes(W, H, 1, levels),
29
+ maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),
30
+ body: function* () {
31
+ for (const [k, f] of frames.entries())
32
+ yield* finiteRows(f.data, W, H, 3, "frames[" + k + "]");
33
+ const [lr, lg, lb] = luminanceWeights("linear-srgb-d65");
34
+ const energy = new Float32Array(n), tmp = new Float32Array(n), smooth = new Float32Array(n), best = new Float32Array(n).fill(-1);
35
+ const index = new Uint8Array(n);
36
+ for (const [k, f] of frames.entries()) {
37
+ const d = f.data;
38
+ const y709 = (x, y) => { const i = 3 * (reflect(y, H) * W + reflect(x, W)); return lr * d[i] + lg * d[i + 1] + lb * d[i + 2]; };
39
+ for (let y = 0; y < H; y++) {
40
+ for (let x = 0; x < W; x++) {
41
+ const lap = y709(x - 1, y) + y709(x + 1, y) + y709(x, y - 1) + y709(x, y + 1) - 4 * y709(x, y);
42
+ energy[y * W + x] = lap * lap;
43
+ }
44
+ yield;
45
+ }
46
+ yield* convolveSeparable(energy, W, H, 1, kernel, tmp, smooth);
47
+ for (let i = 0; i < n; i++)
48
+ if (smooth[i] > best[i]) {
49
+ best[i] = smooth[i];
50
+ index[i] = k;
51
+ }
52
+ }
53
+ let acc = null, sizes = [];
54
+ const mask = new Float32Array(n);
55
+ for (const [k, f] of frames.entries()) {
56
+ for (let y = 0; y < H; y++) {
57
+ for (let i = y * W; i < (y + 1) * W; i++)
58
+ mask[i] = index[i] === k ? 1 : 0;
59
+ yield;
60
+ }
61
+ const lap = yield* laplacianPyramid(f.data, W, H, 3, levels), gw = yield* gaussianPyramid(mask, W, H, 1, levels);
62
+ sizes = lap.sizes;
63
+ acc ??= lap.sizes.map((s) => new Float32Array(s.width * s.height * 3));
64
+ for (let l = 0; l < levels; l++) {
65
+ const a = acc[l], L = lap.levels[l], G = gw.levels[l];
66
+ for (let i = 0; i < G.length; i++)
67
+ for (let c = 0; c < 3; c++)
68
+ a[3 * i + c] = a[3 * i + c] + G[i] * L[3 * i + c];
69
+ }
70
+ }
71
+ const data = yield* collapse({ levels: acc, sizes, channels: 3 });
72
+ return { width: W, height: H, data, selectedFrameIndex: index, provenance: processingProvenance("focus-stack-laplacian-energy-pyramid", [
73
+ "Sharpness: Gaussian-averaged squared 3x3 Laplacian of Rec.709-weighted luma; argmax per pixel, ties to the lowest index.",
74
+ "One-hot masks blended with Burt-Adelson Laplacian pyramids (reflect-101 borders); values are not clipped.",
75
+ "Frames must be registered; no alignment, focus-breathing correction or calibrated depth is produced."
76
+ ]) };
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=focus-stacking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-stacking.js","sourceRoot":"","sources":["../../src/processing/focus-stacking.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Focus stacking: combines aligned (registered) frames focused at different distances into one sharp\n * image.\n *\n * - Sharpness for each frame and pixel is the locally averaged Laplacian energy S_k = G_σ ⊗ (∇²Y_k)²\n * of the Rec.709-weighted luma Y. This is a Laplacian-based focus measure (see Nayar & Nakagawa 1994,\n * and the survey by Pertuz, Puig & García 2013).\n * - Each pixel picks the sharpest frame; a tie picks the lowest index.\n * - The selection masks blend the frames with Laplacian pyramids (Burt & Adelson 1983; pyramid image\n * fusion as in Burt & Kolczynski 1993). This hides the seams between selections at every scale.\n *\n * Not done: frame alignment, magnification (focus-breathing) correction and depth estimation. The\n * index map only says which frame was picked; it is not calibrated depth.\n * @see docs/PROCESSING.md for equations, sources and limits.\n */\n\nimport {\n autoLevels, collapse, collapseRows, convolveRows, convolveSeparable, gaussianKernel, gaussianPyramid, gaussianPyramidRows, laplacianPyramid,\n laplacianPyramidRows, luminanceWeights, pyramidBytes, reflect\n} from \"./image-ops.js\";\nimport {\n createProcessingTask, finiteRows, maximumWorkingBytes, optionalFiniteIn, optionalIntegerIn, processingProvenance, requireImageList, requireOptions,\n type ProcessingBody, type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask\n} from \"./processing-task.js\";\n\nexport interface FocusStackInput {\n /** Registered frames of one scene, ordered by focus distance (any consistent order). */\n frames: readonly ProcessingRgbImage[];\n /** σ (pixels) of the Gaussian window averaging the squared Laplacian; default 2. */\n sharpnessSigmaPixels?: number;\n /** Pyramid levels for seam-free blending; default down to a 1-pixel side (at most 10). */\n pyramidLevels?: number;\n maximumWorkingBytes?: number;\n}\n\nexport interface FocusStackOutput extends ProcessingRgbImage {\n /** Index of the sharpest frame per pixel (the blending selection). */\n selectedFrameIndex: Uint8Array;\n provenance: ProcessingProvenance;\n}\n\n/** Laplacian-energy focus stacking with Laplacian-pyramid blending. */\nexport function createFocusStackTask(input: FocusStackInput, provider: ProcessingProvider): ProcessingTask<FocusStackOutput> {\n const r = requireOptions(input, [\"frames\", \"sharpnessSigmaPixels\", \"pyramidLevels\", \"maximumWorkingBytes\"], \"createFocusStackTask input\");\n const frames = requireImageList(r.frames, \"frames\", 1), W = frames[0]!.width, H = frames[0]!.height, n = W * H, K = frames.length;\n const sigma = optionalFiniteIn(r.sharpnessSigmaPixels, 2, \"sharpnessSigmaPixels\", 0, 1000);\n const levels = optionalIntegerIn(r.pyramidLevels, autoLevels(W, H, 10), \"pyramidLevels\", 1, autoLevels(W, H, 32));\n const kernel = gaussianKernel(sigma);\n const total = K * H + K * (H + convolveRows(H)) + K * (laplacianPyramidRows(W, H, levels) + gaussianPyramidRows(W, H, levels) + H) + collapseRows(W, H, levels);\n return createProcessingTask({\n provider, totalTileCount: total, estimatedWorkingBytes: n * 4 * 4 + n + 2 * pyramidBytes(W, H, 3, levels) + 2 * pyramidBytes(W, H, 1, levels),\n maximumWorkingBytes: maximumWorkingBytes(r.maximumWorkingBytes),\n body: function* (): ProcessingBody<FocusStackOutput> {\n for (const [k, f] of frames.entries()) yield* finiteRows(f.data, W, H, 3, \"frames[\" + k + \"]\");\n const [lr, lg, lb] = luminanceWeights(\"linear-srgb-d65\");\n const energy = new Float32Array(n), tmp = new Float32Array(n), smooth = new Float32Array(n), best = new Float32Array(n).fill(-1);\n const index = new Uint8Array(n);\n for (const [k, f] of frames.entries()) {\n const d = f.data;\n const y709 = (x: number, y: number): number => { const i = 3 * (reflect(y, H) * W + reflect(x, W)); return lr * d[i]! + lg * d[i + 1]! + lb * d[i + 2]!; };\n for (let y = 0; y < H; y++) {\n for (let x = 0; x < W; x++) {\n const lap = y709(x - 1, y) + y709(x + 1, y) + y709(x, y - 1) + y709(x, y + 1) - 4 * y709(x, y);\n energy[y * W + x] = lap * lap;\n }\n yield;\n }\n yield* convolveSeparable(energy, W, H, 1, kernel, tmp, smooth);\n for (let i = 0; i < n; i++) if (smooth[i]! > best[i]!) { best[i] = smooth[i]!; index[i] = k; }\n }\n let acc: Float32Array[] | null = null, sizes: { width: number; height: number }[] = [];\n const mask = new Float32Array(n);\n for (const [k, f] of frames.entries()) {\n for (let y = 0; y < H; y++) {\n for (let i = y * W; i < (y + 1) * W; i++) mask[i] = index[i] === k ? 1 : 0;\n yield;\n }\n const lap = yield* laplacianPyramid(f.data, W, H, 3, levels), gw = yield* gaussianPyramid(mask, W, H, 1, levels);\n sizes = lap.sizes;\n acc ??= lap.sizes.map((s) => new Float32Array(s.width * s.height * 3));\n for (let l = 0; l < levels; l++) {\n const a = acc[l]!, L = lap.levels[l]!, G = gw.levels[l]!;\n for (let i = 0; i < G.length; i++) for (let c = 0; c < 3; c++) a[3 * i + c] = a[3 * i + c]! + G[i]! * L[3 * i + c]!;\n }\n }\n const data = yield* collapse({ levels: acc!, sizes, channels: 3 });\n return { width: W, height: H, data, selectedFrameIndex: index, provenance: processingProvenance(\"focus-stack-laplacian-energy-pyramid\", [\n \"Sharpness: Gaussian-averaged squared 3x3 Laplacian of Rec.709-weighted luma; argmax per pixel, ties to the lowest index.\",\n \"One-hot masks blended with Burt-Adelson Laplacian pyramids (reflect-101 borders); values are not clipped.\",\n \"Frames must be registered; no alignment, focus-breathing correction or calibrated depth is produced.\"]) };\n }\n });\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import { type ProcessingLinearColorSpace, type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask } from "./processing-task.js";
2
+ export interface HdrBracketFrame {
3
+ exposureTimeSeconds: number;
4
+ /** Linear RAW codes, one per sample. */
5
+ codes: Uint16Array | Float32Array;
6
+ blackLevelCode: number;
7
+ /** Codes at or above this level are saturated and excluded. */
8
+ whiteLevelCode: number;
9
+ /** Optional per-sample flags. Non-zero excludes the sample (for example physical saturation before the ADC). */
10
+ saturationFlags?: Uint8Array;
11
+ /** System conversion gain K, electrons per code (includes the frame's ISO gain). */
12
+ conversionGainElectronsPerCode: number;
13
+ /** RMS read noise in electrons for this frame's readout regime. */
14
+ readNoiseElectrons: number;
15
+ }
16
+ export interface HdrBracketMergeInput {
17
+ /** Samples per frame (e.g. width·height for a mosaic, width·height·3 for RGB). */
18
+ sampleCount: number;
19
+ frames: readonly HdrBracketFrame[];
20
+ /** Variance reweighting iterations after the shot-noise-limited start; default 2. */
21
+ iterations?: number;
22
+ maximumWorkingBytes?: number;
23
+ }
24
+ export interface HdrBracketMergeOutput {
25
+ /** Scene-linear photo-electron rate per sample, e⁻/s (relative scene radiance; not absolute). */
26
+ radianceElectronsPerSecond: Float32Array;
27
+ /** Model standard deviation of each estimate, e⁻/s. */
28
+ standardDeviationElectronsPerSecond: Float32Array;
29
+ /** Frames that contributed; 0 marks a sample saturated in every frame (value is a lower bound). */
30
+ contributingFrameCount: Uint8Array;
31
+ saturatedInAllFramesCount: number;
32
+ provenance: ProcessingProvenance;
33
+ }
34
+ /** Noise-optimal merge of linear RAW exposure brackets into a scene-linear photo-electron rate. */
35
+ export declare function createHdrBracketMergeTask(input: HdrBracketMergeInput, provider: ProcessingProvider): ProcessingTask<HdrBracketMergeOutput>;
36
+ /** The only output transfer in 2.0: unclipped float32 linear values (PQ and HLG are not shipped). */
37
+ export type HdrTransfer = "linear-float32";
38
+ export interface HdrImageEncodingInput {
39
+ image: ProcessingRgbImage;
40
+ inputColorSpace: ProcessingLinearColorSpace;
41
+ transfer: HdrTransfer;
42
+ maximumWorkingBytes?: number;
43
+ }
44
+ export interface HdrImageEncodingOutput {
45
+ width: number;
46
+ height: number;
47
+ colorSpace: "rec2020";
48
+ transfer: HdrTransfer;
49
+ /** Interleaved linear BT.2020 RGB (relative, unclipped). */
50
+ linear: Float32Array;
51
+ provenance: ProcessingProvenance;
52
+ }
53
+ /** Converts linear RGB to unclipped float32 linear BT.2020 (relative values, no transfer function or quantization). */
54
+ export declare function createHdrImageEncodingTask(input: HdrImageEncodingInput, provider: ProcessingProvider): ProcessingTask<HdrImageEncodingOutput>;