@photivra/engine 2.8.1 → 2.10.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 (91) hide show
  1. package/CHANGELOG.md +144 -1
  2. package/CITATION.cff +1 -1
  3. package/README.md +8 -6
  4. package/SECURITY.md +1 -1
  5. package/THIRD_PARTY.md +2 -0
  6. package/dist/capture/export-jpeg.d.ts +19 -0
  7. package/dist/capture/export-jpeg.js +190 -108
  8. package/dist/capture/export-jpeg.js.map +1 -1
  9. package/dist/capture/native-environment-lean.js +106 -12
  10. package/dist/capture/native-environment-lean.js.map +1 -1
  11. package/dist/capture/native-environment-tabulated.d.ts +37 -0
  12. package/dist/capture/native-environment-tabulated.js +42 -6
  13. package/dist/capture/native-environment-tabulated.js.map +1 -1
  14. package/dist/core/portable-math.d.ts +13 -0
  15. package/dist/core/portable-math.js +43 -0
  16. package/dist/core/portable-math.js.map +1 -1
  17. package/dist/core/version.d.ts +1 -1
  18. package/dist/core/version.js +1 -1
  19. package/dist/core/version.js.map +1 -1
  20. package/dist/facade/channel-response.d.ts +15 -0
  21. package/dist/facade/channel-response.js +33 -0
  22. package/dist/facade/channel-response.js.map +1 -0
  23. package/dist/facade/diffraction-provider.js +50 -15
  24. package/dist/facade/diffraction-provider.js.map +1 -1
  25. package/dist/facade/display-view.d.ts +75 -0
  26. package/dist/facade/display-view.js +471 -109
  27. package/dist/facade/display-view.js.map +1 -1
  28. package/dist/facade/expected-signal-setup.js +2 -1
  29. package/dist/facade/expected-signal-setup.js.map +1 -1
  30. package/dist/facade/expected-signal.d.ts +36 -4
  31. package/dist/facade/expected-signal.js +331 -43
  32. package/dist/facade/expected-signal.js.map +1 -1
  33. package/dist/facade/scene-radiance.d.ts +4 -1
  34. package/dist/facade/scene-radiance.js +4 -4
  35. package/dist/facade/scene-radiance.js.map +1 -1
  36. package/dist/facade/simulate-capture.d.ts +77 -5
  37. package/dist/facade/simulate-capture.js +232 -40
  38. package/dist/facade/simulate-capture.js.map +1 -1
  39. package/dist/facade/simulate-display-view.d.ts +25 -2
  40. package/dist/facade/simulate-display-view.js +55 -21
  41. package/dist/facade/simulate-display-view.js.map +1 -1
  42. package/dist/gpu/image-kernel-execution.d.ts +5 -0
  43. package/dist/gpu/image-kernel-execution.js +2 -2
  44. package/dist/gpu/image-kernel-execution.js.map +1 -1
  45. package/dist/index.d.ts +5 -4
  46. package/dist/index.js +3 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/optics/diffraction-psf-profile.d.ts +19 -17
  49. package/dist/optics/diffraction-psf-profile.js +49 -18
  50. package/dist/optics/diffraction-psf-profile.js.map +1 -1
  51. package/dist/optics/irradiance-convolution.d.ts +11 -0
  52. package/dist/optics/irradiance-convolution.js +64 -24
  53. package/dist/optics/irradiance-convolution.js.map +1 -1
  54. package/dist/optics/scene-to-sensor-irradiance.d.ts +13 -0
  55. package/dist/optics/scene-to-sensor-irradiance.js +58 -24
  56. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  57. package/dist/optics/sensor-aperture-rays.js +2 -1
  58. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  59. package/dist/optics/sensor-environment-query.js +4 -3
  60. package/dist/optics/sensor-environment-query.js.map +1 -1
  61. package/dist/optics/site-diffraction-kernel.d.ts +16 -0
  62. package/dist/optics/site-diffraction-kernel.js +60 -8
  63. package/dist/optics/site-diffraction-kernel.js.map +1 -1
  64. package/dist/output/print-jpeg.d.ts +28 -1
  65. package/dist/output/print-jpeg.js +79 -7
  66. package/dist/output/print-jpeg.js.map +1 -1
  67. package/dist/processing/demosaic.js +114 -37
  68. package/dist/processing/demosaic.js.map +1 -1
  69. package/dist/schema/scene-radiance.d.ts +8 -0
  70. package/dist/schema/scene-radiance.js +28 -17
  71. package/dist/schema/scene-radiance.js.map +1 -1
  72. package/dist/sensor/environment-photo-signal.d.ts +21 -0
  73. package/dist/sensor/environment-photo-signal.js +68 -2
  74. package/dist/sensor/environment-photo-signal.js.map +1 -1
  75. package/dist/sensor/stochastic-seed.d.ts +12 -0
  76. package/dist/sensor/stochastic-seed.js +25 -0
  77. package/dist/sensor/stochastic-seed.js.map +1 -1
  78. package/docs/API_REFERENCE.md +23 -1
  79. package/docs/QUICK_START.md +77 -8
  80. package/docs/USAGE.md +30 -0
  81. package/docs/api/capture-export-jpeg.md +10 -0
  82. package/docs/api/core-version.md +1 -1
  83. package/docs/api/exports.json +77 -2
  84. package/docs/api/facade-display-view.md +50 -0
  85. package/docs/api/facade-scene-radiance.md +2 -1
  86. package/docs/api/facade-simulate-capture.md +88 -8
  87. package/docs/api/facade-simulate-display-view.md +23 -1
  88. package/docs/api/gpu-image-kernel-execution.md +5 -0
  89. package/docs/api/optics-diffraction-psf-profile.md +1 -1
  90. package/docs/api/output-print-jpeg.md +41 -0
  91. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"print-jpeg.js","sourceRoot":"","sources":["../../src/output/print-jpeg.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAsB,MAAM,2BAA2B,CAAC;AAC5I,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;AACxD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGjH,MAAM,CAAC,MAAM,yBAAyB,GAAC,OAAgB,CAAC;AACxD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAC,MAAM,CAAC,MAAM,CAAC,EAAC,aAAa,EAAC,UAAU,EAAC,aAAa,EAAC,8BAA8B,EAAC,gBAAgB,EAAC,MAAM;IACzI,mBAAmB,EAAC,WAAW,EAAC,oBAAoB,EAAC,SAAS,EAAC,CAAC,CAAC;AACnE,IAAI,UAAiC,CAAC;AACtC,kHAAkH;AAClH,SAAS,eAAe,KAAgB,OAAO,UAAU,KAAG,YAAY,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,GAAG,EAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,mBAAmB,CAAC,CAAC,GAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAC;AA6D/H,2GAA2G;AAC3G,SAAS,kBAAkB,CAAC,EAAS,EAAC,GAAU;IAC9C,IAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QAAC,OAAO,mBAAmB,CAAC,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,GAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAC,IAAI,GAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,IAAI,CAAC,SAAS,CAAC,CAAC,EAAC,GAAG,EAAC,IAAI,CAAC,CAAC;IAAA,IAAI,CAAC,SAAS,CAAC,CAAC,EAAC,CAAC,EAAC,IAAI,CAAC,CAAC;IAChH,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC;AAClC,CAAC;AACD;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAmB;IACpC,MAAM,GAAG,GAAC,IAAI,CAAC,aAAa,CAAC;IAC7B,MAAM,UAAU,GAAC,GAAG,KAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,kBAAkB,CAAC,GAAG,EAAC,GAAG,CAAC,EAAC,iBAAiB,CAAC,GAAG,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/H,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,GAAG,UAAU,EAAC,eAAe,CAAC,GAAG,EAAC,qBAAqB,CAAC,CAAC,EAC/G,CAAC,iBAAiB,CAAC,KAAK,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,EAAC,UAAU,EAAC,IAAI,CAAC,WAAW,EAAC,WAAW,EAAC,IAAI,CAAC,YAAY,EAAC,CAAC,CAAC;AAClG,CAAC;AACD,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,gHAAgH;AAChH,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,EAAC,eAAe,EAAC,eAAe,CAAC,EAAC,2BAA2B,CAAC,CAAC;IACnN,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,MAAM,CAAC,GAAC,iBAAiB,EAAC,aAAa,GAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,EAAC,CAAC,CAAC,aAAa,EAAC,CAAC,CAAC,aAAa,EAAC,mDAAmD,GAAC,CAAC,CAAC,aAAa,GAAC,GAAG,CAAC,CAAC;IACpL,MAAM,mBAAmB,GAAC,CAAC,CAAC,aAAa,KAAG,SAAS,CAAA,CAAC,CAAA,CAAC,CAAC,mBAAmB,CAAA,CAAC,CAAA,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,EAAC,aAAa,CAAC,CAAC;IACpI,IAAG,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,gBAAgB,IAAE,MAAM,CAAC,MAAM,GAAC,CAAC,CAAC,gBAAgB,IAAE,MAAM,CAAC,KAAK,GAAC,MAAM,CAAC,MAAM,GAAC,aAAa,IAAE,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,KAAK,GAAC,MAAM,CAAC,KAAK,IAAE,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,MAAM,GAAC,MAAM,CAAC,MAAM;QAC9K,WAAW,GAAC,IAAI,CAAC,KAAK,IAAE,YAAY,GAAC,IAAI,CAAC,MAAM,IAAE,gBAAgB,GAAC,GAAG,IAAE,mBAAmB,GAAC,mBAAmB,IAAE,oBAAoB,GAAC,CAAC,CAAC,oBAAoB;QAC5J,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,MAAM,GAAG,GAAC,CAAC,CAAC,aAAa,CAAC;IAC1B,IAAG,GAAG,KAAG,SAAS,IAAE,CAAC,OAAO,GAAG,KAAG,QAAQ,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAE,GAAG,GAAC,CAAC,IAAE,GAAG,GAAC,KAAK,CAAC;QAAC,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAC;IAC3L,OAAO,eAAe,CAAC,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,EAAC,YAAY,EAAC,gBAAgB,EAAC,mBAAmB,EAAC,oBAAoB,EAAC,GAAG,CAAC,GAAG,KAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,aAAa,EAAC,GAAG,EAAC,CAAC;QACpK,GAAG,CAAC,CAAC,CAAC,aAAa,KAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,aAAa,EAAC,CAAC,EAAC,CAAC,CAAC;AAC9D,CAAC;AACD,4IAA4I;AAC5I,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,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC3B,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;oBACrM,GAAG,CAAC,IAAI,CAAC,aAAa,KAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,kBAAkB,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;gBACnG,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;gBAC3G,MAAM,SAAS,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAC,UAAU,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAC,QAAQ,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAC,CAAC,CAAC;gBAC/G,kGAAkG;gBAClG,MAAM,YAAY,GAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAC,GAAG,CAAC,EAAC,aAAa,GAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAC,EAAE,CAAC,GAAC,YAAY,CAAC;gBAC5G,IAAG,aAAa,GAAC,IAAI,CAAC,oBAAoB;oBAAC,MAAM,IAAI,yBAAyB,CAAC,4CAA4C,CAAC,CAAC;gBAC7H,uGAAuG;gBACvG,MAAM,KAAK,GAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAC,QAAQ,CAAC,EAAC,GAAG,GAAC,eAAe,EAAE,CAAC;gBACzF,IAAI,KAAK,GAAC,CAAC,EAAC,MAAM,GAAC,CAAC,EAAC,QAAQ,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAC,WAAW,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClE,MAAM,UAAU,GAAC,KAAK,EAAC,QAAe,EAAC,QAAe,EAAe,EAAE;oBACrE,MAAM,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAC,QAAQ,CAAC,EAAC,WAAW,CAAC,CAAC;oBACjE,IAAG,QAAQ,GAAC,QAAQ,EAAC,CAAC;wBAAA,KAAK,CAAC,UAAU,CAAC,CAAC,EAAC,CAAC,QAAQ,GAAC,QAAQ,CAAC,GAAC,QAAQ,EAAC,CAAC,WAAW,GAAC,QAAQ,CAAC,GAAC,QAAQ,CAAC,CAAC;wBAAA,QAAQ,GAAC,QAAQ,CAAC;oBAAA,CAAC;oBAC1H,OAAM,WAAW,GAAC,QAAQ,GAAC,QAAQ,EAAC,CAAC;wBACnC,MAAM,UAAU,GAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,UAAU,GAAC,WAAW,CAAC,CAAC;wBACrD,IAAG,CAAC,WAAW,GAAC,UAAU,GAAC,QAAQ,CAAC,GAAC,QAAQ,GAAC,KAAK,CAAC,MAAM;4BAAC,MAAM,IAAI,yBAAyB,CAAC,0CAA0C,CAAC,CAAC;wBAC3I,KAAI,IAAI,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAC,EAAE,GAAC,SAAS,EAAC,EAAE,IAAE,GAAG,EAAC,CAAC;4BAC3C,KAAK,EAAE,CAAC;4BAAA,EAAE,KAAK,CAAC;4BAChB,MAAM,OAAO,GAAC,MAAM,CAAC,MAAM,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,SAAS,GAAC,EAAE,CAAC,EAAC,MAAM,EAAC,UAAU,EAAC,CAAC,CAAC;4BACxH,MAAM,QAAQ,GAAC,MAAM,IAAI,CAAC,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAAA,KAAK,EAAE,CAAC;4BACxD,MAAM,IAAI,GAAC,wBAAwB,CAAC,QAAQ,EAAC,CAAC,QAAQ,EAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,CAAC,EAAC,4BAA4B,CAAC,CAAC;4BACzH,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;4BAC/J,KAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAA8B;gCAAC,IAAG,MAAM,CAAC,GAAG,CAAC,KAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oCAAC,MAAM,IAAI,yBAAyB,CAAC,iCAAiC,CAAC,CAAC;4BAChL,KAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,CAAU;gCAAC,IAAG,IAAI,CAAC,GAAG,CAAC,KAAG,OAAO,CAAC,GAAG,CAAC;oCAAC,MAAM,IAAI,yBAAyB,CAAC,kCAAkC,CAAC,CAAC;4BACzJ,MAAM,OAAO,GAAC,IAAI,CAAC,OAAO,CAAC;4BAAA,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;gCAAC,MAAM,IAAI,yBAAyB,CAAC,6DAA6D,CAAC,CAAC;4BAC7S,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,UAAU,EAAC,EAAE,EAAE;gCAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAC,OAAO,CAAC,KAAK,GAAC,CAAC,EAAC,CAAC,EAAE,GAAC,CAAC,CAAC,GAAC,OAAO,CAAC,KAAK,GAAC,CAAC,CAAC,EAAC,CAAC,WAAW,GAAC,QAAQ,GAAC,EAAE,CAAC,GAAC,QAAQ,GAAC,CAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;4BAC7J,wGAAwG;4BACxG,IAAG,KAAK,GAAC,EAAE,KAAG,CAAC,EAAC,CAAC;gCAAA,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCAAA,KAAK,EAAE,CAAC;4BAAA,CAAC;wBAC7D,CAAC;wBACD,WAAW,IAAE,UAAU,CAAC;oBAC1B,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,OAAO,GAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAC,CAAC,CAAC,EAAC,IAAI,GAAC,IAAI,YAAY,CAAC,OAAO,GAAC,GAAG,CAAC,CAAC;gBAC/E,+GAA+G;gBAC/G,2GAA2G;gBAC3G,MAAM,QAAQ,GAAC,MAAM,KAAG,CAAC,IAAE,MAAM,KAAG,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAC,QAAQ,CAAA,CAAC,CAAA,UAAU,CAAC,IAAI,CAAC,GAAG,EAAC,CAAC,KAAK,EAAC,EAAE,CAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,SAAS,CAAC;gBACnI,IAAG,MAAM;oBAAC,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,YAAY,EAAC,EAAE,IAAE,CAAC,EAAC,CAAC;wBACjD,KAAK,EAAE,CAAC;wBACR,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,YAAY,GAAC,EAAE,CAAC,CAAC;wBAAA,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,EAAC,MAAM,CAAC,CAAC;wBAAA,KAAK,EAAE,CAAC;wBAC9F,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,WAAW,EAAC,EAAE,IAAE,CAAC,EAAC,CAAC;4BACtC,MAAM,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,WAAW,GAAC,EAAE,CAAC,EAAC,OAAO,GAAU,EAAE,CAAC;4BAChE,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;gCACnB,MAAM,GAAG,GAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,MAAM,GAAC,CAAC,CAAC,GAAC,QAAQ,CAAC,GAAC,QAAQ,GAAC,EAAE,GAAC,CAAC,CAAC;gCACvE,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;oCAAA,MAAM,KAAK,GAAC,GAAG,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC;oCAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,CAAE,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,CAAE,CAAE,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,CAAE,CAAE,CAAC,CAAC;gCAAA,CAAC;4BACrJ,CAAC;4BACD,KAAK,EAAE,CAAC;4BAAA,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;4BAAA,IAAG,EAAE,MAAM,GAAC,EAAE,KAAG,CAAC,EAAC,CAAC;gCAAA,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCAAA,KAAK,EAAE,CAAC;4BAAA,CAAC;wBACvG,CAAC;oBACH,CAAC;;oBACI,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,YAAY,EAAC,EAAE,IAAE,CAAC,EAAC,CAAC;wBAC5C,KAAK,EAAE,CAAC;wBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACrB,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,YAAY,GAAC,EAAE,CAAC,EAAC,GAAG,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,GAAC,MAAM,EAAC,MAAM,GAAC,EAAE,GAAC,MAAM,KAAG,IAAI,CAAC,YAAY,CAAA,CAAC,CAAA,UAAU,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,MAAM,CAAC,GAAC,MAAM,CAAC;wBACvJ,gGAAgG;wBAChG,qGAAqG;wBACrG,KAAI,IAAI,EAAE,GAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,EAAE,IAAE,EAAE,EAAC,CAAC;4BACtD,MAAM,UAAU,GAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAC,EAAE,CAAC,CAAC;4BAAA,MAAM,UAAU,CAAC,EAAE,EAAC,UAAU,CAAC,CAAC;4BAAA,KAAK,EAAE,CAAC;4BAC3F,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,KAAK,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,WAAW,EAAC,EAAE,IAAE,CAAC,EAAC,KAAK,EAAE,EAAC,CAAC;gCACtD,MAAM,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,WAAW,GAAC,EAAE,CAAC,EAAC,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,EAAE,GAAC,MAAM,EAAC,KAAK,GAAC,EAAE,GAAC,KAAK,KAAG,IAAI,CAAC,WAAW,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,EAAE,GAAC,KAAK,CAAC,GAAC,MAAM,EAAC,IAAI,GAAC,KAAK,GAAC,GAAG,CAAC;gCAChK,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;oCACvD,MAAM,UAAU,GAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAC,EAAE,CAAC,CAAC;oCACnD,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,UAAU,EAAC,EAAE,EAAE;wCAAC,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,EAAE,GAAC,UAAU,EAAC,EAAE,EAAE,EAAC,CAAC;4CAC/D,MAAM,EAAE,GAAC,EAAE,GAAC,EAAE,EAAC,EAAE,GAAC,EAAE,GAAC,EAAE,CAAC;4CACxB,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;4CAClI,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;4CACnI,MAAM,KAAK,GAAC,CAAC,EAAE,GAAC,QAAQ,CAAC,GAAC,QAAQ,GAAC,CAAC,EAAE,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,CAAE,EAAC,CAAC,GAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,CAAE,CAAE,EAAC,CAAC,GAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,CAAE,CAAE,CAAC;4CAC5H,KAAI,IAAI,EAAE,GAAC,MAAM,EAAC,EAAE,IAAE,KAAK,EAAC,EAAE,EAAE;gDAAC,KAAI,IAAI,EAAE,GAAC,MAAM,EAAC,EAAE,IAAE,KAAK,EAAC,EAAE,EAAE,EAAC,CAAC;oDACjE,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;oDAClE,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;oDAC5H,MAAM,CAAC,GAAC,IAAI,GAAC,CAAC,EAAE,GAAC,CAAC,GAAC,EAAE,CAAC,GAAC,CAAC,CAAC;oDAAA,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC,CAAE,GAAC,CAAC,GAAC,MAAM,CAAC;oDAAA,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC,GAAC,CAAC,CAAE,GAAC,CAAC,GAAC,MAAM,CAAC;oDAAA,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC,GAAC,CAAC,CAAE,GAAC,CAAC,GAAC,MAAM,CAAC;gDACjH,CAAC;wCACH,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBACD,KAAI,IAAI,EAAE,GAAC,CAAC,EAAC,KAAK,GAAC,CAAC,EAAC,EAAE,GAAC,IAAI,CAAC,WAAW,EAAC,EAAE,IAAE,CAAC,EAAC,KAAK,EAAE,EAAC,CAAC;4BACtD,MAAM,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,WAAW,GAAC,EAAE,CAAC,EAAC,IAAI,GAAC,KAAK,GAAC,GAAG,EAAC,OAAO,GAAU,EAAE,CAAC;4BAC/E,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;oCAAC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;wCAC3D,MAAM,KAAK,GAAC,IAAI,CAAC,IAAI,GAAC,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;wCACzE,wGAAwG;wCACxG,OAAO,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,CAAC,CAAC,CAAC,CAAC,CAAC;oCACrF,CAAC;4BACD,KAAK,EAAE,CAAC;4BAAA,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;4BAAA,IAAG,EAAE,MAAM,GAAC,EAAE,KAAG,CAAC,EAAC,CAAC;gCAAA,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCAAA,KAAK,EAAE,CAAC;4BAAA,CAAC;wBACvG,CAAC;oBACH,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,SAAS,EAAC,sBAAsB,EAAC,CAAC;gBAAA,KAAK,GAAC,WAAW,CAAC;YACvZ,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","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 { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit, scaleBudgetCeiling } from \"../core/pixel-limits.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;\n/**\n * Admission limits. `maximumPixels` is the default source limit; a request may raise it with its own\n * `maximumPixels`, up to `ceilingPixels`. A raised limit raises the `maximumEncodedBytes` ceiling in proportion\n * (256 000 000 bytes per 24 000 000 source pixels).\n */\nexport const PRINT_JPEG_LIMITS=Object.freeze({maximumPixels:24_000_000,ceilingPixels:FULL_RESOLUTION_CEILING_PIXELS,maximumDimension:16_384,\n maximumEncodedBytes:256_000_000,maximumProviderReads:1_000_000});\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 /**\n * Optional opt-in source pixel limit for large images: an integer from 1 to `PRINT_JPEG_LIMITS.ceilingPixels`.\n * Default `PRINT_JPEG_LIMITS.maximumPixels` (24 000 000). When given it is recorded in the XMP export plan, like the\n * other admission budgets; the image data are unchanged.\n */\n maximumPixels?: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\",\"maximumPixels\"],\"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 const L=PRINT_JPEG_LIMITS,maximumPixels=resolveRaisedLimit(r.maximumPixels,L.maximumPixels,L.ceilingPixels,\"Print maximumPixels must be an integer from 1 to \"+L.ceilingPixels+\".\");\n const encodedBytesCeiling=r.maximumPixels===undefined?L.maximumEncodedBytes:scaleBudgetCeiling(L.maximumEncodedBytes,maximumPixels);\n if(source.width>L.maximumDimension||source.height>L.maximumDimension||source.width*source.height>maximumPixels||crop.x+crop.width>source.width||crop.y+crop.height>source.height||\n outputWidth>crop.width||outputHeight>crop.height||quantizationStep>255||maximumEncodedBytes>encodedBytesCeiling||maximumProviderReads>L.maximumProviderReads||\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 ...(r.maximumPixels===undefined ? {} : {maximumPixels})});\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 // At 1:1 every output pixel is one source pixel with weight exactly 1, so its sum is exactly lut[code] and its\n // sample is a function of the code alone: the same bytes from a 256-entry table, without the accumulation.\n const identity=scaleX===1&&scaleY===1;\n const direct=identity?Uint8Array.from(lut,(value)=>Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255)))):undefined;\n if(direct)for(let by=0;by<plan.outputHeight;by+=8){\n check();\n const height=Math.min(8,plan.outputHeight-by);await ensureRows(plan.crop.y+by,height);check();\n for(let bx=0;bx<plan.outputWidth;bx+=8){\n const width=Math.min(8,plan.outputWidth-bx),samples:number[]=[];\n for(let y=0;y<8;y++){\n const row=(plan.crop.y+by+Math.min(y,height-1)-cacheTop)*rowBytes+bx*3;\n for(let x=0;x<8;x++){const index=row+Math.min(x,width-1)*3;samples.push(direct[cache[index]!]!,direct[cache[index+1]!]!,direct[cache[index+2]!]!);}\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n else 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
+ {"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, encodeJpegStrip, EXPORT_JPEG_ENCODER_ID, type JpegStripBits } 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 { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit, scaleBudgetCeiling } from \"../core/pixel-limits.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;\n/**\n * Admission limits. `maximumPixels` is the default source limit; a request may raise it with its own\n * `maximumPixels`, up to `ceilingPixels`. A raised limit raises the `maximumEncodedBytes` ceiling in proportion\n * (256 000 000 bytes per 24 000 000 source pixels).\n */\nexport const PRINT_JPEG_LIMITS=Object.freeze({maximumPixels:24_000_000,ceilingPixels:FULL_RESOLUTION_CEILING_PIXELS,maximumDimension:16_384,\n maximumEncodedBytes:256_000_000,maximumProviderReads:1_000_000});\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 /**\n * Optional opt-in source pixel limit for large images: an integer from 1 to `PRINT_JPEG_LIMITS.ceilingPixels`.\n * Default `PRINT_JPEG_LIMITS.maximumPixels` (24 000 000). When given it is recorded in the XMP export plan, like the\n * other admission budgets; the image data are unchanged.\n */\n maximumPixels?: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\",\"maximumPixels\"],\"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 const L=PRINT_JPEG_LIMITS,maximumPixels=resolveRaisedLimit(r.maximumPixels,L.maximumPixels,L.ceilingPixels,\"Print maximumPixels must be an integer from 1 to \"+L.ceilingPixels+\".\");\n const encodedBytesCeiling=r.maximumPixels===undefined?L.maximumEncodedBytes:scaleBudgetCeiling(L.maximumEncodedBytes,maximumPixels);\n if(source.width>L.maximumDimension||source.height>L.maximumDimension||source.width*source.height>maximumPixels||crop.x+crop.width>source.width||crop.y+crop.height>source.height||\n outputWidth>crop.width||outputHeight>crop.height||quantizationStep>255||maximumEncodedBytes>encodedBytesCeiling||maximumProviderReads>L.maximumProviderReads||\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 ...(r.maximumPixels===undefined ? {} : {maximumPixels})});\n}\n/** The JPEG writer of a Print plan: its size, quantization, budget, ICC profile, EXIF, XMP plan record and density. */\nfunction printEncoder(plan:PrintJpegInput):ReturnType<typeof createExportJpegEncoder> {\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 return 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}\n/** At 1:1, the output code of each source code (its decoded value re-encoded and rounded). */\nfunction directCodes():Uint8Array {\n return Uint8Array.from(srgbDecodeTable(),(value)=>Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255))));\n}\n/** Rows of a 1:1 Print JPEG for `createPrintJpegStrip`: crop rows `y` to `y + height` (relative to the crop), crop-wide RGB. */\nexport interface PrintJpegStripInput {y:number;height:number;samples:Uint8Array}\n/** A strip of a 1:1 Print JPEG's coded blocks (`createPrintJpegStrip`), for `composePrintJpegStrips`. */\nexport interface PrintJpegStrip {readonly y:number;readonly height:number;readonly width:number;readonly quantizationStep:number;readonly bits:JpegStripBits}\nfunction requireIdentity(plan:PrintJpegInput):void {\n if(plan.outputWidth!==plan.crop.width||plan.outputHeight!==plan.crop.height)throw new InvalidConfigurationError(\"Print JPEG strips require a 1:1 plan (output size equal to the crop).\");\n}\n/**\n * Codes rows of a 1:1 Print JPEG (output size equal to the crop) apart from the rows before them, so a large file's strips\n * can be written on separate workers. `strip.y` is a multiple of 8 and `strip.height` a multiple of 8 unless the strip ends at\n * the image's bottom; `strip.samples` are those crop rows' 8-bit sRGB RGB, crop-wide. `composePrintJpegStrips` joins strips that\n * cover the image, in order, into the bytes `createPrintJpegTask` writes for the same plan and source pixels.\n */\nexport function createPrintJpegStrip(input:PrintJpegInput,strip:PrintJpegStripInput):PrintJpegStrip {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n const r=requireAllowlistedRecord(strip,[\"y\",\"height\",\"samples\"],\"Invalid Print JPEG strip.\");\n const y=integer(r.y,0),height=integer(r.height),width=plan.outputWidth,samples=r.samples;\n if(y%8!==0||y+height>plan.outputHeight||(height%8!==0&&y+height!==plan.outputHeight))throw new InvalidConfigurationError(\"Print JPEG strips start on a block row and cover whole block rows.\");\n if(!(samples instanceof Uint8Array)||samples.length!==width*height*3)throw new InvalidConfigurationError(\"Print JPEG strip requires the crop rows' RGB samples.\");\n const direct=directCodes(),blocksX=Math.ceil(width/8),rowBytes=width*3;\n // The same block samples as createPrintJpegTask's 1:1 path: each block's edge pixels repeated into a partial block.\n const bits=encodeJpegStrip(plan.quantizationStep,blocksX*Math.ceil(height/8),(index,out)=>{\n const bx=(index%blocksX)*8,by=Math.floor(index/blocksX)*8,bw=Math.min(8,width-bx),bh=Math.min(8,plan.outputHeight-y-by);\n for(let yy=0,o=0;yy<8;yy++){\n const row=(by+Math.min(yy,bh-1))*rowBytes+bx*3;\n for(let x=0;x<8;x++,o+=3){const i=row+Math.min(x,bw-1)*3;out[o]=direct[samples[i]!]!;out[o+1]=direct[samples[i+1]!]!;out[o+2]=direct[samples[i+2]!]!;}\n }\n });\n return Object.freeze({y,height,width,quantizationStep:plan.quantizationStep,bits});\n}\n/**\n * Joins the strips of a 1:1 Print JPEG (`createPrintJpegStrip`), covering the image top to bottom in order, into its file:\n * the same bytes `createPrintJpegTask` writes for the plan and the same source pixels. No source is read, so the output's\n * `providerReads` is 0.\n */\nexport function composePrintJpegStrips(input:PrintJpegInput,strips:readonly PrintJpegStrip[]):PrintJpegOutput {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n if(!Array.isArray(strips)||strips.length<1)throw new InvalidConfigurationError(\"Print JPEG assembly requires strips.\");\n const encoder=printEncoder(plan);\n try{\n let next=0;\n for(const strip of strips){\n if(strip.y!==next||strip.width!==plan.outputWidth||strip.quantizationStep!==plan.quantizationStep)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n encoder.appendStrip(strip.bits);next+=strip.height;\n }\n if(next!==plan.outputHeight)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n const bytes=encoder.finish();\n return {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:0,encoderId:EXPORT_JPEG_ENCODER_ID};\n }catch(error){encoder.dispose();throw error;}\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 encoder=printEncoder(plan);\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 // At 1:1 every output pixel is one source pixel with weight exactly 1, so its sum is exactly lut[code] and its\n // sample is a function of the code alone: the same bytes from a 256-entry table, without the accumulation.\n const identity=scaleX===1&&scaleY===1;\n const direct=identity?directCodes():undefined;\n if(direct)for(let by=0;by<plan.outputHeight;by+=8){\n check();\n const height=Math.min(8,plan.outputHeight-by);await ensureRows(plan.crop.y+by,height);check();\n for(let bx=0;bx<plan.outputWidth;bx+=8){\n const width=Math.min(8,plan.outputWidth-bx),samples:number[]=[];\n for(let y=0;y<8;y++){\n const row=(plan.crop.y+by+Math.min(y,height-1)-cacheTop)*rowBytes+bx*3;\n for(let x=0;x<8;x++){const index=row+Math.min(x,width-1)*3;samples.push(direct[cache[index]!]!,direct[cache[index+1]!]!,direct[cache[index+2]!]!);}\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n else 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"]}
@@ -165,9 +165,14 @@ export function createAhdDemosaicTask(input, provider) {
165
165
  const W = p.width, H = p.height, s = p.samples;
166
166
  const roleAt = (x, y) => tile[(y & 1) * 2 + (x & 1)];
167
167
  const at = (x, y) => s[reflect(y, H) * W + reflect(x, W)];
168
+ // Sites whose neighbourhood lies inside the plane (two sites from the edge for stage 1, one for stages 2, 4
169
+ // and 5) read their neighbours by direct index offsets; reflect() returns its argument there, so they address
170
+ // the same samples as the border path. Every floating-point expression keeps the operands, order and grouping
171
+ // of the border path, so both paths give bit-identical results (test/processing-ahd-exactness.test.ts).
168
172
  // 1. Directional greens.
169
173
  const gh = new Float32Array(n), gv = new Float32Array(n);
170
174
  for (let y = 0; y < H; y++) {
175
+ const interiorRow = y >= 2 && y + 2 < H;
171
176
  for (let x = 0; x < W; x++) {
172
177
  const i = y * W + x, c = s[i];
173
178
  if (roleAt(x, y) === 1) {
@@ -175,28 +180,54 @@ export function createAhdDemosaicTask(input, provider) {
175
180
  gv[i] = c;
176
181
  continue;
177
182
  }
178
- gh[i] = (at(x - 1, y) + at(x + 1, y)) / 2 + (2 * c - at(x - 2, y) - at(x + 2, y)) / 4;
179
- gv[i] = (at(x, y - 1) + at(x, y + 1)) / 2 + (2 * c - at(x, y - 2) - at(x, y + 2)) / 4;
183
+ if (interiorRow && x >= 2 && x + 2 < W) {
184
+ gh[i] = (s[i - 1] + s[i + 1]) / 2 + (2 * c - s[i - 2] - s[i + 2]) / 4;
185
+ gv[i] = (s[i - W] + s[i + W]) / 2 + (2 * c - s[i - 2 * W] - s[i + 2 * W]) / 4;
186
+ }
187
+ else {
188
+ gh[i] = (at(x - 1, y) + at(x + 1, y)) / 2 + (2 * c - at(x - 2, y) - at(x + 2, y)) / 4;
189
+ gv[i] = (at(x, y - 1) + at(x, y + 1)) / 2 + (2 * c - at(x, y - 2) - at(x, y + 2)) / 4;
190
+ }
180
191
  }
181
192
  yield;
182
193
  }
183
194
  // 2. Two full-colour candidates from colour differences.
184
195
  const rgb = [new Float32Array(3 * n), new Float32Array(3 * n)], greens = [gh, gv];
185
196
  for (let y = 0; y < H; y++) {
197
+ const interiorRow = y >= 1 && y + 1 < H;
186
198
  for (let x = 0; x < W; x++) {
187
- const i = y * W + x, own = roleAt(x, y);
199
+ const i = y * W + x, own = roleAt(x, y), interior = interiorRow && x >= 1 && x + 1 < W;
188
200
  for (let d = 0; d < 2; d++) {
189
- const g = greens[d], out = rgb[d];
190
- const diff = (xx, yy) => { const j = reflect(yy, H) * W + reflect(xx, W); return s[j] - g[j]; };
191
- out[3 * i + 1] = g[i];
201
+ const g = greens[d], out = rgb[d], gi = g[i];
202
+ out[3 * i + 1] = gi;
192
203
  if (own === 1) {
193
204
  const hRole = roleAt(x + 1, y), vRole = 2 - hRole;
194
- out[3 * i + hRole] = g[i] + (diff(x - 1, y) + diff(x + 1, y)) / 2;
195
- out[3 * i + vRole] = g[i] + (diff(x, y - 1) + diff(x, y + 1)) / 2;
205
+ if (interior) {
206
+ out[3 * i + hRole] = gi + ((s[i - 1] - g[i - 1]) + (s[i + 1] - g[i + 1])) / 2;
207
+ out[3 * i + vRole] = gi + ((s[i - W] - g[i - W]) + (s[i + W] - g[i + W])) / 2;
208
+ }
209
+ else {
210
+ let j = reflect(y, H) * W + reflect(x - 1, W);
211
+ const a = s[j] - g[j];
212
+ j = reflect(y, H) * W + reflect(x + 1, W);
213
+ const b = s[j] - g[j];
214
+ out[3 * i + hRole] = gi + (a + b) / 2;
215
+ j = reflect(y - 1, H) * W + reflect(x, W);
216
+ const cc = s[j] - g[j];
217
+ j = reflect(y + 1, H) * W + reflect(x, W);
218
+ const dd = s[j] - g[j];
219
+ out[3 * i + vRole] = gi + (cc + dd) / 2;
220
+ }
196
221
  }
197
222
  else {
198
223
  out[3 * i + own] = s[i];
199
- out[3 * i + 2 - own] = g[i] + (diff(x - 1, y - 1) + diff(x + 1, y - 1) + diff(x - 1, y + 1) + diff(x + 1, y + 1)) / 4;
224
+ if (interior) {
225
+ out[3 * i + 2 - own] = gi + ((s[i - W - 1] - g[i - W - 1]) + (s[i - W + 1] - g[i - W + 1]) + (s[i + W - 1] - g[i + W - 1]) + (s[i + W + 1] - g[i + W + 1])) / 4;
226
+ }
227
+ else {
228
+ const ym = reflect(y - 1, H) * W, yp = reflect(y + 1, H) * W, xm = reflect(x - 1, W), xp = reflect(x + 1, W);
229
+ out[3 * i + 2 - own] = gi + ((s[ym + xm] - g[ym + xm]) + (s[ym + xp] - g[ym + xp]) + (s[yp + xm] - g[yp + xm]) + (s[yp + xp] - g[yp + xp])) / 4;
230
+ }
200
231
  }
201
232
  }
202
233
  }
@@ -205,12 +236,14 @@ export function createAhdDemosaicTask(input, provider) {
205
236
  // 3. CIELAB (W3C CSS Color 4 Lab definition; also CIE 15) of both candidates.
206
237
  const lab = [new Float32Array(3 * n), new Float32Array(3 * n)];
207
238
  const f = (t) => t > 216 / 24389 ? Math.cbrt(t) : (24389 / 27 * t + 16) / 116;
239
+ const m00 = m[0][0], m01 = m[0][1], m02 = m[0][2], m10 = m[1][0], m11 = m[1][1], m12 = m[1][2], m20 = m[2][0], m21 = m[2][1], m22 = m[2][2];
240
+ const w0 = white[0], w1 = white[1], w2 = white[2];
208
241
  for (let y = 0; y < H; y++) {
209
242
  for (let i = y * W; i < (y + 1) * W; i++)
210
243
  for (let d = 0; d < 2; d++) {
211
244
  const c = rgb[d], R = c[3 * i], G = c[3 * i + 1], B = c[3 * i + 2];
212
- const fx = f((m[0][0] * R + m[0][1] * G + m[0][2] * B) / white[0]), fy = f((m[1][0] * R + m[1][1] * G + m[1][2] * B) / white[1]);
213
- const fz = f((m[2][0] * R + m[2][1] * G + m[2][2] * B) / white[2]), o = lab[d];
245
+ const fx = f((m00 * R + m01 * G + m02 * B) / w0), fy = f((m10 * R + m11 * G + m12 * B) / w1);
246
+ const fz = f((m20 * R + m21 * G + m22 * B) / w2), o = lab[d];
214
247
  o[3 * i] = 116 * fy - 16;
215
248
  o[3 * i + 1] = 500 * (fx - fy);
216
249
  o[3 * i + 2] = 200 * (fy - fz);
@@ -218,46 +251,90 @@ export function createAhdDemosaicTask(input, provider) {
218
251
  yield;
219
252
  }
220
253
  // 4. Homogeneity maps with adaptive tolerances.
221
- const homo = [new Uint8Array(n), new Uint8Array(n)];
222
- const N4 = [[-1, 0], [1, 0], [0, -1], [0, 1]];
254
+ const homo = [new Uint8Array(n), new Uint8Array(n)], lab0 = lab[0], lab1 = lab[1];
223
255
  for (let y = 0; y < H; y++) {
256
+ const interiorRow = y >= 1 && y + 1 < H;
224
257
  for (let x = 0; x < W; x++) {
225
- const i = y * W + x, dL = [[0, 0, 0, 0], [0, 0, 0, 0]], dC = [[0, 0, 0, 0], [0, 0, 0, 0]];
226
- for (let d = 0; d < 2; d++) {
227
- const o = lab[d];
228
- for (let k = 0; k < 4; k++) {
229
- const j = reflect(y + N4[k][1], H) * W + reflect(x + N4[k][0], W);
230
- dL[d][k] = Math.abs(o[3 * i] - o[3 * j]);
231
- dC[d][k] = (o[3 * i + 1] - o[3 * j + 1]) ** 2 + (o[3 * i + 2] - o[3 * j + 2]) ** 2;
232
- }
258
+ const i = y * W + x;
259
+ let jl, jr, ju, jd;
260
+ if (interiorRow && x >= 1 && x + 1 < W) {
261
+ jl = i - 1;
262
+ jr = i + 1;
263
+ ju = i - W;
264
+ jd = i + W;
233
265
  }
234
- const epsL = Math.min(Math.max(dL[0][0], dL[0][1]), Math.max(dL[1][2], dL[1][3]));
235
- const epsC = Math.min(Math.max(dC[0][0], dC[0][1]), Math.max(dC[1][2], dC[1][3]));
236
- for (let d = 0; d < 2; d++) {
237
- let count = 0;
238
- for (let k = 0; k < 4; k++)
239
- if (dL[d][k] <= epsL && dC[d][k] <= epsC)
240
- count++;
241
- homo[d][i] = count;
266
+ else {
267
+ const row = reflect(y, H) * W, col = reflect(x, W);
268
+ jl = row + reflect(x - 1, W);
269
+ jr = row + reflect(x + 1, W);
270
+ ju = reflect(y - 1, H) * W + col;
271
+ jd = reflect(y + 1, H) * W + col;
242
272
  }
273
+ // Direction 0 (lab0), neighbours left, right, up, down (the N4 order).
274
+ const L0 = lab0[3 * i], a0 = lab0[3 * i + 1], b0 = lab0[3 * i + 2];
275
+ const dL00 = Math.abs(L0 - lab0[3 * jl]), dC00 = (a0 - lab0[3 * jl + 1]) ** 2 + (b0 - lab0[3 * jl + 2]) ** 2;
276
+ const dL01 = Math.abs(L0 - lab0[3 * jr]), dC01 = (a0 - lab0[3 * jr + 1]) ** 2 + (b0 - lab0[3 * jr + 2]) ** 2;
277
+ const dL02 = Math.abs(L0 - lab0[3 * ju]), dC02 = (a0 - lab0[3 * ju + 1]) ** 2 + (b0 - lab0[3 * ju + 2]) ** 2;
278
+ const dL03 = Math.abs(L0 - lab0[3 * jd]), dC03 = (a0 - lab0[3 * jd + 1]) ** 2 + (b0 - lab0[3 * jd + 2]) ** 2;
279
+ const L1 = lab1[3 * i], a1 = lab1[3 * i + 1], b1 = lab1[3 * i + 2];
280
+ const dL10 = Math.abs(L1 - lab1[3 * jl]), dC10 = (a1 - lab1[3 * jl + 1]) ** 2 + (b1 - lab1[3 * jl + 2]) ** 2;
281
+ const dL11 = Math.abs(L1 - lab1[3 * jr]), dC11 = (a1 - lab1[3 * jr + 1]) ** 2 + (b1 - lab1[3 * jr + 2]) ** 2;
282
+ const dL12 = Math.abs(L1 - lab1[3 * ju]), dC12 = (a1 - lab1[3 * ju + 1]) ** 2 + (b1 - lab1[3 * ju + 2]) ** 2;
283
+ const dL13 = Math.abs(L1 - lab1[3 * jd]), dC13 = (a1 - lab1[3 * jd + 1]) ** 2 + (b1 - lab1[3 * jd + 2]) ** 2;
284
+ const epsL = Math.min(Math.max(dL00, dL01), Math.max(dL12, dL13));
285
+ const epsC = Math.min(Math.max(dC00, dC01), Math.max(dC12, dC13));
286
+ let count = 0;
287
+ if (dL00 <= epsL && dC00 <= epsC)
288
+ count++;
289
+ if (dL01 <= epsL && dC01 <= epsC)
290
+ count++;
291
+ if (dL02 <= epsL && dC02 <= epsC)
292
+ count++;
293
+ if (dL03 <= epsL && dC03 <= epsC)
294
+ count++;
295
+ homo[0][i] = count;
296
+ count = 0;
297
+ if (dL10 <= epsL && dC10 <= epsC)
298
+ count++;
299
+ if (dL11 <= epsL && dC11 <= epsC)
300
+ count++;
301
+ if (dL12 <= epsL && dC12 <= epsC)
302
+ count++;
303
+ if (dL13 <= epsL && dC13 <= epsC)
304
+ count++;
305
+ homo[1][i] = count;
243
306
  }
244
307
  yield;
245
308
  }
246
309
  // 5. 3×3 summed homogeneity selects the candidate.
247
- const out = new Float32Array(3 * n), direction = new Uint8Array(n);
310
+ const out = new Float32Array(3 * n), direction = new Uint8Array(n), h0 = homo[0], h1 = homo[1], rgb0 = rgb[0], rgb1 = rgb[1];
248
311
  for (let y = 0; y < H; y++) {
312
+ const interiorRow = y >= 1 && y + 1 < H;
249
313
  for (let x = 0; x < W; x++) {
250
314
  let sh = 0, sv = 0;
251
- for (let dy = -1; dy <= 1; dy++)
252
- for (let dx = -1; dx <= 1; dx++) {
253
- const j = reflect(y + dy, H) * W + reflect(x + dx, W);
254
- sh += homo[0][j];
255
- sv += homo[1][j];
315
+ const i = y * W + x;
316
+ if (interiorRow && x >= 1 && x + 1 < W) {
317
+ for (let dy = -1; dy <= 1; dy++) {
318
+ const row = i + dy * W;
319
+ for (let dx = -1; dx <= 1; dx++) {
320
+ const j = row + dx;
321
+ sh += h0[j];
322
+ sv += h1[j];
323
+ }
256
324
  }
257
- const i = y * W + x, dir = sh > sv ? 0 : sv > sh ? 1 : 2;
325
+ }
326
+ else {
327
+ for (let dy = -1; dy <= 1; dy++)
328
+ for (let dx = -1; dx <= 1; dx++) {
329
+ const j = reflect(y + dy, H) * W + reflect(x + dx, W);
330
+ sh += h0[j];
331
+ sv += h1[j];
332
+ }
333
+ }
334
+ const dir = sh > sv ? 0 : sv > sh ? 1 : 2;
258
335
  direction[i] = dir;
259
336
  for (let c = 0; c < 3; c++) {
260
- const a = rgb[0][3 * i + c], b = rgb[1][3 * i + c];
337
+ const a = rgb0[3 * i + c], b = rgb1[3 * i + c];
261
338
  out[3 * i + c] = dir === 0 ? a : dir === 1 ? b : (a + b) / 2;
262
339
  }
263
340
  }