# ๐ŸŸก Our composite is brighter than the emulator's frame โ€” measured, not decoded **Status:** ๐ŸŸก **measured, with a narrow reach and a live confound.** Closes an observation left dangling by [ui-8ax-fullres-background](ui-8ax-fullres-background.md) ("the capture is ~4ร— darker than the render"), and puts a number on the โ” that [INDEX](../INDEX.md)'s texture row already carried: *"exact fidelity (gamma/sRGB curve, premultiplied alpha, per-channel scale) is untested, since a hue comparison cannot see it."* โš ๏ธ **This is not a decode.** A port applying it is authoring a value. ## First: the geometry is right Cross-correlating `live-main-menu.png` against our render over ยฑ6 px finds the best alignment at exactly **dy = 0, dx = 0**, correlation **0.9466**. So the composite is in the right place at the right size and only the *tone* differs. (The capture is 1279ร—675 and top-aligned; that is the screenshot tool's crop.) ## ๐Ÿ”ด The first two methods were wrong, and both failed visibly * **Three dark patches** gave "capture โ‰ˆ 4ร— darker". Over the whole frame the best linear scale is **0.914**. Three patches from one region are not a transfer curve. * **A pixel-wise fit** over 854 685 pixels produced a non-monotonic transfer (render 96โ€“127 โ†’ capture *143*, brighter than render 128โ€“159 โ†’ 132). That is the signature of **edge misalignment**, not of a tone curve: at a 0.947 correlation a bright render pixel routinely lands on a dark capture pixel. Mean abs error was 10โ€“14 for every model, which is the tell that none of them fit. Both are recorded because the second is the interesting failure โ€” a fit whose *residual* is large everywhere is not a model to choose between, it is a method to throw away. ## The method that works: flat patches only 16ร—16 patches where **both** images have `std < 8`, so local edges cannot contribute. The threshold is not arbitrary โ€” at `std < 3` there are **zero** patches, and the count runs 0 / 83 / 404 / 1055 / 1788 for `std <` 3 / 5 / 8 / 12 / 20. | screen | flat patches | gamma exponent | mean abs err | best linear | its err | |---|---|---|---|---|---| | main menu | 404 | **1.491** | 0.28 | 0.276 | 0.34 | | `EXTRAS` | 382 | **1.493** | 0.22 | 0.273 | 0.28 | | title | 506 | **1.338** | 1.08 | 0.842 | 9.02 | So `capture โ‰ˆ 255ยท(render/255)^ฮณ` with **ฮณ โ‰ˆ 1.34 โ€“ 1.49**. ## โš ๏ธ The reach โ€” and it is narrow * **The flat patches are almost all dark**: render values ~0โ€“60. Over that range a gamma and a linear scale are nearly indistinguishable โ€” on the two menus the errors are 0.28 vs 0.34 and 0.22 vs 0.28, which decides nothing. **Only the title separates them** (1.08 vs 9.02), because its flat regions reach ~60. * **The held-out control could not test it.** Running the same fit on the developer splash gives 2 918 flat patches whose render range is **0โ€“4** โ€” pure black. Every model scores โ‰ˆ 0.00 there. That is a control that failed to discriminate, not a control that passed. * **Nothing here constrains midtones or highlights**, which is exactly where a ฮณ = 1.4 curve does its visible work. ## โ” The confound: this may be the emulator, not the game The comparison is our composite against **what Xenia Canary displays**, and canary applies its own output transform: `kernel_display_gamma_type = 2` โ€” BT.709 (HDTV) โ€” in this container's config (`0` linear, `1` sRGB, `3` a power set by `kernel_display_gamma_power`). So the measured exponent may belong to canary's display stage rather than to the game or the console. **The discriminating experiment is cheap and was not run:** set `kernel_display_gamma_type = 0`, re-capture the same screen, and re-fit. If the exponent collapses toward 1.0 it is canary's; if it survives it is upstream. That needs one emulator run reaching the main menu. ## What a port should do with this Treat it as **authored**, not transcribed. If the goal is to match the emulator โ€” which is what every capture in this corpus is โ€” a ฮณ โ‰ˆ 1.4 darkening of the composite gets closer, and is best applied where it was measured (the dark background), not extrapolated to the whole range on this evidence.