@photivra/engine 2.22.0 → 2.23.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.
- package/CHANGELOG.md +33 -1
- package/CITATION.cff +1 -1
- package/README.md +6 -6
- package/SECURITY.md +1 -1
- package/dist/color/neighbor-highlight-reconstruction.d.ts +12 -2
- package/dist/color/neighbor-highlight-reconstruction.js +26 -3
- package/dist/color/neighbor-highlight-reconstruction.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/facade/display-view-rendering.d.ts +5 -0
- package/dist/facade/display-view-rendering.js +57 -22
- package/dist/facade/display-view-rendering.js.map +1 -1
- package/dist/facade/fast-methods.js +2 -2
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/gpu/display-view-quality-gpu.js +22 -18
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.js +15 -10
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/wgsl-display-view-coupled-stub.d.ts +6 -1
- package/dist/gpu/wgsl-display-view-coupled-stub.js +9 -1
- package/dist/gpu/wgsl-display-view-coupled-stub.js.map +1 -1
- package/dist/gpu/wgsl-display-view-coupled.d.ts +3 -0
- package/dist/gpu/wgsl-display-view-coupled.js +16 -4
- package/dist/gpu/wgsl-display-view-coupled.js.map +1 -1
- package/dist/gpu/wgsl-display-view-neighbors.d.ts +46 -0
- package/dist/gpu/wgsl-display-view-neighbors.js +114 -0
- package/dist/gpu/wgsl-display-view-neighbors.js.map +1 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +2 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.js +5 -3
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.js +3 -3
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/docs/API_REFERENCE.md +1 -1
- package/docs/USAGE.md +2 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/exports.json +2 -2
- package/docs/api/facade-fast-methods.md +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-view-rendering.js","sourceRoot":"","sources":["../../src/facade/display-view-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * #593 (2.22.0): the display view's rendering steps that couple a pixel's three components: the luminance tone curves\n * (`extended-reinhard-luminance`, `naka-rushton-luminance`), `highlightMode: \"reconstruct\"` and (#601) the hue-preserving\n * gamut handling `desaturate-to-luminance`. The view never draws a pixel's noise; it propagates the mean and covariance of the\n * pixel's camera channels (normal, docs/DISPLAY_VIEW.md) through development, so a coupled step needs the moments of a function\n * of three correlated normals. Two methods, both acting on each pixel's own developed values at use (no lookup tables):\n *\n * - **Tone curves by conditioning on luminance.** With the developed linear sRGB y ~ N(μ, Σ) and the luminance L = wᵀy (w the\n * sRGB Y row), y_k given L is normal with mean μ_k + β_k(L − μ_L), β = Σw/(wᵀΣw), and variance Σ_kk − β_k·(Σw)_k (standard\n * Gaussian conditioning). The rendered component clip(y_k·r(L), 0, 1), r = f(L)/L, then has the closed-form clipped-normal\n * moments for each L, and its expectation is a 1-D integral over L: full, a composite 16-point Gauss–Legendre rule over\n * μ_L ± 8.5σ_L in 4 panels (split at L = 0, where the curves leave a pixel unchanged), the structure of the per-channel Reinhard\n * moments; fast, an 8-point Gauss–Hermite rule in L where the range does not reach L = 0 (else the full rule). The expected\n * slopes (Stein's lemma, for the view's linear noise part) are E[∂out_k/∂y_j] = E[1_in·(δ_kj·r + y_k·r′(L)·w_j)], from the\n * same conditional moments. Derived for this engine from standard Gaussian conditioning; the curves are those of\n * src/output/sdr-rendering.ts (Reinhard et al. 2002; Naka & Rushton 1966).\n * - **Reconstruct and desaturation by a 3-D rule.** The blend of `reconstruct` (src/color/sensor-color-development.ts) depends on\n * the largest camera channel and the clipped channels' largest value, and the desaturation on the largest rendered component:\n * piecewise-smooth functions of all three. Where a pixel's camera channels reach the blend (any channel within 8.5σ of 0.8 of\n * white or above) or, with the desaturation, a rendered component reaches 1, the whole chain (white balance, highlight,\n * matrix, tone curve, desaturation, clip) is integrated over the pixel's normal camera channels with a tensor Gauss–Hermite\n * rule in Cholesky coordinates (nodes and weights from the Jacobi matrix's eigenvalues, Golub & Welsch 1969; NIST DLMF\n * §3.5(v)): full 16 points per axis (4,096 nodes), fast 6 per axis (216). Elsewhere `reconstruct` is the unclipped white\n * balance (exactly linear) and the desaturation leaves the pixel unchanged.\n * The fast rules are the registered fast methods `output.toneCurve/view-luminance-moments` and\n * `output.highlightMode.reconstruct/view-moments` (src/facade/fast-methods.ts); their measured bounds are in docs/DISPLAY_VIEW.md.\n */\n\nimport { portablePow } from \"../core/portable-math.js\";\nimport { CLIP_REACH_SIGMA, GL, bigPhi, phi } from \"./display-view-normal.js\";\nimport { desaturateToLuminance, SDR_LUMINANCE_WEIGHTS, type SdrToneCurve, type SdrToneCurveParameters } from \"../output/sdr-rendering.js\";\nimport { RAW_HIGHLIGHT_RECONSTRUCTION_START } from \"../color/sensor-color-development.js\";\nimport type { DisplayViewSetup } from \"./display-view.js\";\nimport { NEIGHBOR_HIGHLIGHT_MARGIN, NEIGHBOR_HIGHLIGHT_RING, NEIGHBOR_HIGHLIGHT_SOR, NEIGHBOR_HIGHLIGHT_THRESHOLD, rebuildClippedPixel } from \"../color/neighbor-highlight-reconstruction.js\";\n\n/**\n * Internal (exported for tests). The n-point Gauss–Hermite rule of the standard normal: Σ w_i f(x_i) ≈ E[f(Z)], Z ~ N(0, 1).\n * The nodes are the eigenvalues of the Jacobi matrix of the orthonormal Hermite polynomials (zero diagonal, off-diagonal √k),\n * found by Sturm-sequence bisection, and w_i = 1/Σ_k p_k(x_i)² (Golub & Welsch 1969). Only correctly rounded operations, so the\n * rule has the same bits in every JavaScript engine.\n */\nexport function gaussHermite(n: number): { x: Float64Array; w: Float64Array } {\n const x = new Float64Array(n), w = new Float64Array(n), limit = 2 * Math.sqrt(n) + 1;\n /** The number of eigenvalues below λ (Sturm count of the LDLᵀ pivots). */\n const below = (lambda: number): number => {\n let count = 0, q = -lambda;\n for (let k = 1; ; k++) {\n if (q < 0) count++;\n if (k === n) return count;\n q = -lambda - k / (q === 0 ? 1e-300 : q);\n }\n };\n for (let i = 0; i < n; i++) {\n let lo = -limit, hi = limit;\n for (let it = 0; it < 200 && hi - lo > 0; it++) { const mid = (lo + hi) / 2; if (mid === lo || mid === hi) break; if (below(mid) > i) hi = mid; else lo = mid; }\n const z = (lo + hi) / 2;\n let p0 = 1, p1 = z, sum = 1 + (n > 1 ? z * z : 0);\n for (let k = 1; k < n - 1; k++) { const p2 = (z * p1 - Math.sqrt(k) * p0) / Math.sqrt(k + 1); p0 = p1; p1 = p2; sum += p2 * p2; }\n x[i] = z; w[i] = 1 / sum;\n }\n // Symmetric rule: the middle node of an odd rule is 0 exactly, and mirrored nodes share their weight.\n for (let i = 0; i < n >> 1; i++) { const a = (x[n - 1 - i]! - x[i]!) / 2, b = (w[i]! + w[n - 1 - i]!) / 2; x[i] = -a; x[n - 1 - i] = a; w[i] = b; w[n - 1 - i] = b; }\n if (n & 1) x[n >> 1] = 0;\n let total = 0;\n for (let i = 0; i < n; i++) total += w[i]!;\n for (let i = 0; i < n; i++) w[i] = w[i]! / total;\n return { x, w };\n}\n\n/** Points per axis of the 3-D rule (full and fast) and of the fast 1-D luminance rule. */\nexport const DISPLAY_VIEW_CHAIN_POINTS = /* @__PURE__ */ Object.freeze({ full: 16, fast: 6 });\nexport const DISPLAY_VIEW_LUMINANCE_FAST_POINTS = 8;\n\n/** What the view renders: the request's tone curve, highlight mode and gamut handling (#601), and whether the fast rules run. */\nexport interface DisplayViewRenderingChoice {\n toneCurve: SdrToneCurve;\n toneCurveParameters?: SdrToneCurveParameters;\n /** #602: \"reconstruct-neighbors\" rebuilds clipped channels from the ratios around each clipped region (src/color/neighbor-highlight-reconstruction.ts). */\n highlightMode: \"clip\" | \"reconstruct\" | \"reconstruct-neighbors\";\n gamutHandling: \"clip-components\" | \"desaturate-to-luminance\";\n fast: boolean;\n}\n\n/** The coupled steps of one view (see the module notes), or null for a view without them (its arithmetic is unchanged). */\nexport interface DisplayViewCoupledRendering {\n readonly luminanceTone: boolean;\n /** True with either reconstruct mode (the highlight step couples the channels). */\n readonly reconstruct: boolean;\n /** #602: the neighbor reconstruction (its pixels take their region's ratios, `bindView` and `at`). */\n readonly neighbors: boolean;\n /**\n * #602: binds a render's expected (noise-free) camera channels, from which the clipped regions and their ratios are found on\n * demand, and returns the counters of the regions it measured.\n */\n bindView?(setup: DisplayViewSetup): void;\n /** #602: the real pixel (native site coordinates) whose moments `chain` computes next. */\n at?(x: number, y: number): void;\n /** #602: regions measured, and regions whose search stopped at the size cap (their ratios from the part found). */\n readonly neighborRegions: { measured: number; capped: number };\n readonly desaturate: boolean;\n readonly choice: DisplayViewRenderingChoice;\n /** Points per axis of the 3-D rule in use; the luminance rule's Gauss–Hermite nodes and weights (8 points), for the GPU kernels. */\n readonly chainPoints: number;\n readonly chainRule: { x: Float64Array; w: Float64Array };\n readonly luminanceRule: { x: Float64Array; w: Float64Array };\n /** The luminance curve's ratio limit r(0+) (1, 0, 1/(σ·g(Lw)) or ∞). */\n readonly ratioAtZero: number;\n /** Renders one deterministic camera pixel (WB, highlight, matrix, tone, gamut, clip) into out (the AHD correction's pixels). */\n pixel(c0: number, c1: number, c2: number, out: Float64Array): void;\n /**\n * The moments of the rendered pixel for camera channels c ~ N(cm, C) (C row-major 3 × 3), integrated over the whole chain:\n * mean (hm), variance (hv) and the expected slopes ∂out_k/∂c_j (A, row-major 3 × 3). Returns the number of nodes evaluated.\n */\n chain(cm: Float64Array, C: Float64Array, hm: Float64Array, hv: Float64Array, A: Float64Array): number;\n /**\n * Whether the reconstruct blend is within reach of channels c ~ N(cm, C): some channel's mean + 8.5σ above the blend's start.\n * Out of reach the highlight step is the unclipped white balance.\n */\n reconstructInReach(cm: Float64Array, C: Float64Array): boolean;\n /**\n * The luminance tone curve on developed values y ~ N(μ, Σ) (Σ row-major 3 × 3): mean (hm), variance (hv) and the expected\n * slopes J = E[∂out/∂y] (row-major). Returns false when a component reaches 1 within reach and the desaturation is on (the\n * caller then integrates the chain), else true.\n */\n tone(mu: Float64Array, S: Float64Array, hm: Float64Array, hv: Float64Array, J: Float64Array): boolean;\n}\n\n/** #602: a render's noise-free camera channels at a real pixel (native coordinates), and the output raster's native bounds. */\nexport interface NeighborView {\n channels(x: number, y: number, out: Float64Array): void;\n x0: number; y0: number; width: number; height: number;\n}\n/** #602: the most pixels a clipped region's search visits (fast and full); a larger region takes its ratios from the part found. */\nexport const DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT = /* @__PURE__ */ Object.freeze({ fast: 1 << 16, full: 1 << 18 });\n\n/** The tone ratio r(L) = f(L)/L and its derivative of a luminance curve, for L > 0. */\n/** The limit r(0+) of a luminance curve's ratio (where the curves meet the unchanged pixels at L = 0): 1, 0, 1/(σ·g(Lw)) or ∞. */\nfunction ratioAtZero(curve: SdrToneCurve, p: SdrToneCurveParameters | undefined): number {\n if (curve === \"extended-reinhard-luminance\" || !p || !(\"exponent\" in p)) return 1;\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>;\n return q.exponent > 1 ? 0 : q.exponent < 1 ? Infinity : (1 + q.semiSaturation / q.whiteLuminance) / q.semiSaturation;\n}\nfunction luminanceRatio(curve: SdrToneCurve, p: SdrToneCurveParameters | undefined): (l: number, out: Float64Array) => void {\n if (curve === \"extended-reinhard-luminance\" && p && !(\"exponent\" in p)) {\n const inverseWhite2 = 1 / (p.whiteLuminance * p.whiteLuminance);\n // f(L) = L(1 + L/Lw²)/(1 + L): r = (1 + L/Lw²)/(1 + L), r′ = (1/Lw² − 1)/(1 + L)².\n return (l, out) => { const d = 1 + l; out[0] = (1 + l * inverseWhite2) / d; out[1] = (inverseWhite2 - 1) / (d * d); };\n }\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>, n = q.exponent, sigma = q.semiSaturation;\n // g(L) = 1/(1 + u), u = (σ/L)ⁿ; f = g/g(Lw); r = g/(g(Lw)·L), r′ = g·(n·u·g − 1)/(g(Lw)·L²).\n const white = 1 / (1 + portablePow(sigma / q.whiteLuminance, n));\n return (l, out) => { const u = portablePow(sigma / l, n), g = 1 / (1 + u); out[0] = g / (white * l); out[1] = g * (n * u * g - 1) / (white * l * l); };\n}\n\n/**\n * Internal: the coupled rendering of a view, or null when its tone curve is per channel, its highlight mode `clip` and its gamut\n * handling the component clip (the view's own per-component arithmetic then runs, byte for byte as before).\n */\nexport function createDisplayViewCoupledRendering(choice: DisplayViewRenderingChoice, gains: readonly number[], clipLevel: number,\n matrix: readonly (readonly number[])[]): DisplayViewCoupledRendering | null {\n const luminanceTone = choice.toneCurve === \"extended-reinhard-luminance\" || choice.toneCurve === \"naka-rushton-luminance\";\n const neighbors = choice.highlightMode === \"reconstruct-neighbors\", reconstruct = choice.highlightMode === \"reconstruct\" || neighbors, desaturate = choice.gamutHandling === \"desaturate-to-luminance\";\n if (!luminanceTone && !reconstruct && !desaturate) return null;\n const reinhard = choice.toneCurve === \"positive-reinhard-per-channel\", ratio = luminanceTone ? luminanceRatio(choice.toneCurve, choice.toneCurveParameters) : null;\n const ratioZero = ratioAtZero(choice.toneCurve, choice.toneCurveParameters);\n const w0 = SDR_LUMINANCE_WEIGHTS[0]!, w1 = SDR_LUMINANCE_WEIGHTS[1]!, w2 = SDR_LUMINANCE_WEIGHTS[2]!, w = [w0, w1, w2];\n const g = Float64Array.from(gains), L = clipLevel, M = Float64Array.from(matrix.flat()), start = RAW_HIGHLIGHT_RECONSTRUCTION_START;\n const chainRule = gaussHermite(choice.fast ? DISPLAY_VIEW_CHAIN_POINTS.fast : DISPLAY_VIEW_CHAIN_POINTS.full), hermite8 = gaussHermite(DISPLAY_VIEW_LUMINANCE_FAST_POINTS);\n const rr = new Float64Array(2), b = new Float64Array(3), Jb = new Float64Array(9), y = new Float64Array(3), z = new Float64Array(3), Jt = new Float64Array(9), Jz = new Float64Array(9);\n const T = new Float64Array(9), c = new Float64Array(3), out = new Float64Array(3), Jo = new Float64Array(9), chol = new Float64Array(9);\n /** The highlight step b(c) and its slopes Jb = ∂b/∂c (a.e.), as `prepareSensorColorDevelopment` develops. */\n function highlight(c0: number, c1: number, c2: number): void {\n const u0 = c0 * g[0]!, u1 = c1 * g[1]!, u2 = c2 * g[2]!;\n Jb.fill(0);\n if (neighbors) {\n // #602: the pixel's region ratios (its own chromaticity when no region is bound: the rebuild then keeps u).\n if (rho) rebuildClippedPixel(c0, c1, c2, g, rho, b, Jb);\n else { b[0] = u0; b[1] = u1; b[2] = u2; Jb[0] = g[0]!; Jb[4] = g[1]!; Jb[8] = g[2]!; }\n return;\n }\n if (!reconstruct) {\n b[0] = u0 > L ? L : u0; b[1] = u1 > L ? L : u1; b[2] = u2 > L ? L : u2;\n Jb[0] = u0 > L ? 0 : g[0]!; Jb[4] = u1 > L ? 0 : g[1]!; Jb[8] = u2 > L ? 0 : g[2]!;\n return;\n }\n const s = c0 > c1 ? (c0 > c2 ? c0 : c2) : (c1 > c2 ? c1 : c2);\n if (!(s > start)) { b[0] = u0; b[1] = u1; b[2] = u2; Jb[0] = g[0]!; Jb[4] = g[1]!; Jb[8] = g[2]!; return; }\n const sIndex = c0 > c1 ? (c0 > c2 ? 0 : 2) : (c1 > c2 ? 1 : 2);\n const k0 = u0 > L ? L : u0, k1 = u1 > L ? L : u1, k2 = u2 > L ? L : u2, n = k0 > k1 ? (k0 > k2 ? k0 : k2) : (k1 > k2 ? k1 : k2);\n const nIndex = k0 > k1 ? (k0 > k2 ? 0 : 2) : (k1 > k2 ? 1 : 2), nSlope = (nIndex === 0 ? u0 : nIndex === 1 ? u1 : u2) > L ? 0 : g[nIndex]!;\n const t = s >= 1 ? 1 : (s - start) / (1 - start), tSlope = s >= 1 ? 0 : 1 / (1 - start);\n b[0] = (1 - t) * u0 + t * n; b[1] = (1 - t) * u1 + t * n; b[2] = (1 - t) * u2 + t * n;\n for (let k = 0; k < 3; k++) {\n const uk = k === 0 ? u0 : k === 1 ? u1 : u2;\n Jb[k * 4] = (1 - t) * g[k]!;\n Jb[k * 3 + nIndex] = Jb[k * 3 + nIndex]! + t * nSlope;\n Jb[k * 3 + sIndex] = Jb[k * 3 + sIndex]! + (n - uk) * tSlope;\n }\n }\n /** Tone, gamut and clip of developed y into out, with the slopes Jo = ∂out/∂y (a.e.). */\n function render(): void {\n Jt.fill(0);\n if (ratio) {\n const l = w0 * y[0]! + w1 * y[1]! + w2 * y[2]!;\n if (l > 0) {\n ratio(l, rr);\n const r = rr[0]!, rp = rr[1]!;\n for (let k = 0; k < 3; k++) { z[k] = y[k]! * r; for (let j = 0; j < 3; j++) Jt[k * 3 + j] = (k === j ? r : 0) + y[k]! * rp * w[j]!; }\n } else for (let k = 0; k < 3; k++) { z[k] = y[k]!; Jt[k * 4] = 1; }\n } else for (let k = 0; k < 3; k++) {\n const v = y[k]!;\n if (reinhard && v > 0) { z[k] = v / (1 + v); Jt[k * 4] = 1 / ((1 + v) * (1 + v)); } else { z[k] = v; Jt[k * 4] = 1; }\n }\n // #601: toward the luminance until the largest component is 1 (src/output/sdr-rendering.ts, desaturateToLuminance).\n const top = z[0]! > z[1]! ? (z[0]! > z[2]! ? 0 : 2) : (z[1]! > z[2]! ? 1 : 2), zt = z[top]!;\n if (desaturate && zt > 1) {\n const lp = w0 * z[0]! + w1 * z[1]! + w2 * z[2]!;\n if (lp >= 1) { out.fill(1); Jo.fill(0); return; }\n const d = zt - lp, a = (1 - lp) / d;\n // ∂a/∂z_j = (−w_j·d − (1 − lp)·(δ_tj − w_j))/d².\n for (let j = 0; j < 9; j++) Jz[j] = 0;\n for (let k = 0; k < 3; k++) for (let j = 0; j < 3; j++) {\n const da = (-w[j]! * d - (1 - lp) * ((j === top ? 1 : 0) - w[j]!)) / (d * d);\n Jz[k * 3 + j] = w[j]! * (1 - a) + (k === j ? a : 0) + (z[k]! - lp) * da;\n }\n desaturateToLuminance(z);\n } else { Jz.fill(0); Jz[0] = 1; Jz[4] = 1; Jz[8] = 1; }\n // Jo = diag(inside)·Jz·Jt.\n for (let k = 0; k < 3; k++) {\n const v = z[k]!, inside = v > 0 && v < 1;\n out[k] = v < 0 ? 0 : v > 1 ? 1 : v;\n for (let j = 0; j < 3; j++) Jo[k * 3 + j] = inside ? Jz[k * 3]! * Jt[j]! + Jz[k * 3 + 1]! * Jt[3 + j]! + Jz[k * 3 + 2]! * Jt[6 + j]! : 0;\n }\n }\n function develop(c0: number, c1: number, c2: number): void {\n highlight(c0, c1, c2);\n for (let k = 0; k < 3; k++) y[k] = M[k * 3]! * b[0]! + M[k * 3 + 1]! * b[1]! + M[k * 3 + 2]! * b[2]!;\n render();\n }\n function pixel(c0: number, c1: number, c2: number, result: Float64Array): void {\n develop(c0, c1, c2);\n result[0] = out[0]!; result[1] = out[1]!; result[2] = out[2]!;\n }\n function chain(cm: Float64Array, C: Float64Array, hm: Float64Array, hv: Float64Array, A: Float64Array): number {\n // Cholesky factor of C (positive semidefinite; tiny negative pivots are treated as 0).\n chol.fill(0);\n const l00 = Math.sqrt(Math.max(0, C[0]!)), l10 = l00 > 0 ? C[3]! / l00 : 0, l20 = l00 > 0 ? C[6]! / l00 : 0;\n const l11 = Math.sqrt(Math.max(0, C[4]! - l10 * l10)), l21 = l11 > 0 ? (C[7]! - l20 * l10) / l11 : 0, l22 = Math.sqrt(Math.max(0, C[8]! - l20 * l20 - l21 * l21));\n const rule = l00 > 0 || l11 > 0 || l22 > 0 ? chainRule : { x: Float64Array.of(0), w: Float64Array.of(1) }, n = rule.x.length;\n let e0 = 0, e1 = 0, e2 = 0, q0 = 0, q1 = 0, q2 = 0;\n T.fill(0);\n for (let i = 0; i < n; i++) {\n const x0 = rule.x[i]!, wi = rule.w[i]!;\n for (let j = 0; j < (l11 > 0 || l21 !== 0 || l22 > 0 ? n : 1); j++) {\n const x1 = l11 > 0 || l21 !== 0 || l22 > 0 ? rule.x[j]! : 0, wj = l11 > 0 || l21 !== 0 || l22 > 0 ? wi * rule.w[j]! : wi;\n for (let k = 0; k < (l22 > 0 ? n : 1); k++) {\n const x2 = l22 > 0 ? rule.x[k]! : 0, weight = l22 > 0 ? wj * rule.w[k]! : wj;\n c[0] = cm[0]! + l00 * x0; c[1] = cm[1]! + l10 * x0 + l11 * x1; c[2] = cm[2]! + l20 * x0 + l21 * x1 + l22 * x2;\n develop(c[0], c[1], c[2]);\n e0 += weight * out[0]!; e1 += weight * out[1]!; e2 += weight * out[2]!;\n q0 += weight * out[0]! * out[0]!; q1 += weight * out[1]! * out[1]!; q2 += weight * out[2]! * out[2]!;\n // ∂out/∂c = Jo·M·Jb.\n for (let r = 0; r < 3; r++) for (let s = 0; s < 3; s++) {\n const ms = M[r * 3]! * Jb[s]! + M[r * 3 + 1]! * Jb[3 + s]! + M[r * 3 + 2]! * Jb[6 + s]!;\n for (let o = 0; o < 3; o++) T[o * 3 + s] = T[o * 3 + s]! + weight * Jo[o * 3 + r]! * ms;\n }\n }\n }\n }\n hm[0] = e0; hm[1] = e1; hm[2] = e2;\n hv[0] = Math.max(0, q0 - e0 * e0); hv[1] = Math.max(0, q1 - e1 * e1); hv[2] = Math.max(0, q2 - e2 * e2);\n A.set(T);\n return n ** ((l00 > 0 ? 1 : 0) + (l11 > 0 || l21 !== 0 || l22 > 0 ? 1 : 0) + (l22 > 0 ? 1 : 0));\n }\n function reconstructInReach(cm: Float64Array, C: Float64Array): boolean {\n const threshold = neighbors ? NEIGHBOR_HIGHLIGHT_THRESHOLD : start;\n for (let k = 0; k < 3; k++) if (!(cm[k]! + CLIP_REACH_SIGMA * Math.sqrt(Math.max(0, C[k * 4]!)) < threshold)) return true;\n return false;\n }\n // #602: the region ratios of the bound view, found on demand (noise-free channels; see the module notes of the capture's method).\n let rho: Float64Array | null = null, view: NeighborView | null = null;\n const ratioOf = new Map<number, Float64Array>(), channelMemo = new Map<number, Float64Array>(), neighborRegions = { measured: 0, capped: 0 };\n const H = NEIGHBOR_HIGHLIGHT_THRESHOLD, limit = choice.fast ? DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT.fast : DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT.full;\n function channelsAt(x: number, y: number): Float64Array {\n const key = y * 1048576 + x;\n let v = channelMemo.get(key);\n if (!v) { v = new Float64Array(3); view!.channels(x, y, v); channelMemo.set(key, v); }\n return v;\n }\n const inside = (x: number, y: number): boolean => x >= view!.x0 && y >= view!.y0 && x < view!.x0 + view!.width && y < view!.y0 + view!.height;\n const isClipped = (v: Float64Array): boolean => v[0]! >= H || v[1]! >= H || v[2]! >= H;\n // A pixel within the margin of a clipped one gives no ratios (the capture's widened regions).\n const unknownMemo = new Map<number, boolean>(), D = NEIGHBOR_HIGHLIGHT_MARGIN;\n function isUnknown(x: number, y: number): boolean {\n const key = y * 1048576 + x;\n let v = unknownMemo.get(key);\n if (v === undefined) {\n v = false;\n for (let qy = y - D; qy <= y + D && !v; qy++) for (let qx = x - D; qx <= x + D && !v; qx++) if (inside(qx, qy) && isClipped(channelsAt(qx, qy))) v = true;\n unknownMemo.set(key, v);\n }\n return v;\n }\n function ownRatio(v: Float64Array, out: Float64Array): void {\n const u0 = v[0]! * g[0]!, u1 = v[1]! * g[1]!, u2 = v[2]! * g[2]!, sum = u0 + u1 + u2;\n if (sum > 0) { out[0] = u0 / sum; out[1] = u1 / sum; out[2] = u2 / sum; } else out.fill(1 / 3);\n }\n function regionRatio(x: number, y: number): Float64Array {\n const key = y * 1048576 + x, known = ratioOf.get(key);\n if (known) return known;\n // The region (8-connected), breadth first, up to the cap.\n const members: number[] = [key], index = new Map<number, number>([[key, 0]]);\n let capped = false;\n for (let head = 0; head < members.length; head++) {\n const p = members[head]!, px = p % 1048576, py = (p - px) / 1048576;\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n const qx = px + dx, qy = py + dy, q = qy * 1048576 + qx;\n if (!inside(qx, qy) || index.has(q) || !isUnknown(qx, qy)) continue;\n if (members.length >= limit) { capped = true; continue; }\n index.set(q, members.length); members.push(q);\n }\n }\n neighborRegions.measured++;\n if (capped) neighborRegions.capped++;\n // Fast: the ring's mean ratios (unclipped pixels within the ring width, each once).\n const R = NEIGHBOR_HIGHLIGHT_RING, seen = new Set<number>(), r = new Float64Array(3), mean = new Float64Array(3);\n let count = 0;\n for (const p of members) {\n const px = p % 1048576, py = (p - px) / 1048576;\n for (let qy = py - R; qy <= py + R; qy++) for (let qx = px - R; qx <= px + R; qx++) {\n const q = qy * 1048576 + qx;\n if (!inside(qx, qy) || seen.has(q) || index.has(q) || isUnknown(qx, qy)) continue;\n const v = channelsAt(qx, qy);\n seen.add(q); ownRatio(v, r); mean[0] = mean[0]! + r[0]!; mean[1] = mean[1]! + r[1]!; mean[2] = mean[2]! + r[2]!; count++;\n }\n }\n if (count > 0) { mean[0] = mean[0]! / count; mean[1] = mean[1]! / count; mean[2] = mean[2]! / count; } else mean.fill(1 / 3);\n const values = new Float64Array(3 * members.length);\n for (let i = 0; i < members.length; i++) values.set(mean, 3 * i);\n if (!choice.fast && count > 0) {\n // Full: successive over-relaxation of the discrete Laplace equation, Dirichlet values from the unclipped 4-neighbors.\n const { omega, tolerance, maximumIterations } = NEIGHBOR_HIGHLIGHT_SOR, boundary = new Map<number, Float64Array>();\n let change = Infinity;\n for (let sweep = 0; sweep < maximumIterations && change > tolerance; sweep++) {\n change = 0;\n for (let i = 0; i < members.length; i++) {\n const p = members[i]!, px = p % 1048576, py = (p - px) / 1048576;\n let a0 = 0, a1 = 0, a2 = 0, m = 0;\n for (let d = 0; d < 4; d++) {\n const qx = px + (d === 0 ? -1 : d === 1 ? 1 : 0), qy = py + (d === 2 ? -1 : d === 3 ? 1 : 0), q = qy * 1048576 + qx;\n if (!inside(qx, qy)) continue;\n const j = index.get(q);\n let src: Float64Array;\n if (j !== undefined) src = values.subarray(3 * j, 3 * j + 3);\n else {\n let bnd = boundary.get(q);\n if (!bnd) { bnd = new Float64Array(3); if (isUnknown(qx, qy)) bnd.set(mean); else ownRatio(channelsAt(qx, qy), bnd); boundary.set(q, bnd); }\n src = bnd;\n }\n a0 += src[0]!; a1 += src[1]!; a2 += src[2]!; m++;\n }\n if (m === 0) continue;\n for (let k = 0; k < 3; k++) {\n const old = values[3 * i + k]!, next = old + omega * ((k === 0 ? a0 : k === 1 ? a1 : a2) / m - old);\n values[3 * i + k] = next;\n if (Math.abs(next - old) > change) change = Math.abs(next - old);\n }\n }\n }\n }\n for (let i = 0; i < members.length; i++) ratioOf.set(members[i]!, values.subarray(3 * i, 3 * i + 3));\n return ratioOf.get(key)!;\n }\n const own = new Float64Array(3);\n function at(x: number, y: number): void {\n if (!view || !inside(x, y)) { rho = null; return; }\n if (isUnknown(x, y)) rho = regionRatio(x, y);\n else { ownRatio(channelsAt(x, y), own); rho = own; }\n }\n function bindView(setup: DisplayViewSetup): void {\n // The noise-free mosaic (expected normalized site values clipped at white, read reflect-101 at the raster's edges) through the\n // bilinear kernels: the expected camera channels of each real pixel (the capture's own demosaic for AHD captures is approximated).\n const W = setup.nativeWidth, Hh = setup.nativeHeight, k = setup.readout.map((r) => r.perElectron), dark = setup.readout.map((r) => r.darkElectrons);\n const site = (x: number, y: number): number => {\n const sx = x < 0 ? -x : x >= W ? 2 * W - 2 - x : x, sy = y < 0 ? -y : y >= Hh ? 2 * Hh - 2 - y : y;\n const ch = (sy & 1) === 0 ? ((sx & 1) === 0 ? 0 : 1) : ((sx & 1) === 0 ? 1 : 2), v = k[ch]! * (setup.signal.site(sx, sy) + dark[ch]!);\n return v < 1 ? v : 1;\n };\n view = { x0: setup.margin, y0: setup.margin, width: setup.frameWidth, height: setup.frameHeight, channels(x: number, y: number, out: Float64Array): void {\n const taps = setup.demosaic[(y & 1) * 2 + (x & 1)]!;\n for (let c = 0; c < 3; c++) { let sum = 0; for (const t of taps[c]!) sum += t.weight * site(x + t.dx, y + t.dy); out[c] = sum; }\n } };\n ratioOf.clear(); channelMemo.clear(); unknownMemo.clear(); neighborRegions.measured = 0; neighborRegions.capped = 0;\n }\n const m1 = new Float64Array(3), m2 = new Float64Array(3), sw = new Float64Array(3), beta = new Float64Array(3), cv = new Float64Array(3);\n /**\n * The clipped-normal terms of Z ~ N(m, v) on [0, 1]: P(0 < Z < 1), E[Z·1(0 < Z < 1)], E[Z²·1(0 < Z < 1)] and P(Z ≥ 1), into\n * rr-like slots (q). Closed form, as `unitClip` without its skewness term.\n */\n const q = new Float64Array(4);\n function clipped(m: number, v: number): void {\n if (!(v > 0)) { const inside = m > 0 && m < 1; q[0] = inside ? 1 : 0; q[1] = inside ? m : 0; q[2] = inside ? m * m : 0; q[3] = m >= 1 ? 1 : 0; return; }\n const s = Math.sqrt(v), a = -m / s, bb = (1 - m) / s;\n const Pa = a < -CLIP_REACH_SIGMA ? 0 : a > CLIP_REACH_SIGMA ? 1 : bigPhi(a), Pb = bb > CLIP_REACH_SIGMA ? 1 : bb < -CLIP_REACH_SIGMA ? 0 : bigPhi(bb);\n const da = a < -CLIP_REACH_SIGMA || a > CLIP_REACH_SIGMA ? 0 : phi(a), db = bb > CLIP_REACH_SIGMA || bb < -CLIP_REACH_SIGMA ? 0 : phi(bb);\n const inside = Pb - Pa;\n q[0] = inside; q[1] = m * inside + s * (da - db); q[2] = (m * m + v) * inside + 2 * m * s * (da - db) + v * (a * da - bb * db); q[3] = 1 - Pb;\n }\n function tone(mu: Float64Array, S: Float64Array, hm: Float64Array, hv: Float64Array, J: Float64Array): boolean {\n const muL = w0 * mu[0]! + w1 * mu[1]! + w2 * mu[2]!;\n for (let k = 0; k < 3; k++) sw[k] = S[k * 3]! * w0 + S[k * 3 + 1]! * w1 + S[k * 3 + 2]! * w2;\n const vL = w0 * sw[0]! + w1 * sw[1]! + w2 * sw[2]!, sL = vL > 0 ? Math.sqrt(vL) : 0;\n for (let k = 0; k < 3; k++) { beta[k] = sL > 0 ? sw[k]! / vL : 0; cv[k] = Math.max(0, S[k * 4]! - (sL > 0 ? beta[k]! * sw[k]! : 0)); }\n m1.fill(0); m2.fill(0); J.fill(0);\n let reachesTop = false;\n const node = (l: number, weight: number): void => {\n let r = 1, rp = 0;\n if (l > 0) { ratio!(l, rr); r = rr[0]!; rp = rr[1]!; }\n for (let k = 0; k < 3; k++) {\n const m = mu[k]! + beta[k]! * (l - muL);\n clipped(r * m, r * r * cv[k]!);\n m1[k] = m1[k]! + weight * (q[1]! + q[3]!);\n m2[k] = m2[k]! + weight * (q[2]! + q[3]!);\n if (q[3]! > 0) reachesTop = true;\n // E[∂out_k/∂y_j | L] = δ_kj·r·P_in + r′·w_j·E[y_k·1_in] (E[y_k·1_in] = E[Z·1_in]/r).\n for (let j = 0; j < 3; j++) J[k * 3 + j] = J[k * 3 + j]! + weight * ((k === j ? r * q[0]! : 0) + (rp === 0 ? 0 : rp * w[j]! * q[1]! / r));\n }\n };\n if (!(sL > 0)) node(muL, 1);\n else {\n const lo = muL - CLIP_REACH_SIGMA * sL, hi = muL + CLIP_REACH_SIGMA * sL;\n if (choice.fast && (muL > 2 * CLIP_REACH_SIGMA * sL || hi < 0)) for (let i = 0; i < hermite8.x.length; i++) node(muL + sL * hermite8.x[i]!, hermite8.w[i]!);\n else {\n // Composite 16-point Gauss–Legendre in 4 panels over [lo, hi], split at L = 0 where the curves leave the pixel unchanged; in\n // standardized units z = (L − μ_L)/σ_L, so a node's density is formed without the cancellation L − μ_L.\n const pieces = lo < 0 && hi > 0 ? [-CLIP_REACH_SIGMA, -muL / sL, CLIP_REACH_SIGMA] : [-CLIP_REACH_SIGMA, CLIP_REACH_SIGMA];\n for (let piece = 0; piece + 1 < pieces.length; piece++) {\n const a = pieces[piece]!, width = (pieces[piece + 1]! - a) / 4, half = width / 2;\n for (let p = 0; p < 4; p++) {\n const centre = a + (p + 0.5) * width;\n for (let k = 0; k < 16; k++) { const z = centre + half * GL.x[k]!; node(muL + sL * z, half * GL.w[k]! * phi(z)); }\n }\n }\n }\n }\n // Where the luminance's range holds L = 0 and the ratio jumps there (r(0+) ≠ 1), the rendered value jumps across the plane\n // wᵀy = 0, and the expected slopes gain p_L(0)·E[out(0+) − out(0−) | L = 0]·w_j (the jump's term of Stein's lemma).\n if (sL > 0 && ratioZero !== 1 && Math.abs(muL) < CLIP_REACH_SIGMA * sL) {\n const density = phi(muL / sL) / sL;\n for (let k = 0; k < 3; k++) {\n const m = mu[k]! - beta[k]! * muL, v = cv[k]!;\n clipped(m, v);\n const below = q[1]! + q[3]!;\n let above: number;\n if (ratioZero === Infinity) above = v > 0 ? bigPhi(m / Math.sqrt(v)) : m > 0 ? 1 : 0;\n else { clipped(ratioZero * m, ratioZero * ratioZero * v); above = q[1]! + q[3]!; }\n for (let j = 0; j < 3; j++) J[k * 3 + j] = J[k * 3 + j]! + density * (above - below) * w[j]!;\n }\n }\n for (let k = 0; k < 3; k++) { hm[k] = m1[k]!; hv[k] = Math.max(0, m2[k]! - m1[k]! * m1[k]!); }\n return !(desaturate && reachesTop);\n }\n return { luminanceTone, reconstruct, neighbors, ...(neighbors ? { bindView, at } : {}), neighborRegions, desaturate, choice, chainPoints: chainRule.x.length, chainRule, luminanceRule: hermite8, ratioAtZero: ratioZero, pixel, chain, reconstructInReach, tone };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"display-view-rendering.js","sourceRoot":"","sources":["../../src/facade/display-view-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * #593 (2.22.0): the display view's rendering steps that couple a pixel's three components: the luminance tone curves\n * (`extended-reinhard-luminance`, `naka-rushton-luminance`), `highlightMode: \"reconstruct\"` and (#601) the hue-preserving\n * gamut handling `desaturate-to-luminance`. The view never draws a pixel's noise; it propagates the mean and covariance of the\n * pixel's camera channels (normal, docs/DISPLAY_VIEW.md) through development, so a coupled step needs the moments of a function\n * of three correlated normals. Two methods, both acting on each pixel's own developed values at use (no lookup tables):\n *\n * - **Tone curves by conditioning on luminance.** With the developed linear sRGB y ~ N(μ, Σ) and the luminance L = wᵀy (w the\n * sRGB Y row), y_k given L is normal with mean μ_k + β_k(L − μ_L), β = Σw/(wᵀΣw), and variance Σ_kk − β_k·(Σw)_k (standard\n * Gaussian conditioning). The rendered component clip(y_k·r(L), 0, 1), r = f(L)/L, then has the closed-form clipped-normal\n * moments for each L, and its expectation is a 1-D integral over L: full, a composite 16-point Gauss–Legendre rule over\n * μ_L ± 8.5σ_L in 4 panels (split at L = 0, where the curves leave a pixel unchanged), the structure of the per-channel Reinhard\n * moments; fast, an 8-point Gauss–Hermite rule in L where the range does not reach L = 0 (else the full rule). The expected\n * slopes (Stein's lemma, for the view's linear noise part) are E[∂out_k/∂y_j] = E[1_in·(δ_kj·r + y_k·r′(L)·w_j)], from the\n * same conditional moments. Derived for this engine from standard Gaussian conditioning; the curves are those of\n * src/output/sdr-rendering.ts (Reinhard et al. 2002; Naka & Rushton 1966).\n * - **Reconstruct and desaturation by a 3-D rule.** The blend of `reconstruct` (src/color/sensor-color-development.ts) depends on\n * the largest camera channel and the clipped channels' largest value, and the desaturation on the largest rendered component:\n * piecewise-smooth functions of all three. Where a pixel's camera channels reach the blend (any channel within 8.5σ of 0.8 of\n * white or above) or, with the desaturation, a rendered component reaches 1, the whole chain (white balance, highlight,\n * matrix, tone curve, desaturation, clip) is integrated over the pixel's normal camera channels with a tensor Gauss–Hermite\n * rule in Cholesky coordinates (nodes and weights from the Jacobi matrix's eigenvalues, Golub & Welsch 1969; NIST DLMF\n * §3.5(v)): full 16 points per axis (4,096 nodes), fast 6 per axis (216). Elsewhere `reconstruct` is the unclipped white\n * balance (exactly linear) and the desaturation leaves the pixel unchanged.\n * The fast rules are the registered fast methods `output.toneCurve/view-luminance-moments` and\n * `output.highlightMode.reconstruct/view-moments` (src/facade/fast-methods.ts); their measured bounds are in docs/DISPLAY_VIEW.md.\n */\n\nimport { portablePow } from \"../core/portable-math.js\";\nimport { CLIP_REACH_SIGMA, GL, bigPhi, phi } from \"./display-view-normal.js\";\nimport { desaturateToLuminance, SDR_LUMINANCE_WEIGHTS, type SdrToneCurve, type SdrToneCurveParameters } from \"../output/sdr-rendering.js\";\nimport { RAW_HIGHLIGHT_RECONSTRUCTION_START } from \"../color/sensor-color-development.js\";\nimport type { DisplayViewSetup } from \"./display-view.js\";\nimport { NEIGHBOR_HIGHLIGHT_MARGIN, NEIGHBOR_HIGHLIGHT_RING, NEIGHBOR_HIGHLIGHT_SOR, NEIGHBOR_HIGHLIGHT_THRESHOLD, neighborHighlightOmega, rebuildClippedPixel } from \"../color/neighbor-highlight-reconstruction.js\";\n\n/**\n * Internal (exported for tests). The n-point Gauss–Hermite rule of the standard normal: Σ w_i f(x_i) ≈ E[f(Z)], Z ~ N(0, 1).\n * The nodes are the eigenvalues of the Jacobi matrix of the orthonormal Hermite polynomials (zero diagonal, off-diagonal √k),\n * found by Sturm-sequence bisection, and w_i = 1/Σ_k p_k(x_i)² (Golub & Welsch 1969). Only correctly rounded operations, so the\n * rule has the same bits in every JavaScript engine.\n */\nexport function gaussHermite(n: number): { x: Float64Array; w: Float64Array } {\n const x = new Float64Array(n), w = new Float64Array(n), limit = 2 * Math.sqrt(n) + 1;\n /** The number of eigenvalues below λ (Sturm count of the LDLᵀ pivots). */\n const below = (lambda: number): number => {\n let count = 0, q = -lambda;\n for (let k = 1; ; k++) {\n if (q < 0) count++;\n if (k === n) return count;\n q = -lambda - k / (q === 0 ? 1e-300 : q);\n }\n };\n for (let i = 0; i < n; i++) {\n let lo = -limit, hi = limit;\n for (let it = 0; it < 200 && hi - lo > 0; it++) { const mid = (lo + hi) / 2; if (mid === lo || mid === hi) break; if (below(mid) > i) hi = mid; else lo = mid; }\n const z = (lo + hi) / 2;\n let p0 = 1, p1 = z, sum = 1 + (n > 1 ? z * z : 0);\n for (let k = 1; k < n - 1; k++) { const p2 = (z * p1 - Math.sqrt(k) * p0) / Math.sqrt(k + 1); p0 = p1; p1 = p2; sum += p2 * p2; }\n x[i] = z; w[i] = 1 / sum;\n }\n // Symmetric rule: the middle node of an odd rule is 0 exactly, and mirrored nodes share their weight.\n for (let i = 0; i < n >> 1; i++) { const a = (x[n - 1 - i]! - x[i]!) / 2, b = (w[i]! + w[n - 1 - i]!) / 2; x[i] = -a; x[n - 1 - i] = a; w[i] = b; w[n - 1 - i] = b; }\n if (n & 1) x[n >> 1] = 0;\n let total = 0;\n for (let i = 0; i < n; i++) total += w[i]!;\n for (let i = 0; i < n; i++) w[i] = w[i]! / total;\n return { x, w };\n}\n\n/** Points per axis of the 3-D rule (full and fast) and of the fast 1-D luminance rule. */\nexport const DISPLAY_VIEW_CHAIN_POINTS = /* @__PURE__ */ Object.freeze({ full: 16, fast: 6 });\nexport const DISPLAY_VIEW_LUMINANCE_FAST_POINTS = 8;\n\n/** What the view renders: the request's tone curve, highlight mode and gamut handling (#601), and whether the fast rules run. */\nexport interface DisplayViewRenderingChoice {\n toneCurve: SdrToneCurve;\n toneCurveParameters?: SdrToneCurveParameters;\n /** #602: \"reconstruct-neighbors\" rebuilds clipped channels from the ratios around each clipped region (src/color/neighbor-highlight-reconstruction.ts). */\n highlightMode: \"clip\" | \"reconstruct\" | \"reconstruct-neighbors\";\n gamutHandling: \"clip-components\" | \"desaturate-to-luminance\";\n fast: boolean;\n}\n\n/** The coupled steps of one view (see the module notes), or null for a view without them (its arithmetic is unchanged). */\nexport interface DisplayViewCoupledRendering {\n readonly luminanceTone: boolean;\n /** True with either reconstruct mode (the highlight step couples the channels). */\n readonly reconstruct: boolean;\n /** #602: the neighbor reconstruction (its pixels take their region's ratios, `bindView` and `at`). */\n readonly neighbors: boolean;\n /**\n * #602: binds a render's expected (noise-free) camera channels, from which the clipped regions and their ratios are found on\n * demand, and returns the counters of the regions it measured.\n */\n bindView?(setup: DisplayViewSetup): void;\n /** #602: the real pixel (native site coordinates) whose moments `chain` computes next. */\n at?(x: number, y: number): void;\n /**\n * #605: the ratios ρ that `chain` uses at real pixel (x, y) (as `at` selects them) into out, or −1 in out[0] where the pixel\n * takes none (the highlight step then keeps u): the GPU kernels read them from the host.\n */\n ratioAt?(x: number, y: number, out: Float64Array): void;\n /** #602: regions measured, and regions whose search stopped at the size cap (their ratios from the part found). */\n readonly neighborRegions: { measured: number; capped: number };\n readonly desaturate: boolean;\n readonly choice: DisplayViewRenderingChoice;\n /** Points per axis of the 3-D rule in use; the luminance rule's Gauss–Hermite nodes and weights (8 points), for the GPU kernels. */\n readonly chainPoints: number;\n readonly chainRule: { x: Float64Array; w: Float64Array };\n readonly luminanceRule: { x: Float64Array; w: Float64Array };\n /** The luminance curve's ratio limit r(0+) (1, 0, 1/(σ·g(Lw)) or ∞). */\n readonly ratioAtZero: number;\n /** Renders one deterministic camera pixel (WB, highlight, matrix, tone, gamut, clip) into out (the AHD correction's pixels). */\n pixel(c0: number, c1: number, c2: number, out: Float64Array): void;\n /**\n * The moments of the rendered pixel for camera channels c ~ N(cm, C) (C row-major 3 × 3), integrated over the whole chain:\n * mean (hm), variance (hv) and the expected slopes ∂out_k/∂c_j (A, row-major 3 × 3). Returns the number of nodes evaluated.\n */\n chain(cm: Float64Array, C: Float64Array, hm: Float64Array, hv: Float64Array, A: Float64Array): number;\n /**\n * Whether the reconstruct blend is within reach of channels c ~ N(cm, C): some channel's mean + 8.5σ above the blend's start.\n * Out of reach the highlight step is the unclipped white balance.\n */\n reconstructInReach(cm: Float64Array, C: Float64Array): boolean;\n /**\n * The luminance tone curve on developed values y ~ N(μ, Σ) (Σ row-major 3 × 3): mean (hm), variance (hv) and the expected\n * slopes J = E[∂out/∂y] (row-major). Returns false when a component reaches 1 within reach and the desaturation is on (the\n * caller then integrates the chain), else true.\n */\n tone(mu: Float64Array, S: Float64Array, hm: Float64Array, hv: Float64Array, J: Float64Array): boolean;\n}\n\n/** #602: a render's noise-free camera channels at a real pixel (native coordinates), and the output raster's native bounds. */\nexport interface NeighborView {\n channels(x: number, y: number, out: Float64Array): void;\n x0: number; y0: number; width: number; height: number;\n}\n/** #602: the most pixels a clipped region's search visits (fast and full); a larger region takes its ratios from the part found. */\nexport const DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT = /* @__PURE__ */ Object.freeze({ fast: 1 << 16, full: 1 << 18 });\n\n/** The tone ratio r(L) = f(L)/L and its derivative of a luminance curve, for L > 0. */\n/** The limit r(0+) of a luminance curve's ratio (where the curves meet the unchanged pixels at L = 0): 1, 0, 1/(σ·g(Lw)) or ∞. */\nfunction ratioAtZero(curve: SdrToneCurve, p: SdrToneCurveParameters | undefined): number {\n if (curve === \"extended-reinhard-luminance\" || !p || !(\"exponent\" in p)) return 1;\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>;\n return q.exponent > 1 ? 0 : q.exponent < 1 ? Infinity : (1 + q.semiSaturation / q.whiteLuminance) / q.semiSaturation;\n}\nfunction luminanceRatio(curve: SdrToneCurve, p: SdrToneCurveParameters | undefined): (l: number, out: Float64Array) => void {\n if (curve === \"extended-reinhard-luminance\" && p && !(\"exponent\" in p)) {\n const inverseWhite2 = 1 / (p.whiteLuminance * p.whiteLuminance);\n // f(L) = L(1 + L/Lw²)/(1 + L): r = (1 + L/Lw²)/(1 + L), r′ = (1/Lw² − 1)/(1 + L)².\n return (l, out) => { const d = 1 + l; out[0] = (1 + l * inverseWhite2) / d; out[1] = (inverseWhite2 - 1) / (d * d); };\n }\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>, n = q.exponent, sigma = q.semiSaturation;\n // g(L) = 1/(1 + u), u = (σ/L)ⁿ; f = g/g(Lw); r = g/(g(Lw)·L), r′ = g·(n·u·g − 1)/(g(Lw)·L²).\n const white = 1 / (1 + portablePow(sigma / q.whiteLuminance, n));\n return (l, out) => { const u = portablePow(sigma / l, n), g = 1 / (1 + u); out[0] = g / (white * l); out[1] = g * (n * u * g - 1) / (white * l * l); };\n}\n\n/**\n * Internal: the coupled rendering of a view, or null when its tone curve is per channel, its highlight mode `clip` and its gamut\n * handling the component clip (the view's own per-component arithmetic then runs, byte for byte as before).\n */\nexport function createDisplayViewCoupledRendering(choice: DisplayViewRenderingChoice, gains: readonly number[], clipLevel: number,\n matrix: readonly (readonly number[])[]): DisplayViewCoupledRendering | null {\n const luminanceTone = choice.toneCurve === \"extended-reinhard-luminance\" || choice.toneCurve === \"naka-rushton-luminance\";\n const neighbors = choice.highlightMode === \"reconstruct-neighbors\", reconstruct = choice.highlightMode === \"reconstruct\" || neighbors, desaturate = choice.gamutHandling === \"desaturate-to-luminance\";\n if (!luminanceTone && !reconstruct && !desaturate) return null;\n const reinhard = choice.toneCurve === \"positive-reinhard-per-channel\", ratio = luminanceTone ? luminanceRatio(choice.toneCurve, choice.toneCurveParameters) : null;\n const ratioZero = ratioAtZero(choice.toneCurve, choice.toneCurveParameters);\n const w0 = SDR_LUMINANCE_WEIGHTS[0]!, w1 = SDR_LUMINANCE_WEIGHTS[1]!, w2 = SDR_LUMINANCE_WEIGHTS[2]!, w = [w0, w1, w2];\n const g = Float64Array.from(gains), L = clipLevel, M = Float64Array.from(matrix.flat()), start = RAW_HIGHLIGHT_RECONSTRUCTION_START;\n const chainRule = gaussHermite(choice.fast ? DISPLAY_VIEW_CHAIN_POINTS.fast : DISPLAY_VIEW_CHAIN_POINTS.full), hermite8 = gaussHermite(DISPLAY_VIEW_LUMINANCE_FAST_POINTS);\n const rr = new Float64Array(2), b = new Float64Array(3), Jb = new Float64Array(9), y = new Float64Array(3), z = new Float64Array(3), Jt = new Float64Array(9), Jz = new Float64Array(9);\n const T = new Float64Array(9), c = new Float64Array(3), out = new Float64Array(3), Jo = new Float64Array(9), chol = new Float64Array(9);\n /** The highlight step b(c) and its slopes Jb = ∂b/∂c (a.e.), as `prepareSensorColorDevelopment` develops. */\n function highlight(c0: number, c1: number, c2: number): void {\n const u0 = c0 * g[0]!, u1 = c1 * g[1]!, u2 = c2 * g[2]!;\n Jb.fill(0);\n if (neighbors) {\n // #602: the pixel's region ratios (its own chromaticity when no region is bound: the rebuild then keeps u).\n if (rho) rebuildClippedPixel(c0, c1, c2, g, rho, b, Jb);\n else { b[0] = u0; b[1] = u1; b[2] = u2; Jb[0] = g[0]!; Jb[4] = g[1]!; Jb[8] = g[2]!; }\n return;\n }\n if (!reconstruct) {\n b[0] = u0 > L ? L : u0; b[1] = u1 > L ? L : u1; b[2] = u2 > L ? L : u2;\n Jb[0] = u0 > L ? 0 : g[0]!; Jb[4] = u1 > L ? 0 : g[1]!; Jb[8] = u2 > L ? 0 : g[2]!;\n return;\n }\n const s = c0 > c1 ? (c0 > c2 ? c0 : c2) : (c1 > c2 ? c1 : c2);\n if (!(s > start)) { b[0] = u0; b[1] = u1; b[2] = u2; Jb[0] = g[0]!; Jb[4] = g[1]!; Jb[8] = g[2]!; return; }\n const sIndex = c0 > c1 ? (c0 > c2 ? 0 : 2) : (c1 > c2 ? 1 : 2);\n const k0 = u0 > L ? L : u0, k1 = u1 > L ? L : u1, k2 = u2 > L ? L : u2, n = k0 > k1 ? (k0 > k2 ? k0 : k2) : (k1 > k2 ? k1 : k2);\n const nIndex = k0 > k1 ? (k0 > k2 ? 0 : 2) : (k1 > k2 ? 1 : 2), nSlope = (nIndex === 0 ? u0 : nIndex === 1 ? u1 : u2) > L ? 0 : g[nIndex]!;\n const t = s >= 1 ? 1 : (s - start) / (1 - start), tSlope = s >= 1 ? 0 : 1 / (1 - start);\n b[0] = (1 - t) * u0 + t * n; b[1] = (1 - t) * u1 + t * n; b[2] = (1 - t) * u2 + t * n;\n for (let k = 0; k < 3; k++) {\n const uk = k === 0 ? u0 : k === 1 ? u1 : u2;\n Jb[k * 4] = (1 - t) * g[k]!;\n Jb[k * 3 + nIndex] = Jb[k * 3 + nIndex]! + t * nSlope;\n Jb[k * 3 + sIndex] = Jb[k * 3 + sIndex]! + (n - uk) * tSlope;\n }\n }\n /** Tone, gamut and clip of developed y into out, with the slopes Jo = ∂out/∂y (a.e.). */\n function render(): void {\n Jt.fill(0);\n if (ratio) {\n const l = w0 * y[0]! + w1 * y[1]! + w2 * y[2]!;\n if (l > 0) {\n ratio(l, rr);\n const r = rr[0]!, rp = rr[1]!;\n for (let k = 0; k < 3; k++) { z[k] = y[k]! * r; for (let j = 0; j < 3; j++) Jt[k * 3 + j] = (k === j ? r : 0) + y[k]! * rp * w[j]!; }\n } else for (let k = 0; k < 3; k++) { z[k] = y[k]!; Jt[k * 4] = 1; }\n } else for (let k = 0; k < 3; k++) {\n const v = y[k]!;\n if (reinhard && v > 0) { z[k] = v / (1 + v); Jt[k * 4] = 1 / ((1 + v) * (1 + v)); } else { z[k] = v; Jt[k * 4] = 1; }\n }\n // #601: toward the luminance until the largest component is 1 (src/output/sdr-rendering.ts, desaturateToLuminance).\n const top = z[0]! > z[1]! ? (z[0]! > z[2]! ? 0 : 2) : (z[1]! > z[2]! ? 1 : 2), zt = z[top]!;\n if (desaturate && zt > 1) {\n const lp = w0 * z[0]! + w1 * z[1]! + w2 * z[2]!;\n if (lp >= 1) { out.fill(1); Jo.fill(0); return; }\n const d = zt - lp, a = (1 - lp) / d;\n // ∂a/∂z_j = (−w_j·d − (1 − lp)·(δ_tj − w_j))/d².\n for (let j = 0; j < 9; j++) Jz[j] = 0;\n for (let k = 0; k < 3; k++) for (let j = 0; j < 3; j++) {\n const da = (-w[j]! * d - (1 - lp) * ((j === top ? 1 : 0) - w[j]!)) / (d * d);\n Jz[k * 3 + j] = w[j]! * (1 - a) + (k === j ? a : 0) + (z[k]! - lp) * da;\n }\n desaturateToLuminance(z);\n } else { Jz.fill(0); Jz[0] = 1; Jz[4] = 1; Jz[8] = 1; }\n // Jo = diag(inside)·Jz·Jt.\n for (let k = 0; k < 3; k++) {\n const v = z[k]!, inside = v > 0 && v < 1;\n out[k] = v < 0 ? 0 : v > 1 ? 1 : v;\n for (let j = 0; j < 3; j++) Jo[k * 3 + j] = inside ? Jz[k * 3]! * Jt[j]! + Jz[k * 3 + 1]! * Jt[3 + j]! + Jz[k * 3 + 2]! * Jt[6 + j]! : 0;\n }\n }\n function develop(c0: number, c1: number, c2: number): void {\n highlight(c0, c1, c2);\n for (let k = 0; k < 3; k++) y[k] = M[k * 3]! * b[0]! + M[k * 3 + 1]! * b[1]! + M[k * 3 + 2]! * b[2]!;\n render();\n }\n function pixel(c0: number, c1: number, c2: number, result: Float64Array): void {\n develop(c0, c1, c2);\n result[0] = out[0]!; result[1] = out[1]!; result[2] = out[2]!;\n }\n function chain(cm: Float64Array, C: Float64Array, hm: Float64Array, hv: Float64Array, A: Float64Array): number {\n // Cholesky factor of C (positive semidefinite; tiny negative pivots are treated as 0).\n chol.fill(0);\n const l00 = Math.sqrt(Math.max(0, C[0]!)), l10 = l00 > 0 ? C[3]! / l00 : 0, l20 = l00 > 0 ? C[6]! / l00 : 0;\n const l11 = Math.sqrt(Math.max(0, C[4]! - l10 * l10)), l21 = l11 > 0 ? (C[7]! - l20 * l10) / l11 : 0, l22 = Math.sqrt(Math.max(0, C[8]! - l20 * l20 - l21 * l21));\n const rule = l00 > 0 || l11 > 0 || l22 > 0 ? chainRule : { x: Float64Array.of(0), w: Float64Array.of(1) }, n = rule.x.length;\n let e0 = 0, e1 = 0, e2 = 0, q0 = 0, q1 = 0, q2 = 0;\n T.fill(0);\n for (let i = 0; i < n; i++) {\n const x0 = rule.x[i]!, wi = rule.w[i]!;\n for (let j = 0; j < (l11 > 0 || l21 !== 0 || l22 > 0 ? n : 1); j++) {\n const x1 = l11 > 0 || l21 !== 0 || l22 > 0 ? rule.x[j]! : 0, wj = l11 > 0 || l21 !== 0 || l22 > 0 ? wi * rule.w[j]! : wi;\n for (let k = 0; k < (l22 > 0 ? n : 1); k++) {\n const x2 = l22 > 0 ? rule.x[k]! : 0, weight = l22 > 0 ? wj * rule.w[k]! : wj;\n c[0] = cm[0]! + l00 * x0; c[1] = cm[1]! + l10 * x0 + l11 * x1; c[2] = cm[2]! + l20 * x0 + l21 * x1 + l22 * x2;\n develop(c[0], c[1], c[2]);\n e0 += weight * out[0]!; e1 += weight * out[1]!; e2 += weight * out[2]!;\n q0 += weight * out[0]! * out[0]!; q1 += weight * out[1]! * out[1]!; q2 += weight * out[2]! * out[2]!;\n // ∂out/∂c = Jo·M·Jb.\n for (let r = 0; r < 3; r++) for (let s = 0; s < 3; s++) {\n const ms = M[r * 3]! * Jb[s]! + M[r * 3 + 1]! * Jb[3 + s]! + M[r * 3 + 2]! * Jb[6 + s]!;\n for (let o = 0; o < 3; o++) T[o * 3 + s] = T[o * 3 + s]! + weight * Jo[o * 3 + r]! * ms;\n }\n }\n }\n }\n hm[0] = e0; hm[1] = e1; hm[2] = e2;\n hv[0] = Math.max(0, q0 - e0 * e0); hv[1] = Math.max(0, q1 - e1 * e1); hv[2] = Math.max(0, q2 - e2 * e2);\n A.set(T);\n return n ** ((l00 > 0 ? 1 : 0) + (l11 > 0 || l21 !== 0 || l22 > 0 ? 1 : 0) + (l22 > 0 ? 1 : 0));\n }\n function reconstructInReach(cm: Float64Array, C: Float64Array): boolean {\n const threshold = neighbors ? NEIGHBOR_HIGHLIGHT_THRESHOLD : start;\n for (let k = 0; k < 3; k++) if (!(cm[k]! + CLIP_REACH_SIGMA * Math.sqrt(Math.max(0, C[k * 4]!)) < threshold)) return true;\n return false;\n }\n // #602: the region ratios of the bound view, found on demand (noise-free channels; see the module notes of the capture's method).\n let rho: Float64Array | null = null, view: NeighborView | null = null;\n const ratioOf = new Map<number, Float64Array>(), channelMemo = new Map<number, Float64Array>(), neighborRegions = { measured: 0, capped: 0 };\n const H = NEIGHBOR_HIGHLIGHT_THRESHOLD, limit = choice.fast ? DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT.fast : DISPLAY_VIEW_NEIGHBOR_REGION_LIMIT.full, tile = Math.round(Math.sqrt(limit));\n function channelsAt(x: number, y: number): Float64Array {\n const key = y * 1048576 + x;\n let v = channelMemo.get(key);\n if (!v) { v = new Float64Array(3); view!.channels(x, y, v); channelMemo.set(key, v); }\n return v;\n }\n const inside = (x: number, y: number): boolean => x >= view!.x0 && y >= view!.y0 && x < view!.x0 + view!.width && y < view!.y0 + view!.height;\n const isClipped = (v: Float64Array): boolean => v[0]! >= H || v[1]! >= H || v[2]! >= H;\n // A pixel within the margin of a clipped one gives no ratios (the capture's widened regions).\n const unknownMemo = new Map<number, boolean>(), D = NEIGHBOR_HIGHLIGHT_MARGIN;\n function isUnknown(x: number, y: number): boolean {\n const key = y * 1048576 + x;\n let v = unknownMemo.get(key);\n if (v === undefined) {\n v = false;\n for (let qy = y - D; qy <= y + D && !v; qy++) for (let qx = x - D; qx <= x + D && !v; qx++) if (inside(qx, qy) && isClipped(channelsAt(qx, qy))) v = true;\n unknownMemo.set(key, v);\n }\n return v;\n }\n function ownRatio(v: Float64Array, out: Float64Array): void {\n const u0 = v[0]! * g[0]!, u1 = v[1]! * g[1]!, u2 = v[2]! * g[2]!, sum = u0 + u1 + u2;\n if (sum > 0) { out[0] = u0 / sum; out[1] = u1 / sum; out[2] = u2 / sum; } else out.fill(1 / 3);\n }\n function regionRatio(x: number, y: number): Float64Array {\n const key = y * 1048576 + x, known = ratioOf.get(key);\n if (known) return known;\n // The region (8-connected), breadth first. #605: a region above the cap is solved per tile of `tile` × `tile` pixels (the\n // tile area is the cap): its part in the pixel's tile, which does not depend on where the render reached the region.\n const search = (tiled: boolean): { members: number[]; index: Map<number, number>; capped: boolean } => {\n const members: number[] = [key], index = new Map<number, number>([[key, 0]]), tx = Math.floor(x / tile), ty = Math.floor(y / tile);\n let capped = false;\n for (let head = 0; head < members.length && !capped; head++) {\n const p = members[head]!, px = p % 1048576, py = (p - px) / 1048576;\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n const qx = px + dx, qy = py + dy, q = qy * 1048576 + qx;\n if (!inside(qx, qy) || index.has(q) || (tiled && (Math.floor(qx / tile) !== tx || Math.floor(qy / tile) !== ty)) || !isUnknown(qx, qy)) continue;\n if (members.length >= limit) { capped = true; break; }\n index.set(q, members.length); members.push(q);\n }\n }\n return { members, index, capped };\n };\n let found = search(false);\n neighborRegions.measured++;\n if (found.capped) { neighborRegions.capped++; found = search(true); }\n const { members, index } = found;\n // #605: the members in raster order, so the ratios do not depend on which pixel found the region (a region render, the GPU\n // host's band order and the whole view agree bit for bit).\n members.sort((a, b) => a - b);\n for (let i = 0; i < members.length; i++) index.set(members[i]!, i);\n // Fast: the ring's mean ratios (unclipped pixels within the ring width, each once).\n const R = NEIGHBOR_HIGHLIGHT_RING, seen = new Set<number>(), r = new Float64Array(3), mean = new Float64Array(3);\n let count = 0;\n for (const p of members) {\n const px = p % 1048576, py = (p - px) / 1048576;\n for (let qy = py - R; qy <= py + R; qy++) for (let qx = px - R; qx <= px + R; qx++) {\n const q = qy * 1048576 + qx;\n if (!inside(qx, qy) || seen.has(q) || index.has(q) || isUnknown(qx, qy)) continue;\n const v = channelsAt(qx, qy);\n seen.add(q); ownRatio(v, r); mean[0] = mean[0]! + r[0]!; mean[1] = mean[1]! + r[1]!; mean[2] = mean[2]! + r[2]!; count++;\n }\n }\n if (count > 0) { mean[0] = mean[0]! / count; mean[1] = mean[1]! / count; mean[2] = mean[2]! / count; } else mean.fill(1 / 3);\n const values = new Float64Array(3 * members.length);\n for (let i = 0; i < members.length; i++) values.set(mean, 3 * i);\n if (!choice.fast && count > 0) {\n // Full: successive over-relaxation of the discrete Laplace equation, Dirichlet values from the unclipped 4-neighbors.\n const { tolerance, maximumIterations } = NEIGHBOR_HIGHLIGHT_SOR, boundary = new Map<number, Float64Array>();\n let bx0 = Infinity, bx1 = -Infinity, by0 = Infinity, by1 = -Infinity;\n for (const p of members) { const px = p % 1048576, py = (p - px) / 1048576; bx0 = Math.min(bx0, px); bx1 = Math.max(bx1, px); by0 = Math.min(by0, py); by1 = Math.max(by1, py); }\n const omega = neighborHighlightOmega(bx1 - bx0 + 1, by1 - by0 + 1);\n let change = Infinity;\n for (let sweep = 0; sweep < maximumIterations && change > tolerance; sweep++) {\n change = 0;\n for (let i = 0; i < members.length; i++) {\n const p = members[i]!, px = p % 1048576, py = (p - px) / 1048576;\n let a0 = 0, a1 = 0, a2 = 0, m = 0;\n for (let d = 0; d < 4; d++) {\n const qx = px + (d === 0 ? -1 : d === 1 ? 1 : 0), qy = py + (d === 2 ? -1 : d === 3 ? 1 : 0), q = qy * 1048576 + qx;\n if (!inside(qx, qy)) continue;\n const j = index.get(q);\n let src: Float64Array;\n if (j !== undefined) src = values.subarray(3 * j, 3 * j + 3);\n else {\n let bnd = boundary.get(q);\n if (!bnd) { bnd = new Float64Array(3); if (isUnknown(qx, qy)) bnd.set(mean); else ownRatio(channelsAt(qx, qy), bnd); boundary.set(q, bnd); }\n src = bnd;\n }\n a0 += src[0]!; a1 += src[1]!; a2 += src[2]!; m++;\n }\n if (m === 0) continue;\n for (let k = 0; k < 3; k++) {\n const old = values[3 * i + k]!, next = old + omega * ((k === 0 ? a0 : k === 1 ? a1 : a2) / m - old);\n values[3 * i + k] = next;\n if (Math.abs(next - old) > change) change = Math.abs(next - old);\n }\n }\n }\n }\n for (let i = 0; i < members.length; i++) ratioOf.set(members[i]!, values.subarray(3 * i, 3 * i + 3));\n return ratioOf.get(key)!;\n }\n const own = new Float64Array(3);\n function at(x: number, y: number): void {\n if (!view || !inside(x, y)) { rho = null; return; }\n if (isUnknown(x, y)) rho = regionRatio(x, y);\n else { ownRatio(channelsAt(x, y), own); rho = own; }\n }\n function ratioAt(x: number, y: number, out: Float64Array): void {\n at(x, y);\n if (rho) out.set(rho); else out[0] = -1;\n }\n let boundSignal: DisplayViewSetup[\"signal\"] | null = null;\n function bindView(setup: DisplayViewSetup): void {\n // #605: a render of the same signal keeps the regions found (their ratios depend only on the signal and the frame): the\n // host's recomputation of flagged pixels renders many small regions of one view.\n if (view && setup.signal === boundSignal) return;\n boundSignal = setup.signal;\n // The noise-free mosaic (expected normalized site values clipped at white, read reflect-101 at the raster's edges) through the\n // bilinear kernels: the expected camera channels of each real pixel (the capture's own demosaic for AHD captures is approximated).\n const W = setup.nativeWidth, Hh = setup.nativeHeight, k = setup.readout.map((r) => r.perElectron), dark = setup.readout.map((r) => r.darkElectrons);\n const site = (x: number, y: number): number => {\n const sx = x < 0 ? -x : x >= W ? 2 * W - 2 - x : x, sy = y < 0 ? -y : y >= Hh ? 2 * Hh - 2 - y : y;\n const ch = (sy & 1) === 0 ? ((sx & 1) === 0 ? 0 : 1) : ((sx & 1) === 0 ? 1 : 2), v = k[ch]! * (setup.signal.site(sx, sy) + dark[ch]!);\n return v < 1 ? v : 1;\n };\n view = { x0: setup.margin, y0: setup.margin, width: setup.frameWidth, height: setup.frameHeight, channels(x: number, y: number, out: Float64Array): void {\n const taps = setup.demosaic[(y & 1) * 2 + (x & 1)]!;\n for (let c = 0; c < 3; c++) { let sum = 0; for (const t of taps[c]!) sum += t.weight * site(x + t.dx, y + t.dy); out[c] = sum; }\n } };\n ratioOf.clear(); channelMemo.clear(); unknownMemo.clear(); neighborRegions.measured = 0; neighborRegions.capped = 0;\n }\n const m1 = new Float64Array(3), m2 = new Float64Array(3), sw = new Float64Array(3), beta = new Float64Array(3), cv = new Float64Array(3);\n /**\n * The clipped-normal terms of Z ~ N(m, v) on [0, 1]: P(0 < Z < 1), E[Z·1(0 < Z < 1)], E[Z²·1(0 < Z < 1)] and P(Z ≥ 1), into\n * rr-like slots (q). Closed form, as `unitClip` without its skewness term.\n */\n const q = new Float64Array(4);\n function clipped(m: number, v: number): void {\n if (!(v > 0)) { const inside = m > 0 && m < 1; q[0] = inside ? 1 : 0; q[1] = inside ? m : 0; q[2] = inside ? m * m : 0; q[3] = m >= 1 ? 1 : 0; return; }\n const s = Math.sqrt(v), a = -m / s, bb = (1 - m) / s;\n const Pa = a < -CLIP_REACH_SIGMA ? 0 : a > CLIP_REACH_SIGMA ? 1 : bigPhi(a), Pb = bb > CLIP_REACH_SIGMA ? 1 : bb < -CLIP_REACH_SIGMA ? 0 : bigPhi(bb);\n const da = a < -CLIP_REACH_SIGMA || a > CLIP_REACH_SIGMA ? 0 : phi(a), db = bb > CLIP_REACH_SIGMA || bb < -CLIP_REACH_SIGMA ? 0 : phi(bb);\n const inside = Pb - Pa;\n q[0] = inside; q[1] = m * inside + s * (da - db); q[2] = (m * m + v) * inside + 2 * m * s * (da - db) + v * (a * da - bb * db); q[3] = 1 - Pb;\n }\n function tone(mu: Float64Array, S: Float64Array, hm: Float64Array, hv: Float64Array, J: Float64Array): boolean {\n const muL = w0 * mu[0]! + w1 * mu[1]! + w2 * mu[2]!;\n for (let k = 0; k < 3; k++) sw[k] = S[k * 3]! * w0 + S[k * 3 + 1]! * w1 + S[k * 3 + 2]! * w2;\n const vL = w0 * sw[0]! + w1 * sw[1]! + w2 * sw[2]!, sL = vL > 0 ? Math.sqrt(vL) : 0;\n for (let k = 0; k < 3; k++) { beta[k] = sL > 0 ? sw[k]! / vL : 0; cv[k] = Math.max(0, S[k * 4]! - (sL > 0 ? beta[k]! * sw[k]! : 0)); }\n m1.fill(0); m2.fill(0); J.fill(0);\n let reachesTop = false;\n const node = (l: number, weight: number): void => {\n let r = 1, rp = 0;\n if (l > 0) { ratio!(l, rr); r = rr[0]!; rp = rr[1]!; }\n for (let k = 0; k < 3; k++) {\n const m = mu[k]! + beta[k]! * (l - muL);\n clipped(r * m, r * r * cv[k]!);\n m1[k] = m1[k]! + weight * (q[1]! + q[3]!);\n m2[k] = m2[k]! + weight * (q[2]! + q[3]!);\n if (q[3]! > 0) reachesTop = true;\n // E[∂out_k/∂y_j | L] = δ_kj·r·P_in + r′·w_j·E[y_k·1_in] (E[y_k·1_in] = E[Z·1_in]/r).\n for (let j = 0; j < 3; j++) J[k * 3 + j] = J[k * 3 + j]! + weight * ((k === j ? r * q[0]! : 0) + (rp === 0 ? 0 : rp * w[j]! * q[1]! / r));\n }\n };\n if (!(sL > 0)) node(muL, 1);\n else {\n const lo = muL - CLIP_REACH_SIGMA * sL, hi = muL + CLIP_REACH_SIGMA * sL;\n if (choice.fast && (muL > 2 * CLIP_REACH_SIGMA * sL || hi < 0)) for (let i = 0; i < hermite8.x.length; i++) node(muL + sL * hermite8.x[i]!, hermite8.w[i]!);\n else {\n // Composite 16-point Gauss–Legendre in 4 panels over [lo, hi], split at L = 0 where the curves leave the pixel unchanged; in\n // standardized units z = (L − μ_L)/σ_L, so a node's density is formed without the cancellation L − μ_L.\n const pieces = lo < 0 && hi > 0 ? [-CLIP_REACH_SIGMA, -muL / sL, CLIP_REACH_SIGMA] : [-CLIP_REACH_SIGMA, CLIP_REACH_SIGMA];\n for (let piece = 0; piece + 1 < pieces.length; piece++) {\n const a = pieces[piece]!, width = (pieces[piece + 1]! - a) / 4, half = width / 2;\n for (let p = 0; p < 4; p++) {\n const centre = a + (p + 0.5) * width;\n for (let k = 0; k < 16; k++) { const z = centre + half * GL.x[k]!; node(muL + sL * z, half * GL.w[k]! * phi(z)); }\n }\n }\n }\n }\n // Where the luminance's range holds L = 0 and the ratio jumps there (r(0+) ≠ 1), the rendered value jumps across the plane\n // wᵀy = 0, and the expected slopes gain p_L(0)·E[out(0+) − out(0−) | L = 0]·w_j (the jump's term of Stein's lemma).\n if (sL > 0 && ratioZero !== 1 && Math.abs(muL) < CLIP_REACH_SIGMA * sL) {\n const density = phi(muL / sL) / sL;\n for (let k = 0; k < 3; k++) {\n const m = mu[k]! - beta[k]! * muL, v = cv[k]!;\n clipped(m, v);\n const below = q[1]! + q[3]!;\n let above: number;\n if (ratioZero === Infinity) above = v > 0 ? bigPhi(m / Math.sqrt(v)) : m > 0 ? 1 : 0;\n else { clipped(ratioZero * m, ratioZero * ratioZero * v); above = q[1]! + q[3]!; }\n for (let j = 0; j < 3; j++) J[k * 3 + j] = J[k * 3 + j]! + density * (above - below) * w[j]!;\n }\n }\n for (let k = 0; k < 3; k++) { hm[k] = m1[k]!; hv[k] = Math.max(0, m2[k]! - m1[k]! * m1[k]!); }\n return !(desaturate && reachesTop);\n }\n return { luminanceTone, reconstruct, neighbors, ...(neighbors ? { bindView, at, ratioAt } : {}), neighborRegions, desaturate, choice, chainPoints: chainRule.x.length, chainRule, luminanceRule: hermite8, ratioAtZero: ratioZero, pixel, chain, reconstructInReach, tone };\n}\n"]}
|
|
@@ -68,8 +68,8 @@ export const SIMULATE_CAPTURE_FAST_METHODS = /* @__PURE__ */ Object.freeze([
|
|
|
68
68
|
exact: "the same kernels with the full rules (4 × 16 Gauss–Legendre; 16 points per axis), fast: false with an explicit gpu", followsFormatDefault: true,
|
|
69
69
|
resolver: { file: "src/gpu/wgsl-display-view-coupled.ts", call: "out[C.fast] = r.fast ? 1 : 0" }, report: { assumption: "view.rendering" } },
|
|
70
70
|
{ id: "output.highlightMode.reconstruct-neighbors/region-ratios", override: "fast", methods: "fast-and-exact", runs: ["simulateCapture", "simulateDisplayView", "prepareDisplayView"],
|
|
71
|
-
fast: "#602: each clipped region takes the mean color ratios of the unclipped pixels within 2 pixels of it",
|
|
72
|
-
exact: "the ratios' harmonic (Laplace) interpolation inward from the region's unclipped neighbors (successive over-relaxation)", followsFormatDefault: true,
|
|
71
|
+
fast: "#602: each clipped region takes the mean color ratios of the unclipped pixels within 2 pixels of it; #605: on the WebGPU display view too (the host's ratios, the rebuild in float32 within the a-priori bound)",
|
|
72
|
+
exact: "the ratios' harmonic (Laplace) interpolation inward from the region's unclipped neighbors (successive over-relaxation), on the CPU and the WebGPU display view alike", followsFormatDefault: true,
|
|
73
73
|
resolver: { file: CAPTURE, call: "const neighborFast = fastTop" }, report: { assumption: "output.highlightMode.reconstructNeighbors" } },
|
|
74
74
|
{ id: "lens.diffraction", override: "lens.diffraction", methods: "exact-only", runs: ["simulateCapture", "simulateDisplayView", "prepareDisplayView"],
|
|
75
75
|
fast: "", exact: "the diffraction kernels (a fast method only under rolling-shutter rotation, above)", followsFormatDefault: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-methods.js","sourceRoot":"","sources":["../../src/facade/fast-methods.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The registry of every speed-versus-accuracy choice (#395, owner rule of 2.20.0): one entry per choice that has a fast and an\n * exact (full) method, and per option record that accepts `fast` without a fast method yet. Every entry resolves through\n * `resolveFast` and `fastFormatDefault` (fast-resolution.ts): an option record's `fast`, else the top-level `fast`, else the\n * format default (fast for \"srgb-8\", \"srgb-16\" and the display view; exact for \"dng\", \"jpeg\", \"png\" and `simulateIdealReference`).\n *\n * Data only (a root export, so developers can read which choices exist), read by `test/fast-methods-registry.test.ts`, which\n * fails when an option accepts `fast` without an entry here, an entry lacks its resolver or its report, or a format's default\n * leaves the rule. Captures and display views do not import this module (tree-shaking leaves it out of their bundles). A new\n * fast method adds its entry here and to docs/API_STYLE.md, \"Exact and fast modes\".\n * @see docs/API_STYLE.md, \"Exact and fast modes\".\n */\n\n/** One speed-versus-accuracy choice of {@link SIMULATE_CAPTURE_FAST_METHODS} (2.20.0). */\nexport interface SimulateCaptureFastMethod {\n /** A short id: the option path and, where one option has several fast methods, the method. */\n id: string;\n /**\n * The request path whose record takes the `fast` override (`allowKeys` path in simulate-capture.ts), or \"fast\" when only the\n * top-level flag sets it (a choice with no option record of its own).\n */\n override: string;\n /** \"fast-and-exact\": both methods exist; \"exact-only\": the record takes `fast`, but there is no fast method yet (reports false). */\n methods: \"fast-and-exact\" | \"exact-only\";\n /** Where it applies. */\n runs: readonly (\"simulateCapture\" | \"simulateDisplayView\" | \"prepareDisplayView\" | \"developDngStageImage\")[];\n /** The fast method and the exact one, in words (empty for exact-only). */\n fast: string;\n exact: string;\n /** Always true: no choice keeps its own default (the test checks it). */\n followsFormatDefault: true;\n /**\n * The resolver call in the source (`resolveFast(<record flag>, fastTop)`, or `fastTop` itself for a top-level choice), which the\n * test finds in the named file.\n */\n resolver: { file: string; call: string };\n /**\n * How the result reports it: the `diagnostics.fast.applied` key (true where the fast method ran), an assumption id the fast\n * method adds, or another result field. At least one; the test finds each assumption id in the source.\n */\n report: { applied?: string; assumption?: string; field?: string };\n}\n\nconst CAPTURE = \"src/facade/simulate-capture.ts\", VIEW = \"src/facade/simulate-display-view.ts\";\n\n/** 2.20.0: every speed-versus-accuracy choice of the capture facade and the display view (see the module comment). */\nexport const SIMULATE_CAPTURE_FAST_METHODS: readonly SimulateCaptureFastMethod[] = /* @__PURE__ */ Object.freeze([\n { id: \"lens.catalogue/field-grid\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#568: the PSF blended over a field grid, with each site's expected electrons integrated from its taps' material spectra at use, verified per CFA phase against the exact chain\",\n exact: \"the environment PSF quadrature with the PSF resolved at each query point\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/field-grid-cells\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#603: when the field-grid method runs on a fast request, at least 4 grid cells per field interval (2.20.0's grid), except for the measured lenses of CATALOGUE_FAST_GRID_FULL_ON_SCREEN, whose fallbacks made 4 cells slower\",\n exact: \"at least 10 cells per field interval when the field-grid method runs on an exact request (lens.catalogue fast: true with an export or fast: false)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"catalogueFastGridSubdivisions(catalogue!.lensId, fastTop)\" }, report: { assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/cats-eye\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#567: with lens.defocus, the lens's bokeh without its cat's eye (the axis kernel everywhere)\",\n exact: \"the cat's eye shaped at each field point (fast wides and normals)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue.catsEye\" } },\n { id: \"lens.catalogue/view-psf-zones\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#569 (H1): 64 field zones along the longer side, each with the PSF at its centre\",\n exact: \"one zone per site: the PSF at each site centre\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"view.lensPsf\" } },\n { id: \"lens.diffraction/rolling-shutter-taps\", override: \"lens.diffraction\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#565: under rolling-shutter rotation (#551: or subject motion), each PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\", assumption: \"fast.lens.diffraction\" } },\n { id: \"lens.catalogue/rolling-shutter-taps\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#588: under rolling-shutter rotation, each catalogue PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"view.uniform-pixel-sampling\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H2) a quarter of the samples per axis in display pixels whose pilot finds no detail\",\n exact: \"the full samples per axis in every display pixel\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"uniformSampling: fastTop\" }, report: { assumption: \"view.estimation\" } },\n { id: \"prepareDisplayView.gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"gpu \\\"auto\\\": WebGPU float32 where a conforming device supports the request (a bounded approximation), else the CPU reference\",\n exact: \"gpu \\\"off\\\": the CPU reference; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"illumination/image-plane-gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"#597: gpu \\\"auto\\\": an image-plane print under mixed lighting on WebGPU (float32, a bounded approximation): the print's Quality passes light each lattice \" +\n \"point per spectral node from the light's spectra and parts (Speed requests too, without site kernels); flagged points resolved on the host\",\n exact: \"gpu \\\"off\\\": the CPU reference integrates each site from the lit radiance per spectral node in float64; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"sensor.spectralStepNanometers\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#590: the default spectral step is 20 nm under any light; under a spiky one (R(20) > 0.01) sensor.spectralSpikiness notes the possible cast\",\n exact: \"5 nm under a spiky light, else 20 nm (an explicit sensor.spectralStepNanometers always wins)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop || !spiky\" }, report: { applied: \"sensor.spectralStepNanometers\", assumption: \"sensor.spectralSpikiness\" } },\n { id: \"sensor.midGrey\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#535: the mid-gray noise figure is not computed (about 0.3 ms)\", exact: \"result.sensor.midGrey is computed\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop ? undefined : 0\" }, report: { field: \"sensor.midGrey\" } },\n { id: \"motion.subject/temporal-midpoints\", override: \"motion.subject\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#551: with the default count and a still camera, one temporal midpoint per site of the subject's streak plus one, when that is fewer than 8\",\n exact: \"the default 8 temporal midpoints (an explicit sensor.temporalSampleCount always wins)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(subjectFast, fastTop)\" }, report: { applied: \"motion.subject\", assumption: \"fast.motion.subject\" } },\n { id: \"dngImport.warpRectilinear\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"developDngStageImage\"],\n fast: \"#600: an imported DNG's WarpRectilinear opcode resampled bilinearly\", exact: \"cubic convolution (Keys, a = −0.75, the DNG SDK's kernel); default fast unless format names an export\", followsFormatDefault: true,\n resolver: { file: \"src/capture/dng-stage-image.ts\", call: \"resolveFast(options.fast, fastFormatDefault(format, \\\"capture\\\"))\" }, report: { field: \"fast\" } },\n { id: \"output.toneCurve/view-luminance-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#593: a luminance tone curve's moments by an 8-point Gauss–Hermite rule in luminance where its range stays clear of L = 0 (else the full rule)\",\n exact: \"a composite 4 × 16-point Gauss–Legendre rule over the luminance's ±8.5σ, split at L = 0\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"rendering: fastTop\" }, report: { assumption: \"view.rendering\" } },\n { id: \"output.highlightMode.reconstruct/view-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#593, #601: where the reconstruct blend or the desaturation is within reach, the development chain integrated with 6 Gauss–Hermite points per axis (216 nodes)\",\n exact: \"16 points per axis (4,096 nodes)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"rendering: fastTop\" }, report: { assumption: \"view.rendering\" } },\n { id: \"prepareDisplayView.gpu/view-coupled-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"#593, #601: the WebGPU Speed and Quality kernels' coupled steps with the fast rules (8-point Gauss–Hermite in luminance; 6 points per axis for the chain), float32 within the a-priori bound\",\n exact: \"the same kernels with the full rules (4 × 16 Gauss–Legendre; 16 points per axis), fast: false with an explicit gpu\", followsFormatDefault: true,\n resolver: { file: \"src/gpu/wgsl-display-view-coupled.ts\", call: \"out[C.fast] = r.fast ? 1 : 0\" }, report: { assumption: \"view.rendering\" } },\n { id: \"output.highlightMode.reconstruct-neighbors/region-ratios\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#602: each clipped region takes the mean color ratios of the unclipped pixels within 2 pixels of it\",\n exact: \"the ratios' harmonic (Laplace) interpolation inward from the region's unclipped neighbors (successive over-relaxation)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"const neighborFast = fastTop\" }, report: { assumption: \"output.highlightMode.reconstructNeighbors\" } },\n { id: \"lens.diffraction\", override: \"lens.diffraction\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the diffraction kernels (a fast method only under rolling-shutter rotation, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\" } },\n { id: \"sensor.antiAliasing\", override: \"sensor.antiAliasing\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the point-splitting filter\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.antiAliasing\" } },\n { id: \"sensor.pixelAperture.box\", override: \"sensor.pixelAperture\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the N × N midpoint rule\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.pixelAperture.box\" } },\n { id: \"output.demosaic.ahd\", override: \"output.demosaic\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the AHD demosaic of the capture; in the display view, AHD's two linear candidates and its choice on the noise-free mosaic (2.22.0: no low-signal correction, so no fast method)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"[\\\"output.demosaic.ahd\\\", ahd, demosaicFast]\" }, report: { applied: \"output.demosaic.ahd\" } }\n] as const satisfies readonly SimulateCaptureFastMethod[]);\n"]}
|
|
1
|
+
{"version":3,"file":"fast-methods.js","sourceRoot":"","sources":["../../src/facade/fast-methods.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The registry of every speed-versus-accuracy choice (#395, owner rule of 2.20.0): one entry per choice that has a fast and an\n * exact (full) method, and per option record that accepts `fast` without a fast method yet. Every entry resolves through\n * `resolveFast` and `fastFormatDefault` (fast-resolution.ts): an option record's `fast`, else the top-level `fast`, else the\n * format default (fast for \"srgb-8\", \"srgb-16\" and the display view; exact for \"dng\", \"jpeg\", \"png\" and `simulateIdealReference`).\n *\n * Data only (a root export, so developers can read which choices exist), read by `test/fast-methods-registry.test.ts`, which\n * fails when an option accepts `fast` without an entry here, an entry lacks its resolver or its report, or a format's default\n * leaves the rule. Captures and display views do not import this module (tree-shaking leaves it out of their bundles). A new\n * fast method adds its entry here and to docs/API_STYLE.md, \"Exact and fast modes\".\n * @see docs/API_STYLE.md, \"Exact and fast modes\".\n */\n\n/** One speed-versus-accuracy choice of {@link SIMULATE_CAPTURE_FAST_METHODS} (2.20.0). */\nexport interface SimulateCaptureFastMethod {\n /** A short id: the option path and, where one option has several fast methods, the method. */\n id: string;\n /**\n * The request path whose record takes the `fast` override (`allowKeys` path in simulate-capture.ts), or \"fast\" when only the\n * top-level flag sets it (a choice with no option record of its own).\n */\n override: string;\n /** \"fast-and-exact\": both methods exist; \"exact-only\": the record takes `fast`, but there is no fast method yet (reports false). */\n methods: \"fast-and-exact\" | \"exact-only\";\n /** Where it applies. */\n runs: readonly (\"simulateCapture\" | \"simulateDisplayView\" | \"prepareDisplayView\" | \"developDngStageImage\")[];\n /** The fast method and the exact one, in words (empty for exact-only). */\n fast: string;\n exact: string;\n /** Always true: no choice keeps its own default (the test checks it). */\n followsFormatDefault: true;\n /**\n * The resolver call in the source (`resolveFast(<record flag>, fastTop)`, or `fastTop` itself for a top-level choice), which the\n * test finds in the named file.\n */\n resolver: { file: string; call: string };\n /**\n * How the result reports it: the `diagnostics.fast.applied` key (true where the fast method ran), an assumption id the fast\n * method adds, or another result field. At least one; the test finds each assumption id in the source.\n */\n report: { applied?: string; assumption?: string; field?: string };\n}\n\nconst CAPTURE = \"src/facade/simulate-capture.ts\", VIEW = \"src/facade/simulate-display-view.ts\";\n\n/** 2.20.0: every speed-versus-accuracy choice of the capture facade and the display view (see the module comment). */\nexport const SIMULATE_CAPTURE_FAST_METHODS: readonly SimulateCaptureFastMethod[] = /* @__PURE__ */ Object.freeze([\n { id: \"lens.catalogue/field-grid\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#568: the PSF blended over a field grid, with each site's expected electrons integrated from its taps' material spectra at use, verified per CFA phase against the exact chain\",\n exact: \"the environment PSF quadrature with the PSF resolved at each query point\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/field-grid-cells\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#603: when the field-grid method runs on a fast request, at least 4 grid cells per field interval (2.20.0's grid), except for the measured lenses of CATALOGUE_FAST_GRID_FULL_ON_SCREEN, whose fallbacks made 4 cells slower\",\n exact: \"at least 10 cells per field interval when the field-grid method runs on an exact request (lens.catalogue fast: true with an export or fast: false)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"catalogueFastGridSubdivisions(catalogue!.lensId, fastTop)\" }, report: { assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/cats-eye\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#567: with lens.defocus, the lens's bokeh without its cat's eye (the axis kernel everywhere)\",\n exact: \"the cat's eye shaped at each field point (fast wides and normals)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue.catsEye\" } },\n { id: \"lens.catalogue/view-psf-zones\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#569 (H1): 64 field zones along the longer side, each with the PSF at its centre\",\n exact: \"one zone per site: the PSF at each site centre\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"view.lensPsf\" } },\n { id: \"lens.diffraction/rolling-shutter-taps\", override: \"lens.diffraction\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#565: under rolling-shutter rotation (#551: or subject motion), each PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\", assumption: \"fast.lens.diffraction\" } },\n { id: \"lens.catalogue/rolling-shutter-taps\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#588: under rolling-shutter rotation, each catalogue PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"view.uniform-pixel-sampling\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H2) a quarter of the samples per axis in display pixels whose pilot finds no detail\",\n exact: \"the full samples per axis in every display pixel\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"uniformSampling: fastTop\" }, report: { assumption: \"view.estimation\" } },\n { id: \"prepareDisplayView.gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"gpu \\\"auto\\\": WebGPU float32 where a conforming device supports the request (a bounded approximation), else the CPU reference\",\n exact: \"gpu \\\"off\\\": the CPU reference; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"illumination/image-plane-gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"#597: gpu \\\"auto\\\": an image-plane print under mixed lighting on WebGPU (float32, a bounded approximation): the print's Quality passes light each lattice \" +\n \"point per spectral node from the light's spectra and parts (Speed requests too, without site kernels); flagged points resolved on the host\",\n exact: \"gpu \\\"off\\\": the CPU reference integrates each site from the lit radiance per spectral node in float64; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"sensor.spectralStepNanometers\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#590: the default spectral step is 20 nm under any light; under a spiky one (R(20) > 0.01) sensor.spectralSpikiness notes the possible cast\",\n exact: \"5 nm under a spiky light, else 20 nm (an explicit sensor.spectralStepNanometers always wins)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop || !spiky\" }, report: { applied: \"sensor.spectralStepNanometers\", assumption: \"sensor.spectralSpikiness\" } },\n { id: \"sensor.midGrey\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#535: the mid-gray noise figure is not computed (about 0.3 ms)\", exact: \"result.sensor.midGrey is computed\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop ? undefined : 0\" }, report: { field: \"sensor.midGrey\" } },\n { id: \"motion.subject/temporal-midpoints\", override: \"motion.subject\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#551: with the default count and a still camera, one temporal midpoint per site of the subject's streak plus one, when that is fewer than 8\",\n exact: \"the default 8 temporal midpoints (an explicit sensor.temporalSampleCount always wins)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(subjectFast, fastTop)\" }, report: { applied: \"motion.subject\", assumption: \"fast.motion.subject\" } },\n { id: \"dngImport.warpRectilinear\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"developDngStageImage\"],\n fast: \"#600: an imported DNG's WarpRectilinear opcode resampled bilinearly\", exact: \"cubic convolution (Keys, a = −0.75, the DNG SDK's kernel); default fast unless format names an export\", followsFormatDefault: true,\n resolver: { file: \"src/capture/dng-stage-image.ts\", call: \"resolveFast(options.fast, fastFormatDefault(format, \\\"capture\\\"))\" }, report: { field: \"fast\" } },\n { id: \"output.toneCurve/view-luminance-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#593: a luminance tone curve's moments by an 8-point Gauss–Hermite rule in luminance where its range stays clear of L = 0 (else the full rule)\",\n exact: \"a composite 4 × 16-point Gauss–Legendre rule over the luminance's ±8.5σ, split at L = 0\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"rendering: fastTop\" }, report: { assumption: \"view.rendering\" } },\n { id: \"output.highlightMode.reconstruct/view-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#593, #601: where the reconstruct blend or the desaturation is within reach, the development chain integrated with 6 Gauss–Hermite points per axis (216 nodes)\",\n exact: \"16 points per axis (4,096 nodes)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"rendering: fastTop\" }, report: { assumption: \"view.rendering\" } },\n { id: \"prepareDisplayView.gpu/view-coupled-moments\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"#593, #601: the WebGPU Speed and Quality kernels' coupled steps with the fast rules (8-point Gauss–Hermite in luminance; 6 points per axis for the chain), float32 within the a-priori bound\",\n exact: \"the same kernels with the full rules (4 × 16 Gauss–Legendre; 16 points per axis), fast: false with an explicit gpu\", followsFormatDefault: true,\n resolver: { file: \"src/gpu/wgsl-display-view-coupled.ts\", call: \"out[C.fast] = r.fast ? 1 : 0\" }, report: { assumption: \"view.rendering\" } },\n { id: \"output.highlightMode.reconstruct-neighbors/region-ratios\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#602: each clipped region takes the mean color ratios of the unclipped pixels within 2 pixels of it; #605: on the WebGPU display view too (the host's ratios, the rebuild in float32 within the a-priori bound)\",\n exact: \"the ratios' harmonic (Laplace) interpolation inward from the region's unclipped neighbors (successive over-relaxation), on the CPU and the WebGPU display view alike\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"const neighborFast = fastTop\" }, report: { assumption: \"output.highlightMode.reconstructNeighbors\" } },\n { id: \"lens.diffraction\", override: \"lens.diffraction\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the diffraction kernels (a fast method only under rolling-shutter rotation, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\" } },\n { id: \"sensor.antiAliasing\", override: \"sensor.antiAliasing\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the point-splitting filter\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.antiAliasing\" } },\n { id: \"sensor.pixelAperture.box\", override: \"sensor.pixelAperture\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the N × N midpoint rule\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.pixelAperture.box\" } },\n { id: \"output.demosaic.ahd\", override: \"output.demosaic\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the AHD demosaic of the capture; in the display view, AHD's two linear candidates and its choice on the noise-free mosaic (2.22.0: no low-signal correction, so no fast method)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"[\\\"output.demosaic.ahd\\\", ahd, demosaicFast]\" }, report: { applied: \"output.demosaic.ahd\" } }\n] as const satisfies readonly SimulateCaptureFastMethod[]);\n"]}
|
|
@@ -118,8 +118,6 @@ export function displayViewQualityGpuUnsupportedReason(setup, signalInput) {
|
|
|
118
118
|
return "unsupported tone curve " + String(setup.toneCurve);
|
|
119
119
|
if (setup.rendering && !setup.coupled)
|
|
120
120
|
return "the coupled rendering steps were not prepared";
|
|
121
|
-
if (setup.rendering?.highlightMode === "reconstruct-neighbors")
|
|
122
|
-
return "highlightMode reconstruct-neighbors (#602; its regions' ratios are found on the host) is not on the GPU in 2.22.0";
|
|
123
121
|
if (setup.region.width < 1 || setup.region.height < 1)
|
|
124
122
|
return "an empty region";
|
|
125
123
|
if (signalInput.wavelengthsNm.length < 1 || signalInput.wavelengthsNm.length > DISPLAY_VIEW_QUALITY_MAXIMUM_NODES)
|
|
@@ -468,7 +466,9 @@ export async function renderDisplayViewQualityOnGpu(runtime, bandBytes, input, a
|
|
|
468
466
|
// #593, #601: the coupled steps' text and constants, loaded on demand for a view that asks for them.
|
|
469
467
|
const coupled = setup.rendering ? await import("./wgsl-display-view-coupled.js") : null;
|
|
470
468
|
const coupledConstants = coupled ? coupled.displayViewCoupledConstants(setup, SDR_LUMINANCE_WEIGHTS, gaussLegendre16()) : new Float32Array(1);
|
|
471
|
-
|
|
469
|
+
// #605: the neighbor reconstruction's ratios from the host, in a second dispatch per band (wgsl-display-view-neighbors.ts).
|
|
470
|
+
const neighbors = setup.coupled?.neighbors && coupled;
|
|
471
|
+
const pixelsPipeline = coupled ? await pipelines("photivra-display-view-quality-pixels+coupled" + (neighbors ? "+neighbors" : ""), assembleDisplayViewQualityPixelsWgsl(coupled.displayViewCoupledWgsl(!!neighbors)))
|
|
472
472
|
: await pipelines("photivra-display-view-quality-pixels", DISPLAY_VIEW_QUALITY_PIXELS_WGSL);
|
|
473
473
|
const moments = new Float32Array(pixelCount * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), pixelFlags = new Uint32Array(pixelCount), masks = new Uint32Array(2 * pixelCount);
|
|
474
474
|
let latticePointsResolved = 0;
|
|
@@ -574,24 +574,28 @@ export async function renderDisplayViewQualityOnGpu(runtime, bandBytes, input, a
|
|
|
574
574
|
// Pass 3: display pixels.
|
|
575
575
|
words[0] = count;
|
|
576
576
|
const out = band.buffer("photivra-display-view-moments", count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
|
|
577
|
-
const flagBuffer = band.buffer("photivra-display-view-flags", count * 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
|
|
578
577
|
checkAbort(abort.signal);
|
|
579
578
|
t0 = now();
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
579
|
+
let data;
|
|
580
|
+
const run = async (contents = new Uint32Array(count * DISPLAY_VIEW_QUALITY_FLAG_WORDS)) => {
|
|
581
|
+
const pass = new GpuResourceScope(runtime);
|
|
582
|
+
try {
|
|
583
|
+
const flagBuffer = pass.upload("photivra-display-view-flags", contents, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
|
|
584
|
+
const pixelParams = pass.upload("photivra-display-view-params-pixels", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);
|
|
585
|
+
const pixelGroup = runtime.device.createBindGroup({ layout: pixelsPipeline.getBindGroupLayout(0), entries: [
|
|
586
|
+
{ binding: 0, resource: { buffer: pixelParams } }, { binding: 1, resource: { buffer: auxBuffer } }, { binding: 2, resource: { buffer: geometryBuffer } },
|
|
587
|
+
{ binding: 3, resource: { buffer: siteBuffer } }, { binding: 4, resource: { buffer: out } }, { binding: 5, resource: { buffer: flagBuffer } }
|
|
588
|
+
] });
|
|
589
|
+
const [moment, flagData] = await runComputePass(runtime, pass, pixelsPipeline, pixelGroup, linearDispatch(count, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension), [{ buffer: out, bytes: count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS }, { buffer: flagBuffer, bytes: count * 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS }], abort.signal);
|
|
590
|
+
data = moment;
|
|
591
|
+
return new Uint32Array(flagData, 0, count * DISPLAY_VIEW_QUALITY_FLAG_WORDS);
|
|
592
|
+
}
|
|
593
|
+
finally {
|
|
594
|
+
pass.release();
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
const flagWords = neighbors ? await neighbors.dispatchWithNeighborRatios(setup, geometry, first, count, runtime.maximumStorageBindingBytes, run) : await run();
|
|
593
598
|
timings.pixels += now() - t0;
|
|
594
|
-
const flagWords = new Uint32Array(flagData, 0, count * DISPLAY_VIEW_QUALITY_FLAG_WORDS);
|
|
595
599
|
moments.set(new Float32Array(data, 0, count * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), first * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS);
|
|
596
600
|
for (let i = 0; i < count; i++) {
|
|
597
601
|
pixelFlags[first + i] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i];
|