Skip to content

D-Log2 highlight zebra at 100 IRE never paints — confirm mapping, then default below ceiling #136

Description

@erik-sutton95

Maintainer observation: default Highlight zebra is 100 IRE. On D-Log2 they never show. Setting 99 starts to paint. Are zebras mapped to the color mode? If the mapping is correct, 100 is the wrong operator default because SoftAP never quite hits the measured ceiling.

What went wrong?

This is not “100 means code 255.” WAVE / zebra / FALSE Maximum share one axis:

  • 0 = paper black
  • 18% grey = paper IRE (D-Log2 30.50)
  • 100 = live-tap EI ceiling (D-Log2 SoftAP typical max=247, range 243–247 — not 255)

LiveColorScience.zebraHighlight is monitorPercent >= threshold (default 100). GPU maps 100 → ScopeDisplayScale.signalNative → clip byte (~247/255) and paints luma that code.

Tests (ZebraAssistTests.testHighlightFiresAtLiveTapCeiling) only prove 247/255 → 100 and that grey 30.50 is not a highlight. They do not prove a typical 243–246 highlight paints at default 100.

So the operator report matches the model: 100 only fires at/above the measured ceiling. Preview rarely sits on that exact byte, so default 100 looks “off.” 99 is slightly under the shelf and lights.

Already in tree

  • LiveZebra.highlightIRE == 100, midtoneIRE == 55
  • MonitorTransfer / ScopeExposureCeiling / ScopeDisplayScale.monitorPercent
  • GPU: LiveMonitorFx.applyZebra Rec.709 luma matrix on encoded log RGB, then compare to clip code. WAVE uses max-channel tap. A hot but tinted pixel can miss Y even if WAVE shows near 100.
  • Android GLES uses the same IRE → code scalars (FeedEffectsWire)
  • D-Log M mapping is Add D-Log M monitor transfer and scope mapping #84, not this. This is Pocket D-Log2 / D-Log.

Do

  • Prove mapping on a physical D-Log2 take: journal scope max=, WAVE 100 line, and zebra at 100 vs 99 vs 95 on the same blast. If WAVE 100 and zebra 100 disagree, fix the GPU compare (encoded luma vs max channel / monitorPercent) — do not only change the default.
  • If they agree and typical max is 243–246: keep 100 = ceiling, change the default Highlight to 99 (or 95 if 99 is still too tight). Copy: highlight is “approaching clip,” not “exact live-tap max byte.”
  • Rec.709 / HLG: 100 still means encoded peak; confirm defaults still make sense there.
  • Same default + GPU rule on Android.
  • Tests: a D-Log2 code just below the ceiling byte (e.g. 243) does not fire at 100 and does fire at 99. Ceiling byte still fires at 100.
  • Existing operators who saved 100 keep 100 until they reset — or migrate only the factory default.

Out of scope

Keyboard covering the field (separate issue). D-Log M (#84). Redesigning WAVE 0/100 lines.

Done when

Physical Pocket 4 Pro, D-Log2: highlight zebra is visible on a hot sky/practical at the new default, and WAVE 100 still matches the ceiling. Rec.709 still sensible. Both shells.

Verify

Physical D-Log2 + Rec.709. just check. WAVE + zebra on the same take.

Metadata

Metadata

Assignees

Labels

P1High priority — important for current cyclearea:androidAndroid / Jetpack Compose workarea:coreShared Swift core (Sources/OpenPocketViewCore)area:iosiOS SwiftUI shell (ios/OpenPocketCine)area:monitoringMonitoring assists (false color, scopes, zebra, guides, etc.)bugSomething isn't workingreadyTriaged and ready to pick up

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions