@photivra/engine 1.5.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 (1078) hide show
  1. package/CHANGELOG.md +393 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/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 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  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/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1,39 +1,119 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Validates every explicit rendering/encoding policy; unknown HDR/display modes fail.
5
- * Validates declared image state and a bounded finite inline raster; never resolves WB/color.
3
+ * The SDR (standard dynamic range) reference renderer: linear sRGB → rendering exposure → tone
4
+ * curve → gamut handling → sRGB transfer → integer codes.
5
+ *
6
+ * It takes linear RGB that already has colour and white balance (WB) applied. Unknown HDR or
7
+ * display modes are rejected.
6
8
  * @see docs/SDR_RENDERING.md for equations, coordinate/unit conventions, blockers and support limits.
7
9
  */
8
10
  import { encodeSrgbComponent } from "../color/srgb-transfer.js";
11
+ import { resolveCaptureColorModel } from "../color/capture-color.js";
9
12
  import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
10
13
  import { calculatedResult } from "../core/calculation-result.js";
11
14
  import { InvalidConfigurationError } from "../core/configuration-error.js";
12
15
  import { InvalidScientificResultError } from "../core/validation.js";
13
16
  export const SDR_RENDERING_SCHEMA_VERSION = "0.1.0";
17
+ /**
18
+ * Version of the `generic-sdr-rendering-reference` model. 0.2.0 added luminance tone curves and fixed
19
+ * round-to-nearest, ties up (`Math.round`; the old `Math.floor(x+.5)` rounded 0.49999999999999994 up).
20
+ */
21
+ export const SDR_RENDERING_MODEL_VERSION = "0.2.0";
14
22
  function object(v, keys) {
15
23
  return requireAllowlistedRecord(v, keys, "Invalid SDR fields.");
16
24
  }
17
25
  function publicId(v) {
18
26
  return requirePublicOpaqueId(v, "Invalid public SDR identity.");
19
27
  }
