Print the black-and-white negatives instead of showing the scan

Choosing Ilford HP5 Plus showed an inverted grey frame. So did Double-X.
They are negatives, and upstream leaves `target_print` null on every
monochrome stock, so nothing was ever printed and the scan was all there was.

A colour negative at least announces itself -- the orange mask says plainly
that you are looking at a negative. A monochrome one just looks broken.

They print on Kodak 2302 now, which is a monochrome print film and is what
such a negative is actually printed onto; Double-X onto 2302 is the standard
cine chain. For the Ilford stocks it stands in for an Ilford paper, which
nobody has measured, and is at least the right kind of material.

The scan is still reachable through the Scanned/Printed toggle. It is a thing
to choose now rather than the only thing on offer.

`every_shipped_stock_bakes` did not catch this, and could not: it derives
"should this be inverted?" from the stock's kind *and whether it names a
paper*, so it looked at an inverted HP5, concluded that was right for an
unprinted negative, and passed. The assertion was self-consistent and the
situation was still wrong. The new test asserts the thing that actually
matters -- a camera negative must name a paper, that paper must be a printing
stock, and it must be the same kind of material, so a monochrome negative
cannot end up on colour paper.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 17:35:25 +02:00
co-authored by Claude Opus 5
parent ce6458547a
commit ff1a3e0e80
8 changed files with 70 additions and 2 deletions
+26 -2
View File
@@ -119,6 +119,19 @@ PARAMETRIC_BW = [
("ilford_hp5_plus", "Ilford HP5 Plus", 400, 2.6, 11.0),
]
# The black-and-white print stock every monochrome negative here is printed on.
#
# Upstream leaves `target_print` null on the black-and-white negatives, which
# left them rendering as *negatives* -- inverted, and without a colour
# negative's orange cast to make it obvious that was what you were looking at.
# 2302 is a monochrome print film and is the material such a negative is
# actually printed onto; Double-X onto 2302 is the standard cine chain.
#
# For the Ilford stocks it is a stand-in rather than the historical pairing --
# those would have gone onto an Ilford paper -- but it is the right *kind* of
# material and the only monochrome print stock measured here.
BW_PRINT_STOCK = "kodak_2302"
# The stock whose measured panchromatic response the constructed ones borrow.
BW_REFERENCE = "kodak_doublex"
BW_REFERENCE_ISO = 250
@@ -256,8 +269,18 @@ def convert(stock):
f"reference_illuminant: {info['reference_illuminant']}",
f"viewing_illuminant: {info['viewing_illuminant']}",
]
if info.get("target_print"):
out.append(f"target_print: {info['target_print']}")
target_print = info.get("target_print")
if (
target_print is None
and monochrome
and info["type"] == "negative"
and info["stage"] == "filming"
):
# See BW_PRINT_STOCK: upstream leaves this null, which showed the
# negative rather than the photograph.
target_print = BW_PRINT_STOCK
if target_print:
out.append(f"target_print: {target_print}")
out += [
"",
"# log10 spectral sensitivity per layer, 380-780nm at 5nm, in R,G,B layer",
@@ -377,6 +400,7 @@ def build_parametric_bw(stock, name, iso, density_max, granularity):
"support: film # film | paper",
"stage: filming # filming | printing",
"monochrome: true",
"target_print: " + BW_PRINT_STOCK,
"reference_illuminant: D55",
"viewing_illuminant: D50",
"",