@photivra/engine 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1085) hide show
  1. package/CHANGELOG.md +414 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/diffraction-provider.d.ts +30 -0
  236. package/dist/facade/diffraction-provider.js +127 -0
  237. package/dist/facade/diffraction-provider.js.map +1 -0
  238. package/dist/facade/host-yield.d.ts +7 -0
  239. package/dist/facade/host-yield.js +19 -0
  240. package/dist/facade/host-yield.js.map +1 -0
  241. package/dist/facade/scene-radiance.d.ts +117 -0
  242. package/dist/facade/scene-radiance.js +205 -0
  243. package/dist/facade/scene-radiance.js.map +1 -0
  244. package/dist/facade/simulate-capture.d.ts +363 -0
  245. package/dist/facade/simulate-capture.js +1281 -0
  246. package/dist/facade/simulate-capture.js.map +1 -0
  247. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  248. package/dist/gpu/chart-radiance-gpu.js +176 -0
  249. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  250. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  251. package/dist/gpu/image-kernel-accelerator.js +720 -0
  252. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  253. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  254. package/dist/gpu/image-kernel-execution.js +84 -0
  255. package/dist/gpu/image-kernel-execution.js.map +1 -0
  256. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  257. package/dist/gpu/sensor-stage-gpu.js +317 -0
  258. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  259. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  260. package/dist/gpu/temporal-sum-gpu.js +150 -0
  261. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  262. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  263. package/dist/gpu/webgpu-runtime.js +215 -0
  264. package/dist/gpu/webgpu-runtime.js.map +1 -0
  265. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  266. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  267. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  268. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  269. package/dist/gpu/wgsl-kernels.js +365 -0
  270. package/dist/gpu/wgsl-kernels.js.map +1 -0
  271. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  272. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  273. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  274. package/dist/index.d.ts +91 -25
  275. package/dist/index.js +60 -15
  276. package/dist/index.js.map +1 -1
  277. package/dist/motion/camera-rotation.d.ts +92 -40
  278. package/dist/motion/camera-rotation.js +84 -47
  279. package/dist/motion/camera-rotation.js.map +1 -1
  280. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  281. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  282. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  283. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  284. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  285. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  286. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  287. package/dist/motion/capture-rotation-trajectory.js +36 -26
  288. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  289. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  290. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  291. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  292. package/dist/motion/extended-object-projection.d.ts +19 -16
  293. package/dist/motion/extended-object-projection.js +38 -18
  294. package/dist/motion/extended-object-projection.js.map +1 -1
  295. package/dist/motion/projected-motion.d.ts +18 -17
  296. package/dist/motion/projected-motion.js +25 -17
  297. package/dist/motion/projected-motion.js.map +1 -1
  298. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  299. package/dist/motion/temporal-exposure-sum.js +141 -0
  300. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  301. package/dist/motion/video-sequence.d.ts +111 -0
  302. package/dist/motion/video-sequence.js +179 -0
  303. package/dist/motion/video-sequence.js.map +1 -0
  304. package/dist/optics/aperture.d.ts +14 -15
  305. package/dist/optics/aperture.js +13 -11
  306. package/dist/optics/aperture.js.map +1 -1
  307. package/dist/optics/atmospheric-haze.d.ts +83 -0
  308. package/dist/optics/atmospheric-haze.js +113 -0
  309. package/dist/optics/atmospheric-haze.js.map +1 -0
  310. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  311. package/dist/optics/brown-conrady-distortion.js +291 -0
  312. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  313. package/dist/optics/circle-of-confusion.d.ts +10 -10
  314. package/dist/optics/circle-of-confusion.js +15 -11
  315. package/dist/optics/circle-of-confusion.js.map +1 -1
  316. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  317. package/dist/optics/complex-pupil-psf.js +190 -98
  318. package/dist/optics/complex-pupil-psf.js.map +1 -1
  319. package/dist/optics/depth-of-field.d.ts +25 -15
  320. package/dist/optics/depth-of-field.js +67 -27
  321. package/dist/optics/depth-of-field.js.map +1 -1
  322. package/dist/optics/diffraction-psf-profile.d.ts +118 -0
  323. package/dist/optics/diffraction-psf-profile.js +252 -0
  324. package/dist/optics/diffraction-psf-profile.js.map +1 -0
  325. package/dist/optics/diffraction.d.ts +14 -13
  326. package/dist/optics/diffraction.js +14 -10
  327. package/dist/optics/diffraction.js.map +1 -1
  328. package/dist/optics/focus-breathing.d.ts +88 -27
  329. package/dist/optics/focus-breathing.js +114 -23
  330. package/dist/optics/focus-breathing.js.map +1 -1
  331. package/dist/optics/focus-state.d.ts +18 -18
  332. package/dist/optics/focus-state.js +21 -15
  333. package/dist/optics/focus-state.js.map +1 -1
  334. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  335. package/dist/optics/front-of-lens-filter.js +259 -88
  336. package/dist/optics/front-of-lens-filter.js.map +1 -1
  337. package/dist/optics/illumination-vignetting.d.ts +16 -17
  338. package/dist/optics/illumination-vignetting.js +40 -17
  339. package/dist/optics/illumination-vignetting.js.map +1 -1
  340. package/dist/optics/irradiance-convolution.d.ts +59 -0
  341. package/dist/optics/irradiance-convolution.js +138 -0
  342. package/dist/optics/irradiance-convolution.js.map +1 -0
  343. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  344. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  345. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  346. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  347. package/dist/optics/lens-psf-kernels.js +175 -0
  348. package/dist/optics/lens-psf-kernels.js.map +1 -0
  349. package/dist/optics/lens-psf-profile.d.ts +78 -46
  350. package/dist/optics/lens-psf-profile.js +335 -124
  351. package/dist/optics/lens-psf-profile.js.map +1 -1
  352. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  353. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  354. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  355. package/dist/optics/polygon-diffraction.d.ts +80 -23
  356. package/dist/optics/polygon-diffraction.js +130 -25
  357. package/dist/optics/polygon-diffraction.js.map +1 -1
  358. package/dist/optics/profile-contract.d.ts +5 -6
  359. package/dist/optics/profile-contract.js +14 -11
  360. package/dist/optics/profile-contract.js.map +1 -1
  361. package/dist/optics/psf-foundation.d.ts +23 -23
  362. package/dist/optics/psf-foundation.js +24 -21
  363. package/dist/optics/psf-foundation.js.map +1 -1
  364. package/dist/optics/pupil-vignetting.d.ts +118 -0
  365. package/dist/optics/pupil-vignetting.js +264 -0
  366. package/dist/optics/pupil-vignetting.js.map +1 -0
  367. package/dist/optics/radial-distortion.d.ts +34 -33
  368. package/dist/optics/radial-distortion.js +37 -30
  369. package/dist/optics/radial-distortion.js.map +1 -1
  370. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  371. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  372. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  373. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  374. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  375. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  376. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  377. package/dist/optics/sensor-aperture-rays.js +32 -14
  378. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  379. package/dist/optics/sensor-environment-query.d.ts +81 -16
  380. package/dist/optics/sensor-environment-query.js +145 -12
  381. package/dist/optics/sensor-environment-query.js.map +1 -1
  382. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  383. package/dist/optics/sensor-psf-quadrature.js +18 -11
  384. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  385. package/dist/optics/sensor-psf-support.d.ts +8 -6
  386. package/dist/optics/sensor-psf-support.js +8 -5
  387. package/dist/optics/sensor-psf-support.js.map +1 -1
  388. package/dist/optics/stray-light.d.ts +22 -19
  389. package/dist/optics/stray-light.js +18 -12
  390. package/dist/optics/stray-light.js.map +1 -1
  391. package/dist/optics/thin-lens.d.ts +10 -9
  392. package/dist/optics/thin-lens.js +12 -8
  393. package/dist/optics/thin-lens.js.map +1 -1
  394. package/dist/optics/zernike-wavefront.d.ts +154 -0
  395. package/dist/optics/zernike-wavefront.js +352 -0
  396. package/dist/optics/zernike-wavefront.js.map +1 -0
  397. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  398. package/dist/output/capture-corrected-sdr.js +16 -8
  399. package/dist/output/capture-corrected-sdr.js.map +1 -1
  400. package/dist/output/capture-geometry.d.ts +34 -36
  401. package/dist/output/capture-geometry.js +52 -32
  402. package/dist/output/capture-geometry.js.map +1 -1
  403. package/dist/output/capture-sdr.d.ts +7 -6
  404. package/dist/output/capture-sdr.js +11 -8
  405. package/dist/output/capture-sdr.js.map +1 -1
  406. package/dist/output/crop.d.ts +22 -6
  407. package/dist/output/crop.js +40 -6
  408. package/dist/output/crop.js.map +1 -1
  409. package/dist/output/geometric-transforms.d.ts +60 -23
  410. package/dist/output/geometric-transforms.js +111 -24
  411. package/dist/output/geometric-transforms.js.map +1 -1
  412. package/dist/output/lens-corrections.d.ts +27 -19
  413. package/dist/output/lens-corrections.js +29 -13
  414. package/dist/output/lens-corrections.js.map +1 -1
  415. package/dist/output/native-capture-sdr.d.ts +71 -16
  416. package/dist/output/native-capture-sdr.js +190 -33
  417. package/dist/output/native-capture-sdr.js.map +1 -1
  418. package/dist/output/png-encoder.d.ts +65 -0
  419. package/dist/output/png-encoder.js +461 -0
  420. package/dist/output/png-encoder.js.map +1 -0
  421. package/dist/output/print-contrast-reference.d.ts +10 -9
  422. package/dist/output/print-contrast-reference.js +10 -8
  423. package/dist/output/print-contrast-reference.js.map +1 -1
  424. package/dist/output/print-detail.d.ts +18 -17
  425. package/dist/output/print-detail.js +12 -10
  426. package/dist/output/print-detail.js.map +1 -1
  427. package/dist/output/print-jpeg.d.ts +26 -5
  428. package/dist/output/print-jpeg.js +117 -50
  429. package/dist/output/print-jpeg.js.map +1 -1
  430. package/dist/output/print-plan.d.ts +19 -19
  431. package/dist/output/print-plan.js +11 -10
  432. package/dist/output/print-plan.js.map +1 -1
  433. package/dist/output/print-region-statistics.d.ts +14 -15
  434. package/dist/output/print-region-statistics.js +11 -11
  435. package/dist/output/print-region-statistics.js.map +1 -1
  436. package/dist/output/sdr-rendering.d.ts +48 -10
  437. package/dist/output/sdr-rendering.js +114 -25
  438. package/dist/output/sdr-rendering.js.map +1 -1
  439. package/dist/output/subject-framing-crop.d.ts +6 -10
  440. package/dist/output/subject-framing-crop.js +23 -13
  441. package/dist/output/subject-framing-crop.js.map +1 -1
  442. package/dist/processing/demosaic.d.ts +90 -0
  443. package/dist/processing/demosaic.js +275 -0
  444. package/dist/processing/demosaic.js.map +1 -0
  445. package/dist/processing/denoise.d.ts +68 -0
  446. package/dist/processing/denoise.js +214 -0
  447. package/dist/processing/denoise.js.map +1 -0
  448. package/dist/processing/focus-stacking.d.ts +17 -0
  449. package/dist/processing/focus-stacking.js +80 -0
  450. package/dist/processing/focus-stacking.js.map +1 -0
  451. package/dist/processing/hdr.d.ts +54 -0
  452. package/dist/processing/hdr.js +172 -0
  453. package/dist/processing/hdr.js.map +1 -0
  454. package/dist/processing/image-ops.d.ts +66 -0
  455. package/dist/processing/image-ops.js +192 -0
  456. package/dist/processing/image-ops.js.map +1 -0
  457. package/dist/processing/panorama.d.ts +51 -0
  458. package/dist/processing/panorama.js +305 -0
  459. package/dist/processing/panorama.js.map +1 -0
  460. package/dist/processing/processing-task.d.ts +85 -0
  461. package/dist/processing/processing-task.js +164 -0
  462. package/dist/processing/processing-task.js.map +1 -0
  463. package/dist/processing/tone-mapping.d.ts +69 -0
  464. package/dist/processing/tone-mapping.js +310 -0
  465. package/dist/processing/tone-mapping.js.map +1 -0
  466. package/dist/schema/camera.d.ts +5 -4
  467. package/dist/schema/illumination-spectral.d.ts +13 -19
  468. package/dist/schema/illumination-spectral.js +23 -19
  469. package/dist/schema/illumination-spectral.js.map +1 -1
  470. package/dist/schema/illumination-temporal.d.ts +12 -15
  471. package/dist/schema/illumination-temporal.js +43 -28
  472. package/dist/schema/illumination-temporal.js.map +1 -1
  473. package/dist/schema/illumination.d.ts +5 -4
  474. package/dist/schema/illumination.js +55 -20
  475. package/dist/schema/illumination.js.map +1 -1
  476. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  477. package/dist/schema/scene-radiance-temporal.js +26 -23
  478. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  479. package/dist/schema/scene-radiance.d.ts +17 -17
  480. package/dist/schema/scene-radiance.js +56 -34
  481. package/dist/schema/scene-radiance.js.map +1 -1
  482. package/dist/schema/scene.d.ts +14 -13
  483. package/dist/schema/validation.d.ts +0 -1
  484. package/dist/schema/validation.js +17 -15
  485. package/dist/schema/validation.js.map +1 -1
  486. package/dist/sensor/accumulated-charge.d.ts +45 -64
  487. package/dist/sensor/accumulated-charge.js +41 -47
  488. package/dist/sensor/accumulated-charge.js.map +1 -1
  489. package/dist/sensor/architecture.d.ts +22 -25
  490. package/dist/sensor/architecture.js +17 -16
  491. package/dist/sensor/architecture.js.map +1 -1
  492. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  493. package/dist/sensor/camera-saturation-capacity.js +36 -34
  494. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  495. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  496. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  497. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  498. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  499. package/dist/sensor/capture-mode-timing.js +24 -21
  500. package/dist/sensor/capture-mode-timing.js.map +1 -1
  501. package/dist/sensor/capture-mode.d.ts +28 -30
  502. package/dist/sensor/capture-mode.js +33 -31
  503. package/dist/sensor/capture-mode.js.map +1 -1
  504. package/dist/sensor/color-sampling.d.ts +30 -33
  505. package/dist/sensor/color-sampling.js +32 -37
  506. package/dist/sensor/color-sampling.js.map +1 -1
  507. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  508. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  509. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  510. package/dist/sensor/dark-current.d.ts +53 -49
  511. package/dist/sensor/dark-current.js +87 -46
  512. package/dist/sensor/dark-current.js.map +1 -1
  513. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  514. package/dist/sensor/environment-photo-signal.js +127 -46
  515. package/dist/sensor/environment-photo-signal.js.map +1 -1
  516. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  517. package/dist/sensor/eqe-electron-rate.js +34 -14
  518. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  519. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  520. package/dist/sensor/eqe-local-exposure.js +15 -11
  521. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  522. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  523. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  524. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  525. package/dist/sensor/exposure-window.d.ts +48 -34
  526. package/dist/sensor/exposure-window.js +77 -36
  527. package/dist/sensor/exposure-window.js.map +1 -1
  528. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  529. package/dist/sensor/fixed-pattern-noise.js +166 -0
  530. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  531. package/dist/sensor/iso-gain.d.ts +44 -0
  532. package/dist/sensor/iso-gain.js +119 -0
  533. package/dist/sensor/iso-gain.js.map +1 -0
  534. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  535. package/dist/sensor/iso-signal-chain.js +52 -66
  536. package/dist/sensor/iso-signal-chain.js.map +1 -1
  537. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  538. package/dist/sensor/local-exposure-binding.js +22 -18
  539. package/dist/sensor/local-exposure-binding.js.map +1 -1
  540. package/dist/sensor/optical-stack.d.ts +36 -40
  541. package/dist/sensor/optical-stack.js +34 -37
  542. package/dist/sensor/optical-stack.js.map +1 -1
  543. package/dist/sensor/photon-energy.d.ts +22 -28
  544. package/dist/sensor/photon-energy.js +42 -34
  545. package/dist/sensor/photon-energy.js.map +1 -1
  546. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  547. package/dist/sensor/physical-charge-capacity.js +35 -36
  548. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  549. package/dist/sensor/pixel-pitch.d.ts +2 -3
  550. package/dist/sensor/pixel-pitch.js +4 -2
  551. package/dist/sensor/pixel-pitch.js.map +1 -1
  552. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  553. package/dist/sensor/radiometry-readiness.js +20 -17
  554. package/dist/sensor/radiometry-readiness.js.map +1 -1
  555. package/dist/sensor/raw-readout.d.ts +173 -83
  556. package/dist/sensor/raw-readout.js +425 -160
  557. package/dist/sensor/raw-readout.js.map +1 -1
  558. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  559. package/dist/sensor/raw-reconstruction.js +200 -47
  560. package/dist/sensor/raw-reconstruction.js.map +1 -1
  561. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  562. package/dist/sensor/readout-exposure-linkage.js +125 -27
  563. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  564. package/dist/sensor/readout-timing.d.ts +43 -44
  565. package/dist/sensor/readout-timing.js +38 -30
  566. package/dist/sensor/readout-timing.js.map +1 -1
  567. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  568. package/dist/sensor/response-application-compatibility.js +35 -34
  569. package/dist/sensor/response-application-compatibility.js.map +1 -1
  570. package/dist/sensor/response-operating-range.d.ts +26 -35
  571. package/dist/sensor/response-operating-range.js +40 -39
  572. package/dist/sensor/response-operating-range.js.map +1 -1
  573. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  574. package/dist/sensor/responsivity-photocurrent.js +57 -40
  575. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  576. package/dist/sensor/sampling-aperture.d.ts +21 -25
  577. package/dist/sensor/sampling-aperture.js +29 -28
  578. package/dist/sensor/sampling-aperture.js.map +1 -1
  579. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  580. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  581. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  582. package/dist/sensor/sensor-geometry.d.ts +28 -32
  583. package/dist/sensor/sensor-geometry.js +35 -20
  584. package/dist/sensor/sensor-geometry.js.map +1 -1
  585. package/dist/sensor/signal-noise.d.ts +14 -16
  586. package/dist/sensor/signal-noise.js +15 -13
  587. package/dist/sensor/signal-noise.js.map +1 -1
  588. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  589. package/dist/sensor/spatial-sample-reduction.js +39 -48
  590. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  591. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  592. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  593. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  594. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  595. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  596. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  597. package/dist/sensor/spectral-coverage.d.ts +6 -9
  598. package/dist/sensor/spectral-coverage.js +9 -6
  599. package/dist/sensor/spectral-coverage.js.map +1 -1
  600. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  601. package/dist/sensor/spectral-quadrature.js +38 -48
  602. package/dist/sensor/spectral-quadrature.js.map +1 -1
  603. package/dist/sensor/spectral-response.d.ts +53 -41
  604. package/dist/sensor/spectral-response.js +80 -47
  605. package/dist/sensor/spectral-response.js.map +1 -1
  606. package/dist/sensor/stochastic-seed.d.ts +50 -0
  607. package/dist/sensor/stochastic-seed.js +123 -0
  608. package/dist/sensor/stochastic-seed.js.map +1 -0
  609. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  610. package/dist/sensor/temporal-eqe-sum.js +5 -6
  611. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  612. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  613. package/dist/sensor/temporal-photo-signal.js +11 -10
  614. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  615. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  616. package/dist/sensor/temporal-sample-binding.js +3 -3
  617. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  618. package/dist/simulation/poc-simulation.d.ts +16 -16
  619. package/dist/simulation/poc-simulation.js +20 -15
  620. package/dist/simulation/poc-simulation.js.map +1 -1
  621. package/dist/stabilization/camera-shake.d.ts +42 -18
  622. package/dist/stabilization/camera-shake.js +43 -20
  623. package/dist/stabilization/camera-shake.js.map +1 -1
  624. package/dist/stabilization/system.d.ts +44 -41
  625. package/dist/stabilization/system.js +196 -108
  626. package/dist/stabilization/system.js.map +1 -1
  627. package/docs/AGENT_GUIDE.md +183 -0
  628. package/docs/API_REFERENCE.md +777 -2
  629. package/docs/QUICK_START.md +663 -0
  630. package/docs/USAGE.md +1719 -714
  631. package/docs/api/camera-equivalent-focal-length.md +6 -7
  632. package/docs/api/camera-field-of-view.md +16 -8
  633. package/docs/api/camera-lens-projection.md +246 -0
  634. package/docs/api/camera-projected-object-size.md +6 -5
  635. package/docs/api/capture-capture-export-metadata.md +10 -10
  636. package/docs/api/capture-dng-import.md +134 -0
  637. package/docs/api/capture-environment-raw-producer.md +17 -11
  638. package/docs/api/capture-export-jpeg.md +16 -0
  639. package/docs/api/capture-focus-control.md +25 -47
  640. package/docs/api/capture-linear-encoding.md +21 -12
  641. package/docs/api/capture-lossless-jpeg.md +49 -0
  642. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  643. package/docs/api/capture-native-environment-raw.md +161 -4
  644. package/docs/api/capture-native-raw-development.md +69 -8
  645. package/docs/api/capture-native-raw-dng.md +84 -0
  646. package/docs/api/capture-native-raw.md +21 -10
  647. package/docs/api/capture-packed-sensor-raw.md +156 -0
  648. package/docs/api/capture-photographic-export.md +69 -31
  649. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  650. package/docs/api/capture-raw-white-level.md +37 -0
  651. package/docs/api/capture-release-sequence.md +6 -7
  652. package/docs/api/capture-sensor-raw-frame.md +6 -6
  653. package/docs/api/capture-sensor-raw-producer.md +17 -11
  654. package/docs/api/capture-simulated-capture.md +15 -15
  655. package/docs/api/color-camera-color-matrix.md +103 -0
  656. package/docs/api/color-capture-color.md +22 -11
  657. package/docs/api/color-chromatic-adaptation.md +82 -0
  658. package/docs/api/color-color-difference.md +134 -0
  659. package/docs/api/color-color-matching-functions.md +259 -0
  660. package/docs/api/color-colorimetry-math.md +54 -0
  661. package/docs/api/color-gamut-mapping.md +72 -0
  662. package/docs/api/color-illuminants.md +280 -0
  663. package/docs/api/color-rgb-color-spaces.md +151 -0
  664. package/docs/api/color-sensor-color-development.md +27 -0
  665. package/docs/api/color-srgb-icc.md +2 -4
  666. package/docs/api/color-white-balance.md +95 -19
  667. package/docs/api/composition-image-formation-plan.md +124 -95
  668. package/docs/api/composition-plan-consumer.md +7 -7
  669. package/docs/api/core-calculation-result.md +18 -14
  670. package/docs/api/core-configuration-error.md +1 -1
  671. package/docs/api/core-image-formation.md +7 -7
  672. package/docs/api/core-scientific-assurance.md +12 -10
  673. package/docs/api/core-spectral-composition.md +14 -14
  674. package/docs/api/core-spectral.md +6 -6
  675. package/docs/api/core-validation.md +3 -3
  676. package/docs/api/core-version.md +7 -6
  677. package/docs/api/equipment-exposure-capabilities.md +11 -10
  678. package/docs/api/equipment-generic-tier-assets.md +7 -2
  679. package/docs/api/equipment-generic-tier-presets.md +6 -6
  680. package/docs/api/equipment-iso-capabilities.md +18 -18
  681. package/docs/api/equipment-metering-capabilities.md +6 -6
  682. package/docs/api/equipment-release-capabilities.md +4 -4
  683. package/docs/api/exports.json +2253 -3
  684. package/docs/api/exposure-exposure-duration-control.md +9 -9
  685. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  686. package/docs/api/exposure-exposure.md +10 -10
  687. package/docs/api/exposure-flash-ttl.md +182 -0
  688. package/docs/api/exposure-flash.md +183 -28
  689. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  690. package/docs/api/exposure-metering-target.md +9 -8
  691. package/docs/api/exposure-metering-temporal.md +8 -8
  692. package/docs/api/exposure-metering.md +69 -9
  693. package/docs/api/exposure-program-line.md +6 -5
  694. package/docs/api/facade-chart-radiance-batch.md +96 -0
  695. package/docs/api/facade-chart-scenes.md +240 -0
  696. package/docs/api/facade-scene-radiance.md +122 -0
  697. package/docs/api/facade-simulate-capture.md +397 -0
  698. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  699. package/docs/api/gpu-image-kernel-execution.md +152 -0
  700. package/docs/api/motion-camera-rotation.md +43 -26
  701. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  702. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  703. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  704. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  705. package/docs/api/motion-extended-object-projection.md +10 -8
  706. package/docs/api/motion-projected-motion.md +8 -8
  707. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  708. package/docs/api/motion-video-sequence.md +159 -0
  709. package/docs/api/optics-aperture.md +8 -8
  710. package/docs/api/optics-atmospheric-haze.md +104 -0
  711. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  712. package/docs/api/optics-circle-of-confusion.md +5 -4
  713. package/docs/api/optics-complex-pupil-psf.md +57 -16
  714. package/docs/api/optics-depth-of-field.md +12 -6
  715. package/docs/api/optics-diffraction-psf-profile.md +96 -0
  716. package/docs/api/optics-diffraction.md +8 -7
  717. package/docs/api/optics-focus-breathing.md +104 -16
  718. package/docs/api/optics-focus-state.md +9 -10
  719. package/docs/api/optics-front-of-lens-filter.md +72 -14
  720. package/docs/api/optics-illumination-vignetting.md +10 -10
  721. package/docs/api/optics-irradiance-convolution.md +95 -0
  722. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  723. package/docs/api/optics-lens-psf-kernels.md +72 -0
  724. package/docs/api/optics-lens-psf-profile.md +48 -26
  725. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  726. package/docs/api/optics-polygon-diffraction.md +78 -13
  727. package/docs/api/optics-profile-contract.md +4 -4
  728. package/docs/api/optics-psf-foundation.md +12 -12
  729. package/docs/api/optics-pupil-vignetting.md +132 -0
  730. package/docs/api/optics-radial-distortion.md +12 -12
  731. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  732. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  733. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  734. package/docs/api/optics-sensor-environment-query.md +52 -9
  735. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  736. package/docs/api/optics-stray-light.md +12 -11
  737. package/docs/api/optics-thin-lens.md +4 -3
  738. package/docs/api/optics-zernike-wavefront.md +229 -0
  739. package/docs/api/output-capture-corrected-sdr.md +10 -7
  740. package/docs/api/output-capture-geometry.md +35 -36
  741. package/docs/api/output-capture-sdr.md +4 -4
  742. package/docs/api/output-crop.md +7 -4
  743. package/docs/api/output-geometric-transforms.md +65 -19
  744. package/docs/api/output-lens-corrections.md +17 -15
  745. package/docs/api/output-native-capture-sdr.md +26 -13
  746. package/docs/api/output-png-encoder.md +105 -0
  747. package/docs/api/output-print-contrast-reference.md +8 -8
  748. package/docs/api/output-print-detail.md +14 -14
  749. package/docs/api/output-print-jpeg.md +22 -5
  750. package/docs/api/output-print-plan.md +18 -18
  751. package/docs/api/output-print-region-statistics.md +14 -14
  752. package/docs/api/output-sdr-rendering.md +52 -10
  753. package/docs/api/output-subject-framing-crop.md +5 -6
  754. package/docs/api/processing-demosaic.md +120 -0
  755. package/docs/api/processing-denoise.md +148 -0
  756. package/docs/api/processing-focus-stacking.md +41 -0
  757. package/docs/api/processing-hdr.md +113 -0
  758. package/docs/api/processing-panorama.md +82 -0
  759. package/docs/api/processing-processing-task.md +107 -0
  760. package/docs/api/processing-tone-mapping.md +142 -0
  761. package/docs/api/schema-camera.md +6 -4
  762. package/docs/api/schema-illumination-spectral.md +10 -11
  763. package/docs/api/schema-illumination-temporal.md +13 -15
  764. package/docs/api/schema-illumination.md +4 -4
  765. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  766. package/docs/api/schema-scene-radiance.md +18 -17
  767. package/docs/api/schema-scene.md +9 -9
  768. package/docs/api/schema-validation.md +1 -1
  769. package/docs/api/sensor-accumulated-charge.md +12 -20
  770. package/docs/api/sensor-architecture.md +15 -16
  771. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  772. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  773. package/docs/api/sensor-capture-mode-timing.md +9 -9
  774. package/docs/api/sensor-capture-mode.md +29 -30
  775. package/docs/api/sensor-color-sampling.md +31 -33
  776. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  777. package/docs/api/sensor-dark-current.md +30 -14
  778. package/docs/api/sensor-environment-photo-signal.md +13 -6
  779. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  780. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  781. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  782. package/docs/api/sensor-exposure-window.md +24 -24
  783. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  784. package/docs/api/sensor-iso-gain.md +63 -0
  785. package/docs/api/sensor-iso-signal-chain.md +13 -22
  786. package/docs/api/sensor-local-exposure-binding.md +12 -13
  787. package/docs/api/sensor-optical-stack.md +37 -40
  788. package/docs/api/sensor-photon-energy.md +10 -11
  789. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  790. package/docs/api/sensor-pixel-pitch.md +1 -1
  791. package/docs/api/sensor-radiometry-readiness.md +9 -9
  792. package/docs/api/sensor-raw-readout.md +118 -52
  793. package/docs/api/sensor-raw-reconstruction.md +97 -20
  794. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  795. package/docs/api/sensor-readout-timing.md +33 -35
  796. package/docs/api/sensor-response-application-compatibility.md +9 -11
  797. package/docs/api/sensor-response-operating-range.md +14 -18
  798. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  799. package/docs/api/sensor-sampling-aperture.md +22 -25
  800. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  801. package/docs/api/sensor-sensor-geometry.md +23 -24
  802. package/docs/api/sensor-signal-noise.md +10 -10
  803. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  804. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  805. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  806. package/docs/api/sensor-spectral-coverage.md +5 -5
  807. package/docs/api/sensor-spectral-quadrature.md +33 -35
  808. package/docs/api/sensor-spectral-response.md +28 -16
  809. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  810. package/docs/api/simulation-poc-simulation.md +17 -16
  811. package/docs/api/stabilization-camera-shake.md +29 -10
  812. package/docs/api/stabilization-system.md +25 -21
  813. package/docs/examples/production-request.json +3821 -2157
  814. package/docs/examples/simulate-capture.mjs +14 -0
  815. package/llms.txt +35 -0
  816. package/package.json +32 -11
  817. package/AGENTS.md +0 -674
  818. package/CONTRIBUTING.md +0 -76
  819. package/DCO +0 -33
  820. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  821. package/dist/camera/field-of-view.d.ts.map +0 -1
  822. package/dist/camera/projected-object-size.d.ts.map +0 -1
  823. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  824. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  825. package/dist/capture/export-jpeg.d.ts.map +0 -1
  826. package/dist/capture/export-tiff.d.ts.map +0 -1
  827. package/dist/capture/focus-control.d.ts.map +0 -1
  828. package/dist/capture/linear-encoding.d.ts.map +0 -1
  829. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  830. package/dist/capture/native-raw-development.d.ts.map +0 -1
  831. package/dist/capture/native-raw.d.ts.map +0 -1
  832. package/dist/capture/photographic-export.d.ts.map +0 -1
  833. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  834. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  835. package/dist/capture/release-sequence.d.ts.map +0 -1
  836. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  837. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  838. package/dist/capture/simulated-capture.d.ts.map +0 -1
  839. package/dist/color/capture-color.d.ts.map +0 -1
  840. package/dist/color/sensor-color-development.d.ts.map +0 -1
  841. package/dist/color/srgb-icc.d.ts.map +0 -1
  842. package/dist/color/srgb-transfer.d.ts.map +0 -1
  843. package/dist/color/white-balance.d.ts.map +0 -1
  844. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  845. package/dist/composition/plan-consumer.d.ts.map +0 -1
  846. package/dist/core/calculation-result.d.ts.map +0 -1
  847. package/dist/core/canonical-json.d.ts.map +0 -1
  848. package/dist/core/configuration-error.d.ts.map +0 -1
  849. package/dist/core/evidence-provenance.d.ts.map +0 -1
  850. package/dist/core/image-formation.d.ts.map +0 -1
  851. package/dist/core/owned-data.d.ts.map +0 -1
  852. package/dist/core/record-validation.d.ts.map +0 -1
  853. package/dist/core/scientific-assurance.d.ts.map +0 -1
  854. package/dist/core/spectral-composition.d.ts.map +0 -1
  855. package/dist/core/spectral.d.ts.map +0 -1
  856. package/dist/core/validation.d.ts.map +0 -1
  857. package/dist/core/version.d.ts.map +0 -1
  858. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  859. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  860. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  861. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  862. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  863. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  864. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  865. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  866. package/dist/exposure/exposure.d.ts.map +0 -1
  867. package/dist/exposure/flash.d.ts.map +0 -1
  868. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  869. package/dist/exposure/metering-target.d.ts.map +0 -1
  870. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  871. package/dist/exposure/metering.d.ts.map +0 -1
  872. package/dist/exposure/program-line.d.ts.map +0 -1
  873. package/dist/index.d.ts.map +0 -1
  874. package/dist/motion/camera-rotation.d.ts.map +0 -1
  875. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  876. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  877. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  878. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  879. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  880. package/dist/motion/projected-motion.d.ts.map +0 -1
  881. package/dist/optics/aperture.d.ts.map +0 -1
  882. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  883. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  884. package/dist/optics/depth-of-field.d.ts.map +0 -1
  885. package/dist/optics/diffraction.d.ts.map +0 -1
  886. package/dist/optics/focus-breathing.d.ts.map +0 -1
  887. package/dist/optics/focus-state.d.ts.map +0 -1
  888. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  889. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  890. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  891. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  892. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  893. package/dist/optics/profile-contract.d.ts.map +0 -1
  894. package/dist/optics/psf-foundation.d.ts.map +0 -1
  895. package/dist/optics/radial-distortion.d.ts.map +0 -1
  896. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  897. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  898. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  899. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  900. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  901. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  902. package/dist/optics/stray-light.d.ts.map +0 -1
  903. package/dist/optics/thin-lens.d.ts.map +0 -1
  904. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  905. package/dist/output/capture-geometry.d.ts.map +0 -1
  906. package/dist/output/capture-sdr.d.ts.map +0 -1
  907. package/dist/output/crop.d.ts.map +0 -1
  908. package/dist/output/geometric-transforms.d.ts.map +0 -1
  909. package/dist/output/lens-corrections.d.ts.map +0 -1
  910. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  911. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  912. package/dist/output/print-detail.d.ts.map +0 -1
  913. package/dist/output/print-jpeg.d.ts.map +0 -1
  914. package/dist/output/print-plan.d.ts.map +0 -1
  915. package/dist/output/print-region-statistics.d.ts.map +0 -1
  916. package/dist/output/sdr-rendering.d.ts.map +0 -1
  917. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  918. package/dist/schema/camera.d.ts.map +0 -1
  919. package/dist/schema/camera.js +0 -3
  920. package/dist/schema/camera.js.map +0 -1
  921. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  922. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  923. package/dist/schema/illumination.d.ts.map +0 -1
  924. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  925. package/dist/schema/scene-radiance.d.ts.map +0 -1
  926. package/dist/schema/scene.d.ts.map +0 -1
  927. package/dist/schema/scene.js +0 -3
  928. package/dist/schema/scene.js.map +0 -1
  929. package/dist/schema/validation.d.ts.map +0 -1
  930. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  931. package/dist/sensor/architecture.d.ts.map +0 -1
  932. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  933. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  934. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  935. package/dist/sensor/capture-mode.d.ts.map +0 -1
  936. package/dist/sensor/color-sampling.d.ts.map +0 -1
  937. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  938. package/dist/sensor/dark-current.d.ts.map +0 -1
  939. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  940. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  941. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  942. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  943. package/dist/sensor/exposure-window.d.ts.map +0 -1
  944. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  945. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  946. package/dist/sensor/optical-stack.d.ts.map +0 -1
  947. package/dist/sensor/photon-energy.d.ts.map +0 -1
  948. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  949. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  950. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  951. package/dist/sensor/raw-readout.d.ts.map +0 -1
  952. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  953. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  954. package/dist/sensor/readout-timing.d.ts.map +0 -1
  955. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  956. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  957. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  958. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  959. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  960. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  961. package/dist/sensor/signal-noise.d.ts.map +0 -1
  962. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  963. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  964. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  965. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  966. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  967. package/dist/sensor/spectral-response.d.ts.map +0 -1
  968. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  969. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  970. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  971. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  972. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  973. package/dist/stabilization/system.d.ts.map +0 -1
  974. package/docs/API_STYLE.md +0 -235
  975. package/docs/ARCHITECTURE.md +0 -356
  976. package/docs/AUTOMATION_COORDINATION.md +0 -190
  977. package/docs/CAPTURE_COLOR.md +0 -25
  978. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  979. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  980. package/docs/CAPTURE_SDR.md +0 -22
  981. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  982. package/docs/DEVELOPERS.md +0 -68
  983. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  984. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  985. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  986. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  987. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  988. package/docs/IMAGE_FORMATION.md +0 -247
  989. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  990. package/docs/MOTION_AND_SIGNAL.md +0 -250
  991. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  992. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  993. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  994. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  995. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  996. package/docs/PERFORMANCE_BASELINE.md +0 -56
  997. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  998. package/docs/PHYSICS_FOUNDATION.md +0 -426
  999. package/docs/POC_API.md +0 -278
  1000. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  1001. package/docs/POC_PROJECTION_REUSE.md +0 -124
  1002. package/docs/PRINT_195_196_REVIEW.md +0 -93
  1003. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  1004. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  1005. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  1006. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1007. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1008. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1009. package/docs/PRINT_PLANNING.md +0 -75
  1010. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1011. package/docs/PROCESSED_OUTPUT.md +0 -157
  1012. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1013. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1014. package/docs/PROVENANCE.md +0 -115
  1015. package/docs/PSF_FOUNDATION.md +0 -165
  1016. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1017. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1018. package/docs/RELEASE_1_0.md +0 -66
  1019. package/docs/RELEASE_1_0_1.md +0 -61
  1020. package/docs/RELEASE_1_1_0.md +0 -25
  1021. package/docs/RELEASE_1_2_0.md +0 -51
  1022. package/docs/RELEASE_1_3_0.md +0 -15
  1023. package/docs/RELEASE_1_4_0.md +0 -23
  1024. package/docs/RELEASE_1_5_0.md +0 -105
  1025. package/docs/RELEASE_AUDIT.md +0 -39
  1026. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1027. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1028. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1029. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1030. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1031. package/docs/SDR_RENDERING.md +0 -33
  1032. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1033. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1034. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1035. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1036. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1037. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1038. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1039. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1040. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1041. package/docs/SIMULATED_CAPTURE.md +0 -65
  1042. package/docs/STABILIZATION.md +0 -234
  1043. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1044. package/docs/TIER_ACCEPTANCE.md +0 -129
  1045. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1046. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1047. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1048. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1049. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1050. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1051. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1052. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1053. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1054. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1055. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1056. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1057. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1058. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1059. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1060. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1061. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1062. package/docs/validation/documentation-fragments.json +0 -212
  1063. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1064. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1065. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1069. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1071. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1072. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1073. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1074. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1075. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1076. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1077. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1078. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1079. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1080. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1081. package/docs/validation/print-detail-capabilities.json +0 -103
  1082. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1083. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1084. package/docs/validation/release-audit-inventory.json +0 -1306
  1085. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1,21 +1,47 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /** Bounded post-SDR area filtering and original baseline JPEG/ICC serialization. */