20
- /** Validates every explicit rendering/encoding policy; unknown HDR/display modes fail. */
28
+ function bounded(value, minimumExclusive, maximum) {
29
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= minimumExclusive || value > maximum) {
30
+ throw new InvalidConfigurationError("Unsupported SDR tone-curve parameters.");
31
+ }
32
+ return value;
33
+ }
34
+ function parseToneCurveParameters(curve, value) {
35
+ if (curve === "identity" || curve === "positive-reinhard-per-channel") {
36
+ if (value !== undefined)
37
+ throw new InvalidConfigurationError("Per-channel tone curves take no parameters.");
38
+ return undefined;
39
+ }
40
+ if (curve === "extended-reinhard-luminance") {
41
+ const p = requireAllowlistedRecord(value, ["whiteLuminance"], "Invalid SDR tone-curve parameters.");
42
+ return { whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };
43
+ }
44
+ if (curve === "naka-rushton-luminance") {
45
+ const p = requireAllowlistedRecord(value, ["exponent", "semiSaturation", "whiteLuminance"], "Invalid SDR tone-curve parameters.");
46
+ const exponent = bounded(p.exponent, 0, 4);
47
+ if (exponent < .25)
48
+ throw new InvalidConfigurationError("Unsupported SDR tone-curve parameters.");
49
+ return { exponent, semiSaturation: bounded(p.semiSaturation, 0, 64), whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };
50
+ }
51
+ throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
52
+ }
53
+ /** Linear-sRGB/D65 relative-luminance weights: the Y row of the engine's sRGB to XYZ matrix (W3C CSS Color 4 sRGB; also IEC 61966-2-1). */
54
+ const LUMINANCE = resolveCaptureColorModel().cameraRgbToXyz[1];
55
+ /**
56
+ * Internal shared tone operator. The reference renderer, the native SDR kernel and RAW development all
57
+ * call this one function, so every path uses the same per-pixel operation order. Not exported from the package.
58
+ */
59
+ export function prepareSdrPixelTone(profile) {
60
+ const curve = profile.toneCurve, p = profile.toneCurveParameters;
61
+ if (curve === "identity")
62
+ return (r, g, b, out) => { out[0] = r; out[1] = g; out[2] = b; };
63
+ if (curve === "positive-reinhard-per-channel")
64
+ return (r, g, b, out) => {
65
+ out[0] = r > 0 ? r / (1 + r) : r;
66
+ out[1] = g > 0 ? g / (1 + g) : g;
67
+ out[2] = b > 0 ? b / (1 + b) : b;
68
+ };
69
+ let map;
70
+ if (curve === "extended-reinhard-luminance" && p && !("exponent" in p)) {
71
+ const white2 = p.whiteLuminance * p.whiteLuminance;
72
+ // Written as L/(1+L)·(1+L/Lw²) so a very large finite L cannot overflow an intermediate product.
73
+ map = (l) => l / (1 + l) * (1 + l / white2);
74
+ }
75
+ else if (curve === "naka-rushton-luminance" && p && "exponent" in p) {
76
+ // g(L) = Lⁿ/(Lⁿ+σⁿ) = 1/(1+(σ/L)ⁿ): no overflow for large L.
77
+ const q = p;
78
+ const n = q.exponent, sigma = q.semiSaturation, g = (l) => 1 / (1 + (sigma / l) ** n), white = g(q.whiteLuminance);
79
+ map = (l) => g(l) / white;
80
+ }
81
+ else
82
+ throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
83
+ const kr = LUMINANCE[0], kg = LUMINANCE[1], kb = LUMINANCE[2];
84
+ return (r, g, b, out) => {
85
+ const l = kr * r + kg * g + kb * b;
86
+ if (!(l > 0)) {
87
+ out[0] = r;
88
+ out[1] = g;
89
+ out[2] = b;
90
+ return;
91
+ }
92
+ const ratio = map(l) / l, mr = r * ratio, mg = g * ratio, mb = b * ratio;
93
+ if (!Number.isFinite(mr) || !Number.isFinite(mg) || !Number.isFinite(mb))
94
+ throw new InvalidScientificResultError("Tone mapping produced a non-finite sample.");
95
+ out[0] = mr;
96
+ out[1] = mg;
97
+ out[2] = mb;
98
+ };
99
+ }
100
+ /** Validates a rendering and encoding profile. Unknown HDR or display modes are rejected. */
21
101
  export function parseSdrRenderingProfile(value) {
22
- const r = object(value, ["schemaVersion", "profileId", "profileVersion", "renderingExposureEv", "toneCurve", "gamutHandling",
102
+ const r = object(value, ["schemaVersion", "profileId", "profileVersion", "renderingExposureEv", "toneCurve", "toneCurveParameters", "gamutHandling",
23
103
  "outputDynamicRange", "transferFunction", "bitDepth", "rounding", "dither"]);
104
+ const toneCurveParameters = parseToneCurveParameters(r.toneCurve, r.toneCurveParameters);
24
105
  if (r.schemaVersion !== SDR_RENDERING_SCHEMA_VERSION || typeof r.renderingExposureEv !== "number" ||
25
106
  !Number.isFinite(r.renderingExposureEv) || Math.abs(r.renderingExposureEv) > 32 ||
26
- (r.toneCurve !== "identity" && r.toneCurve !== "positive-reinhard-per-channel") ||
27
107
  (r.gamutHandling !== "clip-components" && r.gamutHandling !== "reject-out-of-range") ||
28
108
  r.outputDynamicRange !== "sdr" || r.transferFunction !== "srgb" || (r.bitDepth !== 8 && r.bitDepth !== 16) ||
29
109
  r.rounding !== "nearest-ties-up" || r.dither !== "none")
30
110
  throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
31
111
  return { schemaVersion: SDR_RENDERING_SCHEMA_VERSION, profileId: publicId(r.profileId), profileVersion: publicId(r.profileVersion),
32
112
  renderingExposureEv: Object.is(r.renderingExposureEv, -0) ? 0 : r.renderingExposureEv, toneCurve: r.toneCurve,
33
- gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,
113
+ ...(toneCurveParameters === undefined ? {} : { toneCurveParameters }), gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,
34
114
  bitDepth: r.bitDepth, rounding: r.rounding, dither: r.dither };
35
115
  }
36
- /** Validates declared image state and a bounded finite inline raster; never resolves WB/color. */
116
+ /** Validates the declared image state and a bounded, finite, inline image. It never applies white balance or colour conversion. */
37
117
  export function parseSdrRenderingInput(value) {
38
118
  const r = object(value, ["sourceImageStateId", "inputImageState", "inputColorSpace", "whiteBalanceHandling",
39
119
  "pixelWidth", "pixelHeight", "referenceWhiteValue", "samples", "profile"]);
@@ -54,7 +134,8 @@ export function parseSdrRenderingInput(value) {
54
134
  }
55
135
  /**
56
136
  * Standalone SDR rendering: rendering exposure → tone → gamut → sRGB transfer → quantization.
57
- * No physical capture, metering, WB/color/correction integration or display adaptation runs.
137
+ * No physical capture, metering, white balance, colour conversion, lens correction or display
138
+ * adaptation runs.
58
139
  */
59
140
  export function calculateSdrRendering(input) {
60
141
  const value = parseSdrRenderingInput(input), p = value.profile;
@@ -62,19 +143,26 @@ export function calculateSdrRendering(input) {
62
143
  if (!Number.isFinite(scale) || scale <= 0)
63
144
  throw new InvalidScientificResultError("Rendering scale is non-finite/unrepresentable.");
64
145
  let negative = 0, above = 0, changed = 0, low = 0, high = 0;
65
- const tone = value.samples.map((sample) => {
66
- const exposed = sample * scale;
67
- if (!Number.isFinite(exposed))
68
- throw new InvalidScientificResultError("Rendering exposure produced a non-finite sample.");
69
- if (exposed < 0)
70
- negative++;
71
- if (exposed > 1)
72
- above++;
73
- const mapped = p.toneCurve === "positive-reinhard-per-channel" && exposed > 0 ? exposed / (1 + exposed) : exposed;
74
- if (mapped !== exposed)
75
- changed++;
76
- return Object.is(mapped, -0) ? 0 : mapped;
77
- });
146
+ const toneOf = prepareSdrPixelTone(p), exposed = [0, 0, 0], mapped = [0, 0, 0], tone = [];
147
+ for (let i = 0; i < value.samples.length; i += 3) {
148
+ for (let c = 0; c < 3; c++) {
149
+ const e = value.samples[i + c] * scale;
150
+ if (!Number.isFinite(e))
151
+ throw new InvalidScientificResultError("Rendering exposure produced a non-finite sample.");
152
+ if (e < 0)
153
+ negative++;
154
+ if (e > 1)
155
+ above++;
156
+ exposed[c] = e;
157
+ }
158
+ toneOf(exposed[0], exposed[1], exposed[2], mapped);
159
+ for (let c = 0; c < 3; c++) {
160
+ const m = mapped[c];
161
+ if (m !== exposed[c])
162
+ changed++;
163
+ tone.push(m === 0 ? 0 : m);
164
+ }
165
+ }
78
166
  const linear = tone.map((sample) => {
79
167
  if (sample < 0 || sample > 1) {
80
168
  if (p.gamutHandling === "reject-out-of-range")
@@ -90,7 +178,8 @@ export function calculateSdrRendering(input) {
90
178
  });
91
179
  const encoded = linear.map(encodeSrgbComponent);
92
180
  const maximum = 2 ** p.bitDepth - 1;
93
- const codes = encoded.map((sample) => Math.floor(sample * maximum + .5));
181
+ // Nearest, ties up: encoded samples are in [0,1], where Math.round is exact ties-up rounding.
182
+ const codes = encoded.map((sample) => Math.round(sample * maximum));
94
183
  return calculatedResult({ schemaVersion: SDR_RENDERING_SCHEMA_VERSION, sourceImageStateId: value.sourceImageStateId,
95
184
  profile: p, pixelWidth: value.pixelWidth, pixelHeight: value.pixelHeight, channelOrder: ["red", "green", "blue"],
96
185
  whiteBalanceHandling: value.whiteBalanceHandling, toneMappedLinearSamples: tone, outputLinearSamples: linear,
@@ -99,8 +188,8 @@ export function calculateSdrRendering(input) {
99
188
  whitePointXy: [.3127, .3290], referenceWhiteLuminanceCdM2: 80, codeMinimum: 0, codeMaximum: maximum },
100
189
  diagnostics: { renderingNegativeSampleCount: negative, renderingAboveReferenceSampleCount: above,
101
190
  toneChangedSampleCount: changed, gamutClippedLowSampleCount: low, gamutClippedHighSampleCount: high, captureSaturation: "not-consumed" },
102
- displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" } }, "generic-sdr-rendering-reference", SDR_RENDERING_SCHEMA_VERSION, ["Deterministic first-party rendering choice, not a calibrated camera look or scene-light model",
103
- "Per-channel positive Reinhard can change chromaticity; component clipping is not perceptual gamut mapping",
191
+ displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" } }, "generic-sdr-rendering-reference", SDR_RENDERING_MODEL_VERSION, ["Deterministic first-party rendering choice, not a calibrated camera look or scene-light model",
192
+ "Per-channel positive Reinhard can change chromaticity; luminance curves preserve chromaticity until component clipping, which is not perceptual gamut mapping",
104
193
  "Input WB/color completion is a producer declaration; capture/correction adapter and production activation remain pending",
105
194
  "sRGB reference encoding assumptions do not establish actual display luminance, saturation or viewing conditions"]);
106
195
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdr-rendering.js","sourceRoot":"","sources":["../../src/output/sdr-rendering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdr-rendering.js","sourceRoot":"","sources":["../../src/output/sdr-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The SDR (standard dynamic range) reference renderer: linear sRGB → rendering exposure → tone\n * curve → gamut handling → sRGB transfer → integer codes.\n *\n * It takes linear RGB that already has colour and white balance (WB) applied. Unknown HDR or\n * display modes are rejected.\n * @see docs/SDR_RENDERING.md for equations, coordinate/unit conventions, blockers and support limits.\n */\n\nimport { encodeSrgbComponent } from \"../color/srgb-transfer.js\";\nimport { resolveCaptureColorModel } from \"../color/capture-color.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { calculatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { InvalidScientificResultError } from \"../core/validation.js\";\n\nexport const SDR_RENDERING_SCHEMA_VERSION = \"0.1.0\" as const;\n/**\n * Version of the `generic-sdr-rendering-reference` model. 0.2.0 added luminance tone curves and fixed\n * round-to-nearest, ties up (`Math.round`; the old `Math.floor(x+.5)` rounded 0.49999999999999994 up).\n */\nexport const SDR_RENDERING_MODEL_VERSION = \"0.2.0\" as const;\n/**\n * Tone curves. A per-channel curve acts on each exposed component separately. A luminance curve\n * scales all three components of a pixel by f(L)/L, where L is the linear-sRGB/D65 relative\n * luminance, so the colour (chromaticity) is kept before gamut handling.\n * - `identity`: f(x)=x.\n * - `positive-reinhard-per-channel`: f(x)=x/(1+x) for x>0 (Reinhard et al. 2002, eq. 3), per channel.\n * - `extended-reinhard-luminance`: f(L)=L(1+L/Lw²)/(1+L) (Reinhard et al. 2002, eq. 4); L=Lw maps to 1.\n * - `naka-rushton-luminance`: f(L)=g(L)/g(Lw), g(L)=Lⁿ/(Lⁿ+σⁿ) (Naka & Rushton 1966; Reinhard & Devlin\n * 2005): a sigmoid in log luminance with contrast n and mid-response σ, i.e. a film-like S-curve.\n */\nexport type SdrToneCurve = \"identity\" | \"positive-reinhard-per-channel\" | \"extended-reinhard-luminance\" | \"naka-rushton-luminance\";\n/** Required only by luminance curves; all values are relative linear luminance after rendering exposure. */\nexport type SdrToneCurveParameters =\n | { whiteLuminance: number }\n | { exponent: number; semiSaturation: number; whiteLuminance: number };\n/** Rendering choices made by the engine user. They are independent of physical exposure and display calibration. */\nexport interface SdrRenderingProfile {\n schemaVersion: typeof SDR_RENDERING_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n renderingExposureEv: number;\n toneCurve: SdrToneCurve;\n /** Present exactly for `extended-reinhard-luminance` ({whiteLuminance}) and `naka-rushton-luminance`. */\n toneCurveParameters?: SdrToneCurveParameters;\n gamutHandling: \"clip-components\" | \"reject-out-of-range\";\n outputDynamicRange: \"sdr\";\n transferFunction: \"srgb\";\n bitDepth: 8 | 16;\n rounding: \"nearest-ties-up\";\n dither: \"none\";\n}\n/** Only linear-sRGB/D65 data that has been explicitly colour-transformed, with all three channels at each pixel, is accepted. */\nexport interface SdrRenderingInput {\n sourceImageStateId: string;\n inputImageState: \"color-transformed-linear-rgb\";\n inputColorSpace: \"linear-srgb-d65\";\n whiteBalanceHandling: \"already-applied-upstream\" | \"not-required\";\n pixelWidth: number;\n pixelHeight: number;\n referenceWhiteValue: number;\n /** Relative linear RGB, row-major tightly interleaved red/green/blue. */\n samples: readonly number[];\n profile: SdrRenderingProfile;\n}\nfunction object(v: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(v, keys, \"Invalid SDR fields.\");\n}\nfunction publicId(v: unknown): string {\n return requirePublicOpaqueId(v, \"Invalid public SDR identity.\");\n}\nfunction bounded(value: unknown, minimumExclusive: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= minimumExclusive || value > maximum) {\n throw new InvalidConfigurationError(\"Unsupported SDR tone-curve parameters.\");\n }\n return value;\n}\nfunction parseToneCurveParameters(curve: unknown, value: unknown): SdrToneCurveParameters | undefined {\n if (curve === \"identity\" || curve === \"positive-reinhard-per-channel\") {\n if (value !== undefined) throw new InvalidConfigurationError(\"Per-channel tone curves take no parameters.\");\n return undefined;\n }\n if (curve === \"extended-reinhard-luminance\") {\n const p = requireAllowlistedRecord(value, [\"whiteLuminance\"], \"Invalid SDR tone-curve parameters.\");\n return { whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };\n }\n if (curve === \"naka-rushton-luminance\") {\n const p = requireAllowlistedRecord(value, [\"exponent\", \"semiSaturation\", \"whiteLuminance\"], \"Invalid SDR tone-curve parameters.\");\n const exponent = bounded(p.exponent, 0, 4);\n if (exponent < .25) throw new InvalidConfigurationError(\"Unsupported SDR tone-curve parameters.\");\n return { exponent, semiSaturation: bounded(p.semiSaturation, 0, 64), whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };\n }\n throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n}\n/** Linear-sRGB/D65 relative-luminance weights: the Y row of the engine's sRGB to XYZ matrix (W3C CSS Color 4 sRGB; also IEC 61966-2-1). */\nconst LUMINANCE = resolveCaptureColorModel().cameraRgbToXyz[1]! as readonly number[];\n/** Writes the three tone-mapped samples of one exposed pixel. Exposed values are finite. */\nexport type SdrPixelTone = (red: number, green: number, blue: number, out: Float64Array | number[]) => void;\n/**\n * Internal shared tone operator. The reference renderer, the native SDR kernel and RAW development all\n * call this one function, so every path uses the same per-pixel operation order. Not exported from the package.\n */\nexport function prepareSdrPixelTone(profile: Pick<SdrRenderingProfile, \"toneCurve\" | \"toneCurveParameters\">): SdrPixelTone {\n const curve = profile.toneCurve, p = profile.toneCurveParameters;\n if (curve === \"identity\") return (r, g, b, out) => { out[0] = r; out[1] = g; out[2] = b; };\n if (curve === \"positive-reinhard-per-channel\") return (r, g, b, out) => {\n out[0] = r > 0 ? r/(1+r) : r; out[1] = g > 0 ? g/(1+g) : g; out[2] = b > 0 ? b/(1+b) : b;\n };\n let map: (l: number) => number;\n if (curve === \"extended-reinhard-luminance\" && p && !(\"exponent\" in p)) {\n const white2 = p.whiteLuminance*p.whiteLuminance;\n // Written as L/(1+L)·(1+L/Lw²) so a very large finite L cannot overflow an intermediate product.\n map = (l: number): number => l/(1+l)*(1+l/white2);\n } else if (curve === \"naka-rushton-luminance\" && p && \"exponent\" in p) {\n // g(L) = Lⁿ/(Lⁿ+σⁿ) = 1/(1+(σ/L)ⁿ): no overflow for large L.\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>;\n const n = q.exponent, sigma = q.semiSaturation, g = (l: number): number => 1/(1+(sigma/l)**n), white = g(q.whiteLuminance);\n map = (l: number): number => g(l)/white;\n } else throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n const kr = LUMINANCE[0]!, kg = LUMINANCE[1]!, kb = LUMINANCE[2]!;\n return (r, g, b, out) => {\n const l = kr*r+kg*g+kb*b;\n if (!(l > 0)) { out[0] = r; out[1] = g; out[2] = b; return; }\n const ratio = map(l)/l, mr = r*ratio, mg = g*ratio, mb = b*ratio;\n if (!Number.isFinite(mr) || !Number.isFinite(mg) || !Number.isFinite(mb)) throw new InvalidScientificResultError(\"Tone mapping produced a non-finite sample.\");\n out[0] = mr; out[1] = mg; out[2] = mb;\n };\n}\n/** Validates a rendering and encoding profile. Unknown HDR or display modes are rejected. */\nexport function parseSdrRenderingProfile(value: unknown): SdrRenderingProfile {\n const r = object(value, [\"schemaVersion\", \"profileId\", \"profileVersion\", \"renderingExposureEv\", \"toneCurve\", \"toneCurveParameters\", \"gamutHandling\",\n \"outputDynamicRange\", \"transferFunction\", \"bitDepth\", \"rounding\", \"dither\"]);\n const toneCurveParameters = parseToneCurveParameters(r.toneCurve, r.toneCurveParameters);\n if (r.schemaVersion !== SDR_RENDERING_SCHEMA_VERSION || typeof r.renderingExposureEv !== \"number\" ||\n !Number.isFinite(r.renderingExposureEv) || Math.abs(r.renderingExposureEv) > 32 ||\n (r.gamutHandling !== \"clip-components\" && r.gamutHandling !== \"reject-out-of-range\") ||\n r.outputDynamicRange !== \"sdr\" || r.transferFunction !== \"srgb\" || (r.bitDepth !== 8 && r.bitDepth !== 16) ||\n r.rounding !== \"nearest-ties-up\" || r.dither !== \"none\") throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n return { schemaVersion: SDR_RENDERING_SCHEMA_VERSION, profileId: publicId(r.profileId), profileVersion: publicId(r.profileVersion),\n renderingExposureEv: Object.is(r.renderingExposureEv, -0) ? 0 : r.renderingExposureEv, toneCurve: r.toneCurve as SdrToneCurve,\n ...(toneCurveParameters === undefined ? {} : { toneCurveParameters }), gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,\n bitDepth: r.bitDepth, rounding: r.rounding, dither: r.dither };\n}\n/** Validates the declared image state and a bounded, finite, inline image. It never applies white balance or colour conversion. */\nexport function parseSdrRenderingInput(value: unknown): SdrRenderingInput {\n const r = object(value, [\"sourceImageStateId\", \"inputImageState\", \"inputColorSpace\", \"whiteBalanceHandling\",\n \"pixelWidth\", \"pixelHeight\", \"referenceWhiteValue\", \"samples\", \"profile\"]);\n const samples = r.samples;\n if (r.inputImageState !== \"color-transformed-linear-rgb\" || r.inputColorSpace !== \"linear-srgb-d65\" ||\n (r.whiteBalanceHandling !== \"already-applied-upstream\" && r.whiteBalanceHandling !== \"not-required\") ||\n typeof r.pixelWidth !== \"number\" || !Number.isSafeInteger(r.pixelWidth) || r.pixelWidth <= 0 ||\n typeof r.pixelHeight !== \"number\" || !Number.isSafeInteger(r.pixelHeight) || r.pixelHeight <= 0 ||\n typeof r.referenceWhiteValue !== \"number\" || !Number.isFinite(r.referenceWhiteValue) || r.referenceWhiteValue <= 0 ||\n !Array.isArray(samples) || samples.length !== r.pixelWidth*r.pixelHeight*3 || samples.length > 262144 ||\n Array.from({ length: samples.length }, (_, i) => i in samples).includes(false) ||\n samples.some((v) => typeof v !== \"number\" || !Number.isFinite(v))) throw new InvalidConfigurationError(\"Unsupported SDR input domain/raster.\");\n return { sourceImageStateId: publicId(r.sourceImageStateId), inputImageState: r.inputImageState, inputColorSpace: r.inputColorSpace,\n whiteBalanceHandling: r.whiteBalanceHandling, pixelWidth: r.pixelWidth, pixelHeight: r.pixelHeight,\n referenceWhiteValue: r.referenceWhiteValue, samples: samples.map((v: number) => Object.is(v, -0) ? 0 : v),\n profile: parseSdrRenderingProfile(r.profile) };\n}\nexport interface SdrRenderingResult {\n schemaVersion: typeof SDR_RENDERING_SCHEMA_VERSION;\n sourceImageStateId: string;\n profile: SdrRenderingProfile;\n pixelWidth: number;\n pixelHeight: number;\n channelOrder: readonly [\"red\", \"green\", \"blue\"];\n whiteBalanceHandling: SdrRenderingInput[\"whiteBalanceHandling\"];\n /** Relative normalized linear samples after exposure/tone, before gamut handling. */\n toneMappedLinearSamples: readonly number[];\n outputLinearSamples: readonly number[];\n outputEncodedSamples: readonly number[];\n integerSamples: readonly number[];\n outputEncoding: {\n imageState: \"output-referred-sdr\";\n colorSpace: \"srgb\";\n primariesXy: { red: readonly [number, number]; green: readonly [number, number]; blue: readonly [number, number] };\n whitePointXy: readonly [number, number];\n referenceWhiteLuminanceCdM2: 80;\n codeMinimum: 0;\n codeMaximum: number;\n };\n diagnostics: {\n renderingNegativeSampleCount: number;\n renderingAboveReferenceSampleCount: number;\n toneChangedSampleCount: number;\n gamutClippedLowSampleCount: number;\n gamutClippedHighSampleCount: number;\n /**\n * `not-consumed`: no upstream saturation data (full well, ADC or RAW) is available, and it is never\n * guessed from the output.\n * `consumed-in-raw-development`: RAW development already clipped or reconstructed flagged and\n * white-level samples before white balance (see its highlight diagnostics).\n */\n captureSaturation: \"not-consumed\" | \"consumed-in-raw-development\";\n };\n /** Describes the encoded output for the platform's colour management. No real display is assessed. */\n displayAdaptation: { kind: \"external-platform\"; applied: false; displayCapabilities: \"unknown\" };\n}\n/**\n * Standalone SDR rendering: rendering exposure → tone → gamut → sRGB transfer → quantization.\n * No physical capture, metering, white balance, colour conversion, lens correction or display\n * adaptation runs.\n */\nexport function calculateSdrRendering(input: SdrRenderingInput): CalculationResult<SdrRenderingResult> {\n const value = parseSdrRenderingInput(input), p = value.profile;\n const scale = 2**p.renderingExposureEv/value.referenceWhiteValue;\n if (!Number.isFinite(scale) || scale <= 0) throw new InvalidScientificResultError(\"Rendering scale is non-finite/unrepresentable.\");\n let negative = 0, above = 0, changed = 0, low = 0, high = 0;\n const toneOf = prepareSdrPixelTone(p), exposed = [0, 0, 0], mapped = [0, 0, 0], tone: number[] = [];\n for (let i = 0; i < value.samples.length; i += 3) {\n for (let c = 0; c < 3; c++) {\n const e = value.samples[i+c]!*scale;\n if (!Number.isFinite(e)) throw new InvalidScientificResultError(\"Rendering exposure produced a non-finite sample.\");\n if (e < 0) negative++;\n if (e > 1) above++;\n exposed[c] = e;\n }\n toneOf(exposed[0]!, exposed[1]!, exposed[2]!, mapped);\n for (let c = 0; c < 3; c++) {\n const m = mapped[c]!;\n if (m !== exposed[c]) changed++;\n tone.push(m === 0 ? 0 : m);\n }\n }\n const linear = tone.map((sample) => {\n if (sample < 0 || sample > 1) {\n if (p.gamutHandling === \"reject-out-of-range\") throw new InvalidConfigurationError(\"Tone output exceeds the declared SDR gamut range.\");\n if (sample < 0) { low++; return 0; }\n high++; return 1;\n }\n return sample;\n });\n const encoded = linear.map(encodeSrgbComponent);\n const maximum = 2**p.bitDepth-1;\n // Nearest, ties up: encoded samples are in [0,1], where Math.round is exact ties-up rounding.\n const codes = encoded.map((sample) => Math.round(sample*maximum));\n return calculatedResult({ schemaVersion: SDR_RENDERING_SCHEMA_VERSION, sourceImageStateId: value.sourceImageStateId,\n profile: p, pixelWidth: value.pixelWidth, pixelHeight: value.pixelHeight, channelOrder: [\"red\", \"green\", \"blue\"],\n whiteBalanceHandling: value.whiteBalanceHandling, toneMappedLinearSamples: tone, outputLinearSamples: linear,\n outputEncodedSamples: encoded, integerSamples: codes,\n outputEncoding: { imageState: \"output-referred-sdr\", colorSpace: \"srgb\", primariesXy: { red: [.64, .33], green: [.30, .60], blue: [.15, .06] },\n whitePointXy: [.3127, .3290], referenceWhiteLuminanceCdM2: 80, codeMinimum: 0, codeMaximum: maximum },\n diagnostics: { renderingNegativeSampleCount: negative, renderingAboveReferenceSampleCount: above,\n toneChangedSampleCount: changed, gamutClippedLowSampleCount: low, gamutClippedHighSampleCount: high, captureSaturation: \"not-consumed\" },\n displayAdaptation: { kind: \"external-platform\", applied: false, displayCapabilities: \"unknown\" } },\n \"generic-sdr-rendering-reference\", SDR_RENDERING_MODEL_VERSION,\n [\"Deterministic first-party rendering choice, not a calibrated camera look or scene-light model\",\n \"Per-channel positive Reinhard can change chromaticity; luminance curves preserve chromaticity until component clipping, which is not perceptual gamut mapping\",\n \"Input WB/color completion is a producer declaration; capture/correction adapter and production activation remain pending\",\n \"sRGB reference encoding assumptions do not establish actual display luminance, saturation or viewing conditions\"]);\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Calculates the same-aspect-ratio crop needed for a subject to occupy a requested fraction of frame
4
- * height. This calculation assumes a centered/positionable crop with enough spatial margin around the
5
- * subject. It does not validate subject position against image edges.
2
+ * Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share
3
+ * of the frame height.
6
4
  * @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support
7
5
  * limits.
8
6
  */
@@ -33,12 +31,10 @@ export interface SubjectFramingCrop {
33
31
  cropped: boolean;
34
32
  }
35
33
  /**
36
- * Calculates the same-aspect-ratio crop needed for a subject to occupy a
37
- * requested fraction of frame height.
34
+ * Calculates the crop (keeping the aspect ratio) that makes a subject fill a
35
+ * requested fraction of the frame height.
38
36
  *
39
- * This calculation assumes a centered/positionable crop with enough spatial
40
- * margin around the subject. It does not validate subject position against
41
- * image edges.
37
+ * It assumes the crop can be centred or moved freely, with enough room around
38
+ * the subject. It does not check the subject's position against the image edges.
42
39
  */
43
40
  export declare function calculateSubjectFramingCrop(input: CalculateSubjectFramingCropInput): CalculationResult<SubjectFramingCrop>;
44
- //# sourceMappingURL=subject-framing-crop.d.ts.map
@@ -1,23 +1,23 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Calculates the same-aspect-ratio crop needed for a subject to occupy a requested fraction of frame
5
- * height. This calculation assumes a centered/positionable crop with enough spatial margin around the
6
- * subject. It does not validate subject position against image edges.
3
+ * Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share
4
+ * of the frame height.
7
5
  * @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support
8
6
  * limits.
9
7
  */
10
8
  import { calculatedResult } from "../core/calculation-result.js";
11
9
  import { InvalidScientificInputError, requirePositiveFinite, requirePositiveInteger } from "../core/validation.js";
10
+ import { floorWholePixels } from "./crop.js";
11
+ import { requireInputKeys } from "../core/record-validation.js";
12
12
  /**
13
- * Calculates the same-aspect-ratio crop needed for a subject to occupy a
14
- * requested fraction of frame height.
13
+ * Calculates the crop (keeping the aspect ratio) that makes a subject fill a
14
+ * requested fraction of the frame height.
15
15
  *
16
- * This calculation assumes a centered/positionable crop with enough spatial
17
- * margin around the subject. It does not validate subject position against
18
- * image edges.
16
+ * It assumes the crop can be centred or moved freely, with enough room around
17
+ * the subject. It does not check the subject's position against the image edges.
19
18
  */
20
19
  export function calculateSubjectFramingCrop(input) {
20
+ requireInputKeys(input, "calculateSubjectFramingCrop", ["pixelWidth", "pixelHeight", "subjectHeightPixels", "targetSubjectHeightFraction"]);
21
21
  requirePositiveInteger("pixelWidth", input.pixelWidth);
22
22
  requirePositiveInteger("pixelHeight", input.pixelHeight);
23
23
  requirePositiveFinite("subjectHeightPixels", input.subjectHeightPixels);
@@ -29,8 +29,18 @@ export function calculateSubjectFramingCrop(input) {
29
29
  const cropFactor = requestedCropHeight >= input.pixelHeight
30
30
  ? 1
31
31
  : input.pixelHeight / requestedCropHeight;
32
- const pixelHeight = Math.max(1, Math.floor(input.pixelHeight / cropFactor));
33
- const pixelWidth = Math.max(1, Math.floor(input.pixelWidth / cropFactor));
32
+ // Height is the limiting axis. Compute it straight from the requested crop
33
+ // height, not through H / (H / requested), whose rounding could lose a pixel.
34
+ // It is the largest whole-pixel height within the requested crop, so the
35
+ // subject fills at least the target fraction. It is never smaller than the
36
+ // subject, so rounding alone never clips the subject. Width follows from that
37
+ // integer height and the source aspect ratio.
38
+ const pixelHeight = cropFactor === 1
39
+ ? input.pixelHeight
40
+ : Math.min(input.pixelHeight, Math.max(floorWholePixels(requestedCropHeight), Math.ceil(input.subjectHeightPixels)));
41
+ const pixelWidth = cropFactor === 1
42
+ ? input.pixelWidth
43
+ : Math.max(1, Math.min(input.pixelWidth, Math.round((pixelHeight * input.pixelWidth) / input.pixelHeight)));
34
44
  const subjectHeightFraction = input.subjectHeightPixels / pixelHeight;
35
45
  return calculatedResult({
36
46
  cropFactor,
@@ -40,8 +50,8 @@ export function calculateSubjectFramingCrop(input) {
40
50
  subjectHeightFraction,
41
51
  subjectClipped: subjectHeightFraction > 1,
42
52
  cropped: cropFactor > 1
43
- }, "subject-height-framing-crop", "1.0.0", [
44
- "Original aspect ratio is preserved",
53
+ }, "subject-height-framing-crop", "2.0.0", [
54
+ "Crop height is the largest whole-pixel height within the requested crop, but never smaller than the subject; width is the nearest integer to the original aspect ratio",
45
55
  "Crop can be positioned around the subject",
46
56
  "Subject edge/margin constraints are not modeled",
47
57
  "subjectHeightFraction may exceed 1 when the subject is clipped by frame height"
@@ -1 +1 @@
1
- {"version":3,"file":"subject-framing-crop.js","sourceRoot":"","sources":["../../src/output/subject-framing-crop.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AA6B/B;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAuC;IAEvC,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACzD,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxE,qBAAqB,CACnB,6BAA6B,EAC7B,KAAK,CAAC,2BAA2B,CAClC,CAAC;IAEF,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,2BAA2B,CACnC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GACvB,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,2BAA2B,CAAC;IAChE,MAAM,UAAU,GACd,mBAAmB,IAAI,KAAK,CAAC,WAAW;QACtC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,mBAAmB,CAAC;IAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,CAC3C,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,CAC1C,CAAC;IACF,MAAM,qBAAqB,GACzB,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC;IAE1C,OAAO,gBAAgB,CACrB;QACE,UAAU;QACV,UAAU;QACV,WAAW;QACX,UAAU,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,SAAS;QAClD,qBAAqB;QACrB,cAAc,EAAE,qBAAqB,GAAG,CAAC;QACzC,OAAO,EAAE,UAAU,GAAG,CAAC;KACxB,EACD,6BAA6B,EAC7B,OAAO,EACP;QACE,oCAAoC;QACpC,2CAA2C;QAC3C,iDAAiD;QACjD,gFAAgF;KACjF,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"subject-framing-crop.js","sourceRoot":"","sources":["../../src/output/subject-framing-crop.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA6BhE;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAuC;IAEvC,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAC5I,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACzD,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxE,qBAAqB,CACnB,6BAA6B,EAC7B,KAAK,CAAC,2BAA2B,CAClC,CAAC;IAEF,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,2BAA2B,CACnC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GACvB,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,2BAA2B,CAAC;IAChE,MAAM,UAAU,GACd,mBAAmB,IAAI,KAAK,CAAC,WAAW;QACtC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,mBAAmB,CAAC;IAE9C,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,2EAA2E;IAC3E,8EAA8E;IAC9E,8CAA8C;IAC9C,MAAM,WAAW,GACf,UAAU,KAAK,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,WAAW,EACjB,IAAI,CAAC,GAAG,CACN,gBAAgB,CAAC,mBAAmB,CAAC,EACrC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CACrC,CACF,CAAC;IACR,MAAM,UAAU,GACd,UAAU,KAAK,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,UAAU;QAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CACjE,CACF,CAAC;IACR,MAAM,qBAAqB,GACzB,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC;IAE1C,OAAO,gBAAgB,CACrB;QACE,UAAU;QACV,UAAU;QACV,WAAW;QACX,UAAU,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,SAAS;QAClD,qBAAqB;QACrB,cAAc,EAAE,qBAAqB,GAAG,CAAC;QACzC,OAAO,EAAE,UAAU,GAAG,CAAC;KACxB,EACD,6BAA6B,EAC7B,OAAO,EACP;QACE,wKAAwK;QACxK,2CAA2C;QAC3C,iDAAiD;QACjD,gFAAgF;KACjF,CACF,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share\n * of the frame height.\n * @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport { floorWholePixels } from \"./crop.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\nexport interface CalculateSubjectFramingCropInput {\n /** Source image width in pixels. */\n pixelWidth: number;\n /** Source image height in pixels. */\n pixelHeight: number;\n /** Projected subject height in source-image pixels. */\n subjectHeightPixels: number;\n /** Desired subject height as a fraction of output frame height, >0 and <=1. */\n targetSubjectHeightFraction: number;\n}\n\nexport interface SubjectFramingCrop {\n cropFactor: number;\n pixelWidth: number;\n pixelHeight: number;\n megapixels: number;\n /**\n * Actual subject height divided by cropped frame height.\n * Values greater than 1 mean the subject is taller than the output frame.\n */\n subjectHeightFraction: number;\n /** Whether the projected subject exceeds the cropped frame height. */\n subjectClipped: boolean;\n /** Whether achieving the target required an additional crop. */\n cropped: boolean;\n}\n\n/**\n * Calculates the crop (keeping the aspect ratio) that makes a subject fill a\n * requested fraction of the frame height.\n *\n * It assumes the crop can be centred or moved freely, with enough room around\n * the subject. It does not check the subject's position against the image edges.\n */\nexport function calculateSubjectFramingCrop(\n input: CalculateSubjectFramingCropInput\n): CalculationResult<SubjectFramingCrop> {\n requireInputKeys(input, \"calculateSubjectFramingCrop\", [\"pixelWidth\", \"pixelHeight\", \"subjectHeightPixels\", \"targetSubjectHeightFraction\"]);\n requirePositiveInteger(\"pixelWidth\", input.pixelWidth);\n requirePositiveInteger(\"pixelHeight\", input.pixelHeight);\n requirePositiveFinite(\"subjectHeightPixels\", input.subjectHeightPixels);\n requirePositiveFinite(\n \"targetSubjectHeightFraction\",\n input.targetSubjectHeightFraction\n );\n\n if (input.targetSubjectHeightFraction > 1) {\n throw new InvalidScientificInputError(\n \"targetSubjectHeightFraction must be less than or equal to 1.\"\n );\n }\n\n const requestedCropHeight =\n input.subjectHeightPixels / input.targetSubjectHeightFraction;\n const cropFactor =\n requestedCropHeight >= input.pixelHeight\n ? 1\n : input.pixelHeight / requestedCropHeight;\n\n // Height is the limiting axis. Compute it straight from the requested crop\n // height, not through H / (H / requested), whose rounding could lose a pixel.\n // It is the largest whole-pixel height within the requested crop, so the\n // subject fills at least the target fraction. It is never smaller than the\n // subject, so rounding alone never clips the subject. Width follows from that\n // integer height and the source aspect ratio.\n const pixelHeight =\n cropFactor === 1\n ? input.pixelHeight\n : Math.min(\n input.pixelHeight,\n Math.max(\n floorWholePixels(requestedCropHeight),\n Math.ceil(input.subjectHeightPixels)\n )\n );\n const pixelWidth =\n cropFactor === 1\n ? input.pixelWidth\n : Math.max(\n 1,\n Math.min(\n input.pixelWidth,\n Math.round((pixelHeight * input.pixelWidth) / input.pixelHeight)\n )\n );\n const subjectHeightFraction =\n input.subjectHeightPixels / pixelHeight;\n\n return calculatedResult(\n {\n cropFactor,\n pixelWidth,\n pixelHeight,\n megapixels: (pixelWidth * pixelHeight) / 1_000_000,\n subjectHeightFraction,\n subjectClipped: subjectHeightFraction > 1,\n cropped: cropFactor > 1\n },\n \"subject-height-framing-crop\",\n \"2.0.0\",\n [\n \"Crop height is the largest whole-pixel height within the requested crop, but never smaller than the subject; width is the nearest integer to the original aspect ratio\",\n \"Crop can be positioned around the subject\",\n \"Subject edge/margin constraints are not modeled\",\n \"subjectHeightFraction may exceed 1 when the subject is clipped by frame height\"\n ]\n );\n}\n"]}
@@ -0,0 +1,90 @@
1
+ import { type ColorMatrix3x3 } from "../color/colorimetry-math.js";
2
+ import { type SensorColorSamplingProfile } from "../sensor/color-sampling.js";
3
+ import { type RawReconstructionBorderHandling } from "../sensor/raw-reconstruction.js";
4
+ import { type RawFrameReconstructionPhaseProfile } from "../capture/raw-frame-reconstruction.js";
5
+ import { type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask } from "./processing-task.js";
6
+ /** A single-channel linear CFA mosaic in absolute native site coordinates (row-major, +Y down). */
7
+ export interface CfaMosaicPlane {
8
+ width: number;
9
+ height: number;
10
+ captureModeId: string;
11
+ /** Periodic mosaic anchored at site (0, 0) of this plane. */
12
+ colorSamplingProfile: SensorColorSamplingProfile;
13
+ /** Linear values, e.g. black-subtracted normalized RAW or merged HDR radiance. */
14
+ samples: Float32Array;
15
+ }
16
+ export interface CfaPlaneReconstructionInput {
17
+ plane: CfaMosaicPlane;
18
+ phaseProfiles: readonly RawFrameReconstructionPhaseProfile[];
19
+ /** Default `reject`: every neighbourhood must lie inside the plane. */
20
+ borderHandling?: RawReconstructionBorderHandling;
21
+ /** Output region in plane coordinates; default the whole plane. */
22
+ region?: {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ };
28
+ maximumWorkingBytes?: number;
29
+ }
30
+ export interface CfaPlaneReconstructionOutput {
31
+ width: number;
32
+ height: number;
33
+ region: {
34
+ x: number;
35
+ y: number;
36
+ width: number;
37
+ height: number;
38
+ };
39
+ channelIds: readonly string[];
40
+ /** Interleaved `channelIds.length` channels, row-major over the region. */
41
+ data: Float32Array;
42
+ borderHandling: RawReconstructionBorderHandling;
43
+ provenance: ProcessingProvenance;
44
+ }
45
+ /**
46
+ * Runs explicit linear reconstruction kernels, one per CFA phase, over a typed CFA plane.
47
+ * - With `mirror` borders, a site outside the plane is read from its mirrored (reflect-101) position.
48
+ * This is accepted only if the mirrored site has the same CFA channel, which is always true for a
49
+ * 2×2 Bayer pattern.
50
+ * - With `reject`, out-of-plane reads throw (fail closed), like the reference resolver.
51
+ * Values are linear and signed. No clamping, white balance or colour transform is applied.
52
+ */
53
+ export declare function createCfaPlaneReconstructionTask(input: CfaPlaneReconstructionInput, provider: ProcessingProvider): ProcessingTask<CfaPlaneReconstructionOutput>;
54
+ export interface AhdDemosaicInput {
55
+ plane: CfaMosaicPlane;
56
+ /** CFA channel ids of the red, green and blue sites; output order is red, green, blue. */
57
+ channelRoles: {
58
+ red: string;
59
+ green: string;
60
+ blue: string;
61
+ };
62
+ /**
63
+ * Camera-linear RGB → CIE XYZ, used only for the homogeneity metric (in CIELAB). Default: the
64
+ * sRGB/D65 matrix, so the plane is treated as linear sRGB for the metric. Output values are never
65
+ * transformed.
66
+ */
67
+ cameraToXyz?: ColorMatrix3x3;
68
+ maximumWorkingBytes?: number;
69
+ }
70
+ export interface AhdDemosaicOutput extends ProcessingRgbImage {
71
+ /** Per pixel: 0 horizontal, 1 vertical, 2 equal homogeneity (average of both). */
72
+ direction: Uint8Array;
73
+ provenance: ProcessingProvenance;
74
+ }
75
+ /**
76
+ * Adaptive homogeneity-directed (AHD) demosaicing after Hirakawa & Parks, IEEE TIP 14(3), 2005:
77
+ * 1. green is interpolated separately along rows and columns with the 5-tap directional filter
78
+ * [−1/4, 1/2, 1/2, 1/2, −1/4] (bilinear green plus the own-channel second difference);
79
+ * 2. red and blue are filled from bilinearly interpolated colour differences (R−G, B−G) against each
80
+ * directional green, giving two full-colour candidates;
81
+ * 3. both candidates are converted to CIELAB. At each pixel, the homogeneity is the number of
82
+ * 4-neighbours within adaptive luminance and chrominance tolerances ε_L, ε_C. Each tolerance is the
83
+ * smaller of the two directions' largest differences along their own direction;
84
+ * 4. homogeneity is summed over 3×3, and the more homogeneous candidate is chosen (a tie averages
85
+ * both).
86
+ * The paper's optional iterative median step for reducing artifacts is not applied. Mirrored
87
+ * (reflect-101) borders keep each site's Bayer channel. The method is non-linear: the output is not a
88
+ * linear function of the mosaic.
89
+ */
90
+ export declare function createAhdDemosaicTask(input: AhdDemosaicInput, provider: ProcessingProvider): ProcessingTask<AhdDemosaicOutput>;