Ship every stock that exists, black and white included
Three profiles was what the first cut needed to prove the model. This is the rest of the open data: 23 camera stocks and 9 papers, which is all of spektrafilm. Black and white was the gap, and it turned out not to be a gap in the data -- it was a gap in where I looked. Upstream's `main` has 28 colour profiles and nothing monochrome; `dev` has three more, and they are Tri-X, Double-X and the 2302 print film they go onto. So the answer to "do we have B&W" was yes all along, and it needed the dev branch rather than a fortnight digitising Ilford's datasheet graphs by eye. Those three are pinned to `dev` per stock; the colour stocks stay on the released branch. A monochrome profile is single-channel -- one emulsion, not three -- and spreading that one layer across all three is exact rather than an approximation: three layers with identical sensitivity and identical curves respond identically, which is what one layer does. The dye is the trap. The renderer *sums* the three layers' contributions, so replicating it unchanged renders every frame three times too dense -- neutrally, and therefore plausibly. A third each reconstructs the single emulsion, and two tests hold both halves: that the densities stay equal, and that they sum to one emulsion and not three. Double-X and 2302 ship five curves apiece, measured at five development times -- 4 to 12 minutes for Double-X. That is push and pull processing as measured data. The standard 6.5 minutes is what ships; the rest is in the upstream file waiting for a control to ask for it. Two stocks are `support: film` and are nevertheless what a negative is printed *onto*: the cine projection films 2383 and 2393, which the Vision3 stocks print to. Filtering the picker on support alone offered a projection stock as something to load in a camera, so it filters on stage, with a test saying so. The picker had to change shape twice over. Chips were right for three stocks and off the edge of a 280px column at twenty-four, and the column that replaced them was a thousand pixels standing between the photographer and every slider below. It is a disclosure now: one row carrying the answer, opened to change it, closed again on choosing. That is the opposite of the argument this panel used to take the lids off its sliders, and deliberately so -- an instrument you compare wants to be visible, and a list you consult once wants to be out of the way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2344,17 +2344,15 @@ impl DevelopSession {
|
||||
/// photograph that has never been put on film selects it without anyone
|
||||
/// inventing a sentinel, and `reset` means what it means everywhere else.
|
||||
///
|
||||
/// Papers are filtered out. A print paper is a stock in the database and
|
||||
/// is chosen *for* a negative rather than instead of one — offering
|
||||
/// Endura beside Portra would invite developing a photograph on
|
||||
/// photographic paper, which is not a thing that happens.
|
||||
/// Only what goes in a camera. A print paper is a stock in the database
|
||||
/// and is chosen *for* a negative rather than instead of one, and so is a
|
||||
/// cine projection print film — which is coated on film, and is why the
|
||||
/// filter asks about the stage rather than the support.
|
||||
pub fn film_choices() -> Vec<(Option<&'static str>, String)> {
|
||||
let mut out = vec![(None, "None".to_string())];
|
||||
for p in dr_film::built_in() {
|
||||
if p.support == dr_film::Support::Film {
|
||||
out.push((Some(p.stock.as_str()), p.name.clone()));
|
||||
}
|
||||
}
|
||||
out.extend(
|
||||
dr_film::camera_stocks().map(|p| (Some(p.stock.as_str()), p.name.clone())),
|
||||
);
|
||||
out
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user