3
- import { createExportJpegEncoder } from "../capture/export-jpeg.js";
4
- import { packExportTiff, exportTiffNumbers, exportTiffAscii } from "../capture/export-tiff.js";
2
+ /**
3
+ * Print JPEG export: downsamples an SDR image by exact area averaging, then writes a baseline JPEG
4
+ * with an ICC colour profile. Bounded in size; the encoder is written for this project.
5
+ */
6
+ import { createExportJpegEncoder, EXPORT_JPEG_ENCODER_ID } from "../capture/export-jpeg.js";
7
+ import { packExportJpegExif, exportTiffNumbers, exportTiffAscii, exportTiffRationals } from "../capture/export-tiff.js";
5
8
  import { createSrgbIccProfile, SRGB_ICC_PROFILE_VERSION } from "../color/srgb-icc.js";
6
9
  import { decodeSrgbComponent, encodeSrgbComponent } from "../color/srgb-transfer.js";
7
10
  import { InvalidConfigurationError } from "../core/configuration-error.js";
8
11
  import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
9
12
  import { freezeOwnedData } from "../core/owned-data.js";
10
- export const PRINT_JPEG_SCHEMA_VERSION = "0.1.0";
13
+ export const PRINT_JPEG_SCHEMA_VERSION = "0.2.0";
14
+ let srgbDecode;
15
+ /** decodeSrgbComponent(v/255) for every 8-bit code v, computed once with the same function (identical values). */
16
+ function srgbDecodeTable() { return srgbDecode ??= Float64Array.from({ length: 256 }, (_, v) => decodeSrgbComponent(v / 255)); }
17
+ /** Exactly n/1 for a whole-number density; otherwise the shared bounded decimal-fraction approximation. */
18
+ function resolutionRational(id, ppi) {
19
+ if (!Number.isSafeInteger(ppi))
20
+ return exportTiffRationals(id, false, [ppi]);
21
+ const data = new Uint8Array(8), view = new DataView(data.buffer);
22
+ view.setUint32(0, ppi, true);
23
+ view.setUint32(4, 1, true);
24
+ return { id, type: 5, count: 1, data };
25
+ }
26
+ /**
27
+ * Exif 2.32 APP1 for a compressed primary image with every mandatory tag (CIPA DC-008-2019 Tables 17-18):
28
+ * IFD0 Orientation, X/YResolution + ResolutionUnit, Software, YCbCrPositioning; Exif IFD ExifVersion "0232",
29
+ * ComponentsConfiguration, FlashpixVersion "0100", ColorSpace sRGB, PixelX/YDimension. Without a planned
30
+ * density the resolution tags carry the standard's "unknown resolution" value of 72 dpi.
31
+ */
32
+ function printExif(plan) {
33
+ const ppi = plan.pixelsPerInch;
34
+ const resolution = ppi === undefined ? [] : [resolutionRational(282, ppi), resolutionRational(283, ppi), exportTiffNumbers(296, 3, [2])];
35
+ return packExportJpegExif([exportTiffNumbers(274, 3, [1]), ...resolution, exportTiffAscii(305, "Photivra Print JPEG")], [exportTiffNumbers(40961, 3, [1])], { pixelWidth: plan.outputWidth, pixelHeight: plan.outputHeight });
36
+ }
11
37
  function integer(v, min = 1) {
12
38
  if (typeof v !== "number" || !Number.isSafeInteger(v) || v < min)
13
39
  throw new InvalidConfigurationError("Print raster/budgets require safe integers.");
14
40
  return v;
15
41
  }
