@photivra/engine 2.20.0 → 2.21.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 +178 -1
- package/CITATION.cff +1 -1
- package/README.md +7 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +7 -0
- package/dist/capture/dng-lens-correction-opcodes.d.ts +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js.map +1 -1
- package/dist/capture/exposure-build-up-stage.d.ts +16 -0
- package/dist/capture/exposure-build-up-stage.js +4 -0
- package/dist/capture/exposure-build-up-stage.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +2 -1
- package/dist/capture/native-environment-lean.js +41 -73
- package/dist/capture/native-environment-lean.js.map +1 -1
- package/dist/capture/native-environment-tabulated.js +4 -3
- package/dist/capture/native-environment-tabulated.js.map +1 -1
- package/dist/capture/native-raw.d.ts +3 -2
- package/dist/capture/native-raw.js +5 -4
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +4 -1
- package/dist/capture/sensor-raw-producer.js +12 -3
- package/dist/capture/sensor-raw-producer.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/equipment/generic-lens-catalogue.d.ts +3 -2
- package/dist/equipment/generic-lens-catalogue.js +18 -5
- package/dist/equipment/generic-lens-catalogue.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +32 -0
- package/dist/equipment/generic-tier-assets.js +16 -11
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/sensor-profile-body.d.ts +78 -0
- package/dist/equipment/sensor-profile-body.js +77 -0
- package/dist/equipment/sensor-profile-body.js.map +1 -0
- package/dist/equipment/sensor-profiles.d.ts +8 -0
- package/dist/equipment/sensor-profiles.js +82 -0
- package/dist/equipment/sensor-profiles.js.map +1 -0
- package/dist/facade/catalogue-lens-signal.d.ts +2 -2
- package/dist/facade/catalogue-lens-signal.js +58 -71
- package/dist/facade/catalogue-lens-signal.js.map +1 -1
- package/dist/facade/chart-radiance-batch.js +2 -1
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/defocus-image-space-provider.d.ts +7 -0
- package/dist/facade/defocus-image-space-provider.js +64 -76
- package/dist/facade/defocus-image-space-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.js +2 -0
- package/dist/facade/display-view-gpu-session.js.map +1 -1
- package/dist/facade/display-view-gpu.d.ts +6 -1
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/display-view-lens-signal.js +25 -23
- package/dist/facade/display-view-lens-signal.js.map +1 -1
- package/dist/facade/display-view.js +5 -23
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.d.ts +3 -1
- package/dist/facade/expected-signal-setup.js +1 -1
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/expected-signal.d.ts +47 -14
- package/dist/facade/expected-signal.js +117 -112
- package/dist/facade/expected-signal.js.map +1 -1
- package/dist/facade/exposure-build-up.d.ts +70 -0
- package/dist/facade/exposure-build-up.js +164 -0
- package/dist/facade/exposure-build-up.js.map +1 -0
- package/dist/facade/fast-methods.js +9 -1
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/facade/generic-lens-capture.d.ts +2 -2
- package/dist/facade/generic-lens-capture.js +2 -2
- package/dist/facade/generic-lens-capture.js.map +1 -1
- package/dist/facade/image-plane-enable.d.ts +7 -0
- package/dist/facade/image-plane-enable.js +17 -0
- package/dist/facade/image-plane-enable.js.map +1 -0
- package/dist/facade/image-plane-lattice-data.d.ts +6 -0
- package/dist/facade/image-plane-lattice-data.js +10 -0
- package/dist/facade/image-plane-lattice-data.js.map +1 -0
- package/dist/facade/image-plane-support.d.ts +33 -0
- package/dist/facade/image-plane-support.js +11 -0
- package/dist/facade/image-plane-support.js.map +1 -0
- package/dist/facade/image-plane.d.ts +36 -0
- package/dist/facade/image-plane.js +353 -0
- package/dist/facade/image-plane.js.map +1 -0
- package/dist/facade/mixed-illumination.d.ts +108 -0
- package/dist/facade/mixed-illumination.js +174 -0
- package/dist/facade/mixed-illumination.js.map +1 -0
- package/dist/facade/representative-light-sources.d.ts +72 -0
- package/dist/facade/representative-light-sources.js +124 -0
- package/dist/facade/representative-light-sources.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +129 -4
- package/dist/facade/scene-radiance.js +48 -13
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +39 -10
- package/dist/facade/simulate-capture.js +252 -92
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.js +14 -6
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.d.ts +13 -1
- package/dist/gpu/chart-composite-gpu.js +48 -9
- package/dist/gpu/chart-composite-gpu.js.map +1 -1
- package/dist/gpu/chart-radiance-gpu.js +4 -30
- package/dist/gpu/chart-radiance-gpu.js.map +1 -1
- package/dist/gpu/display-view-composite-material-module.d.ts +10 -4
- package/dist/gpu/display-view-composite-material-module.js +39 -13
- package/dist/gpu/display-view-composite-material-module.js.map +1 -1
- package/dist/gpu/display-view-image-material-module.d.ts +86 -0
- package/dist/gpu/display-view-image-material-module.js +339 -0
- package/dist/gpu/display-view-image-material-module.js.map +1 -0
- package/dist/gpu/display-view-image-quality.d.ts +45 -0
- package/dist/gpu/display-view-image-quality.js +380 -0
- package/dist/gpu/display-view-image-quality.js.map +1 -0
- package/dist/gpu/display-view-quality-gpu.d.ts +67 -1
- package/dist/gpu/display-view-quality-gpu.js +136 -205
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.d.ts +51 -3
- package/dist/gpu/display-view-speed-gpu.js +131 -93
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +29 -15
- package/dist/gpu/wgsl-display-view-quality-kernel.js +58 -36
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +21 -6
- package/dist/gpu/wgsl-display-view-speed-kernel.js +46 -11
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/gpu/wgsl-exact-sum.d.ts +20 -0
- package/dist/gpu/wgsl-exact-sum.js +42 -0
- package/dist/gpu/wgsl-exact-sum.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/motion/subject-motion.d.ts +66 -0
- package/dist/motion/subject-motion.js +52 -0
- package/dist/motion/subject-motion.js.map +1 -0
- package/dist/optics/generic-lens-lateral-color.d.ts +83 -0
- package/dist/optics/generic-lens-lateral-color.js +77 -0
- package/dist/optics/generic-lens-lateral-color.js.map +1 -0
- package/dist/optics/generic-lens-psf.js +54 -46
- package/dist/optics/generic-lens-psf.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +7 -0
- package/dist/optics/lens-psf-profile.js +2 -1
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/output/developed-lens-corrections.d.ts +19 -5
- package/dist/output/developed-lens-corrections.js +28 -9
- package/dist/output/developed-lens-corrections.js.map +1 -1
- package/dist/output/generic-lens-corrections.d.ts +41 -5
- package/dist/output/generic-lens-corrections.js +52 -8
- package/dist/output/generic-lens-corrections.js.map +1 -1
- package/dist/output/print-plan.d.ts +41 -5
- package/dist/output/print-plan.js +59 -14
- package/dist/output/print-plan.js.map +1 -1
- package/dist/sensor/binomial-sample.d.ts +3 -0
- package/dist/sensor/binomial-sample.js +86 -0
- package/dist/sensor/binomial-sample.js.map +1 -0
- package/dist/sensor/sensor-characteristics.d.ts +10 -0
- package/dist/sensor/sensor-characteristics.js +20 -9
- package/dist/sensor/sensor-characteristics.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/API_REFERENCE.md +98 -1
- package/docs/QUICK_START.md +125 -0
- package/docs/USAGE.md +92 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/equipment-generic-lens-catalogue.md +10 -5
- package/docs/api/equipment-sensor-profile-body.md +64 -0
- package/docs/api/equipment-sensor-profiles.md +86 -0
- package/docs/api/exports.json +207 -2
- package/docs/api/facade-exposure-build-up.md +105 -0
- package/docs/api/facade-fast-methods.md +9 -1
- package/docs/api/facade-image-plane-enable.md +16 -0
- package/docs/api/facade-mixed-illumination.md +67 -0
- package/docs/api/facade-representative-light-sources.md +131 -0
- package/docs/api/facade-scene-radiance.md +54 -3
- package/docs/api/facade-simulate-capture.md +26 -6
- package/docs/api/motion-subject-motion.md +23 -0
- package/docs/api/optics-generic-lens-lateral-color.md +79 -0
- package/docs/api/output-developed-lens-corrections.md +10 -1
- package/docs/api/output-generic-lens-corrections.md +40 -4
- package/docs/api/output-print-plan.md +35 -1
- package/llms.txt +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expected-signal.js","sourceRoot":"","sources":["../../src/facade/expected-signal.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The tabulated expected signal (2.6 display view; #394 also the capture's tabulated RAW path): expected photo electrons of\n * real native sites for a still, rectilinear, distortion-free planar scene. Kept apart from display-view.ts so a bundle that\n * only captures does not contain the display view or the portable functions it uses (issue #380).\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { createSiteKernelRunsLattice, type SiteKernelRuns, type SiteKernelRunsLattice, type SiteKernelRunsRowPattern } from \"../optics/site-kernel-runs.js\";\n\n/** A query offset from a site centre in sites (+x right, +y down) and its weight (pixel-aperture node × filter spot). */\nexport interface DisplayViewQueryOffset { x: number; y: number; weight: number }\n\n/** Scene access for the expected signal: chart materials (fast tables) or a radiance function. */\nexport type DisplayViewScene =\n | { kind: \"materials\"; materialAt(u: number, v: number): number;\n /** Per material: `{ neutral: reflectance }` (radiance = reflectance × illuminant) or the spectral radiance at each node. */\n materials: readonly ({ neutral: number } | { radiance: Float64Array })[];\n /** Illuminant radiance of a perfect white diffuser at each spectral node: irradianceScale·shape(λ)/π. */\n whiteRadiance: Float64Array }\n | { kind: \"radiance\"; radianceAt(u: number, v: number, nm: number): number };\n\nexport interface DisplayViewExpectedSignalInput {\n nativeWidth: number;\n nativeHeight: number;\n /** Frame output width: plane coordinates are 2 / outputWidth frame units per site. */\n outputWidth: number;\n /** Spectral nodes and, per CFA channel (red, green, blue), the expected electrons per unit spectral radiance at each node. */\n wavelengthsNm: readonly number[];\n electronsPerRadiance: readonly [Float64Array, Float64Array, Float64Array];\n offsets: readonly DisplayViewQueryOffset[];\n /**\n * Diffraction and (#492) defocus: per-node kernels on the site lattice, (2R + 1)² taps in row-major order,\n * out(x) = Σ in(x − t)·K(t). With defocus each node's kernel is its diffraction kernel convolved with the disc, or the\n * disc itself without diffraction (expected-signal-setup.ts).\n */\n kernels?: { radius: number; perNode: readonly Float64Array[] };\n scene: DisplayViewScene;\n /** CFA channel index (0 red, 1 green, 2 blue) of native site (x, y). */\n channelAt(x: number, y: number): number;\n /**\n * Without kernels: the plane point (frame units) that the environment queries for offset `o` of native site (x, y),\n * computed with the environment's own arithmetic, so points that fall exactly on a chart boundary resolve to the same\n * material as in the capture. With kernels (diffraction or defocus) the facade's object-space convolution uses the\n * lattice formula, as here.\n */\n queryPoint?(x: number, y: number, offset: number, out: Float64Array): void;\n /**\n * #564: a defocus kernel D above the direct radius (64 sites), as runs. Each site's expected electrons are then\n * Σ_t D(t)·E_c(x − t, y − t), with E_c the expected electrons of channel c (the site's own) through `kernels` (each node's\n * diffraction kernel, or a unit tap for the lattice formula) at every native site position, convolved over the site\n * lattice by runs in fixed tiles (see {@link createDisplayViewExpectedSignal}). Requires `kernels`.\n */\n largeKernel?: SiteKernelRuns;\n}\n\n/** Expected photo electrons of real native sites. */\nexport interface DisplayViewExpectedSignal {\n /**\n * Starts a new cache window: native sites [x0, x1) × [y0, y1) that the following `site` calls mostly read. Sites and\n * scene lookups inside it are computed once; anything outside is computed without caching.\n */\n window(x0: number, y0: number, x1: number, y1: number): void;\n /** Expected photo electrons of native site (x, y) for its own CFA channel (x, y inside the native raster). */\n site(x: number, y: number): number;\n /** A cheap classifier value of the scene at plane point (u, v) frame units: the material, or the radiance at one node. */\n pilot(u: number, v: number): number;\n /** Scene lookups performed so far (material or radiance queries), for diagnostics. */\n readonly lookups: number;\n /**\n * The chart material that every kernel tap (without diffraction: every query point) of the last `site` call read, when\n * they all read one material (its value is then a function of that material and the site's CFA channel only); −1 when\n * unknown or mixed.\n */\n readonly uniformMaterial: number;\n /**\n * Whether `uniformMaterial` is tracked in the current window (otherwise it is not meaningful): chart materials in a\n * filled window or, without diffraction, in a window the direct ring serves (#444); never for radiance scenes.\n */\n readonly tracksMaterial: boolean;\n /**\n * Whether the current window caches its sites: a second `site` call for a site inside the window then returns the stored\n * value without any work or lookup (#392).\n */\n readonly cachesSites: boolean;\n /**\n * Whether `markReads` is available in the current window: a filled window (chart materials with diffraction kernels),\n * whose lookup count comes from the sites it computed. False otherwise: for windows without kernels (whose sites the\n * direct ring already serves cheaply) and for the lazy window caches (radiance scenes with diffraction), whose count\n * depends on the lattice points each computed site reads.\n */\n readonly marksReads: boolean;\n /**\n * Records `count` sites as read in the current window without computing them: site n at (xs[n], ys[n]) with value values[n]\n * (as `site` returned it for that site) and uniform material materials[n] (as `uniformMaterial` reported it). Sites outside\n * the window and sites the window already holds are skipped. For the window's lookup count and for later `site` calls this\n * is the same as reading each site with `site`. Only valid while `marksReads` is true; it must do for a site the\n * bookkeeping `site` does for a site the window's cache does not hold yet.\n */\n markReads(xs: Int32Array, ys: Int32Array, values: Float64Array, materials: Int32Array, count: number): void;\n}\n\nconst OFFSET_TOLERANCE = 1e-9;\n/** Largest cache window, in sites or lattice points; larger windows are evaluated without caching. */\nconst CACHE_LIMIT = 1 << 22;\n/** Largest band of looked-up lattice materials per group, in lattice points (a band that would be larger restarts at the window). */\nconst BAND_LIMIT = 1 << 22;\n/**\n * Lattice-row ring (refinement windows): rows kept per group, the tallest band that uses it, and the columns kept beyond each\n * raster edge (kernel radius, demosaic reach and query offsets; columns beyond it are looked up directly).\n */\nconst LATTICE_RING_ROWS = 128, LATTICE_RING_MAXIMUM_BAND_ROWS = 64, LATTICE_RING_MARGIN = 64;\n\n/**\n * The tables of `createDisplayViewExpectedSignal` (see there) that are a function of the input's numbers alone: the materials,\n * the lattice groups' geometry and combined kernels, and the per-material sums. Written only while they are built, never after:\n * they are shared by every render of an input and, for chart materials, by every input of the same content (#449). Everything a\n * render changes (each group's window cache and its origin and size, the bands, rings and counts) lives in the render.\n */\nexport interface SignalTables {\n readonly reflectance: Float64Array; readonly spectralIndex: Int32Array; readonly spectral: readonly Float64Array[]; readonly groups: readonly GroupTables[];\n readonly neutralDirect: readonly number[]; readonly spectralDirect: readonly (readonly number[])[]; readonly uniformSite: readonly Float64Array[];\n}\n/** A lattice group's fixed part: its fractional shift, members, index bounds, rectangle and combined kernels. */\nexport interface GroupTables { fx: number; fy: number; members: { ix: number; iy: number; weight: number }[]; minIx: number; maxIx: number; minIy: number; maxIy: number;\n cw: number; ch: number; neutral: Float64Array[]; spectral: Float64Array[][]; perNode: Float64Array[][] }\n/** A render's lattice group: the fixed part and its own window cache (lattice points [cx0, cx0 + cpw) × [cy0, cy0 + cph)). */\ninterface Group extends GroupTables { cache: Int32Array | Float64Array; cx0: number; cy0: number; cpw: number; cph: number }\n/** Per input object: the tables, and the filled path's lattice material rings per group (created on first use), which depend on its `materialAt` and raster. */\ninterface PreparedSignal { tables: SignalTables; rings: ({ width: number; material: Int16Array | Int32Array; rowId: Int32Array } | undefined)[] }\nconst PREPARED = new WeakMap<DisplayViewExpectedSignalInput, PreparedSignal>();\n\n/** Chart-material tables kept by content across input objects (#449), least recently used first. */\nexport const EXPECTED_SIGNAL_TABLE_CACHE_SIZE = 4;\nconst tableCache: { signature: Uint32Array; tables: SignalTables }[] = [];\nlet tableBuilds = 0, tableHits = 0;\n\n/** Internal test hook: the kept table entries, and the tables built and found by content so far. */\nexport function expectedSignalTableCacheState(): { size: number; builds: number; hits: number } { return { size: tableCache.length, builds: tableBuilds, hits: tableHits }; }\n/** Internal test hook: forgets the tables kept by content (inputs already prepared keep theirs). */\nexport function clearExpectedSignalTableCache(): void { tableCache.length = 0; }\n\n/**\n * Every number the tables read, with the lengths that delimit them, as the bits of doubles (so -0, NaN and every digit are kept\n * apart): the spectral nodes, the three channel responses, the offsets, the kernel radius and taps, each material's reflectance or\n * radiance, and the white radiance. Undefined for radiance scenes, whose tables are not kept by content.\n */\nfunction tableSignature(input: DisplayViewExpectedSignalInput): Uint32Array | undefined {\n const scene = input.scene;\n if (scene.kind !== \"materials\") return undefined;\n const values: number[] = [];\n const push = (a: ArrayLike<number>): void => { values.push(a.length); for (let i = 0; i < a.length; i++) values.push(a[i]!); };\n push(input.wavelengthsNm);\n values.push(input.electronsPerRadiance.length);\n for (const a of input.electronsPerRadiance) push(a);\n values.push(input.offsets.length);\n for (const o of input.offsets) values.push(o.x, o.y, o.weight);\n if (input.kernels) { values.push(1, input.kernels.radius, input.kernels.perNode.length); for (const k of input.kernels.perNode) push(k); } else values.push(0);\n values.push(scene.materials.length);\n for (const m of scene.materials) if (\"neutral\" in m) values.push(0, m.neutral); else { values.push(1); push(m.radiance); }\n push(scene.whiteRadiance);\n return new Uint32Array(Float64Array.from(values).buffer);\n}\n\nfunction sameBits(a: Uint32Array, b: Uint32Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction prepareSignal(input: DisplayViewExpectedSignalInput): PreparedSignal {\n const signature = tableSignature(input);\n let tables: SignalTables | undefined;\n if (signature) {\n const at = tableCache.findIndex((entry) => sameBits(entry.signature, signature));\n if (at >= 0) { const [entry] = tableCache.splice(at, 1); tableCache.push(entry!); tables = entry!.tables; tableHits++; }\n }\n if (!tables) {\n tables = buildTables(input);\n tableBuilds++;\n if (signature) { tableCache.push({ signature, tables }); while (tableCache.length > EXPECTED_SIGNAL_TABLE_CACHE_SIZE) tableCache.shift(); }\n }\n const prepared: PreparedSignal = { tables, rings: tables.groups.map(() => undefined) };\n PREPARED.set(input, prepared);\n return prepared;\n}\n\n/**\n * Internal (#479): the read-only tables of an input (the ones `createDisplayViewExpectedSignal` reads), for the GPU display view,\n * which uploads the combined kernels and per-material sums the reference forms in float64. Prepared and cached as a render\n * prepares them, so a GPU render of an input and a CPU render read the same doubles.\n */\nexport function displayViewSignalTables(input: DisplayViewExpectedSignalInput): SignalTables {\n return (PREPARED.get(input) ?? prepareSignal(input)).tables;\n}\n\n/**\n * Internal (#569): the tables of an input, built without the content cache (the display view's lens PSF builds one per field zone,\n * which would only evict the view's own entries).\n */\nexport function buildTables(input: DisplayViewExpectedSignalInput): SignalTables {\n const nodes = input.wavelengthsNm.length, R = input.kernels ? input.kernels.radius : 0, size = 2 * R + 1;\n const A = input.electronsPerRadiance, scene = input.scene, offsets = input.offsets;\n const kernelAt = (node: number, t: number): number => (input.kernels ? input.kernels.perNode[node]![t]! : 1);\n // Materials: neutral ones by reflectance, spectral ones by index.\n let reflectance = new Float64Array(0), spectralIndex = new Int32Array(0);\n const spectral: Float64Array[] = [];\n if (scene.kind === \"materials\") {\n reflectance = new Float64Array(scene.materials.length); spectralIndex = new Int32Array(scene.materials.length).fill(-1);\n // A copy of each spectral radiance: the tables may outlive the input and serve other inputs of the same content.\n scene.materials.forEach((m, index) => { if (\"neutral\" in m) reflectance[index] = m.neutral; else { spectralIndex[index] = spectral.length; spectral.push(Float64Array.from(m.radiance)); } });\n }\n // Offsets grouped by fractional shift: offsets that differ by whole sites share one lattice.\n const frac = (v: number): number => { const f = v - Math.floor(v); return f > 1 - OFFSET_TOLERANCE || f < OFFSET_TOLERANCE ? 0 : f; };\n const groups: GroupTables[] = [];\n for (const o of offsets) {\n const fx = frac(o.x), fy = frac(o.y), ix = Math.round(o.x - fx), iy = Math.round(o.y - fy);\n let group = groups.find((q) => Math.abs(q.fx - fx) <= OFFSET_TOLERANCE && Math.abs(q.fy - fy) <= OFFSET_TOLERANCE);\n if (!group) { group = { fx, fy, members: [], minIx: ix, maxIx: ix, minIy: iy, maxIy: iy, cw: 0, ch: 0, neutral: [], spectral: [], perNode: [] }; groups.push(group); }\n group.members.push({ ix, iy, weight: o.weight });\n group.minIx = Math.min(group.minIx, ix); group.maxIx = Math.max(group.maxIx, ix); group.minIy = Math.min(group.minIy, iy); group.maxIy = Math.max(group.maxIy, iy);\n }\n if (input.kernels) for (const group of groups) {\n // Combined kernel over lattice offsets d = (ix − tu, iy − tv), stored at (d − min + R).\n const cw = group.maxIx - group.minIx + size, ch = group.maxIy - group.minIy + size;\n group.cw = cw; group.ch = ch;\n const combine = (value: (c: number, node: number, t: number) => number): Float64Array[] => [0, 1, 2].map((c) => {\n const out = new Float64Array(cw * ch);\n for (const member of group.members) for (let tv = -R, t = 0; tv <= R; tv++) for (let tu = -R; tu <= R; tu++, t++) {\n let sum = 0;\n for (let n = 0; n < nodes; n++) sum += value(c, n, t);\n const index = (member.iy - tv - group.minIy + R) * cw + (member.ix - tu - group.minIx + R);\n out[index] = out[index]! + member.weight * sum;\n }\n return out;\n });\n if (scene.kind === \"materials\") {\n group.neutral = combine((c, n, t) => A[c]![n]! * kernelAt(n, t) * scene.whiteRadiance[n]!);\n const perMaterial = spectral.map((radiance) => combine((c, n, t) => A[c]![n]! * kernelAt(n, t) * radiance[n]!));\n group.spectral = [0, 1, 2].map((c) => perMaterial.map((tables) => tables[c]!));\n } else {\n // Radiance scenes: combined kernels per node, applied to the cached radiance at each node.\n group.perNode = Array.from({ length: nodes }, (_, n) => combine((c, node, t) => (node === n ? A[c]![n]! * kernelAt(n, t) : 0)));\n }\n }\n // Neutral tap-0 signal per channel and spectral per material, for the direct (no-kernel) path.\n const neutralDirect = scene.kind === \"materials\" ? [0, 1, 2].map((c) => { let s = 0; for (let n = 0; n < nodes; n++) s += A[c]![n]! * scene.whiteRadiance[n]!; return s; }) : [];\n const spectralDirect = [0, 1, 2].map((c) => spectral.map((radiance) => { let s = 0; for (let n = 0; n < nodes; n++) s += A[c]![n]! * radiance[n]!; return s; }));\n const uniformSite = scene.kind === \"materials\" && input.kernels ? [0, 1, 2].map((c) => Float64Array.from(scene.materials, (_, m) => {\n const si = spectralIndex[m]!;\n let sum = 0;\n for (const group of groups) {\n const nk = group.neutral[c]!, sk = si < 0 ? nk : group.spectral[c]![si]!;\n for (let t = 0; t < group.cw * group.ch; t++) sum += si < 0 ? reflectance[m]! * nk[t]! : sk[t]!;\n }\n return sum;\n })) : [];\n // Frozen records: a render copies each group before it gives it a window (see createDisplayViewExpectedSignal).\n for (const group of groups) Object.freeze(group);\n return Object.freeze({ reflectance, spectralIndex, spectral, groups, neutralDirect, spectralDirect, uniformSite });\n}\n\n/**\n * Expected photo electrons per site: μ_c(i, j) = Σ_o w_o Σ_λ A_c(λ) Σ_t K_λ(t)·L(p_o(i, j) − t, λ), where p_o is the\n * query point of offset o and K the diffraction kernel (a single unit tap without diffraction). This is the sum the\n * facade's environment chain forms for a still, rectilinear, distortion-free planar scene, where the\n * radiance-to-irradiance factor is the same at every site (docs/DISPLAY_VIEW.md, \"Expected signal\").\n *\n * With diffraction, offsets that share a fractional shift read one lattice, and their kernels are combined in advance:\n * C_c(d) = Σ_members w·Σ_λ A_c(λ)·K_λ(t)·L(λ) over the taps t that reach lattice offset d. A neutral material's radiance\n * is its reflectance times the white radiance, so all neutral materials share one combined kernel per channel.\n *\n * `spanColumns`: how many native columns the render's windows move across beyond one window's width (a filled band is never\n * built wider). Only a speed hint: a window past it rebuilds its band, with the same values.\n */\nexport function createDisplayViewExpectedSignal(input: DisplayViewExpectedSignalInput, spanColumns = Infinity): DisplayViewExpectedSignal {\n if (input.largeKernel) return createLargeKernelSignal(input);\n const W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth, nodes = input.wavelengthsNm.length;\n const R = input.kernels ? input.kernels.radius : 0;\n if (input.kernels && input.kernels.perNode.length !== nodes) throw new InvalidConfigurationError(\"Display view kernels must match the spectral nodes.\");\n if (!input.kernels && !input.queryPoint) throw new InvalidConfigurationError(\"Display view needs the environment query points without diffraction.\");\n const A = input.electronsPerRadiance, scene = input.scene, offsets = input.offsets, channelAt = input.channelAt;\n // The request's tables (materials, lattice groups, combined kernels, per-material sums) are the same for every render of a\n // prepared view, which passes the same input object: computed once per input. Each render gets its own groups' window caches.\n // Chart-material tables are also shared by inputs of the same content (#449): each render gets its own groups' window state.\n const prepared = PREPARED.get(input) ?? prepareSignal(input);\n const { reflectance, spectralIndex, spectral, neutralDirect, spectralDirect, uniformSite } = prepared.tables;\n const groups: Group[] = prepared.tables.groups.map((group) => ({ ...group, cache: new Int32Array(0), cx0: 0, cy0: 0, cpw: 0, cph: 0 }));\n let lookups = 0;\n const point = new Float64Array(2);\n const materialSignalDirect = (m: number, c: number): number => {\n const si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n return si < 0 ? reflectance[m]! * neutralDirect[c]! : spectralDirect[c]![si]!;\n };\n /**\n * Without diffraction: one site from the environment's own query points. Also sets lastMaterial: the chart material every\n * query point read, or −1 when they read more than one (or the scene is a radiance scene). A site whose points all read\n * material m sums the same operands in the same order as every other such site of its channel, so it holds the same value.\n */\n function directSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0, uniform = -1;\n for (let o = 0; o < offsets.length; o++) {\n input.queryPoint!(x, y, o, point);\n let value: number;\n if (scene.kind === \"materials\") {\n const m = scene.materialAt(point[0]!, point[1]!);\n uniform = o === 0 || uniform === m ? m : -2;\n value = materialSignalDirect(m, c); lookups++;\n } else { value = 0; for (let n = 0; n < nodes; n++) value += A[c]![n]! * scene.radianceAt(point[0]!, point[1]!, input.wavelengthsNm[n]!); lookups += nodes; }\n sum += offsets[o]!.weight * value;\n }\n lastMaterial = uniform < 0 ? -1 : uniform;\n return sum;\n }\n // Lattice point (p, q) of a group: the facade's lattice formula (createDiffractedPlanarProvider).\n const latticeU = (group: Group, p: number): number => (group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g);\n const latticeV = (group: Group, q: number): number => (group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g);\n const radianceScratch = new Float64Array(nodes);\n /** Material (or radiance at each node, into radianceScratch) of a group's lattice point, from the window cache when it holds it. */\n function latticeMaterial(group: Group, p: number, q: number): number {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph;\n if (cached) { const m = group.cache[j * group.cpw + i]!; if (m >= 0) return m; }\n const m = (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p), latticeV(group, q));\n lookups++;\n if (cached) group.cache[j * group.cpw + i] = m;\n return m;\n }\n function latticeRadiance(group: Group, p: number, q: number): Float64Array {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph, cache = group.cache as Float64Array;\n if (cached && !Number.isNaN(cache[(j * group.cpw + i) * nodes]!)) { for (let n = 0; n < nodes; n++) radianceScratch[n] = cache[(j * group.cpw + i) * nodes + n]!; return radianceScratch; }\n const u = latticeU(group, p), v = latticeV(group, q);\n for (let n = 0; n < nodes; n++) radianceScratch[n] = (scene as Extract<DisplayViewScene, { kind: \"radiance\" }>).radianceAt(u, v, input.wavelengthsNm[n]!);\n lookups += nodes;\n if (cached) for (let n = 0; n < nodes; n++) cache[(j * group.cpw + i) * nodes + n] = radianceScratch[n]!;\n return radianceScratch;\n }\n /** With diffraction: one site through the combined kernels on each group's lattice. */\n function kernelSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0;\n for (const group of groups) {\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, cw = group.cw, ch = group.ch;\n if (scene.kind === \"materials\") {\n const nk = group.neutral[c]!, sk = group.spectral[c]!;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const m = latticeMaterial(group, p0 + dx, q0 + dy), si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n sum += si < 0 ? reflectance[m]! * nk[dy * cw + dx]! : sk[si]![dy * cw + dx]!;\n }\n } else {\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const radiance = latticeRadiance(group, p0 + dx, q0 + dy);\n for (let n = 0; n < nodes; n++) sum += group.perNode[n]![c]![dy * cw + dx]! * radiance[n]!;\n }\n }\n }\n return sum;\n }\n // Filled windows (chart materials with diffraction, every lattice point of the window cacheable): each group keeps a band of\n // looked-up lattice materials that covers the window's rows and grows to the right as the windows of a display row move\n // right, with summed-area tables of material changes. A site whose kernel reads one material only (each group's rectangle\n // uniform, the same material in all) takes the value of the same sum over that material, precomputed below in the same\n // order; other sites run the same sum from the band. Either way each site's value is the same sequence of operations as\n // kernelSite, so it is bit-identical. The scene lookup count stays the count kernelSite's lazy window cache makes (each\n // cache point a computed site reads counts once per window, points outside the cache once per read): the rectangles of\n // the sites computed in a window are counted when the window closes (windowLookups).\n const allNeutral = spectral.length === 0;\n /**\n * A group's band: lattice rows [y0, y0 + rows), columns [x0, x0 + filled) looked up, row stride `capacity`. `material`,\n * `reflectance` (neutral-only charts) and the summed-area tables of left changes (`changeLeft`, 1 where a point's material\n * differs from its left neighbour's) and upper changes (`changeUp`), (rows + 1) × (capacity + 1).\n */\n interface Band { x0: number; y0: number; rows: number; capacity: number; filled: number; material: Int32Array; reflectance: Float64Array; changeLeft: Int32Array; changeUp: Int32Array; v: Float64Array }\n const bands: Band[] = groups.map(() => ({ x0: 0, y0: 0, rows: 0, capacity: 0, filled: 0, material: new Int32Array(0), reflectance: new Float64Array(0),\n changeLeft: new Int32Array(0), changeUp: new Int32Array(0), v: new Float64Array(0) }));\n // Lattice rows of material indices per group, kept across windows (filled windows only): rows LATTICE_RING_ROWS apart share a\n // slot; columns from −LATTICE_RING_MARGIN. Int16 when every index fits (about 3 MB for four groups of a 6000-site row). A\n // lattice point's material depends only on the input, so the rings are kept per input object, across its renders (not with\n // the tables kept by content: they depend on `materialAt` and the raster).\n const ringWide = scene.kind === \"materials\" && scene.materials.length <= 32767;\n const rings = prepared.rings;\n function latticeRing(g: number): { width: number; material: Int16Array | Int32Array; rowId: Int32Array } {\n let ring = rings[g];\n if (!ring) {\n const width = W + 2 * LATTICE_RING_MARGIN, size = LATTICE_RING_ROWS * width;\n ring = rings[g] = { width, material: ringWide ? new Int16Array(size) : new Int32Array(size), rowId: new Int32Array(LATTICE_RING_ROWS).fill(-2147483648) };\n }\n return ring;\n }\n /** Makes the band of group g cover lattice columns [x0, x1) of rows [y0, y0 + rows), extending it to the right when it can. */\n function coverBand(g: number, x0: number, x1: number, y0: number, rows: number): void {\n const group = groups[g]!, band = bands[g]!, materials = scene as Extract<DisplayViewScene, { kind: \"materials\" }>;\n if (!(y0 >= band.y0 && y0 + rows <= band.y0 + band.rows && x0 >= band.x0 && x1 - band.x0 <= band.capacity)) {\n // A band with the ring is built twice as tall, so the next display rows' windows (a few lattice rows lower) reuse its\n // filled columns; a lattice point's material and the change counts inside a rectangle do not depend on the band's origin.\n if (rows <= LATTICE_RING_MAXIMUM_BAND_ROWS) rows *= 2;\n const capacity = Math.max(x1 - x0, Math.min(Math.floor(BAND_LIMIT / rows), W + 2 * (x1 - x0), spanColumns + x1 - x0));\n const size = rows * capacity, tables = (rows + 1) * (capacity + 1);\n band.x0 = x0; band.y0 = y0; band.rows = rows; band.capacity = capacity; band.filled = 0;\n if (band.material.length < size) { band.material = new Int32Array(size); band.reflectance = new Float64Array(allNeutral ? size : 0); }\n if (band.changeLeft.length < tables) { band.changeLeft = new Int32Array(tables); band.changeUp = new Int32Array(tables); }\n band.changeLeft.fill(0, 0, capacity + 1); band.changeUp.fill(0, 0, capacity + 1);\n for (let j = 0; j < rows; j++) { band.changeLeft[(j + 1) * (capacity + 1)] = 0; band.changeUp[(j + 1) * (capacity + 1)] = 0; }\n if (band.v.length < rows) band.v = new Float64Array(rows);\n for (let j = 0; j < rows; j++) band.v[j] = latticeV(group, y0 + j);\n }\n const stride = band.capacity, S1 = stride + 1, material = band.material, left = band.changeLeft, up = band.changeUp;\n rows = band.rows; y0 = band.y0;\n const ring = rows <= 2 * LATTICE_RING_MAXIMUM_BAND_ROWS ? latticeRing(g) : undefined;\n for (let i = band.filled; i < x1 - band.x0; i++) {\n const p = band.x0 + i, u = latticeU(group, p), column = p + LATTICE_RING_MARGIN;\n for (let j = 0; j < rows; j++) {\n let m: number;\n if (ring && column >= 0 && column < ring.width) {\n // A lattice point's material is a function of the point alone, so one looked up for an earlier window (the rows a\n // display row shares with the next) is the same material; the ring only spares the repeated lookup.\n const q = y0 + j, slot = q & (LATTICE_RING_ROWS - 1), index = slot * ring.width + column;\n if (ring.rowId[slot] !== q) { ring.rowId[slot] = q; ring.material.fill(-1, slot * ring.width, (slot + 1) * ring.width); }\n m = ring.material[index]!;\n if (m < 0) { m = materials.materialAt(u, band.v[j]!); ring.material[index] = m; }\n } else m = materials.materialAt(u, band.v[j]!);\n if (spectralIndex[m] === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n material[j * stride + i] = m;\n if (allNeutral) band.reflectance[j * stride + i] = reflectance[m]!;\n const changedLeft = i > 0 && material[j * stride + i - 1] !== m ? 1 : 0, changedUp = j > 0 && material[(j - 1) * stride + i] !== m ? 1 : 0;\n left[(j + 1) * S1 + i + 1] = left[j * S1 + i + 1]! + left[(j + 1) * S1 + i]! - left[j * S1 + i]! + changedLeft;\n up[(j + 1) * S1 + i + 1] = up[j * S1 + i + 1]! + up[(j + 1) * S1 + i]! - up[j * S1 + i]! + changedUp;\n }\n }\n band.filled = Math.max(band.filled, x1 - band.x0);\n }\n const rectSum = (sat: Int32Array, S1: number, i0: number, j0: number, i1: number, j1: number): number =>\n sat[j1 * S1 + i1]! - sat[j0 * S1 + i1]! - sat[j1 * S1 + i0]! + sat[j0 * S1 + i0]!;\n let filled = false;\n /** Sites outside the site window computed in this window (x, y pairs in window coordinates); their rectangles count when the window closes. */\n let outsideSites: number[] = [];\n let marks = new Uint8Array(0), cover = new Uint8Array(0);\n /** A site of a filled window: (i, j) are its coordinates in the site window, inside or outside it. */\n function filledSite(x: number, y: number, i: number, j: number): number {\n const c = channelAt(x, y), inside = i >= 0 && j >= 0 && i < sw && j < sh;\n if (inside) {\n let m = -1;\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, S1 = band.capacity + 1, bi = x + group.minIx - R - band.x0, bj = y + group.minIy - R - band.y0;\n if (rectSum(band.changeLeft, S1, bi + 1, bj, bi + group.cw, bj + group.ch) !== 0 || rectSum(band.changeUp, S1, bi, bj + 1, bi + group.cw, bj + group.ch) !== 0) { m = -2; break; }\n const own = band.material[bj * band.capacity + bi]!;\n if (m === -1) m = own; else if (own !== m) { m = -2; break; }\n }\n if (m >= 0) { lastMaterial = m; return uniformSite[c]![m]!; }\n }\n lastMaterial = -1;\n let sum = 0;\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, cw = group.cw, ch = group.ch, nk = group.neutral[c]!, sk = group.spectral[c]!, stride = band.capacity;\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, bi = p0 - band.x0, bj = q0 - band.y0;\n if (inside && allNeutral) {\n const refl = band.reflectance;\n for (let dy = 0, t = 0; dy < ch; dy++) {\n const row = (bj + dy) * stride + bi;\n for (let dx = 0; dx < cw; dx++, t++) sum += refl[row + dx]! * nk[t]!;\n }\n } else if (inside) {\n const material = band.material;\n for (let dy = 0, t = 0; dy < ch; dy++) {\n const row = (bj + dy) * stride + bi;\n for (let dx = 0; dx < cw; dx++, t++) {\n const m = material[row + dx]!, si = spectralIndex[m]!;\n sum += si < 0 ? reflectance[m]! * nk[t]! : sk[si]![t]!;\n }\n }\n } else {\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const ci = i + dx, cj = j + dy;\n let m: number;\n if (ci >= 0 && cj >= 0 && ci < group.cpw && cj < group.cph) m = band.material[(bj + dy) * stride + bi + dx]!;\n else m = (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p0 + dx), latticeV(group, q0 + dy));\n const si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n sum += si < 0 ? reflectance[m]! * nk[dy * cw + dx]! : sk[si]![dy * cw + dx]!;\n }\n }\n }\n return sum;\n }\n /** Lattice points of an outside site's rectangles that lie outside the window caches (kernelSite looks these up on every read). */\n function outsideLookups(i: number, j: number): number {\n let count = 0;\n for (const group of groups) {\n const w = Math.max(0, Math.min(i + group.cw, group.cpw) - Math.max(i, 0)), h = Math.max(0, Math.min(j + group.ch, group.cph) - Math.max(j, 0));\n count += group.cw * group.ch - w * h;\n }\n return count;\n }\n // Site values of filled windows persist across windows (a site's value does not depend on the window): rows of native\n // sites in a ring of a power-of-two number of rows, row y in slot y mod ringRows. The window's site cache still holds the\n // sites read in the window, which is also what its lookup count needs.\n let ringRows = 0, ringOn = false, ring = new Float64Array(0), ringMaterial = new Int32Array(0), ringRowId = new Int32Array(0), windowMaterial = new Int32Array(0), lastMaterial = -1;\n /** A filled-window site read outside the site window: counted as kernelSite counts it. */\n function outsideRead(i: number, j: number): void { lookups += outsideLookups(i, j); outsideSites.push(i, j); }\n /** A site from the ring; on a miss (re)claims the row's slot when another row holds it, computes the site and stores it. */\n function ringRead(x: number, y: number, i: number, j: number): number {\n const slot = y & (ringRows - 1), q = slot * W + x;\n if (ringRowId[slot] === y) { const v = ring[q]!; if (v === v) { lastMaterial = ringMaterial[q]!; return v; } }\n else { ringRowId[slot] = y; ring.fill(NaN, slot * W, (slot + 1) * W); }\n const v = filledSite(x, y, i, j);\n ring[q] = v; ringMaterial[q] = lastMaterial;\n return v;\n }\n // Without diffraction (#392): site values persist across windows the same way, in their own ring (a site's value does not\n // depend on the window). A ring hit counts the lookups directSite would have made, so `lookups` is unchanged. The site's\n // material (directSite's lastMaterial) is kept beside its value, so the display view's one-material memo applies (#444).\n let directRows = 0, directOn = false, directRing = new Float64Array(0), directRowId = new Int32Array(0), directRingMaterial = new Int32Array(0);\n const directLookups = offsets.length * (scene.kind === \"materials\" ? 1 : nodes);\n function directRead(x: number, y: number): number {\n const slot = y & (directRows - 1), q = slot * W + x;\n if (directRowId[slot] === y) { const v = directRing[q]!; if (v === v) { lookups += directLookups; lastMaterial = directRingMaterial[q]!; return v; } }\n else { directRowId[slot] = y; directRing.fill(NaN, slot * W, (slot + 1) * W); }\n const v = directSite(x, y);\n directRing[q] = v; directRingMaterial[q] = lastMaterial;\n return v;\n }\n /** A site not in the window's site cache: from a ring, a filled window without the ring, the lazy window caches, or uncached. */\n function siteMiss(x: number, y: number, i: number, j: number, cached: boolean): number {\n if (directOn) {\n const v = directRead(x, y);\n if (cached) { siteCache[j * sw + i] = v; windowMaterial[j * sw + i] = lastMaterial; }\n return v;\n }\n if (ringOn) {\n if (!cached) { outsideRead(i, j); return ringRead(x, y, i, j); }\n const v = ringRead(x, y, i, j);\n siteCache[j * sw + i] = v; windowMaterial[j * sw + i] = lastMaterial; markFilled(i, j);\n return v;\n }\n if (filled && !cached) outsideRead(i, j);\n const v = filled ? filledSite(x, y, i, j) : input.kernels ? kernelSite(x, y) : directSite(x, y);\n if (cached) { siteCache[j * sw + i] = v; if (filled) markFilled(i, j); }\n return v;\n }\n /**\n * Lattice points of the closing window that kernelSite's lazy cache would have looked up: per group, the window cache points\n * covered by the rectangles of the computed sites (the site cache's filled entries and the outside sites), a box dilation.\n * A group's count depends only on the computed sites and its geometry (cw, ch, cpw, cph), so a group shaped like an\n * earlier one takes that group's count (the app's Quality groups all have one shape).\n */\n const groupTotals = new Float64Array(groups.length);\n function sameGeometry(g: number): number {\n const group = groups[g]!;\n for (let h = 0; h < g; h++) { const o = groups[h]!; if (o.cw === group.cw && o.ch === group.ch && o.cpw === group.cpw && o.cph === group.cph) return h; }\n return -1;\n }\n function windowLookups(): number {\n let total = 0;\n if (outsideSites.length === 0 && filledCount === 0) return 0;\n if (outsideSites.length === 0 && filledCount === sw * sh) {\n // Every site computed (each once) and none outside: the marks at (i + cw − 1, j + ch − 1) cover cache columns\n // 0 … sw + cw − 2 and rows 0 … sh + ch − 2, the whole cpw × cph cache of every group.\n for (const group of groups) total += group.cpw * group.cph;\n return total;\n }\n if (outsideSites.length === 0 && sw <= 31) {\n // Computed sites as a bit mask per window row. Cache point (ci, cj) is covered when a computed site (i, j) has\n // i ≤ ci < i + cw and j ≤ cj < j + ch; a union of dilations is the dilation of the union, so per cache row the\n // covered columns are the dilation of the OR of the masks of window rows cj − ch + 1 … cj. That OR is a prefix OR\n // when the rows start at fy0 and a suffix OR when they end at fy1 (OR is associative and commutative).\n if (prefixOr.length < sh) { prefixOr = new Int32Array(sh); suffixOr = new Int32Array(sh); }\n for (let j = fy0, m = 0; j <= fy1; j++) { m |= rowMask[j]!; prefixOr[j] = m; }\n for (let j = fy1, m = 0; j >= fy0; j--) { m |= rowMask[j]!; suffixOr[j] = m; }\n for (let g = 0; g < groups.length; g++) {\n const same = sameGeometry(g);\n if (same >= 0) { total += groupTotals[same]!; groupTotals[g] = groupTotals[same]!; continue; }\n const group = groups[g]!, cw = group.cw, ch = group.ch, cpw = group.cpw, cph = group.cph, last = Math.min(cph - 1, fy1 + ch - 1), before = total;\n let previous = -1, width = 0;\n for (let cj = fy0; cj <= last; cj++) {\n let m = 0;\n const a = Math.max(fy0, cj - ch + 1), b = Math.min(fy1, cj);\n if (a === fy0) m = prefixOr[b]!; else if (b === fy1) m = suffixOr[a]!;\n else for (let j = a; j <= b; j++) m |= rowMask[j]!;\n if (m !== previous) {\n previous = m; width = 0;\n let end = -1;\n for (let i = 0; m >>> i !== 0; i++) {\n if (((m >>> i) & 1) === 0) continue;\n const to = Math.min(i + cw - 1, cpw - 1);\n if (i > end) width += to - i + 1; else if (to > end) width += to - end;\n if (to > end) end = to;\n }\n }\n total += width;\n }\n groupTotals[g] = total - before;\n }\n return total;\n }\n for (let g = 0; g < groups.length; g++) {\n // The marks are the computed sites shifted by (cw − 1, ch − 1), so the count depends on the group's geometry only.\n const same = sameGeometry(g);\n if (same >= 0) { total += groupTotals[same]!; groupTotals[g] = groupTotals[same]!; continue; }\n const group = groups[g]!, cw = group.cw, ch = group.ch, cpw = group.cpw, cph = group.cph, ew = cpw + cw - 1, eh = cph + ch - 1, before = total;\n groupTotals[g] = 0;\n // Top-left marks in extended coordinates (window coordinates + (cw − 1, ch − 1)), and their bounding box.\n if (marks.length < ew * eh) { marks = new Uint8Array(ew * eh); }\n let x0 = ew, x1 = -1, y0 = eh, y1 = -1;\n const mark = (ei: number, ej: number): void => {\n if (ei < 0 || ej < 0 || ei >= ew || ej >= eh) return;\n marks[ej * ew + ei] = 1;\n if (ei < x0) x0 = ei; if (ei > x1) x1 = ei; if (ej < y0) y0 = ej; if (ej > y1) y1 = ej;\n };\n for (let j = 0; j < sh; j++) for (let i = 0; i < sw; i++) if (!Number.isNaN(siteCache[j * sw + i]!)) mark(i + cw - 1, j + ch - 1);\n for (let k = 0; k < outsideSites.length; k += 2) mark(outsideSites[k]! + cw - 1, outsideSites[k + 1]! + ch - 1);\n if (x1 < 0) continue;\n // Cache point (i, j) is covered when a mark lies in extended columns [i, i + cw) and rows [j, j + ch): a horizontal\n // then a vertical running count over the marks' box (outside it nothing is covered).\n const i0 = Math.max(0, x0 - cw + 1), i1 = Math.min(cpw - 1, x1), cwid = i1 - i0 + 1;\n if (cover.length < cwid * (y1 - y0 + 1)) cover = new Uint8Array(cwid * (y1 - y0 + 1));\n for (let r = y0; r <= y1; r++) {\n let run = 0;\n for (let e = i0; e <= i1 + cw - 1; e++) {\n run += marks[r * ew + e]!;\n if (e - cw >= i0) run -= marks[r * ew + e - cw]!;\n if (e >= i0 + cw - 1) cover[(r - y0) * cwid + e - cw + 1 - i0] = run > 0 ? 1 : 0;\n }\n marks.fill(0, r * ew + x0, r * ew + x1 + 1);\n }\n for (let i = 0; i < cwid; i++) {\n let run = 0;\n for (let r = y0; r <= y1 + ch - 1; r++) {\n if (r <= y1) run += cover[(r - y0) * cwid + i]!;\n if (r - ch >= y0 && r - ch <= y1) run -= cover[(r - ch - y0) * cwid + i]!;\n const j = r - ch + 1;\n if (j >= 0 && j < cph && run > 0) total++;\n }\n }\n groupTotals[g] = total - before;\n }\n return total;\n }\n let sx0 = 0, sy0 = 0, sw = 0, sh = 0, siteCache = new Float64Array(0);\n // The computed entries of a filled window's site cache (windowLookups): their count, bounding box and a bit mask per row\n // (columns below 31).\n let filledCount = 0, fx0 = 0, fx1 = -1, fy0 = 0, fy1 = -1;\n let rowMask = new Int32Array(0), prefixOr = new Int32Array(0), suffixOr = new Int32Array(0);\n function markFilled(i: number, j: number): void {\n if (i < 31) rowMask[j] = rowMask[j]! | (1 << i);\n if (filledCount++ === 0) { fx0 = fx1 = i; fy0 = fy1 = j; return; }\n if (i < fx0) fx0 = i; else if (i > fx1) fx1 = i;\n if (j < fy0) fy0 = j; else if (j > fy1) fy1 = j;\n }\n const pilotNode = input.wavelengthsNm[Math.floor(nodes / 2)]!;\n return {\n get lookups(): number { return lookups + (filled ? windowLookups() : 0); },\n get uniformMaterial(): number { return lastMaterial; },\n // Chart materials are tracked on the filled path and, without diffraction, on the direct ring (radiance scenes never).\n get tracksMaterial(): boolean { return ringOn || (directOn && scene.kind === \"materials\"); },\n get cachesSites(): boolean { return sw > 0; },\n get marksReads(): boolean { return filled; },\n markReads(xs: Int32Array, ys: Int32Array, values: Float64Array, materials: Int32Array, count: number): void {\n for (let n = 0; n < count; n++) {\n const i = xs[n]! - sx0, j = ys[n]! - sy0;\n if (!(i >= 0 && j >= 0 && i < sw && j < sh)) continue;\n const w = j * sw + i;\n if (siteCache[w]! === siteCache[w]!) continue;\n // As siteMiss for a site inside a filled window: the computed site is marked (windowLookups counts from the marks)\n // and its material kept.\n siteCache[w] = values[n]!; windowMaterial[w] = materials[n]!; markFilled(i, j);\n }\n },\n window(x0: number, y0: number, x1: number, y1: number): void {\n if (filled) lookups += windowLookups();\n filled = false; ringOn = false; outsideSites = []; filledCount = 0; rowMask.fill(0, 0, sh);\n sx0 = x0; sy0 = y0; sw = Math.max(0, x1 - x0); sh = Math.max(0, y1 - y0);\n if (sw * sh > CACHE_LIMIT) { sw = 0; sh = 0; }\n if (siteCache.length < sw * sh) siteCache = new Float64Array(sw * sh);\n if (rowMask.length < sh) rowMask = new Int32Array(sh);\n siteCache.fill(NaN, 0, sw * sh);\n if (!input.kernels) {\n // A ring of at least twice the window's rows keeps the rows of the previous display row's windows.\n if (sh > 0 && directRows < 2 * sh) {\n let rows = 1;\n while (rows < 2 * sh) rows *= 2;\n if (rows * W <= CACHE_LIMIT) { directRows = rows; directRing = new Float64Array(rows * W).fill(NaN); directRowId = new Int32Array(rows).fill(-1); directRingMaterial = new Int32Array(rows * W); }\n }\n directOn = sh > 0 && directRows >= 2 * sh;\n if (directOn && windowMaterial.length < sw * sh) windowMaterial = new Int32Array(sw * sh);\n return;\n }\n for (const group of groups) {\n group.cx0 = x0 + group.minIx - R; group.cy0 = y0 + group.minIy - R;\n group.cpw = sw === 0 ? 0 : sw + group.cw - 1; group.cph = sh === 0 ? 0 : sh + group.ch - 1;\n if (group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes) > CACHE_LIMIT) { group.cpw = 0; group.cph = 0; }\n }\n // Chart materials whose every group caches the whole window: the filled path (bands). Otherwise the lazy window caches.\n if (scene.kind === \"materials\" && sw > 0 && groups.every((group) => group.cpw > 0)) {\n groups.forEach((group, g) => coverBand(g, group.cx0, group.cx0 + group.cpw, group.cy0, group.cph));\n filled = true;\n if (windowMaterial.length < sw * sh) windowMaterial = new Int32Array(sw * sh);\n // A ring of at least twice the window's rows keeps the rows of the previous display row's windows.\n if (ringRows < 2 * sh) {\n let rows = 1;\n while (rows < 2 * sh) rows *= 2;\n if (rows * W <= CACHE_LIMIT) { ringRows = rows; ring = new Float64Array(rows * W).fill(NaN); ringMaterial = new Int32Array(rows * W); ringRowId = new Int32Array(rows).fill(-1); }\n }\n ringOn = ringRows >= 2 * sh;\n return;\n }\n for (const group of groups) {\n const n = group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes);\n if (scene.kind === \"materials\") { if (group.cache.length < n || !(group.cache instanceof Int32Array)) group.cache = new Int32Array(n); group.cache.fill(-1, 0, n); }\n else { if (group.cache.length < n || !(group.cache instanceof Float64Array)) group.cache = new Float64Array(n); group.cache.fill(NaN, 0, n); }\n }\n },\n site(x: number, y: number): number {\n // The window's site cache first (with the ring: the sites read in this window, which its lookup count needs too).\n const i = x - sx0, j = y - sy0, cached = i >= 0 && j >= 0 && i < sw && j < sh;\n if (cached) { const w = j * sw + i, v = siteCache[w]!; if (v === v) { if (ringOn || directOn) lastMaterial = windowMaterial[w]!; return v; } }\n return siteMiss(x, y, i, j, cached);\n },\n pilot(u: number, v: number): number {\n lookups++;\n return scene.kind === \"materials\" ? scene.materialAt(u, v) : scene.radianceAt(u, v, pilotNode);\n }\n };\n}\n\n/** #564: tile sides of the large-kernel expected signal: the in-focus signal E (3 channels) and the convolved sites. */\nconst LARGE_E_TILE = 64, LARGE_OUTPUT_TILE = 128;\n/** Bytes kept per input for each of the two tile caches (least recently used first; a dropped tile is recomputed with the same bits). */\nconst LARGE_CACHE_BYTES = 32 * 1048576;\n\n/** Per input object: the in-focus tiles, the convolved lattice and the scene lookups made so far (shared by the renders of the input). */\ninterface LargeKernelState { lattice: SiteKernelRunsLattice; lookups: number }\nconst LARGE_PREPARED = new WeakMap<DisplayViewExpectedSignalInput, LargeKernelState>();\n\n/**\n * #564: the expected signal with a defocus kernel D above the direct radius. Defocus of a plane is space-invariant and\n * wavelength-independent, so it commutes with the spectral and query-offset sums and with the diffraction kernels:\n * μ_c(x) = Σ_o w_o Σ_λ A_c(λ) Σ_t (K_λ ∗ D)(t)·L(p_o(x) − t, λ) = Σ_s D(s)·E_c(x − s),\n * with E_c(x) = Σ_o w_o Σ_λ A_c(λ) Σ_t K_λ(t)·L(p_o(x) − t, λ) the in-focus expected electrons of channel c at site position x\n * (the same sum as `kernelSite`, on the lattice formula), so the disc is applied once per channel on the native site lattice\n * instead of once per spectral node and lattice group. E is computed in fixed 64-site tiles (all three channels), and D ⊛ E_c\n * by runs in fixed 128-site tiles, each site taking its own channel: every value depends only on the site, so regions and parts\n * are bit-identical to the whole frame. The tiles are kept per input object, across its renders.\n *\n * Diagnostics: `lookups` counts the scene lookups this signal's calls caused (tiles computed for it; a tile an earlier render of\n * the input computed costs none). `uniformMaterial` is −1 and nothing is tracked or marked, as for radiance scenes.\n */\nfunction createLargeKernelSignal(input: DisplayViewExpectedSignalInput): DisplayViewExpectedSignal {\n if (!input.kernels || !input.largeKernel) throw new InvalidConfigurationError(\"The large-kernel expected signal needs the in-focus kernels.\");\n let state = LARGE_PREPARED.get(input);\n if (!state) { state = prepareLargeKernel(input); LARGE_PREPARED.set(input, state); }\n const prepared = state, start = prepared.lookups, channelAt = input.channelAt, scene = input.scene, nodes = input.wavelengthsNm.length;\n const pilotNode = input.wavelengthsNm[Math.floor(nodes / 2)]!;\n let pilots = 0;\n return {\n get lookups(): number { return prepared.lookups - start + pilots; },\n get uniformMaterial(): number { return -1; },\n get tracksMaterial(): boolean { return false; },\n get cachesSites(): boolean { return false; },\n get marksReads(): boolean { return false; },\n markReads(): void { /* nothing is marked: marksReads is false */ },\n window(): void { /* the tiles are fixed and kept per input; a window changes nothing */ },\n site(x: number, y: number): number { return prepared.lattice.valueAt(channelAt(x, y), x, y); },\n pilot(u: number, v: number): number {\n pilots++;\n return scene.kind === \"materials\" ? scene.materialAt(u, v) : scene.radianceAt(u, v, pilotNode);\n }\n };\n}\n\nfunction prepareLargeKernel(input: DisplayViewExpectedSignalInput): LargeKernelState {\n const W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth, nodes = input.wavelengthsNm.length, R = input.kernels!.radius;\n const tables = displayViewSignalTables(input), { reflectance, spectralIndex, groups } = tables, scene = input.scene;\n const state = { lookups: 0 } as LargeKernelState;\n const latticeU = (group: GroupTables, p: number): number => (group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g);\n const latticeV = (group: GroupTables, q: number): number => (group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g);\n /** E_c of the native site positions [x0, x0 + T) × [y0, y0 + T), all three channels: kernelSite's sum, each group's lattice read once. */\n function inFocusTile(x0: number, y0: number, T: number): Float64Array[] {\n const out = [0, 1, 2].map(() => new Float64Array(T * T));\n for (const group of groups) {\n const cw = group.cw, ch = group.ch, gw = T + cw - 1, gh = T + ch - 1, p0 = x0 + group.minIx - R, q0 = y0 + group.minIy - R;\n if (scene.kind === \"materials\") {\n const material = new Int32Array(gw * gh);\n for (let j = 0; j < gh; j++) { const v = latticeV(group, q0 + j); for (let i = 0; i < gw; i++) material[j * gw + i] = scene.materialAt(latticeU(group, p0 + i), v); }\n state.lookups += gw * gh;\n for (let c = 0; c < 3; c++) {\n const nk = group.neutral[c]!, sk = group.spectral[c]!, e = out[c]!;\n for (let y = 0; y < T; y++) for (let x = 0; x < T; x++) {\n let sum = 0;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const m = material[(y + dy) * gw + x + dx]!, si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n sum += si < 0 ? reflectance[m]! * nk[dy * cw + dx]! : sk[si]![dy * cw + dx]!;\n }\n e[y * T + x] = e[y * T + x]! + sum;\n }\n }\n } else {\n const radiance = new Float64Array(gw * gh * nodes);\n for (let j = 0; j < gh; j++) {\n const v = latticeV(group, q0 + j);\n for (let i = 0; i < gw; i++) { const u = latticeU(group, p0 + i); for (let n = 0; n < nodes; n++) radiance[(j * gw + i) * nodes + n] = scene.radianceAt(u, v, input.wavelengthsNm[n]!); }\n }\n state.lookups += gw * gh * nodes;\n for (let c = 0; c < 3; c++) {\n const e = out[c]!;\n for (let y = 0; y < T; y++) for (let x = 0; x < T; x++) {\n let sum = 0;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const r = ((y + dy) * gw + x + dx) * nodes;\n for (let n = 0; n < nodes; n++) sum += group.perNode[n]![c]![dy * cw + dx]! * radiance[r + n]!;\n }\n e[y * T + x] = e[y * T + x]! + sum;\n }\n }\n }\n }\n return out;\n }\n // At least the in-focus tiles one output tile's source spans plus one more row of them, so the next output tile of a row\n // reuses them (about 37 MiB at radius 512); otherwise the byte budget.\n const span = Math.ceil((LARGE_OUTPUT_TILE + 2 * input.largeKernel!.radius) / LARGE_E_TILE) + 1;\n const inFocus = new Map<number, Float64Array[]>(), inFocusCapacity = Math.max(span * (span + 1), Math.floor(LARGE_CACHE_BYTES / (3 * LARGE_E_TILE * LARGE_E_TILE * 8)));\n function inFocusTileAt(tx: number, ty: number): Float64Array[] {\n const T = LARGE_E_TILE, key = (ty + 1048576) * 2097152 + tx + 1048576;\n let tile = inFocus.get(key);\n if (tile) { inFocus.delete(key); inFocus.set(key, tile); }\n else {\n tile = inFocusTile(tx * T, ty * T, T);\n inFocus.set(key, tile);\n if (inFocus.size > inFocusCapacity) inFocus.delete(inFocus.keys().next().value!);\n }\n return tile;\n }\n // Which sites of a tile row hold channel c: the CFA's 2 × 2 period, from channelAt (tile origins are even).\n const phase = [0, 1].map((py) => [0, 1].map((px) => input.channelAt(px, py)));\n const patterns: SiteKernelRunsRowPattern[] = [0, 1, 2].map((c) => (row: number) => {\n const p = phase[row & 1]!, even = p[0] === c, odd = p[1] === c;\n return even && odd ? { start: 0, step: 1 } : even ? { start: 0, step: 2 } : odd ? { start: 1, step: 2 } : null;\n });\n state.lattice = createSiteKernelRunsLattice({ runs: input.largeKernel!, tile: LARGE_OUTPUT_TILE, fields: 3, capacityBytes: LARGE_CACHE_BYTES,\n pattern: (c) => patterns[c], source: (x0, y0, width, height) => (c: number): Float64Array => {\n // Copied from the in-focus tiles the rectangle overlaps, tile by tile, row segment by row segment (the values are copies).\n const samples = new Float64Array(width * height), T = LARGE_E_TILE;\n for (let ty = Math.floor(y0 / T); ty * T < y0 + height; ty++) for (let tx = Math.floor(x0 / T); tx * T < x0 + width; tx++) {\n const tile = inFocusTileAt(tx, ty)[c]!, ax = Math.max(x0, tx * T), bx = Math.min(x0 + width, (tx + 1) * T), ay = Math.max(y0, ty * T), by = Math.min(y0 + height, (ty + 1) * T);\n for (let y = ay; y < by; y++) samples.set(tile.subarray((y - ty * T) * T + ax - tx * T, (y - ty * T) * T + bx - tx * T), (y - y0) * width + ax - x0);\n }\n return samples;\n } });\n return state;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expected-signal.js","sourceRoot":"","sources":["../../src/facade/expected-signal.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The tabulated expected signal (2.6 display view; #394 also the capture's tabulated RAW path): expected photo electrons of\n * real native sites for a still, rectilinear, distortion-free planar scene. Kept apart from display-view.ts so a bundle that\n * only captures does not contain the display view or the portable functions it uses (issue #380).\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport type { ImagePlaneSignalScene } from \"./scene-radiance.js\";\nimport { createSiteKernelRunsLattice, type SiteKernelRuns, type SiteKernelRunsLattice, type SiteKernelRunsRowPattern } from \"../optics/site-kernel-runs.js\";\n\n/** A query offset from a site centre in sites (+x right, +y down) and its weight (pixel-aperture node × filter spot). */\nexport interface DisplayViewQueryOffset { x: number; y: number; weight: number }\n\n/** Scene access for the expected signal: chart materials (fast tables) or a radiance function. */\nexport type DisplayViewScene =\n | { kind: \"materials\"; materialAt(u: number, v: number): number;\n /** Per material: `{ neutral: reflectance }` (radiance = reflectance × illuminant) or the spectral radiance at each node. */\n materials: readonly ({ neutral: number } | { radiance: Float64Array })[];\n /** Illuminant radiance of a perfect white diffuser at each spectral node: irradianceScale·shape(λ)/π. */\n whiteRadiance: Float64Array }\n | { kind: \"radiance\"; radianceAt(u: number, v: number, nm: number, t?: number): number;\n /**\n * #581, an image-plane scene's direct path: the signal of channel c, each pixel's Σ_n A_c(λ_n)·L_n integrated from its\n * reconstructed spectrum and interpolated between pixels (a site without kernels takes it instead of one radiance lookup per node).\n */\n signalAt?(u: number, v: number, c: number): number;\n /** #581: the image-plane print behind `signalAt` (its scene, spectral nodes and surround), for the GPU's image-plane module. */\n image?: ImagePlaneSignalScene[\"image\"] };\n\nexport interface DisplayViewExpectedSignalInput {\n nativeWidth: number;\n nativeHeight: number;\n /** Frame output width: plane coordinates are 2 / outputWidth frame units per site. */\n outputWidth: number;\n /** Spectral nodes and, per CFA channel (red, green, blue), the expected electrons per unit spectral radiance at each node. */\n wavelengthsNm: readonly number[];\n electronsPerRadiance: readonly [Float64Array, Float64Array, Float64Array];\n offsets: readonly DisplayViewQueryOffset[];\n /**\n * Diffraction and (#492) defocus: per-node kernels on the site lattice, (2R + 1)² taps in row-major order,\n * out(x) = Σ in(x − t)·K(t). With defocus each node's kernel is its diffraction kernel convolved with the disc, or the\n * disc itself without diffraction (expected-signal-setup.ts).\n */\n kernels?: { radius: number; perNode: readonly Float64Array[] };\n scene: DisplayViewScene;\n /** CFA channel index (0 red, 1 green, 2 blue) of native site (x, y). */\n channelAt(x: number, y: number): number;\n /**\n * Without kernels: the plane point (frame units) that the environment queries for offset `o` of native site (x, y),\n * computed with the environment's own arithmetic, so points that fall exactly on a chart boundary resolve to the same\n * material as in the capture. With kernels (diffraction or defocus) the facade's object-space convolution uses the\n * lattice formula, as here.\n */\n queryPoint?(x: number, y: number, offset: number, out: Float64Array): void;\n /**\n * #564: a defocus kernel D above the direct radius (64 sites), as runs. Each site's expected electrons are then\n * Σ_t D(t)·E_c(x − t, y − t), with E_c the expected electrons of channel c (the site's own) through `kernels` (each node's\n * diffraction kernel, or a unit tap for the lattice formula) at every native site position, convolved over the site\n * lattice by runs in fixed tiles (see {@link createDisplayViewExpectedSignal}). Requires `kernels`.\n */\n largeKernel?: SiteKernelRuns;\n}\n\n/** Expected photo electrons of real native sites. */\nexport interface DisplayViewExpectedSignal {\n /**\n * Starts a new cache window: native sites [x0, x1) × [y0, y1) that the following `site` calls mostly read. Sites and\n * scene lookups inside it are computed once; anything outside is computed without caching.\n */\n window(x0: number, y0: number, x1: number, y1: number): void;\n /** Expected photo electrons of native site (x, y) for its own CFA channel (x, y inside the native raster). */\n site(x: number, y: number): number;\n /** A cheap classifier value of the scene at plane point (u, v) frame units: the material, or the radiance at one node. */\n pilot(u: number, v: number): number;\n /** Scene lookups performed so far (material or radiance queries), for diagnostics. */\n readonly lookups: number;\n /**\n * The chart material that every kernel tap (without diffraction: every query point) of the last `site` call read, when\n * they all read one material (its value is then a function of that material and the site's CFA channel only); −1 when\n * unknown or mixed.\n */\n readonly uniformMaterial: number;\n /**\n * Whether `uniformMaterial` is tracked in the current window (otherwise it is not meaningful): chart materials in a\n * filled window or, without diffraction, in a window the direct ring serves (#444); never for radiance scenes.\n */\n readonly tracksMaterial: boolean;\n /**\n * Whether the current window caches its sites: a second `site` call for a site inside the window then returns the stored\n * value without any work or lookup (#392).\n */\n readonly cachesSites: boolean;\n /**\n * Whether `markReads` is available in the current window: a filled window (chart materials with diffraction kernels),\n * whose lookup count comes from the sites it computed. False otherwise: for windows without kernels (whose sites the\n * direct ring already serves cheaply) and for the lazy window caches (radiance scenes with diffraction), whose count\n * depends on the lattice points each computed site reads.\n */\n readonly marksReads: boolean;\n /**\n * Records `count` sites as read in the current window without computing them: site n at (xs[n], ys[n]) with value values[n]\n * (as `site` returned it for that site) and uniform material materials[n] (as `uniformMaterial` reported it). Sites outside\n * the window and sites the window already holds are skipped. For the window's lookup count and for later `site` calls this\n * is the same as reading each site with `site`. Only valid while `marksReads` is true; it must do for a site the\n * bookkeeping `site` does for a site the window's cache does not hold yet.\n */\n markReads(xs: Int32Array, ys: Int32Array, values: Float64Array, materials: Int32Array, count: number): void;\n}\n\nconst OFFSET_TOLERANCE = 1e-9;\n/** Largest cache window, in sites or lattice points; larger windows are evaluated without caching. */\nconst CACHE_LIMIT = 1 << 22;\n/** Largest band of looked-up lattice materials per group, in lattice points (a band that would be larger restarts at the window). */\nconst BAND_LIMIT = 1 << 22;\n/**\n * Lattice-row ring (refinement windows): rows kept per group, the tallest band that uses it, and the columns kept beyond each\n * raster edge (kernel radius, demosaic reach and query offsets; columns beyond it are looked up directly).\n */\nconst LATTICE_RING_ROWS = 128, LATTICE_RING_MAXIMUM_BAND_ROWS = 64, LATTICE_RING_MARGIN = 64;\n\n/**\n * The tables of `createDisplayViewExpectedSignal` (see there) that are a function of the input's numbers alone: the materials'\n * spectra, the lattice groups' geometry and their combined kernels per spectral node, and each channel's kernel sums per node.\n * Written only while they are built, never after: they are shared by every render of an input and, for chart materials, by every\n * input of the same content (#449). Everything a render changes (each group's window cache and its origin and size, the bands,\n * rings and counts) lives in the render.\n *\n * Signals are integrated from the material spectrum per site (2.21.0): no table holds a material's value for a channel. A\n * material is kept as its spectral radiance at the nodes, L_m(λ_n) (a neutral one: its reflectance times the white radiance),\n * and a site's signal is formed from the spectra of the materials it reads, against its own channel's response, when it is read.\n */\nexport interface SignalTables {\n /** Per chart material, its spectral radiance at each node (empty for radiance scenes). */\n readonly spectra: readonly Float64Array[];\n readonly groups: readonly GroupTables[];\n /**\n * With kernels, chart materials: per channel c and node n, S_c(n) = Σ_groups Σ_t C_c(t, n), summed in the order a site reads its\n * taps (groups in order, taps row-major), so a site whose every tap reads one material is the same sum as any other site.\n */\n readonly kernelSums: readonly Float64Array[];\n}\n/**\n * A lattice group's fixed part: its fractional shift, members, index bounds, rectangle and combined kernels. Chart materials:\n * `nodeKernels[c]` holds C_c(t, n) = Σ_members w·A_c(λ_n)·K_n(t) at t·N + n (a channel's response and kernel per node, no\n * material). Radiance scenes: `perNode[n][c]` the same values per node.\n */\nexport interface GroupTables { fx: number; fy: number; members: { ix: number; iy: number; weight: number }[]; minIx: number; maxIx: number; minIy: number; maxIy: number;\n cw: number; ch: number; nodeKernels: Float64Array[]; perNode: Float64Array[][] }\n/** A render's lattice group: the fixed part and its own window cache (lattice points [cx0, cx0 + cpw) × [cy0, cy0 + cph)). */\ninterface Group extends GroupTables { cache: Int32Array | Float64Array; cx0: number; cy0: number; cpw: number; cph: number }\n/** Per input object: the tables, and the filled path's lattice material rings per group (created on first use), which depend on its `materialAt` and raster. */\ninterface PreparedSignal { tables: SignalTables; rings: ({ width: number; material: Int16Array | Int32Array; rowId: Int32Array } | undefined)[] }\nconst PREPARED = new WeakMap<DisplayViewExpectedSignalInput, PreparedSignal>();\n\n/** Chart-material tables kept by content across input objects (#449), least recently used first. */\nexport const EXPECTED_SIGNAL_TABLE_CACHE_SIZE = 4;\nconst tableCache: { signature: Uint32Array; tables: SignalTables }[] = [];\nlet tableBuilds = 0, tableHits = 0;\n\n/** Internal test hook: the kept table entries, and the tables built and found by content so far. */\nexport function expectedSignalTableCacheState(): { size: number; builds: number; hits: number } { return { size: tableCache.length, builds: tableBuilds, hits: tableHits }; }\n/** Internal test hook: forgets the tables kept by content (inputs already prepared keep theirs). */\nexport function clearExpectedSignalTableCache(): void { tableCache.length = 0; }\n\n/**\n * Every number the tables read, with the lengths that delimit them, as the bits of doubles (so -0, NaN and every digit are kept\n * apart): the spectral nodes, the three channel responses, the offsets, the kernel radius and taps, each material's reflectance or\n * radiance, and the white radiance. Undefined for radiance scenes, whose tables are not kept by content.\n */\nfunction tableSignature(input: DisplayViewExpectedSignalInput): Uint32Array | undefined {\n const scene = input.scene;\n if (scene.kind !== \"materials\") return undefined;\n const values: number[] = [];\n const push = (a: ArrayLike<number>): void => { values.push(a.length); for (let i = 0; i < a.length; i++) values.push(a[i]!); };\n push(input.wavelengthsNm);\n values.push(input.electronsPerRadiance.length);\n for (const a of input.electronsPerRadiance) push(a);\n values.push(input.offsets.length);\n for (const o of input.offsets) values.push(o.x, o.y, o.weight);\n if (input.kernels) { values.push(1, input.kernels.radius, input.kernels.perNode.length); for (const k of input.kernels.perNode) push(k); } else values.push(0);\n values.push(scene.materials.length);\n for (const m of scene.materials) if (\"neutral\" in m) values.push(0, m.neutral); else { values.push(1); push(m.radiance); }\n push(scene.whiteRadiance);\n return new Uint32Array(Float64Array.from(values).buffer);\n}\n\nfunction sameBits(a: Uint32Array, b: Uint32Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction prepareSignal(input: DisplayViewExpectedSignalInput): PreparedSignal {\n const signature = tableSignature(input);\n let tables: SignalTables | undefined;\n if (signature) {\n const at = tableCache.findIndex((entry) => sameBits(entry.signature, signature));\n if (at >= 0) { const [entry] = tableCache.splice(at, 1); tableCache.push(entry!); tables = entry!.tables; tableHits++; }\n }\n if (!tables) {\n tables = buildTables(input);\n tableBuilds++;\n if (signature) { tableCache.push({ signature, tables }); while (tableCache.length > EXPECTED_SIGNAL_TABLE_CACHE_SIZE) tableCache.shift(); }\n }\n const prepared: PreparedSignal = { tables, rings: tables.groups.map(() => undefined) };\n PREPARED.set(input, prepared);\n return prepared;\n}\n\n/**\n * Internal (#479): the read-only tables of an input (the ones `createDisplayViewExpectedSignal` reads), for the GPU display view,\n * which uploads the combined kernels and per-material sums the reference forms in float64. Prepared and cached as a render\n * prepares them, so a GPU render of an input and a CPU render read the same doubles.\n */\nexport function displayViewSignalTables(input: DisplayViewExpectedSignalInput): SignalTables {\n return (PREPARED.get(input) ?? prepareSignal(input)).tables;\n}\n\n/**\n * Internal (#569): the tables of an input, built without the content cache (the display view's lens PSF builds one per field zone,\n * which would only evict the view's own entries).\n */\nexport function buildTables(input: DisplayViewExpectedSignalInput): SignalTables {\n const nodes = input.wavelengthsNm.length, R = input.kernels ? input.kernels.radius : 0, size = 2 * R + 1;\n const A = input.electronsPerRadiance, scene = input.scene, offsets = input.offsets;\n const kernelAt = (node: number, t: number): number => (input.kernels ? input.kernels.perNode[node]![t]! : 1);\n // Each material's spectral radiance at the nodes (a copy: the tables may outlive the input and serve other inputs of the same\n // content). A neutral material's spectrum is its reflectance times the white radiance.\n const spectra = scene.kind === \"materials\" ?\n scene.materials.map((m) => (\"neutral\" in m ? Float64Array.from(scene.whiteRadiance, (w) => m.neutral * w) : Float64Array.from(m.radiance))) : [];\n // Offsets grouped by fractional shift: offsets that differ by whole sites share one lattice.\n const frac = (v: number): number => { const f = v - Math.floor(v); return f > 1 - OFFSET_TOLERANCE || f < OFFSET_TOLERANCE ? 0 : f; };\n const groups: GroupTables[] = [];\n for (const o of offsets) {\n const fx = frac(o.x), fy = frac(o.y), ix = Math.round(o.x - fx), iy = Math.round(o.y - fy);\n let group = groups.find((q) => Math.abs(q.fx - fx) <= OFFSET_TOLERANCE && Math.abs(q.fy - fy) <= OFFSET_TOLERANCE);\n if (!group) { group = { fx, fy, members: [], minIx: ix, maxIx: ix, minIy: iy, maxIy: iy, cw: 0, ch: 0, nodeKernels: [], perNode: [] }; groups.push(group); }\n group.members.push({ ix, iy, weight: o.weight });\n group.minIx = Math.min(group.minIx, ix); group.maxIx = Math.max(group.maxIx, ix); group.minIy = Math.min(group.minIy, iy); group.maxIy = Math.max(group.maxIy, iy);\n }\n if (input.kernels) for (const group of groups) {\n // Combined kernel over lattice offsets d = (ix − tu, iy − tv), stored at (d − min + R).\n const cw = group.maxIx - group.minIx + size, ch = group.maxIy - group.minIy + size;\n group.cw = cw; group.ch = ch;\n const combine = (value: (c: number, node: number, t: number) => number): Float64Array[] => [0, 1, 2].map((c) => {\n const out = new Float64Array(cw * ch);\n for (const member of group.members) for (let tv = -R, t = 0; tv <= R; tv++) for (let tu = -R; tu <= R; tu++, t++) {\n let sum = 0;\n for (let n = 0; n < nodes; n++) sum += value(c, n, t);\n const index = (member.iy - tv - group.minIy + R) * cw + (member.ix - tu - group.minIx + R);\n out[index] = out[index]! + member.weight * sum;\n }\n return out;\n });\n if (scene.kind === \"materials\") {\n // The channel's response and kernel per node, C_c(t, n) at t·N + n: no material radiance is folded in.\n group.nodeKernels = [0, 1, 2].map((c) => {\n const out = new Float64Array(cw * ch * nodes);\n for (const member of group.members) for (let tv = -R, t = 0; tv <= R; tv++) for (let tu = -R; tu <= R; tu++, t++) {\n const index = ((member.iy - tv - group.minIy + R) * cw + (member.ix - tu - group.minIx + R)) * nodes;\n for (let n = 0; n < nodes; n++) out[index + n] = out[index + n]! + member.weight * (A[c]![n]! * kernelAt(n, t));\n }\n return out;\n });\n } else {\n // Radiance scenes: combined kernels per node, applied to the cached radiance at each node.\n group.perNode = Array.from({ length: nodes }, (_, n) => combine((c, node, t) => (node === n ? A[c]![n]! * kernelAt(n, t) : 0)));\n }\n }\n // Per channel the kernel sums per node, in a site's tap order (see SignalTables.kernelSums): response and kernels only.\n const kernelSums = scene.kind === \"materials\" && input.kernels ? [0, 1, 2].map((c) => {\n const out = new Float64Array(nodes);\n for (const group of groups) { const k = group.nodeKernels[c]!; for (let t = 0; t < group.cw * group.ch; t++) for (let n = 0; n < nodes; n++) out[n] = out[n]! + k[t * nodes + n]!; }\n return out;\n }) : [];\n // Frozen records: a render copies each group before it gives it a window (see createDisplayViewExpectedSignal).\n for (const group of groups) Object.freeze(group);\n return Object.freeze({ spectra, groups, kernelSums });\n}\n\n/**\n * A site's per-material kernel sums (2.21.0, signals integrated from the material spectrum per site). For each distinct chart\n * material the site's taps read, P_m(n) = Σ_{taps t that read m} C_c(t, n), added in tap order; the site's signal is then\n * Σ_m Σ_n L_m(λ_n)·P_m(n), the materials in the order of their first tap. A site whose every tap reads material m has P_m = S_c\n * (`SignalTables.kernelSums`, summed in the same order), so adding S_c once gives the same value without reading its taps.\n */\nexport interface MaterialSums {\n reset(): void;\n /** Adds f·k[at .. at + N) to material m's sums (f: a tap's field factor; 1, an exact product, without one). */\n add(m: number, k: Float64Array, at: number, f?: number): void;\n /** Σ_m Σ_n L_m(λ_n)·P_m(n) over the materials added since the last reset. */\n value(): number;\n}\nexport function createMaterialSums(nodes: number, spectra: readonly Float64Array[]): MaterialSums {\n // A site reads at most every material once: one slot per material, in the order of the site's first taps.\n let count = 0, last = -1, lastAt = 0;\n const ids = new Int32Array(spectra.length), sums = new Float64Array(spectra.length * nodes);\n /** The offset of material m's sums, a new zeroed slot when the site has not read m yet. */\n const slot = (m: number): number => {\n if (m === last) return lastAt;\n let a = 0;\n while (a < count && ids[a] !== m) a++;\n if (a === count) {\n if (spectra[m] === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n ids[count++] = m; sums.fill(0, a * nodes, (a + 1) * nodes);\n }\n last = m; lastAt = a * nodes;\n return lastAt;\n };\n return {\n reset(): void { count = 0; last = -1; },\n add(m: number, k: Float64Array, at: number, f = 1): void {\n const base = slot(m);\n for (let n = 0; n < nodes; n++) sums[base + n] = sums[base + n]! + f * k[at + n]!;\n },\n value(): number {\n let sum = 0;\n for (let a = 0; a < count; a++) {\n const L = spectra[ids[a]!]!, base = a * nodes;\n let v = 0;\n for (let n = 0; n < nodes; n++) v += L[n]! * sums[base + n]!;\n sum += v;\n }\n return sum;\n }\n };\n}\n\n/** A chart material's signal for channel response a without kernels: Σ_n A_c(λ_n)·L_m(λ_n), integrated from its spectrum. */\nexport function materialSpectrumSignal(a: ArrayLike<number>, spectrum: ArrayLike<number> | undefined, nodes: number): number {\n if (!spectrum) throw new InvalidConfigurationError(\"Unknown chart material.\");\n let s = 0;\n for (let n = 0; n < nodes; n++) s += a[n]! * spectrum[n]!;\n return s;\n}\n\n/**\n * Expected photo electrons per site: μ_c(i, j) = Σ_o w_o Σ_λ A_c(λ) Σ_t K_λ(t)·L(p_o(i, j) − t, λ), where p_o is the\n * query point of offset o and K the diffraction kernel (a single unit tap without diffraction). This is the sum the\n * facade's environment chain forms for a still, rectilinear, distortion-free planar scene, where the\n * radiance-to-irradiance factor is the same at every site (docs/DISPLAY_VIEW.md, \"Expected signal\").\n *\n * With diffraction, offsets that share a fractional shift read one lattice, and their kernels are combined in advance:\n * C_c(d) = Σ_members w·Σ_λ A_c(λ)·K_λ(t)·L(λ) over the taps t that reach lattice offset d. A neutral material's radiance\n * is its reflectance times the white radiance, so all neutral materials share one combined kernel per channel.\n *\n * `spanColumns`: how many native columns the render's windows move across beyond one window's width (a filled band is never\n * built wider). Only a speed hint: a window past it rebuilds its band, with the same values.\n */\nexport function createDisplayViewExpectedSignal(input: DisplayViewExpectedSignalInput, spanColumns = Infinity): DisplayViewExpectedSignal {\n if (input.largeKernel) return createLargeKernelSignal(input);\n const W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth, nodes = input.wavelengthsNm.length;\n const R = input.kernels ? input.kernels.radius : 0;\n if (input.kernels && input.kernels.perNode.length !== nodes) throw new InvalidConfigurationError(\"Display view kernels must match the spectral nodes.\");\n if (!input.kernels && !input.queryPoint) throw new InvalidConfigurationError(\"Display view needs the environment query points without diffraction.\");\n const A = input.electronsPerRadiance, scene = input.scene, offsets = input.offsets, channelAt = input.channelAt;\n // The request's tables (materials, lattice groups, combined kernels, per-material sums) are the same for every render of a\n // prepared view, which passes the same input object: computed once per input. Each render gets its own groups' window caches.\n // Chart-material tables are also shared by inputs of the same content (#449): each render gets its own groups' window state.\n const prepared = PREPARED.get(input) ?? prepareSignal(input);\n const { spectra, kernelSums } = prepared.tables;\n const groups: Group[] = prepared.tables.groups.map((group) => ({ ...group, cache: new Int32Array(0), cx0: 0, cy0: 0, cpw: 0, cph: 0 }));\n let lookups = 0;\n const point = new Float64Array(2), acc = createMaterialSums(nodes, spectra);\n /**\n * Without diffraction: one site from the environment's own query points. Also sets lastMaterial: the chart material every\n * query point read, or −1 when they read more than one (or the scene is a radiance scene). A site whose points all read\n * material m sums the same operands in the same order as every other such site of its channel, so it holds the same value.\n */\n function directSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0, uniform = -1, lastM = -1, lastValue = 0;\n for (let o = 0; o < offsets.length; o++) {\n input.queryPoint!(x, y, o, point);\n let value: number;\n if (scene.kind === \"materials\") {\n const m = scene.materialAt(point[0]!, point[1]!);\n uniform = o === 0 || uniform === m ? m : -2;\n // Integrated from the material's spectrum against the site's channel, once per material change within the site.\n if (m !== lastM) { lastValue = materialSpectrumSignal(A[c]!, spectra[m], nodes); lastM = m; }\n value = lastValue; lookups++;\n } else if (scene.signalAt) { value = scene.signalAt(point[0]!, point[1]!, c); lookups++; }\n else { value = 0; for (let n = 0; n < nodes; n++) value += A[c]![n]! * scene.radianceAt(point[0]!, point[1]!, input.wavelengthsNm[n]!); lookups += nodes; }\n sum += offsets[o]!.weight * value;\n }\n lastMaterial = uniform < 0 ? -1 : uniform;\n return sum;\n }\n // Lattice point (p, q) of a group: the facade's lattice formula (createDiffractedPlanarProvider).\n const latticeU = (group: Group, p: number): number => (group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g);\n const latticeV = (group: Group, q: number): number => (group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g);\n const radianceScratch = new Float64Array(nodes);\n /** Material (or radiance at each node, into radianceScratch) of a group's lattice point, from the window cache when it holds it. */\n function latticeMaterial(group: Group, p: number, q: number): number {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph;\n if (cached) { const m = group.cache[j * group.cpw + i]!; if (m >= 0) return m; }\n const m = (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p), latticeV(group, q));\n lookups++;\n if (cached) group.cache[j * group.cpw + i] = m;\n return m;\n }\n function latticeRadiance(group: Group, p: number, q: number): Float64Array {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph, cache = group.cache as Float64Array;\n if (cached && !Number.isNaN(cache[(j * group.cpw + i) * nodes]!)) { for (let n = 0; n < nodes; n++) radianceScratch[n] = cache[(j * group.cpw + i) * nodes + n]!; return radianceScratch; }\n const u = latticeU(group, p), v = latticeV(group, q);\n for (let n = 0; n < nodes; n++) radianceScratch[n] = (scene as Extract<DisplayViewScene, { kind: \"radiance\" }>).radianceAt(u, v, input.wavelengthsNm[n]!);\n lookups += nodes;\n if (cached) for (let n = 0; n < nodes; n++) cache[(j * group.cpw + i) * nodes + n] = radianceScratch[n]!;\n return radianceScratch;\n }\n /** With diffraction: one site through the combined kernels on each group's lattice. */\n function kernelSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0;\n acc.reset();\n for (const group of groups) {\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, cw = group.cw, ch = group.ch;\n if (scene.kind === \"materials\") {\n const k = group.nodeKernels[c]!;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) acc.add(latticeMaterial(group, p0 + dx, q0 + dy), k, (dy * cw + dx) * nodes);\n } else {\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const radiance = latticeRadiance(group, p0 + dx, q0 + dy);\n for (let n = 0; n < nodes; n++) sum += group.perNode[n]![c]![dy * cw + dx]! * radiance[n]!;\n }\n }\n }\n return scene.kind === \"materials\" ? acc.value() : sum;\n }\n // Filled windows (chart materials with diffraction, every lattice point of the window cacheable): each group keeps a band of\n // looked-up lattice materials that covers the window's rows and grows to the right as the windows of a display row move\n // right, with summed-area tables of material changes. A site whose kernel reads one material only (each group's rectangle\n // uniform, the same material in all) integrates that material's spectrum against the channel's kernel sums, which are the\n // per-material sums any site reading only that material forms (see MaterialSums); other sites run the per-material sums from the\n // band. Either way each site's value is the same sequence of operations as kernelSite, so it is bit-identical. The scene lookup count stays the count kernelSite's lazy window cache makes (each\n // cache point a computed site reads counts once per window, points outside the cache once per read): the rectangles of\n // the sites computed in a window are counted when the window closes (windowLookups).\n /**\n * A group's band: lattice rows [y0, y0 + rows), columns [x0, x0 + filled) looked up, row stride `capacity`. `material` and the\n * summed-area tables of left changes (`changeLeft`, 1 where a point's material\n * differs from its left neighbour's) and upper changes (`changeUp`), (rows + 1) × (capacity + 1).\n */\n interface Band { x0: number; y0: number; rows: number; capacity: number; filled: number; material: Int32Array; changeLeft: Int32Array; changeUp: Int32Array; v: Float64Array }\n const bands: Band[] = groups.map(() => ({ x0: 0, y0: 0, rows: 0, capacity: 0, filled: 0, material: new Int32Array(0),\n changeLeft: new Int32Array(0), changeUp: new Int32Array(0), v: new Float64Array(0) }));\n // Lattice rows of material indices per group, kept across windows (filled windows only): rows LATTICE_RING_ROWS apart share a\n // slot; columns from −LATTICE_RING_MARGIN. Int16 when every index fits (about 3 MB for four groups of a 6000-site row). A\n // lattice point's material depends only on the input, so the rings are kept per input object, across its renders (not with\n // the tables kept by content: they depend on `materialAt` and the raster).\n const ringWide = scene.kind === \"materials\" && scene.materials.length <= 32767;\n const rings = prepared.rings;\n function latticeRing(g: number): { width: number; material: Int16Array | Int32Array; rowId: Int32Array } {\n let ring = rings[g];\n if (!ring) {\n const width = W + 2 * LATTICE_RING_MARGIN, size = LATTICE_RING_ROWS * width;\n ring = rings[g] = { width, material: ringWide ? new Int16Array(size) : new Int32Array(size), rowId: new Int32Array(LATTICE_RING_ROWS).fill(-2147483648) };\n }\n return ring;\n }\n /** Makes the band of group g cover lattice columns [x0, x1) of rows [y0, y0 + rows), extending it to the right when it can. */\n function coverBand(g: number, x0: number, x1: number, y0: number, rows: number): void {\n const group = groups[g]!, band = bands[g]!, materials = scene as Extract<DisplayViewScene, { kind: \"materials\" }>;\n if (!(y0 >= band.y0 && y0 + rows <= band.y0 + band.rows && x0 >= band.x0 && x1 - band.x0 <= band.capacity)) {\n // A band with the ring is built twice as tall, so the next display rows' windows (a few lattice rows lower) reuse its\n // filled columns; a lattice point's material and the change counts inside a rectangle do not depend on the band's origin.\n if (rows <= LATTICE_RING_MAXIMUM_BAND_ROWS) rows *= 2;\n const capacity = Math.max(x1 - x0, Math.min(Math.floor(BAND_LIMIT / rows), W + 2 * (x1 - x0), spanColumns + x1 - x0));\n const size = rows * capacity, tables = (rows + 1) * (capacity + 1);\n band.x0 = x0; band.y0 = y0; band.rows = rows; band.capacity = capacity; band.filled = 0;\n if (band.material.length < size) band.material = new Int32Array(size);\n if (band.changeLeft.length < tables) { band.changeLeft = new Int32Array(tables); band.changeUp = new Int32Array(tables); }\n band.changeLeft.fill(0, 0, capacity + 1); band.changeUp.fill(0, 0, capacity + 1);\n for (let j = 0; j < rows; j++) { band.changeLeft[(j + 1) * (capacity + 1)] = 0; band.changeUp[(j + 1) * (capacity + 1)] = 0; }\n if (band.v.length < rows) band.v = new Float64Array(rows);\n for (let j = 0; j < rows; j++) band.v[j] = latticeV(group, y0 + j);\n }\n const stride = band.capacity, S1 = stride + 1, material = band.material, left = band.changeLeft, up = band.changeUp;\n rows = band.rows; y0 = band.y0;\n const ring = rows <= 2 * LATTICE_RING_MAXIMUM_BAND_ROWS ? latticeRing(g) : undefined;\n for (let i = band.filled; i < x1 - band.x0; i++) {\n const p = band.x0 + i, u = latticeU(group, p), column = p + LATTICE_RING_MARGIN;\n for (let j = 0; j < rows; j++) {\n let m: number;\n if (ring && column >= 0 && column < ring.width) {\n // A lattice point's material is a function of the point alone, so one looked up for an earlier window (the rows a\n // display row shares with the next) is the same material; the ring only spares the repeated lookup.\n const q = y0 + j, slot = q & (LATTICE_RING_ROWS - 1), index = slot * ring.width + column;\n if (ring.rowId[slot] !== q) { ring.rowId[slot] = q; ring.material.fill(-1, slot * ring.width, (slot + 1) * ring.width); }\n m = ring.material[index]!;\n if (m < 0) { m = materials.materialAt(u, band.v[j]!); ring.material[index] = m; }\n } else m = materials.materialAt(u, band.v[j]!);\n if (!spectra[m]) throw new InvalidConfigurationError(\"Unknown chart material.\");\n material[j * stride + i] = m;\n const changedLeft = i > 0 && material[j * stride + i - 1] !== m ? 1 : 0, changedUp = j > 0 && material[(j - 1) * stride + i] !== m ? 1 : 0;\n left[(j + 1) * S1 + i + 1] = left[j * S1 + i + 1]! + left[(j + 1) * S1 + i]! - left[j * S1 + i]! + changedLeft;\n up[(j + 1) * S1 + i + 1] = up[j * S1 + i + 1]! + up[(j + 1) * S1 + i]! - up[j * S1 + i]! + changedUp;\n }\n }\n band.filled = Math.max(band.filled, x1 - band.x0);\n }\n const rectSum = (sat: Int32Array, S1: number, i0: number, j0: number, i1: number, j1: number): number =>\n sat[j1 * S1 + i1]! - sat[j0 * S1 + i1]! - sat[j1 * S1 + i0]! + sat[j0 * S1 + i0]!;\n let filled = false;\n /** Sites outside the site window computed in this window (x, y pairs in window coordinates); their rectangles count when the window closes. */\n let outsideSites: number[] = [];\n let marks = new Uint8Array(0), cover = new Uint8Array(0);\n /** A site of a filled window: (i, j) are its coordinates in the site window, inside or outside it. */\n function filledSite(x: number, y: number, i: number, j: number): number {\n const c = channelAt(x, y), inside = i >= 0 && j >= 0 && i < sw && j < sh;\n if (inside) {\n let m = -1;\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, S1 = band.capacity + 1, bi = x + group.minIx - R - band.x0, bj = y + group.minIy - R - band.y0;\n if (rectSum(band.changeLeft, S1, bi + 1, bj, bi + group.cw, bj + group.ch) !== 0 || rectSum(band.changeUp, S1, bi, bj + 1, bi + group.cw, bj + group.ch) !== 0) { m = -2; break; }\n const own = band.material[bj * band.capacity + bi]!;\n if (m === -1) m = own; else if (own !== m) { m = -2; break; }\n }\n if (m >= 0) { lastMaterial = m; acc.reset(); acc.add(m, kernelSums[c]!, 0); return acc.value(); }\n }\n lastMaterial = -1;\n acc.reset();\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, cw = group.cw, ch = group.ch, k = group.nodeKernels[c]!, stride = band.capacity;\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, bi = p0 - band.x0, bj = q0 - band.y0;\n // A site inside the window reads every tap from the band; one outside it looks up the taps beyond the window cache.\n for (let dy = 0, t = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++, t++) {\n const ci = i + dx, cj = j + dy;\n acc.add(inside || (ci >= 0 && cj >= 0 && ci < group.cpw && cj < group.cph) ? band.material[(bj + dy) * stride + bi + dx]! :\n (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p0 + dx), latticeV(group, q0 + dy)), k, t * nodes);\n }\n }\n return acc.value();\n }\n /** Lattice points of an outside site's rectangles that lie outside the window caches (kernelSite looks these up on every read). */\n function outsideLookups(i: number, j: number): number {\n let count = 0;\n for (const group of groups) {\n const w = Math.max(0, Math.min(i + group.cw, group.cpw) - Math.max(i, 0)), h = Math.max(0, Math.min(j + group.ch, group.cph) - Math.max(j, 0));\n count += group.cw * group.ch - w * h;\n }\n return count;\n }\n // Site values of filled windows persist across windows (a site's value does not depend on the window): rows of native\n // sites in a ring of a power-of-two number of rows, row y in slot y mod ringRows. The window's site cache still holds the\n // sites read in the window, which is also what its lookup count needs.\n let ringRows = 0, ringOn = false, ring = new Float64Array(0), ringMaterial = new Int32Array(0), ringRowId = new Int32Array(0), windowMaterial = new Int32Array(0), lastMaterial = -1;\n /** A filled-window site read outside the site window: counted as kernelSite counts it. */\n function outsideRead(i: number, j: number): void { lookups += outsideLookups(i, j); outsideSites.push(i, j); }\n /** A site from the ring; on a miss (re)claims the row's slot when another row holds it, computes the site and stores it. */\n function ringRead(x: number, y: number, i: number, j: number): number {\n const slot = y & (ringRows - 1), q = slot * W + x;\n if (ringRowId[slot] === y) { const v = ring[q]!; if (v === v) { lastMaterial = ringMaterial[q]!; return v; } }\n else { ringRowId[slot] = y; ring.fill(NaN, slot * W, (slot + 1) * W); }\n const v = filledSite(x, y, i, j);\n ring[q] = v; ringMaterial[q] = lastMaterial;\n return v;\n }\n // Without diffraction (#392): site values persist across windows the same way, in their own ring (a site's value does not\n // depend on the window). A ring hit counts the lookups directSite would have made, so `lookups` is unchanged. The site's\n // material (directSite's lastMaterial) is kept beside its value, so the display view's one-material memo applies (#444).\n let directRows = 0, directOn = false, directRing = new Float64Array(0), directRowId = new Int32Array(0), directRingMaterial = new Int32Array(0);\n const directLookups = offsets.length * (scene.kind === \"materials\" || scene.signalAt ? 1 : nodes);\n function directRead(x: number, y: number): number {\n const slot = y & (directRows - 1), q = slot * W + x;\n if (directRowId[slot] === y) { const v = directRing[q]!; if (v === v) { lookups += directLookups; lastMaterial = directRingMaterial[q]!; return v; } }\n else { directRowId[slot] = y; directRing.fill(NaN, slot * W, (slot + 1) * W); }\n const v = directSite(x, y);\n directRing[q] = v; directRingMaterial[q] = lastMaterial;\n return v;\n }\n /** A site not in the window's site cache: from a ring, a filled window without the ring, the lazy window caches, or uncached. */\n function siteMiss(x: number, y: number, i: number, j: number, cached: boolean): number {\n if (directOn) {\n const v = directRead(x, y);\n if (cached) { siteCache[j * sw + i] = v; windowMaterial[j * sw + i] = lastMaterial; }\n return v;\n }\n if (ringOn) {\n if (!cached) { outsideRead(i, j); return ringRead(x, y, i, j); }\n const v = ringRead(x, y, i, j);\n siteCache[j * sw + i] = v; windowMaterial[j * sw + i] = lastMaterial; markFilled(i, j);\n return v;\n }\n if (filled && !cached) outsideRead(i, j);\n const v = filled ? filledSite(x, y, i, j) : input.kernels ? kernelSite(x, y) : directSite(x, y);\n if (cached) { siteCache[j * sw + i] = v; if (filled) markFilled(i, j); }\n return v;\n }\n /**\n * Lattice points of the closing window that kernelSite's lazy cache would have looked up: per group, the window cache points\n * covered by the rectangles of the computed sites (the site cache's filled entries and the outside sites), a box dilation.\n * A group's count depends only on the computed sites and its geometry (cw, ch, cpw, cph), so a group shaped like an\n * earlier one takes that group's count (the app's Quality groups all have one shape).\n */\n const groupTotals = new Float64Array(groups.length);\n function sameGeometry(g: number): number {\n const group = groups[g]!;\n for (let h = 0; h < g; h++) { const o = groups[h]!; if (o.cw === group.cw && o.ch === group.ch && o.cpw === group.cpw && o.cph === group.cph) return h; }\n return -1;\n }\n function windowLookups(): number {\n let total = 0;\n if (outsideSites.length === 0 && filledCount === 0) return 0;\n if (outsideSites.length === 0 && filledCount === sw * sh) {\n // Every site computed (each once) and none outside: the marks at (i + cw − 1, j + ch − 1) cover cache columns\n // 0 … sw + cw − 2 and rows 0 … sh + ch − 2, the whole cpw × cph cache of every group.\n for (const group of groups) total += group.cpw * group.cph;\n return total;\n }\n if (outsideSites.length === 0 && sw <= 31) {\n // Computed sites as a bit mask per window row. Cache point (ci, cj) is covered when a computed site (i, j) has\n // i ≤ ci < i + cw and j ≤ cj < j + ch; a union of dilations is the dilation of the union, so per cache row the\n // covered columns are the dilation of the OR of the masks of window rows cj − ch + 1 … cj. That OR is a prefix OR\n // when the rows start at fy0 and a suffix OR when they end at fy1 (OR is associative and commutative).\n if (prefixOr.length < sh) { prefixOr = new Int32Array(sh); suffixOr = new Int32Array(sh); }\n for (let j = fy0, m = 0; j <= fy1; j++) { m |= rowMask[j]!; prefixOr[j] = m; }\n for (let j = fy1, m = 0; j >= fy0; j--) { m |= rowMask[j]!; suffixOr[j] = m; }\n for (let g = 0; g < groups.length; g++) {\n const same = sameGeometry(g);\n if (same >= 0) { total += groupTotals[same]!; groupTotals[g] = groupTotals[same]!; continue; }\n const group = groups[g]!, cw = group.cw, ch = group.ch, cpw = group.cpw, cph = group.cph, last = Math.min(cph - 1, fy1 + ch - 1), before = total;\n let previous = -1, width = 0;\n for (let cj = fy0; cj <= last; cj++) {\n let m = 0;\n const a = Math.max(fy0, cj - ch + 1), b = Math.min(fy1, cj);\n if (a === fy0) m = prefixOr[b]!; else if (b === fy1) m = suffixOr[a]!;\n else for (let j = a; j <= b; j++) m |= rowMask[j]!;\n if (m !== previous) {\n previous = m; width = 0;\n let end = -1;\n for (let i = 0; m >>> i !== 0; i++) {\n if (((m >>> i) & 1) === 0) continue;\n const to = Math.min(i + cw - 1, cpw - 1);\n if (i > end) width += to - i + 1; else if (to > end) width += to - end;\n if (to > end) end = to;\n }\n }\n total += width;\n }\n groupTotals[g] = total - before;\n }\n return total;\n }\n for (let g = 0; g < groups.length; g++) {\n // The marks are the computed sites shifted by (cw − 1, ch − 1), so the count depends on the group's geometry only.\n const same = sameGeometry(g);\n if (same >= 0) { total += groupTotals[same]!; groupTotals[g] = groupTotals[same]!; continue; }\n const group = groups[g]!, cw = group.cw, ch = group.ch, cpw = group.cpw, cph = group.cph, ew = cpw + cw - 1, eh = cph + ch - 1, before = total;\n groupTotals[g] = 0;\n // Top-left marks in extended coordinates (window coordinates + (cw − 1, ch − 1)), and their bounding box.\n if (marks.length < ew * eh) { marks = new Uint8Array(ew * eh); }\n let x0 = ew, x1 = -1, y0 = eh, y1 = -1;\n const mark = (ei: number, ej: number): void => {\n if (ei < 0 || ej < 0 || ei >= ew || ej >= eh) return;\n marks[ej * ew + ei] = 1;\n if (ei < x0) x0 = ei; if (ei > x1) x1 = ei; if (ej < y0) y0 = ej; if (ej > y1) y1 = ej;\n };\n for (let j = 0; j < sh; j++) for (let i = 0; i < sw; i++) if (!Number.isNaN(siteCache[j * sw + i]!)) mark(i + cw - 1, j + ch - 1);\n for (let k = 0; k < outsideSites.length; k += 2) mark(outsideSites[k]! + cw - 1, outsideSites[k + 1]! + ch - 1);\n if (x1 < 0) continue;\n // Cache point (i, j) is covered when a mark lies in extended columns [i, i + cw) and rows [j, j + ch): a horizontal\n // then a vertical running count over the marks' box (outside it nothing is covered).\n const i0 = Math.max(0, x0 - cw + 1), i1 = Math.min(cpw - 1, x1), cwid = i1 - i0 + 1;\n if (cover.length < cwid * (y1 - y0 + 1)) cover = new Uint8Array(cwid * (y1 - y0 + 1));\n for (let r = y0; r <= y1; r++) {\n let run = 0;\n for (let e = i0; e <= i1 + cw - 1; e++) {\n run += marks[r * ew + e]!;\n if (e - cw >= i0) run -= marks[r * ew + e - cw]!;\n if (e >= i0 + cw - 1) cover[(r - y0) * cwid + e - cw + 1 - i0] = run > 0 ? 1 : 0;\n }\n marks.fill(0, r * ew + x0, r * ew + x1 + 1);\n }\n for (let i = 0; i < cwid; i++) {\n let run = 0;\n for (let r = y0; r <= y1 + ch - 1; r++) {\n if (r <= y1) run += cover[(r - y0) * cwid + i]!;\n if (r - ch >= y0 && r - ch <= y1) run -= cover[(r - ch - y0) * cwid + i]!;\n const j = r - ch + 1;\n if (j >= 0 && j < cph && run > 0) total++;\n }\n }\n groupTotals[g] = total - before;\n }\n return total;\n }\n let sx0 = 0, sy0 = 0, sw = 0, sh = 0, siteCache = new Float64Array(0);\n // The computed entries of a filled window's site cache (windowLookups): their count, bounding box and a bit mask per row\n // (columns below 31).\n let filledCount = 0, fx0 = 0, fx1 = -1, fy0 = 0, fy1 = -1;\n let rowMask = new Int32Array(0), prefixOr = new Int32Array(0), suffixOr = new Int32Array(0);\n function markFilled(i: number, j: number): void {\n if (i < 31) rowMask[j] = rowMask[j]! | (1 << i);\n if (filledCount++ === 0) { fx0 = fx1 = i; fy0 = fy1 = j; return; }\n if (i < fx0) fx0 = i; else if (i > fx1) fx1 = i;\n if (j < fy0) fy0 = j; else if (j > fy1) fy1 = j;\n }\n const pilotNode = input.wavelengthsNm[Math.floor(nodes / 2)]!;\n return {\n get lookups(): number { return lookups + (filled ? windowLookups() : 0); },\n get uniformMaterial(): number { return lastMaterial; },\n // Chart materials are tracked on the filled path and, without diffraction, on the direct ring (radiance scenes never).\n get tracksMaterial(): boolean { return ringOn || (directOn && scene.kind === \"materials\"); },\n get cachesSites(): boolean { return sw > 0; },\n get marksReads(): boolean { return filled; },\n markReads(xs: Int32Array, ys: Int32Array, values: Float64Array, materials: Int32Array, count: number): void {\n for (let n = 0; n < count; n++) {\n const i = xs[n]! - sx0, j = ys[n]! - sy0;\n if (!(i >= 0 && j >= 0 && i < sw && j < sh)) continue;\n const w = j * sw + i;\n if (siteCache[w]! === siteCache[w]!) continue;\n // As siteMiss for a site inside a filled window: the computed site is marked (windowLookups counts from the marks)\n // and its material kept.\n siteCache[w] = values[n]!; windowMaterial[w] = materials[n]!; markFilled(i, j);\n }\n },\n window(x0: number, y0: number, x1: number, y1: number): void {\n if (filled) lookups += windowLookups();\n filled = false; ringOn = false; outsideSites = []; filledCount = 0; rowMask.fill(0, 0, sh);\n sx0 = x0; sy0 = y0; sw = Math.max(0, x1 - x0); sh = Math.max(0, y1 - y0);\n if (sw * sh > CACHE_LIMIT) { sw = 0; sh = 0; }\n if (siteCache.length < sw * sh) siteCache = new Float64Array(sw * sh);\n if (rowMask.length < sh) rowMask = new Int32Array(sh);\n siteCache.fill(NaN, 0, sw * sh);\n if (!input.kernels) {\n // A ring of at least twice the window's rows keeps the rows of the previous display row's windows.\n if (sh > 0 && directRows < 2 * sh) {\n let rows = 1;\n while (rows < 2 * sh) rows *= 2;\n if (rows * W <= CACHE_LIMIT) { directRows = rows; directRing = new Float64Array(rows * W).fill(NaN); directRowId = new Int32Array(rows).fill(-1); directRingMaterial = new Int32Array(rows * W); }\n }\n directOn = sh > 0 && directRows >= 2 * sh;\n if (directOn && windowMaterial.length < sw * sh) windowMaterial = new Int32Array(sw * sh);\n return;\n }\n for (const group of groups) {\n group.cx0 = x0 + group.minIx - R; group.cy0 = y0 + group.minIy - R;\n group.cpw = sw === 0 ? 0 : sw + group.cw - 1; group.cph = sh === 0 ? 0 : sh + group.ch - 1;\n if (group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes) > CACHE_LIMIT) { group.cpw = 0; group.cph = 0; }\n }\n // Chart materials whose every group caches the whole window: the filled path (bands). Otherwise the lazy window caches.\n if (scene.kind === \"materials\" && sw > 0 && groups.every((group) => group.cpw > 0)) {\n groups.forEach((group, g) => coverBand(g, group.cx0, group.cx0 + group.cpw, group.cy0, group.cph));\n filled = true;\n if (windowMaterial.length < sw * sh) windowMaterial = new Int32Array(sw * sh);\n // A ring of at least twice the window's rows keeps the rows of the previous display row's windows.\n if (ringRows < 2 * sh) {\n let rows = 1;\n while (rows < 2 * sh) rows *= 2;\n if (rows * W <= CACHE_LIMIT) { ringRows = rows; ring = new Float64Array(rows * W).fill(NaN); ringMaterial = new Int32Array(rows * W); ringRowId = new Int32Array(rows).fill(-1); }\n }\n ringOn = ringRows >= 2 * sh;\n return;\n }\n for (const group of groups) {\n const n = group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes);\n if (scene.kind === \"materials\") { if (group.cache.length < n || !(group.cache instanceof Int32Array)) group.cache = new Int32Array(n); group.cache.fill(-1, 0, n); }\n else { if (group.cache.length < n || !(group.cache instanceof Float64Array)) group.cache = new Float64Array(n); group.cache.fill(NaN, 0, n); }\n }\n },\n site(x: number, y: number): number {\n // The window's site cache first (with the ring: the sites read in this window, which its lookup count needs too).\n const i = x - sx0, j = y - sy0, cached = i >= 0 && j >= 0 && i < sw && j < sh;\n if (cached) { const w = j * sw + i, v = siteCache[w]!; if (v === v) { if (ringOn || directOn) lastMaterial = windowMaterial[w]!; return v; } }\n return siteMiss(x, y, i, j, cached);\n },\n pilot(u: number, v: number): number {\n lookups++;\n return scene.kind === \"materials\" ? scene.materialAt(u, v) : scene.radianceAt(u, v, pilotNode);\n }\n };\n}\n\n/** #564: tile sides of the large-kernel expected signal: the in-focus signal E (3 channels) and the convolved sites. */\nconst LARGE_E_TILE = 64, LARGE_OUTPUT_TILE = 128;\n/** Bytes kept per input for each of the two tile caches (least recently used first; a dropped tile is recomputed with the same bits). */\nconst LARGE_CACHE_BYTES = 32 * 1048576;\n\n/** Per input object: the in-focus tiles, the convolved lattice and the scene lookups made so far (shared by the renders of the input). */\ninterface LargeKernelState { lattice: SiteKernelRunsLattice; lookups: number }\nconst LARGE_PREPARED = new WeakMap<DisplayViewExpectedSignalInput, LargeKernelState>();\n\n/**\n * #564: the expected signal with a defocus kernel D above the direct radius. Defocus of a plane is space-invariant and\n * wavelength-independent, so it commutes with the spectral and query-offset sums and with the diffraction kernels:\n * μ_c(x) = Σ_o w_o Σ_λ A_c(λ) Σ_t (K_λ ∗ D)(t)·L(p_o(x) − t, λ) = Σ_s D(s)·E_c(x − s),\n * with E_c(x) = Σ_o w_o Σ_λ A_c(λ) Σ_t K_λ(t)·L(p_o(x) − t, λ) the in-focus expected electrons of channel c at site position x\n * (the same sum as `kernelSite`, on the lattice formula), so the disc is applied once per channel on the native site lattice\n * instead of once per spectral node and lattice group. E is computed in fixed 64-site tiles (all three channels), and D ⊛ E_c\n * by runs in fixed 128-site tiles, each site taking its own channel: every value depends only on the site, so regions and parts\n * are bit-identical to the whole frame. The tiles are kept per input object, across its renders.\n *\n * Diagnostics: `lookups` counts the scene lookups this signal's calls caused (tiles computed for it; a tile an earlier render of\n * the input computed costs none). `uniformMaterial` is −1 and nothing is tracked or marked, as for radiance scenes.\n */\nfunction createLargeKernelSignal(input: DisplayViewExpectedSignalInput): DisplayViewExpectedSignal {\n if (!input.kernels || !input.largeKernel) throw new InvalidConfigurationError(\"The large-kernel expected signal needs the in-focus kernels.\");\n let state = LARGE_PREPARED.get(input);\n if (!state) { state = prepareLargeKernel(input); LARGE_PREPARED.set(input, state); }\n const prepared = state, start = prepared.lookups, channelAt = input.channelAt, scene = input.scene, nodes = input.wavelengthsNm.length;\n const pilotNode = input.wavelengthsNm[Math.floor(nodes / 2)]!;\n let pilots = 0;\n return {\n get lookups(): number { return prepared.lookups - start + pilots; },\n get uniformMaterial(): number { return -1; },\n get tracksMaterial(): boolean { return false; },\n get cachesSites(): boolean { return false; },\n get marksReads(): boolean { return false; },\n markReads(): void { /* nothing is marked: marksReads is false */ },\n window(): void { /* the tiles are fixed and kept per input; a window changes nothing */ },\n site(x: number, y: number): number { return prepared.lattice.valueAt(channelAt(x, y), x, y); },\n pilot(u: number, v: number): number {\n pilots++;\n return scene.kind === \"materials\" ? scene.materialAt(u, v) : scene.radianceAt(u, v, pilotNode);\n }\n };\n}\n\nfunction prepareLargeKernel(input: DisplayViewExpectedSignalInput): LargeKernelState {\n const W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth, nodes = input.wavelengthsNm.length, R = input.kernels!.radius;\n const tables = displayViewSignalTables(input), { spectra, groups } = tables, scene = input.scene, acc = createMaterialSums(nodes, spectra);\n const state = { lookups: 0 } as LargeKernelState;\n const latticeU = (group: GroupTables, p: number): number => (group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g);\n const latticeV = (group: GroupTables, q: number): number => (group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g);\n /** E_c of the native site positions [x0, x0 + T) × [y0, y0 + T), all three channels: kernelSite's sum, each group's lattice read once. */\n function inFocusTile(x0: number, y0: number, T: number): Float64Array[] {\n const out = [0, 1, 2].map(() => new Float64Array(T * T));\n for (const group of groups) {\n const cw = group.cw, ch = group.ch, gw = T + cw - 1, gh = T + ch - 1, p0 = x0 + group.minIx - R, q0 = y0 + group.minIy - R;\n if (scene.kind === \"materials\") {\n const material = new Int32Array(gw * gh);\n for (let j = 0; j < gh; j++) { const v = latticeV(group, q0 + j); for (let i = 0; i < gw; i++) material[j * gw + i] = scene.materialAt(latticeU(group, p0 + i), v); }\n state.lookups += gw * gh;\n for (let c = 0; c < 3; c++) {\n const k = group.nodeKernels[c]!, e = out[c]!;\n for (let y = 0; y < T; y++) for (let x = 0; x < T; x++) {\n // Each group's part of the site, integrated from its taps' material spectra (MaterialSums).\n acc.reset();\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) acc.add(material[(y + dy) * gw + x + dx]!, k, (dy * cw + dx) * nodes);\n e[y * T + x] = e[y * T + x]! + acc.value();\n }\n }\n } else {\n const radiance = new Float64Array(gw * gh * nodes);\n for (let j = 0; j < gh; j++) {\n const v = latticeV(group, q0 + j);\n for (let i = 0; i < gw; i++) { const u = latticeU(group, p0 + i); for (let n = 0; n < nodes; n++) radiance[(j * gw + i) * nodes + n] = scene.radianceAt(u, v, input.wavelengthsNm[n]!); }\n }\n state.lookups += gw * gh * nodes;\n for (let c = 0; c < 3; c++) {\n const e = out[c]!;\n for (let y = 0; y < T; y++) for (let x = 0; x < T; x++) {\n let sum = 0;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const r = ((y + dy) * gw + x + dx) * nodes;\n for (let n = 0; n < nodes; n++) sum += group.perNode[n]![c]![dy * cw + dx]! * radiance[r + n]!;\n }\n e[y * T + x] = e[y * T + x]! + sum;\n }\n }\n }\n }\n return out;\n }\n // At least the in-focus tiles one output tile's source spans plus one more row of them, so the next output tile of a row\n // reuses them (about 37 MiB at radius 512); otherwise the byte budget.\n const span = Math.ceil((LARGE_OUTPUT_TILE + 2 * input.largeKernel!.radius) / LARGE_E_TILE) + 1;\n const inFocus = new Map<number, Float64Array[]>(), inFocusCapacity = Math.max(span * (span + 1), Math.floor(LARGE_CACHE_BYTES / (3 * LARGE_E_TILE * LARGE_E_TILE * 8)));\n function inFocusTileAt(tx: number, ty: number): Float64Array[] {\n const T = LARGE_E_TILE, key = (ty + 1048576) * 2097152 + tx + 1048576;\n let tile = inFocus.get(key);\n if (tile) { inFocus.delete(key); inFocus.set(key, tile); }\n else {\n tile = inFocusTile(tx * T, ty * T, T);\n inFocus.set(key, tile);\n if (inFocus.size > inFocusCapacity) inFocus.delete(inFocus.keys().next().value!);\n }\n return tile;\n }\n // Which sites of a tile row hold channel c: the CFA's 2 × 2 period, from channelAt (tile origins are even).\n const phase = [0, 1].map((py) => [0, 1].map((px) => input.channelAt(px, py)));\n const patterns: SiteKernelRunsRowPattern[] = [0, 1, 2].map((c) => (row: number) => {\n const p = phase[row & 1]!, even = p[0] === c, odd = p[1] === c;\n return even && odd ? { start: 0, step: 1 } : even ? { start: 0, step: 2 } : odd ? { start: 1, step: 2 } : null;\n });\n state.lattice = createSiteKernelRunsLattice({ runs: input.largeKernel!, tile: LARGE_OUTPUT_TILE, fields: 3, capacityBytes: LARGE_CACHE_BYTES,\n pattern: (c) => patterns[c], source: (x0, y0, width, height) => (c: number): Float64Array => {\n // Copied from the in-focus tiles the rectangle overlaps, tile by tile, row segment by row segment (the values are copies).\n const samples = new Float64Array(width * height), T = LARGE_E_TILE;\n for (let ty = Math.floor(y0 / T); ty * T < y0 + height; ty++) for (let tx = Math.floor(x0 / T); tx * T < x0 + width; tx++) {\n const tile = inFocusTileAt(tx, ty)[c]!, ax = Math.max(x0, tx * T), bx = Math.min(x0 + width, (tx + 1) * T), ay = Math.max(y0, ty * T), by = Math.min(y0 + height, (ty + 1) * T);\n for (let y = ay; y < by; y++) samples.set(tile.subarray((y - ty * T) * T + ax - tx * T, (y - ty * T) * T + bx - tx * T), (y - y0) * width + ax - x0);\n }\n return samples;\n } });\n return state;\n}\n"]}
|