16
- /** Admission-only; source detail/perception/printer qualification are separate contracts. */
42
+ /** Validates the input only. Source detail, perception and printer suitability are checked by separate APIs. */
17
43
  export function parsePrintJpegInput(input) {
18
- const r = requireAllowlistedRecord(input, ["source", "crop", "outputWidth", "outputHeight", "quantizationStep", "maximumEncodedBytes", "maximumProviderReads"], "Invalid Print JPEG input.");
44
+ const r = requireAllowlistedRecord(input, ["source", "crop", "outputWidth", "outputHeight", "quantizationStep", "maximumEncodedBytes", "maximumProviderReads", "pixelsPerInch"], "Invalid Print JPEG input.");
19
45
  const s = requireAllowlistedRecord(r.source, ["captureId", "imageStateId", "artifactId", "sha256", "width", "height", "encoding"], "Invalid Print source.");
20
46
  if (typeof s.sha256 !== "string" || !/^[a-f0-9]{64}$/.test(s.sha256) || s.encoding !== "encoded-srgb-8-rgb")
21
47
  throw new InvalidConfigurationError("Print requires identified encoded sRGB source bytes.");
@@ -26,9 +52,12 @@ export function parsePrintJpegInput(input) {
26
52
  outputWidth > crop.width || outputHeight > crop.height || quantizationStep > 255 || maximumEncodedBytes > 256_000_000 || maximumProviderReads > 1_000_000 ||
27
53
  Math.abs(outputWidth * crop.height - outputHeight * crop.width) > .5 * (crop.width + crop.height))
28
54
  throw new InvalidConfigurationError("Print requires bounded native/downsampled aspect-preserving crop output.");
29
- return freezeOwnedData({ source, crop, outputWidth, outputHeight, quantizationStep, maximumEncodedBytes, maximumProviderReads });
55
+ const ppi = r.pixelsPerInch;
56
+ if (ppi !== undefined && (typeof ppi !== "number" || !Number.isFinite(ppi) || ppi < 1 || ppi > 65535))
57
+ throw new InvalidConfigurationError("Print density requires finite pixels per inch from 1 to 65535.");
58
+ return freezeOwnedData({ source, crop, outputWidth, outputHeight, quantizationStep, maximumEncodedBytes, maximumProviderReads, ...(ppi === undefined ? {} : { pixelsPerInch: ppi }) });
30
59
  }
31
- /** Filtering uses exact source-pixel area overlap after decoding the explicitly declared 8-bit SDR stage. */
60
+ /** Creates the export task. Filtering weights each source pixel by its exact area overlap, after decoding the declared 8-bit SDR source. */
32
61
  export function createPrintJpegTask(input, provider) {
33
62
  const plan = parsePrintJpegInput(input);
34
63
  if (!provider || typeof provider.readTile !== "function" || typeof provider.yieldControl !== "function")
@@ -44,76 +73,114 @@ export function createPrintJpegTask(input, provider) {
44
73
  throw new InvalidConfigurationError("Print export is single-use.");
45
74
  state = "running";
46
75
  try {
47
- const exif = packExportTiff([exportTiffNumbers(274, 3, [1]), exportTiffAscii(305, "Photivra Print JPEG")], [exportTiffNumbers(40961, 3, [1]), exportTiffNumbers(40962, 4, [plan.outputWidth]), exportTiffNumbers(40963, 4, [plan.outputHeight])]);
76
+ const exif = printExif(plan);
48
77
  const escaped = JSON.stringify(plan).replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
49
78
  const xmp = new TextEncoder().encode('<x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:photivra="https://photivra.com/ns/simulation/1.0/" photivra:PrintExportPlan="' + escaped + '" photivra:SourceBytesVerified="False"/></rdf:RDF></x:xmpmeta>');
50
- encoder = createExportJpegEncoder({ width: plan.outputWidth, height: plan.outputHeight, quantizationStep: plan.quantizationStep, maximumOutputBytes: plan.maximumEncodedBytes, icc: createSrgbIccProfile(), exif, xmp });
51
- let reads = 0, blocks = 0;
79
+ encoder = createExportJpegEncoder({ width: plan.outputWidth, height: plan.outputHeight, quantizationStep: plan.quantizationStep, maximumOutputBytes: plan.maximumEncodedBytes, icc: createSrgbIccProfile(), exif, xmp,
80
+ ...(plan.pixelsPerInch === undefined ? {} : { densityDotsPerInch: Math.round(plan.pixelsPerInch) }) });
52
81
  const scaleX = plan.crop.width / plan.outputWidth, scaleY = plan.crop.height / plan.outputHeight, area = scaleX * scaleY;
53
- for (let by = 0; by < plan.outputHeight; by += 8)
54
- for (let bx = 0; bx < plan.outputWidth; bx += 8) {
82
+ const cropRight = plan.crop.x + plan.crop.width, cropBottom = plan.crop.y + plan.crop.height, rowBytes = plan.crop.width * 3;
83
+ // Every crop pixel is read exactly once, in tiles of at most 256 x 32 aligned to the crop origin.
84
+ const tilesPerBand = Math.ceil(plan.crop.width / 256), requiredReads = Math.ceil(plan.crop.height / 32) * tilesPerBand;
85
+ if (requiredReads > plan.maximumProviderReads)
86
+ throw new InvalidConfigurationError("Print source exceeds provider-read budget.");
87
+ // Rolling cache of whole crop-width source rows [cacheTop, cacheBottom): at most 63 rows are retained.
88
+ const cache = new Uint8Array(Math.min(64, plan.crop.height) * rowBytes), lut = srgbDecodeTable();
89
+ let reads = 0, blocks = 0, cacheTop = plan.crop.y, cacheBottom = plan.crop.y;
90
+ const ensureRows = async (firstRow, rowCount) => {
91
+ const keepFrom = Math.min(Math.max(cacheTop, firstRow), cacheBottom);
92
+ if (keepFrom > cacheTop) {
93
+ cache.copyWithin(0, (keepFrom - cacheTop) * rowBytes, (cacheBottom - cacheTop) * rowBytes);
94
+ cacheTop = keepFrom;
95
+ }
96
+ while (cacheBottom < firstRow + rowCount) {
97
+ const bandHeight = Math.min(32, cropBottom - cacheBottom);
98
+ if ((cacheBottom + bandHeight - cacheTop) * rowBytes > cache.length)
99
+ throw new InvalidConfigurationError("Print source traversal is not monotonic.");
100
+ for (let sx = plan.crop.x; sx < cropRight; sx += 256) {
101
+ check();
102
+ ++reads;
103
+ const request = Object.freeze({ source: plan.source, x: sx, y: cacheBottom, width: Math.min(256, cropRight - sx), height: bandHeight });
104
+ const supplied = await read(request, abort.signal);
105
+ check();
106
+ const tile = requireAllowlistedRecord(supplied, ["source", "x", "y", "width", "height", "samples"], "Invalid Print source tile.");
107
+ const source = requireAllowlistedRecord(tile.source, ["captureId", "imageStateId", "artifactId", "sha256", "width", "height", "encoding"], "Invalid Print tile source.");
108
+ for (const key of Object.keys(plan.source))
109
+ if (source[key] !== plan.source[key])
110
+ throw new InvalidConfigurationError("Print source identity mismatch.");
111
+ for (const key of ["x", "y", "width", "height"])
112
+ if (tile[key] !== request[key])
113
+ throw new InvalidConfigurationError("Print source rectangle mismatch.");
114
+ const samples = tile.samples;
115
+ if (!(samples instanceof Uint8Array) || !(samples.buffer instanceof ArrayBuffer) || samples.length !== request.width * request.height * 3 || samples.buffer.byteLength !== samples.byteLength)
116
+ throw new InvalidConfigurationError("Print source requires exact owned bounded RGB tile storage.");
117
+ for (let iy = 0; iy < bandHeight; iy++)
118
+ cache.set(samples.subarray(iy * request.width * 3, (iy + 1) * request.width * 3), (cacheBottom - cacheTop + iy) * rowBytes + (sx - plan.crop.x) * 3);
119
+ // One output block can cover a megapixel of source, so also yield to the host while reading the source.
120
+ if (reads % 32 === 0) {
121
+ await yieldControl(abort.signal);
122
+ check();
123
+ }
124
+ }
125
+ cacheBottom += bandHeight;
126
+ }
127
+ };
128
+ const blocksX = Math.ceil(plan.outputWidth / 8), sums = new Float64Array(blocksX * 192);
129
+ for (let by = 0; by < plan.outputHeight; by += 8) {
130
+ check();
131
+ sums.fill(0);
132
+ const height = Math.min(8, plan.outputHeight - by), top = plan.crop.y + by * scaleY, bottom = by + height === plan.outputHeight ? cropBottom : plan.crop.y + (by + height) * scaleY;
133
+ // Accumulation order per output pixel is unchanged from the per-block reader: 32-row bands from
134
+ // floor(top), then 256-column chunks from floor(left), then rows, then columns. Identical IEEE sums.
135
+ for (let sy = Math.floor(top); sy < Math.ceil(bottom); sy += 32) {
136
+ const bandHeight = Math.min(32, Math.ceil(bottom) - sy);
137
+ await ensureRows(sy, bandHeight);
55
138
  check();
56
- const width = Math.min(8, plan.outputWidth - bx), height = Math.min(8, plan.outputHeight - by), sums = new Float64Array(192);
57
- const left = plan.crop.x + bx * scaleX, top = plan.crop.y + by * scaleY, right = bx + width === plan.outputWidth ? plan.crop.x + plan.crop.width : plan.crop.x + (bx + width) * scaleX, bottom = by + height === plan.outputHeight ? plan.crop.y + plan.crop.height : plan.crop.y + (by + height) * scaleY;
58
- for (let sy = Math.floor(top); sy < Math.ceil(bottom); sy += 32)
139
+ for (let bx = 0, block = 0; bx < plan.outputWidth; bx += 8, block++) {
140
+ const width = Math.min(8, plan.outputWidth - bx), left = plan.crop.x + bx * scaleX, right = bx + width === plan.outputWidth ? cropRight : plan.crop.x + (bx + width) * scaleX, base = block * 192;
59
141
  for (let sx = Math.floor(left); sx < Math.ceil(right); sx += 256) {
60
- check();
61
- if (++reads > plan.maximumProviderReads)
62
- throw new InvalidConfigurationError("Print source exceeds provider-read budget.");
63
- const request = Object.freeze({ source: plan.source, x: sx, y: sy, width: Math.min(256, Math.ceil(right) - sx), height: Math.min(32, Math.ceil(bottom) - sy) });
64
- const supplied = await read(request, abort.signal);
65
- check();
66
- const tile = requireAllowlistedRecord(supplied, ["source", "x", "y", "width", "height", "samples"], "Invalid Print source tile.");
67
- const source = requireAllowlistedRecord(tile.source, ["captureId", "imageStateId", "artifactId", "sha256", "width", "height", "encoding"], "Invalid Print tile source.");
68
- for (const key of Object.keys(plan.source))
69
- if (source[key] !== plan.source[key])
70
- throw new InvalidConfigurationError("Print source identity mismatch.");
71
- for (const key of ["x", "y", "width", "height"])
72
- if (tile[key] !== request[key])
73
- throw new InvalidConfigurationError("Print source rectangle mismatch.");
74
- const samples = tile.samples;
75
- if (!(samples instanceof Uint8Array) || !(samples.buffer instanceof ArrayBuffer) || samples.length !== request.width * request.height * 3 || samples.buffer.byteLength !== samples.byteLength)
76
- throw new InvalidConfigurationError("Print source requires exact owned bounded RGB tile storage.");
77
- for (let iy = 0; iy < request.height; iy++)
78
- for (let ix = 0; ix < request.width; ix++) {
142
+ const chunkWidth = Math.min(256, Math.ceil(right) - sx);
143
+ for (let iy = 0; iy < bandHeight; iy++)
144
+ for (let ix = 0; ix < chunkWidth; ix++) {
79
145
  const px = sx + ix, py = sy + iy;
80
146
  const firstX = Math.max(0, Math.floor((px - plan.crop.x) / scaleX) - bx), lastX = Math.min(width - 1, Math.ceil((px + 1 - plan.crop.x) / scaleX) - bx - 1);
81
147
  const firstY = Math.max(0, Math.floor((py - plan.crop.y) / scaleY) - by), lastY = Math.min(height - 1, Math.ceil((py + 1 - plan.crop.y) / scaleY) - by - 1);
82
- const index = (iy * request.width + ix) * 3, linear = [0, 1, 2].map(c => decodeSrgbComponent(samples[index + c] / 255));
148
+ const index = (py - cacheTop) * rowBytes + (px - plan.crop.x) * 3, r = lut[cache[index]], g = lut[cache[index + 1]], b = lut[cache[index + 2]];
83
149
  for (let oy = firstY; oy <= lastY; oy++)
84
150
  for (let ox = firstX; ox <= lastX; ox++) {
85
151
  const x0 = plan.crop.x + (bx + ox) * scaleX, y0 = plan.crop.y + (by + oy) * scaleY;
86
152
  const weight = Math.max(0, Math.min(px + 1, x0 + scaleX) - Math.max(px, x0)) * Math.max(0, Math.min(py + 1, y0 + scaleY) - Math.max(py, y0)) / area;
87
- for (let c = 0; c < 3; c++) {
88
- const i = (oy * 8 + ox) * 3 + c;
89
- sums[i] = sums[i] + linear[c] * weight;
90
- }
153
+ const i = base + (oy * 8 + ox) * 3;
154
+ sums[i] = sums[i] + r * weight;
155
+ sums[i + 1] = sums[i + 1] + g * weight;
156
+ sums[i + 2] = sums[i + 2] + b * weight;
91
157
  }
92
158
  }
93
- // A single output block can span a megapixel footprint: yield within source traversal too.
94
- if (reads % 32 === 0) {
95
- await yieldControl(abort.signal);
96
- check();
97
- }
98
159
  }
99
- const block = [];
160
+ }
161
+ }
162
+ for (let bx = 0, block = 0; bx < plan.outputWidth; bx += 8, block++) {
163
+ const width = Math.min(8, plan.outputWidth - bx), base = block * 192, samples = [];
100
164
  for (let y = 0; y < 8; y++)
101
165
  for (let x = 0; x < 8; x++)
102
166
  for (let c = 0; c < 3; c++) {
103
- const value = sums[(Math.min(y, height - 1) * 8 + Math.min(x, width - 1)) * 3 + c];
104
- block.push(Math.min(255, Math.max(0, Math.floor(encodeSrgbComponent(value) * 255 + .5))));
167
+ const value = sums[base + (Math.min(y, height - 1) * 8 + Math.min(x, width - 1)) * 3 + c];
168
+ // Nearest code, ties up. Math.round is used because floor(x+0.5) wrongly rounds 0.49999999999999994 up.
169
+ samples.push(Math.min(255, Math.max(0, Math.round(encodeSrgbComponent(value) * 255))));
105
170
  }
106
- encoder.writeRgbBlock(block);
171
+ check();
172
+ encoder.writeRgbBlock(samples);
107
173
  if (++blocks % 32 === 0) {
108
174
  await yieldControl(abort.signal);
109
175
  check();
110
176
  }
111
177
  }
178
+ }
112
179
  await yieldControl(abort.signal);
113
180
  check();
114
181
  const bytes = encoder.finish();
115
182
  encoder = undefined;
116
- output = { schemaVersion: PRINT_JPEG_SCHEMA_VERSION, input: plan, mediaType: "image/jpeg", bytes, iccProfileVersion: SRGB_ICC_PROFILE_VERSION, width: plan.outputWidth, height: plan.outputHeight, resampling: "exact-area-average-in-decoded-linear-light", sourceStage: "post-SDR-8-bit-quantization", digitalUpscalingApplied: false, sourceBytesVerified: false, providerReads: reads };
183
+ output = { schemaVersion: PRINT_JPEG_SCHEMA_VERSION, input: plan, mediaType: "image/jpeg", bytes, iccProfileVersion: SRGB_ICC_PROFILE_VERSION, width: plan.outputWidth, height: plan.outputHeight, resampling: "exact-area-average-in-decoded-linear-light", sourceStage: "post-SDR-8-bit-quantization", digitalUpscalingApplied: false, sourceBytesVerified: false, providerReads: reads, encoderId: EXPORT_JPEG_ENCODER_ID };
117
184
  state = "completed";
118
185
  }
119
186
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"print-jpeg.js","sourceRoot":"","sources":["../../src/output/print-jpeg.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,oFAAoF;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,CAAC,MAAM,yBAAyB,GAAC,OAAgB,CAAC;AAsCxD,SAAS,OAAO,CAAC,CAAS,EAAC,GAAG,GAAC,CAAC;IAC9B,IAAG,OAAO,CAAC,KAAG,QAAQ,IAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAE,CAAC,GAAC,GAAG;QAAC,MAAM,IAAI,yBAAyB,CAAC,6CAA6C,CAAC,CAAC;IAAA,OAAO,CAAC,CAAC;AACtJ,CAAC;AACD,6FAA6F;AAC7F,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,MAAM,CAAC,GAAC,wBAAwB,CAAC,KAAK,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,aAAa,EAAC,cAAc,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,sBAAsB,CAAC,EAAC,2BAA2B,CAAC,CAAC;IACnL,MAAM,CAAC,GAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,EAAC,CAAC,WAAW,EAAC,cAAc,EAAC,YAAY,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,uBAAuB,CAAC,CAAC;IAClJ,IAAG,OAAO,CAAC,CAAC,MAAM,KAAG,QAAQ,IAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAE,CAAC,CAAC,QAAQ,KAAG,oBAAoB;QAAC,MAAM,IAAI,yBAAyB,CAAC,sDAAsD,CAAC,CAAC;IAC/L,MAAM,MAAM,GAAiB,EAAC,SAAS,EAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EAAC,qBAAqB,CAAC,EAAC,YAAY,EAAC,qBAAqB,CAAC,CAAC,CAAC,YAAY,EAAC,yBAAyB,CAAC,EAAC,UAAU,EAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,EAAC,sBAAsB,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC,MAAM,EAAC,KAAK,EAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAC,MAAM,EAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC,QAAQ,EAAC,CAAC;IACzU,MAAM,CAAC,GAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAC,CAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAC,qBAAqB,CAAC,EAAC,IAAI,GAAC,EAAC,CAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,KAAK,EAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAC,MAAM,EAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAC,CAAC;IACnL,MAAM,WAAW,GAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,YAAY,GAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAC,gBAAgB,GAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAC,mBAAmB,GAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAC,oBAAoB,GAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnO,IAAG,MAAM,CAAC,KAAK,GAAC,MAAM,IAAE,MAAM,CAAC,MAAM,GAAC,MAAM,IAAE,MAAM,CAAC,KAAK,GAAC,MAAM,CAAC,MAAM,GAAC,UAAU,IAAE,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,KAAK,GAAC,MAAM,CAAC,KAAK,IAAE,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,MAAM,GAAC,MAAM,CAAC,MAAM;QACnJ,WAAW,GAAC,IAAI,CAAC,KAAK,IAAE,YAAY,GAAC,IAAI,CAAC,MAAM,IAAE,gBAAgB,GAAC,GAAG,IAAE,mBAAmB,GAAC,WAAW,IAAE,oBAAoB,GAAC,SAAS;QACvI,IAAI,CAAC,GAAG,CAAC,WAAW,GAAC,IAAI,CAAC,MAAM,GAAC,YAAY,GAAC,IAAI,CAAC,KAAK,CAAC,GAAC,EAAE,GAAC,CAAC,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,MAAM,CAAC;QAAC,MAAM,IAAI,yBAAyB,CAAC,0EAA0E,CAAC,CAAC;IACxM,OAAO,eAAe,CAAC,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,EAAC,YAAY,EAAC,gBAAgB,EAAC,mBAAmB,EAAC,oBAAoB,EAAC,CAAC,CAAC;AAC3H,CAAC;AACD,6GAA6G;AAC7G,MAAM,UAAU,mBAAmB,CAAC,KAAoB,EAAC,QAA0B;IACjF,MAAM,IAAI,GAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACtC,IAAG,CAAC,QAAQ,IAAE,OAAO,QAAQ,CAAC,QAAQ,KAAG,UAAU,IAAE,OAAO,QAAQ,CAAC,YAAY,KAAG,UAAU;QAAC,MAAM,IAAI,yBAAyB,CAAC,sDAAsD,CAAC,CAAC;IAC3L,MAAM,IAAI,GAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,YAAY,GAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,KAAK,GAAC,IAAI,eAAe,EAAE,CAAC;IAC1H,IAAI,KAAK,GAAoB,OAAO,EAAC,MAAM,GAAsB,IAAI,EAAC,OAA4D,CAAC;IACnI,SAAS,KAAK,KAAQ,IAAG,KAAK,CAAC,MAAM,CAAC,OAAO;QAAC,MAAM,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,CAAC,CAAA,CAAC;IAC5G,SAAS,OAAO,KAAQ,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA,OAAO,GAAC,SAAS,CAAC,CAAA,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,MAAM,GAAC,IAAI,CAAC,CAAA,CAAC;IAChG,OAAO,EAAC,IAAI,KAAK,KAAsB,OAAO,KAAK,CAAC,CAAA,CAAC;QACnD,KAAK,CAAC,GAAG;YACP,IAAG,KAAK,KAAG,OAAO;gBAAC,MAAM,IAAI,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YACtG,IAAG,CAAC;gBACF,MAAM,IAAI,GAAC,cAAc,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,eAAe,CAAC,GAAG,EAAC,qBAAqB,CAAC,CAAC,EACjG,CAAC,iBAAiB,CAAC,KAAK,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,iBAAiB,CAAC,KAAK,EAAC,CAAC,EAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAC,iBAAiB,CAAC,KAAK,EAAC,CAAC,EAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjI,MAAM,OAAO,GAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,EAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAC,MAAM,CAAC,CAAC;gBAClI,MAAM,GAAG,GAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,wNAAwN,GAAC,OAAO,GAAC,gEAAgE,CAAC,CAAC;gBACtU,OAAO,GAAC,uBAAuB,CAAC,EAAC,KAAK,EAAC,IAAI,CAAC,WAAW,EAAC,MAAM,EAAC,IAAI,CAAC,YAAY,EAAC,gBAAgB,EAAC,IAAI,CAAC,gBAAgB,EAAC,kBAAkB,EAAC,IAAI,CAAC,mBAAmB,EAAC,GAAG,EAAC,oBAAoB,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,CAAC;gBAC1M,IAAI,KAAK,GAAC,CAAC,EAAC,MAAM,GAAC,CAAC,CAAC;gBAAA,MAAM,MAAM,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,WAAW,EAAC,MAAM,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,YAAY,EAAC,IAAI,GAAC,MAAM,GAAC,MAAM,CAAC;gBAChI,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,YAAY,EAAC,EAAE,IAAE,CAAC;oBAAC,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,WAAW,EAAC,EAAE,IAAE,CAAC,EAAC,CAAC;wBAC9E,KAAK,EAAE,CAAC;wBAAA,MAAM,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,WAAW,GAAC,EAAE,CAAC,EAAC,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,YAAY,GAAC,EAAE,CAAC,EAAC,IAAI,GAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;wBACvH,MAAM,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,GAAC,MAAM,EAAC,GAAG,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,GAAC,MAAM,EAAC,KAAK,GAAC,EAAE,GAAC,KAAK,KAAG,IAAI,CAAC,WAAW,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,KAAK,CAAC,GAAC,MAAM,EAAC,MAAM,GAAC,EAAE,GAAC,MAAM,KAAG,IAAI,CAAC,YAAY,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,MAAM,CAAC,GAAC,MAAM,CAAC;wBACxP,KAAI,IAAI,EAAE,GAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,EAAE,IAAE,EAAE;4BAAC,KAAI,IAAI,EAAE,GAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,EAAE,IAAE,GAAG,EAAC,CAAC;gCAC9G,KAAK,EAAE,CAAC;gCAAA,IAAG,EAAE,KAAK,GAAC,IAAI,CAAC,oBAAoB;oCAAC,MAAM,IAAI,yBAAyB,CAAC,4CAA4C,CAAC,CAAC;gCAC/H,MAAM,OAAO,GAAC,MAAM,CAAC,MAAM,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAC,EAAE,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAC,EAAE,CAAC,EAAC,CAAC,CAAC;gCAC7I,MAAM,QAAQ,GAAC,MAAM,IAAI,CAAC,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCAAA,KAAK,EAAE,CAAC;gCACxD,MAAM,IAAI,GAAC,wBAAwB,CAAC,QAAQ,EAAC,CAAC,QAAQ,EAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,4BAA4B,CAAC,CAAC;gCACzH,MAAM,MAAM,GAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAC,CAAC,WAAW,EAAC,cAAc,EAAC,YAAY,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,CAAC,EAAC,4BAA4B,CAAC,CAAC;gCAC/J,KAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAA8B;oCAAC,IAAG,MAAM,CAAC,GAAG,CAAC,KAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wCAAC,MAAM,IAAI,yBAAyB,CAAC,iCAAiC,CAAC,CAAC;gCAChL,KAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,CAAU;oCAAC,IAAG,IAAI,CAAC,GAAG,CAAC,KAAG,OAAO,CAAC,GAAG,CAAC;wCAAC,MAAM,IAAI,yBAAyB,CAAC,kCAAkC,CAAC,CAAC;gCACzJ,MAAM,OAAO,GAAC,IAAI,CAAC,OAAO,CAAC;gCAAA,IAAG,CAAC,CAAC,OAAO,YAAY,UAAU,CAAC,IAAE,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,WAAW,CAAC,IAAE,OAAO,CAAC,MAAM,KAAG,OAAO,CAAC,KAAK,GAAC,OAAO,CAAC,MAAM,GAAC,CAAC,IAAE,OAAO,CAAC,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,UAAU;oCAAC,MAAM,IAAI,yBAAyB,CAAC,6DAA6D,CAAC,CAAC;gCAC7S,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,OAAO,CAAC,MAAM,EAAC,EAAE,EAAE;oCAAC,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,OAAO,CAAC,KAAK,EAAC,EAAE,EAAE,EAAC,CAAC;wCACtE,MAAM,EAAE,GAAC,EAAE,GAAC,EAAE,EAAC,EAAE,GAAC,EAAE,GAAC,EAAE,CAAC;wCACxB,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,GAAC,EAAE,CAAC,EAAC,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,GAAC,EAAE,GAAC,CAAC,CAAC,CAAC;wCAClI,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,GAAC,EAAE,CAAC,EAAC,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,GAAC,EAAE,GAAC,CAAC,CAAC,CAAC;wCACnI,MAAM,KAAK,GAAC,CAAC,EAAE,GAAC,OAAO,CAAC,KAAK,GAAC,EAAE,CAAC,GAAC,CAAC,EAAC,MAAM,GAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,mBAAmB,CAAC,OAAO,CAAC,KAAK,GAAC,CAAC,CAAE,GAAC,GAAG,CAAC,CAAC,CAAC;wCACtG,KAAI,IAAI,EAAE,GAAC,MAAM,EAAC,EAAE,IAAE,KAAK,EAAC,EAAE,EAAE;4CAAC,KAAI,IAAI,EAAE,GAAC,MAAM,EAAC,EAAE,IAAE,KAAK,EAAC,EAAE,EAAE,EAAC,CAAC;gDACjE,MAAM,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,EAAE,CAAC,GAAC,MAAM,EAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,EAAE,CAAC,GAAC,MAAM,CAAC;gDAClE,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,MAAM,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,EAAE,CAAC,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,MAAM,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,EAAE,CAAC,CAAC,GAAC,IAAI,CAAC;gDAC5H,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;oDAAA,MAAM,CAAC,GAAC,CAAC,EAAE,GAAC,CAAC,GAAC,EAAE,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC;oDAAA,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC,CAAE,GAAC,MAAM,CAAC,CAAC,CAAE,GAAC,MAAM,CAAC;gDAAA,CAAC;4CACjF,CAAC;oCACH,CAAC;gCACD,2FAA2F;gCAC3F,IAAG,KAAK,GAAC,EAAE,KAAG,CAAC,EAAC,CAAC;oCAAA,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oCAAA,KAAK,EAAE,CAAC;gCAAA,CAAC;4BAC7D,CAAC;wBACD,MAAM,KAAK,GAAU,EAAE,CAAC;wBACxB,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE;4BAAC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE;gCAAC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;oCAC3D,MAAM,KAAK,GAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,MAAM,GAAC,CAAC,CAAC,GAAC,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAE,CAAC;oCACpE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAC,GAAG,GAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gCACtF,CAAC;wBACD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAAA,IAAG,EAAE,MAAM,GAAC,EAAE,KAAG,CAAC,EAAC,CAAC;4BAAA,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAAA,KAAK,EAAE,CAAC;wBAAA,CAAC;oBAC7F,CAAC;gBACD,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAAA,KAAK,EAAE,CAAC;gBAAA,MAAM,KAAK,GAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAAA,OAAO,GAAC,SAAS,CAAC;gBACxF,MAAM,GAAC,EAAC,aAAa,EAAC,yBAAyB,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,EAAC,iBAAiB,EAAC,wBAAwB,EAAC,KAAK,EAAC,IAAI,CAAC,WAAW,EAAC,MAAM,EAAC,IAAI,CAAC,YAAY,EAAC,UAAU,EAAC,4CAA4C,EAAC,WAAW,EAAC,6BAA6B,EAAC,uBAAuB,EAAC,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAC,aAAa,EAAC,KAAK,EAAC,CAAC;gBAAA,KAAK,GAAC,WAAW,CAAC;YACtX,CAAC;YAAA,OAAM,KAAK,EAAC,CAAC;gBAAA,OAAO,EAAE,CAAC;gBAAA,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAC,CAAC;oBAAA,KAAK,GAAC,QAAQ,CAAC;oBAAA,KAAK,CAAC,KAAK,EAAE,CAAC;gBAAA,CAAC;gBAAA,MAAM,KAAK,CAAC;YAAA,CAAC;QAC/F,CAAC,EAAC,MAAM,KAAQ,IAAG,KAAK,KAAG,OAAO,IAAE,KAAK,KAAG,SAAS,IAAE,KAAK,KAAG,WAAW,EAAC,CAAC;YAAA,KAAK,GAAC,WAAW,CAAC;YAAA,KAAK,CAAC,KAAK,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC,CAAA,CAAC;QACxH,OAAO,KAAQ,IAAG,KAAK,KAAG,aAAa,EAAC,CAAC;YAAA,KAAK,GAAC,UAAU,CAAC;YAAA,KAAK,CAAC,KAAK,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC,CAAA,CAAC;QACpF,UAAU,KAAmB,IAAG,KAAK,KAAG,WAAW,IAAE,CAAC,MAAM;YAAC,MAAM,IAAI,yBAAyB,CAAC,yBAAyB,CAAC,CAAC,CAAA,MAAM,KAAK,GAAC,MAAM,CAAC,CAAA,MAAM,GAAC,IAAI,CAAC,CAAA,KAAK,GAAC,aAAa,CAAC,CAAA,OAAO,KAAK,CAAC,CAAA,CAAC;KAC9L,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"print-jpeg.js","sourceRoot":"","sources":["../../src/output/print-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Print JPEG export: downsamples an SDR image by exact area averaging, then writes a baseline JPEG\n * with an ICC colour profile. Bounded in size; the encoder is written for this project.\n */\nimport { createExportJpegEncoder, EXPORT_JPEG_ENCODER_ID } from \"../capture/export-jpeg.js\";\nimport { packExportJpegExif, exportTiffNumbers, exportTiffAscii, exportTiffRationals, type ExportTiffTag } from \"../capture/export-tiff.js\";\nimport { createSrgbIccProfile, SRGB_ICC_PROFILE_VERSION } from \"../color/srgb-icc.js\";\nimport { decodeSrgbComponent, encodeSrgbComponent } from \"../color/srgb-transfer.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport type { NativeRawTaskState } from \"../capture/native-raw.js\";\nimport type { RasterRect } from \"./capture-geometry.js\";\nexport const PRINT_JPEG_SCHEMA_VERSION=\"0.2.0\" as const;\nlet srgbDecode:Float64Array|undefined;\n/** decodeSrgbComponent(v/255) for every 8-bit code v, computed once with the same function (identical values). */\nfunction srgbDecodeTable():Float64Array{return srgbDecode??=Float64Array.from({length:256},(_,v)=>decodeSrgbComponent(v/255));}\nexport interface PrintJpegSource {\n captureId:string;imageStateId:string;artifactId:string;sha256:string;\n width:number;height:number;\n encoding:\"encoded-srgb-8-rgb\";\n}\nexport interface PrintJpegInput {\n source:PrintJpegSource;\n /** Integer crop in the oriented output source image, not in sensor or CFA (colour filter array) coordinates. */\n crop:RasterRect;\n outputWidth:number;outputHeight:number;\n quantizationStep:number;\n maximumEncodedBytes:number;\n /**\n * Maximum provider `readTile` calls. The task reads each crop pixel exactly once, in tiles of at most\n * 256 x 32 pixels aligned to the crop origin, so it needs ceil(crop.height/32) x ceil(crop.width/256)\n * reads; a smaller budget fails before the first read.\n */\n maximumProviderReads:number;\n /**\n * Optional physical print density in pixels per inch (1..65535) from the caller's print plan. When present,\n * EXIF IFD0 records XResolution = YResolution = this value as a RATIONAL with ResolutionUnit = 2 (inches),\n * and JFIF APP0 records units = 1 with the nearest integer density (JFIF density fields are uint16).\n * When omitted no physical size is claimed: JFIF keeps units = 0 with a 1:1 aspect ratio. Exif 2.32 makes\n * the IFD0 resolution tags mandatory and says an unknown resolution \"shall\" be recorded as 72 dpi, so IFD0\n * carries 72/1 with ResolutionUnit = 2; that is the standard's unknown-resolution marker, not a print size.\n */\n pixelsPerInch?:number;\n}\nexport interface PrintJpegTileRequest {source:PrintJpegSource;x:number;y:number;width:number;height:number}\nexport interface PrintJpegTile extends PrintJpegTileRequest {samples:Uint8Array}\nexport interface PrintJpegProvider {\n readTile(request:Readonly<PrintJpegTileRequest>,signal:AbortSignal):Promise<PrintJpegTile>;\n yieldControl(signal:AbortSignal):Promise<void>;\n}\nexport interface PrintJpegOutput {\n schemaVersion:typeof PRINT_JPEG_SCHEMA_VERSION;\n input:PrintJpegInput;\n mediaType:\"image/jpeg\";\n bytes:Uint8Array;\n iccProfileVersion:typeof SRGB_ICC_PROFILE_VERSION;\n width:number;height:number;\n resampling:\"exact-area-average-in-decoded-linear-light\";\n sourceStage:\"post-SDR-8-bit-quantization\";\n digitalUpscalingApplied:false;\n sourceBytesVerified:false;\n /** Provider calls made: ceil(crop.height/32) x ceil(crop.width/256) tiles, each crop pixel read once. */\n providerReads:number;\n /** Byte behaviour of the baseline encoder that produced `bytes`. */\n encoderId:typeof EXPORT_JPEG_ENCODER_ID;\n}\nexport interface PrintJpegTask {\n readonly state:NativeRawTaskState;\n run():Promise<void>;cancel():void;dispose():void;takeOutput():PrintJpegOutput;\n}\n/** Exactly n/1 for a whole-number density; otherwise the shared bounded decimal-fraction approximation. */\nfunction resolutionRational(id:number,ppi:number):ExportTiffTag {\n if(!Number.isSafeInteger(ppi))return exportTiffRationals(id,false,[ppi]);\n const data=new Uint8Array(8),view=new DataView(data.buffer);view.setUint32(0,ppi,true);view.setUint32(4,1,true);\n return {id,type:5,count:1,data};\n}\n/**\n * Exif 2.32 APP1 for a compressed primary image with every mandatory tag (CIPA DC-008-2019 Tables 17-18):\n * IFD0 Orientation, X/YResolution + ResolutionUnit, Software, YCbCrPositioning; Exif IFD ExifVersion \"0232\",\n * ComponentsConfiguration, FlashpixVersion \"0100\", ColorSpace sRGB, PixelX/YDimension. Without a planned\n * density the resolution tags carry the standard's \"unknown resolution\" value of 72 dpi.\n */\nfunction printExif(plan:PrintJpegInput):Uint8Array {\n const ppi=plan.pixelsPerInch;\n const resolution=ppi===undefined ? [] : [resolutionRational(282,ppi),resolutionRational(283,ppi),exportTiffNumbers(296,3,[2])];\n return packExportJpegExif([exportTiffNumbers(274,3,[1]),...resolution,exportTiffAscii(305,\"Photivra Print JPEG\")],\n [exportTiffNumbers(40961,3,[1])],{pixelWidth:plan.outputWidth,pixelHeight:plan.outputHeight});\n}\nfunction integer(v:unknown,min=1):number {\n if(typeof v!==\"number\"||!Number.isSafeInteger(v)||v<min)throw new InvalidConfigurationError(\"Print raster/budgets require safe integers.\");return v;\n}\n/** Validates the input only. Source detail, perception and printer suitability are checked by separate APIs. */\nexport function parsePrintJpegInput(input:PrintJpegInput):PrintJpegInput {\n const r=requireAllowlistedRecord(input,[\"source\",\"crop\",\"outputWidth\",\"outputHeight\",\"quantizationStep\",\"maximumEncodedBytes\",\"maximumProviderReads\",\"pixelsPerInch\"],\"Invalid Print JPEG input.\");\n const s=requireAllowlistedRecord(r.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print source.\");\n if(typeof s.sha256!==\"string\"||!/^[a-f0-9]{64}$/.test(s.sha256)||s.encoding!==\"encoded-srgb-8-rgb\")throw new InvalidConfigurationError(\"Print requires identified encoded sRGB source bytes.\");\n const source:PrintJpegSource={captureId:requirePublicOpaqueId(s.captureId,\"Invalid capture ID.\"),imageStateId:requirePublicOpaqueId(s.imageStateId,\"Invalid image state ID.\"),artifactId:requirePublicOpaqueId(s.artifactId,\"Invalid artifact ID.\"),sha256:s.sha256,width:integer(s.width),height:integer(s.height),encoding:s.encoding};\n const c=requireAllowlistedRecord(r.crop,[\"x\",\"y\",\"width\",\"height\"],\"Invalid Print crop.\"),crop={x:integer(c.x,0),y:integer(c.y,0),width:integer(c.width),height:integer(c.height)};\n const outputWidth=integer(r.outputWidth),outputHeight=integer(r.outputHeight),quantizationStep=integer(r.quantizationStep),maximumEncodedBytes=integer(r.maximumEncodedBytes),maximumProviderReads=integer(r.maximumProviderReads);\n if(source.width>16_384||source.height>16_384||source.width*source.height>24_000_000||crop.x+crop.width>source.width||crop.y+crop.height>source.height||\n outputWidth>crop.width||outputHeight>crop.height||quantizationStep>255||maximumEncodedBytes>256_000_000||maximumProviderReads>1_000_000||\n Math.abs(outputWidth*crop.height-outputHeight*crop.width)>.5*(crop.width+crop.height))throw new InvalidConfigurationError(\"Print requires bounded native/downsampled aspect-preserving crop output.\");\n const ppi=r.pixelsPerInch;\n if(ppi!==undefined&&(typeof ppi!==\"number\"||!Number.isFinite(ppi)||ppi<1||ppi>65535))throw new InvalidConfigurationError(\"Print density requires finite pixels per inch from 1 to 65535.\");\n return freezeOwnedData({source,crop,outputWidth,outputHeight,quantizationStep,maximumEncodedBytes,maximumProviderReads,...(ppi===undefined ? {} : {pixelsPerInch:ppi})});\n}\n/** Creates the export task. Filtering weights each source pixel by its exact area overlap, after decoding the declared 8-bit SDR source. */\nexport function createPrintJpegTask(input:PrintJpegInput,provider:PrintJpegProvider):PrintJpegTask {\n const plan=parsePrintJpegInput(input);\n if(!provider||typeof provider.readTile!==\"function\"||typeof provider.yieldControl!==\"function\")throw new InvalidConfigurationError(\"Print export requires source reader and host yields.\");\n const read=provider.readTile.bind(provider),yieldControl=provider.yieldControl.bind(provider),abort=new AbortController();\n let state:NativeRawTaskState=\"ready\",output:PrintJpegOutput|null=null,encoder:ReturnType<typeof createExportJpegEncoder>|undefined;\n function check():void{if(abort.signal.aborted)throw new InvalidConfigurationError(\"Print export aborted.\");}\n function release():void{encoder?.dispose();encoder=undefined;output?.bytes.fill(0);output=null;}\n return {get state():NativeRawTaskState{return state;},\n async run():Promise<void>{\n if(state!==\"ready\")throw new InvalidConfigurationError(\"Print export is single-use.\");state=\"running\";\n try{\n const exif=printExif(plan);\n const escaped=JSON.stringify(plan).replaceAll(\"&\",\"&amp;\").replaceAll('\"',\"&quot;\").replaceAll(\"<\",\"&lt;\").replaceAll(\">\",\"&gt;\");\n const xmp=new TextEncoder().encode('<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description rdf:about=\"\" xmlns:photivra=\"https://photivra.com/ns/simulation/1.0/\" photivra:PrintExportPlan=\"'+escaped+'\" photivra:SourceBytesVerified=\"False\"/></rdf:RDF></x:xmpmeta>');\n encoder=createExportJpegEncoder({width:plan.outputWidth,height:plan.outputHeight,quantizationStep:plan.quantizationStep,maximumOutputBytes:plan.maximumEncodedBytes,icc:createSrgbIccProfile(),exif,xmp,\n ...(plan.pixelsPerInch===undefined ? {} : {densityDotsPerInch:Math.round(plan.pixelsPerInch)})});\n const scaleX=plan.crop.width/plan.outputWidth,scaleY=plan.crop.height/plan.outputHeight,area=scaleX*scaleY;\n const cropRight=plan.crop.x+plan.crop.width,cropBottom=plan.crop.y+plan.crop.height,rowBytes=plan.crop.width*3;\n // Every crop pixel is read exactly once, in tiles of at most 256 x 32 aligned to the crop origin.\n const tilesPerBand=Math.ceil(plan.crop.width/256),requiredReads=Math.ceil(plan.crop.height/32)*tilesPerBand;\n if(requiredReads>plan.maximumProviderReads)throw new InvalidConfigurationError(\"Print source exceeds provider-read budget.\");\n // Rolling cache of whole crop-width source rows [cacheTop, cacheBottom): at most 63 rows are retained.\n const cache=new Uint8Array(Math.min(64,plan.crop.height)*rowBytes),lut=srgbDecodeTable();\n let reads=0,blocks=0,cacheTop=plan.crop.y,cacheBottom=plan.crop.y;\n const ensureRows=async(firstRow:number,rowCount:number):Promise<void>=>{\n const keepFrom=Math.min(Math.max(cacheTop,firstRow),cacheBottom);\n if(keepFrom>cacheTop){cache.copyWithin(0,(keepFrom-cacheTop)*rowBytes,(cacheBottom-cacheTop)*rowBytes);cacheTop=keepFrom;}\n while(cacheBottom<firstRow+rowCount){\n const bandHeight=Math.min(32,cropBottom-cacheBottom);\n if((cacheBottom+bandHeight-cacheTop)*rowBytes>cache.length)throw new InvalidConfigurationError(\"Print source traversal is not monotonic.\");\n for(let sx=plan.crop.x;sx<cropRight;sx+=256){\n check();++reads;\n const request=Object.freeze({source:plan.source,x:sx,y:cacheBottom,width:Math.min(256,cropRight-sx),height:bandHeight});\n const supplied=await read(request,abort.signal);check();\n const tile=requireAllowlistedRecord(supplied,[\"source\",\"x\",\"y\",\"width\",\"height\",\"samples\"],\"Invalid Print source tile.\");\n const source=requireAllowlistedRecord(tile.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print tile source.\");\n for(const key of Object.keys(plan.source) as (keyof PrintJpegSource)[])if(source[key]!==plan.source[key])throw new InvalidConfigurationError(\"Print source identity mismatch.\");\n for(const key of [\"x\",\"y\",\"width\",\"height\"] as const)if(tile[key]!==request[key])throw new InvalidConfigurationError(\"Print source rectangle mismatch.\");\n const samples=tile.samples;if(!(samples instanceof Uint8Array)||!(samples.buffer instanceof ArrayBuffer)||samples.length!==request.width*request.height*3||samples.buffer.byteLength!==samples.byteLength)throw new InvalidConfigurationError(\"Print source requires exact owned bounded RGB tile storage.\");\n for(let iy=0;iy<bandHeight;iy++)cache.set(samples.subarray(iy*request.width*3,(iy+1)*request.width*3),(cacheBottom-cacheTop+iy)*rowBytes+(sx-plan.crop.x)*3);\n // One output block can cover a megapixel of source, so also yield to the host while reading the source.\n if(reads%32===0){await yieldControl(abort.signal);check();}\n }\n cacheBottom+=bandHeight;\n }\n };\n const blocksX=Math.ceil(plan.outputWidth/8),sums=new Float64Array(blocksX*192);\n for(let by=0;by<plan.outputHeight;by+=8){\n check();sums.fill(0);\n const height=Math.min(8,plan.outputHeight-by),top=plan.crop.y+by*scaleY,bottom=by+height===plan.outputHeight?cropBottom:plan.crop.y+(by+height)*scaleY;\n // Accumulation order per output pixel is unchanged from the per-block reader: 32-row bands from\n // floor(top), then 256-column chunks from floor(left), then rows, then columns. Identical IEEE sums.\n for(let sy=Math.floor(top);sy<Math.ceil(bottom);sy+=32){\n const bandHeight=Math.min(32,Math.ceil(bottom)-sy);await ensureRows(sy,bandHeight);check();\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),left=plan.crop.x+bx*scaleX,right=bx+width===plan.outputWidth?cropRight:plan.crop.x+(bx+width)*scaleX,base=block*192;\n for(let sx=Math.floor(left);sx<Math.ceil(right);sx+=256){\n const chunkWidth=Math.min(256,Math.ceil(right)-sx);\n for(let iy=0;iy<bandHeight;iy++)for(let ix=0;ix<chunkWidth;ix++){\n const px=sx+ix,py=sy+iy;\n const firstX=Math.max(0,Math.floor((px-plan.crop.x)/scaleX)-bx),lastX=Math.min(width-1,Math.ceil((px+1-plan.crop.x)/scaleX)-bx-1);\n const firstY=Math.max(0,Math.floor((py-plan.crop.y)/scaleY)-by),lastY=Math.min(height-1,Math.ceil((py+1-plan.crop.y)/scaleY)-by-1);\n const index=(py-cacheTop)*rowBytes+(px-plan.crop.x)*3,r=lut[cache[index]!]!,g=lut[cache[index+1]!]!,b=lut[cache[index+2]!]!;\n for(let oy=firstY;oy<=lastY;oy++)for(let ox=firstX;ox<=lastX;ox++){\n const x0=plan.crop.x+(bx+ox)*scaleX,y0=plan.crop.y+(by+oy)*scaleY;\n const weight=Math.max(0,Math.min(px+1,x0+scaleX)-Math.max(px,x0))*Math.max(0,Math.min(py+1,y0+scaleY)-Math.max(py,y0))/area;\n const i=base+(oy*8+ox)*3;sums[i]=sums[i]!+r*weight;sums[i+1]=sums[i+1]!+g*weight;sums[i+2]=sums[i+2]!+b*weight;\n }\n }\n }\n }\n }\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),base=block*192,samples:number[]=[];\n for(let y=0;y<8;y++)for(let x=0;x<8;x++)for(let c=0;c<3;c++){\n const value=sums[base+(Math.min(y,height-1)*8+Math.min(x,width-1))*3+c]!;\n // Nearest code, ties up. Math.round is used because floor(x+0.5) wrongly rounds 0.49999999999999994 up.\n samples.push(Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255))));\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n await yieldControl(abort.signal);check();const bytes=encoder.finish();encoder=undefined;\n output={schemaVersion:PRINT_JPEG_SCHEMA_VERSION,input:plan,mediaType:\"image/jpeg\",bytes,iccProfileVersion:SRGB_ICC_PROFILE_VERSION,width:plan.outputWidth,height:plan.outputHeight,resampling:\"exact-area-average-in-decoded-linear-light\",sourceStage:\"post-SDR-8-bit-quantization\",digitalUpscalingApplied:false,sourceBytesVerified:false,providerReads:reads,encoderId:EXPORT_JPEG_ENCODER_ID};state=\"completed\";\n }catch(error){release();if(!abort.signal.aborted){state=\"failed\";abort.abort();}throw error;}\n },cancel():void{if(state===\"ready\"||state===\"running\"||state===\"completed\"){state=\"cancelled\";abort.abort();release();}},\n dispose():void{if(state!==\"transferred\"){state=\"disposed\";abort.abort();release();}},\n takeOutput():PrintJpegOutput{if(state!==\"completed\"||!output)throw new InvalidConfigurationError(\"Print JPEG unavailable.\");const value=output;output=null;state=\"transferred\";return value;}\n };\n}\n"]}
@@ -1,21 +1,22 @@
1
- /** Native-only print geometry. No image generation or perceived-quality certification.
1
+ /** Print planning: how many native pixels a print of a given size and viewing distance needs.
2
+ * It uses native capture pixels only. It does not make an image or certify perceived quality.
2
3
  * @see docs/PRINT_PLANNING.md for equations, rounding and support limits.
3
4
  */
4
5
  import { type CalculationResult } from "../core/calculation-result.js";
5
6
  import { type ResolveCaptureGeometryInput } from "./capture-geometry.js";
6
7
  import type { RasterDimensions } from "../sensor/sensor-geometry.js";
7
- /** Physical length, separate from raster pixels and printer dots. */
8
+ /** A physical length. Not to be confused with image pixels or printer dots. */
8
9
  export interface PrintLength {
9
10
  value: number;
10
11
  unit: "mm" | "cm" | "inches" | "m";
11
12
  }
12
- /** Flat printed image area; excludes paper, borders and wraps. */
13
+ /** The flat printed image area. It excludes paper margins, borders and canvas wraps. */
13
14
  export interface PrintedImageSize {
14
15
  width: number;
15
16
  height: number;
16
17
  unit: PrintLength["unit"];
17
18
  }
18
- /** Explicit angular convention; manual PPI starts a different plan. */
19
+ /** How to choose pixel density: one of three angular criteria at the viewing distance, or a manual PPI (pixels per inch), which gives a different kind of plan. */
19
20
  export type PrintSamplingCriterion = {
20
21
  kind: "angular-pixel-pitch";
21
22
  maximumArcminutesPerPixel: number;
@@ -31,7 +32,7 @@ export type PrintSamplingCriterion = {
31
32
  kind: "manual-ppi";
32
33
  pixelsPerInch: number;
33
34
  };
34
- /** Declared authoritative geometry, not a preview or resampled pixel count. */
35
+ /** The declared native source geometry. Not a preview or a resampled pixel count. */
35
36
  export type PrintNativeSource = {
36
37
  kind: "native-retained";
37
38
  captureId: string;
@@ -40,14 +41,14 @@ export type PrintNativeSource = {
40
41
  kind: "unavailable";
41
42
  reason: "missing-native-raster" | "unverified-native-identity";
42
43
  };
43
- /** Caller-supplied lab constraints; no vendor catalog or delivery guarantee. */
44
+ /** Print lab requirements supplied by the caller. There is no vendor catalogue and no guarantee of what a lab will accept. */
44
45
  export interface PrintProviderConstraints {
45
46
  minimumRaster?: RasterDimensions;
46
47
  exactRaster?: RasterDimensions;
47
48
  minimumPpi?: number;
48
49
  exactPpi?: number;
49
50
  }
50
- /** Exact-ratio output policy. Physical aspect tolerance is explicit and reported. */
51
+ /** Plan input. The output keeps the exact native aspect ratio; the allowed physical aspect error is explicit and reported. */
51
52
  export interface PrintPlanInput {
52
53
  source: PrintNativeSource;
53
54
  printedImage: PrintedImageSize;
@@ -59,7 +60,7 @@ export interface PrintPlanInput {
59
60
  };
60
61
  provider?: PrintProviderConstraints;
61
62
  }
62
- /** Per-axis density and angular pitch; angular values are geometry, not acuity. */
63
+ /** Pixel density and angular pixel pitch for each axis. The angles are pure geometry, not a measure of visual acuity. */
63
64
  export interface PrintRasterSampling {
64
65
  raster: RasterDimensions;
65
66
  pixelsPerInch: {
@@ -71,7 +72,7 @@ export interface PrintRasterSampling {
71
72
  y: number;
72
73
  };
73
74
  }
74
- /** Finite conditional plan. Null recommendation never authorizes an upscale. */
75
+ /** A plan, valid only under its stated conditions. A null recommendation never means it is fine to upscale. */
75
76
  export interface PrintPlan {
76
77
  engineApiVersion: string;
77
78
  input: PrintPlanInput;
@@ -106,21 +107,21 @@ export interface PrintPlan {
106
107
  capturedDetailAssessment: "unassessed";
107
108
  deliveryAssessment: "unassessed";
108
109
  }
109
- /** Validate and copy an untrusted Print request; never infer native authority. */
110
+ /** Validates and copies an untrusted print request. It never assumes the source is native if that is not declared. */
110
111
  export declare function parsePrintPlanInput(value: unknown): PrintPlanInput;
111
- /** Resolve the minimum exact-native-ratio file under declared sampling/lab constraints.
112
- * Angular guidance is approximate as a usage criterion; geometry is calculated.
113
- * No source detail, perceived quality, serializer or resource availability is assessed.
112
+ /** Finds the smallest file, at the exact native aspect ratio, that meets the declared sampling and lab constraints.
113
+ * The angular guidance is an approximate rule of thumb; the geometry itself is calculated exactly.
114
+ * It does not assess source detail, perceived quality, file writing or available resources.
114
115
  */
115
116
  export declare function calculatePrintPlan(value: PrintPlanInput): CalculationResult<PrintPlan>;
116
- /** Size-limit query retains the reference image aspect and criterion.
117
- * Proportional viewing scales the supplied reference distance with both image axes.
117
+ /** Input for the largest-print-size query. It keeps the reference plan's aspect ratio and criterion.
118
+ * With proportional viewing, the reference viewing distance scales with the image size.
118
119
  */
119
120
  export interface PrintSizeLimitInput {
120
121
  plan: PrintPlanInput;
121
122
  viewingDistancePolicy: "fixed" | "proportional-to-image-size";
122
123
  }
123
- /** Semantic bounds avoid Infinity sentinels; no-positive-size differs from invalid input. */
124
+ /** Result of the size query. A status says "unbounded" rather than using Infinity. "no-positive-size" is a valid answer, not an input error. */
124
125
  export interface PrintSizeLimit {
125
126
  engineApiVersion: string;
126
127
  status: "finite" | "unbounded" | "no-positive-size" | "cannot-assess" | "unsupported";
@@ -131,8 +132,7 @@ export interface PrintSizeLimit {
131
132
  reasons: string[];
132
133
  referencePlan: PrintPlan;
133
134
  }
134
- /** Calculate a conditional size bound. Lab constraints require individual plans;
135
- * this first size-query contract reports them as unsupported rather than ignoring them.
135
+ /** Calculates the largest print size under the stated conditions. Lab constraints need individual plans,
136
+ * so this size query reports them as unsupported rather than ignoring them.
136
137
  */
137
138
  export declare function calculatePrintSizeLimit(value: PrintSizeLimitInput): CalculationResult<PrintSizeLimit>;
138
- //# sourceMappingURL=print-plan.d.ts.map
@@ -1,5 +1,6 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /** Native-only print geometry. No image generation or perceived-quality certification.
2
+ /** Print planning: how many native pixels a print of a given size and viewing distance needs.
3
+ * It uses native capture pixels only. It does not make an image or certify perceived quality.
3
4
  * @see docs/PRINT_PLANNING.md for equations, rounding and support limits.
4
5
  */
5
6
  import { calculatedResult, approximationResult } from "../core/calculation-result.js";
@@ -45,7 +46,7 @@ function geometry(value) {
45
46
  }
46
47
  if (g.outputRaster !== undefined)
47
48
  raster(g.outputRaster);
48
- // Existing geometry owns units, orientations, bounds and optical-axis semantics.
49
+ // The capture geometry module defines units, orientations, bounds and the optical axis.
49
50
  const parsed = g;
50
51
  resolveCaptureGeometry(parsed);
51
52
  return structuredCloneGeometry(parsed);
@@ -99,7 +100,7 @@ function angularLimit(s) {
99
100
  case "angular-line-pair": return s.periodArcminutes / s.samplesPerPeriod;
100
101
  }
101
102
  }
102
- /** Validate and copy an untrusted Print request; never infer native authority. */
103
+ /** Validates and copies an untrusted print request. It never assumes the source is native if that is not declared. */
103
104
  export function parsePrintPlanInput(value) {
104
105
  const r = record(value, ["source", "printedImage", "viewingDistance", "sampling", "fit", "provider"]);
105
106
  const source = record(r.source, ["kind", "captureId", "geometry", "reason"]);
@@ -138,7 +139,7 @@ function gcd(a, b) { while (b !== 0) {
138
139
  b = next;
139
140
  } return a; }
140
141
  function positiveSupported(...values) { return values.every(v => Number.isFinite(v) && v > 0); }
141
- // Adjacent binary64 values implement outward rounding, not a criterion epsilon.
142
+ // Stepping to the adjacent double rounds outward. It is not a tolerance on the criterion.
142
143
  function adjacentPositive(value, direction) {
143
144
  const view = new DataView(new ArrayBuffer(8));
144
145
  view.setFloat64(0, value);
@@ -159,9 +160,9 @@ function diagnostics(raster, width, height, distance) {
159
160
  const px = width / raster.pixelWidth, py = height / raster.pixelHeight;
160
161
  return { raster, pixelsPerInch: { x: 25.4 / px, y: 25.4 / py }, angularPixelPitchArcminutes: { x: 2 * Math.atan((px / distance) / 2) / RAD_PER_ARCMIN, y: 2 * Math.atan((py / distance) / 2) / RAD_PER_ARCMIN } };
161
162
  }
162
- /** Resolve the minimum exact-native-ratio file under declared sampling/lab constraints.
163
- * Angular guidance is approximate as a usage criterion; geometry is calculated.
164
- * No source detail, perceived quality, serializer or resource availability is assessed.
163
+ /** Finds the smallest file, at the exact native aspect ratio, that meets the declared sampling and lab constraints.
164
+ * The angular guidance is an approximate rule of thumb; the geometry itself is calculated exactly.
165
+ * It does not assess source detail, perceived quality, file writing or available resources.
165
166
  */
166
167
  export function calculatePrintPlan(value) {
167
168
  const input = parsePrintPlanInput(value);
@@ -219,7 +220,7 @@ export function calculatePrintPlan(value) {
219
220
  const candidate = input.sampling.kind === "manual-ppi" ? minimumRaster(native, w / 25.4 * ppi, h / 25.4 * ppi) : minimumRaster(native, w / p, h / p);
220
221
  return candidate !== null && candidate.pixelWidth <= native.pixelWidth && candidate.pixelHeight <= native.pixelHeight;
221
222
  };
222
- // Return alternatives that survive their own documented integer policy.
223
+ // Return only alternatives that still pass their own documented integer rule.
223
224
  for (let i = 0; i < 8 && !fits(maxWidth, maxHeight, pitch); i++) {
224
225
  maxScale = adjacentPositive(maxScale, "down");
225
226
  maxWidth = width * maxScale;
@@ -276,8 +277,8 @@ export function calculatePrintPlan(value) {
276
277
  plan.resamplingScale = { x: file.pixelWidth / native.pixelWidth, y: file.pixelHeight / native.pixelHeight };
277
278
  return finish();
278
279
  }
279
- /** Calculate a conditional size bound. Lab constraints require individual plans;
280
- * this first size-query contract reports them as unsupported rather than ignoring them.
280
+ /** Calculates the largest print size under the stated conditions. Lab constraints need individual plans,
281
+ * so this size query reports them as unsupported rather than ignoring them.
281
282
  */
282
283
  export function calculatePrintSizeLimit(value) {
283
284
  const r = record(value, ["plan", "viewingDistancePolicy"]);