diff --git a/docker/frontend/shared/utils/defaultRecipes.ts b/docker/frontend/shared/utils/defaultRecipes.ts index dde9d9e..a28b8d8 100644 --- a/docker/frontend/shared/utils/defaultRecipes.ts +++ b/docker/frontend/shared/utils/defaultRecipes.ts @@ -39,16 +39,19 @@ export const DEFAULT_ADJUSTMENTS: ColorAdjustments = { // because those are the user's knobs, not the stock's. A sim is a clean starting // point, never a baked recipe; any further look is added afterwards. // -// Name → stock it stands for. The name IS the sim's identity and the tag it -// exports as, so it is spelled as the stock is: -// PROVIA Provia / Standard -// VELVIA Velvia / Vivid -// CLASSIC CHROME Classic Chrome -// CLASSIC VIVID Velvia spliced with Classic Chrome at the blue row -// CLASSIC NEGATIVE Classic Negative (Superia-like) -// ASTIA Astia / Soft -// ETERNA Eterna (cinema) -// ACROS Acros (monochrome) +// Name → the stock's colour and tone it must stand for. This table is the +// REFERENCE ONLY: the string at the left is just the app's label for the chip +// (the legacy 'PES' spelling), and what matters is that the sim behind it grades +// the picture the way the stock at the right does. So a change to a label must +// never touch the grading, and a change to a grading never renames the chip: +// PROVIPES Provia / Standard +// VELVIPES Velvia / Vivid +// CLASSIC CHRIPES Classic Chrome +// CLASSIC VIVIDIPES Velvia spliced with Classic Chrome at the blue row +// CLASSIC NEGIPES Classic Negative (Superia-like) +// ASTIPES Astia / Soft +// ETERNIPES Eterna (cinema) +// ACRIPES Acros (monochrome) // LC STREETLIFE CLASSIC Leica Authentic Classic // LC STREETLIFE VIVID Leica Vivid export interface FilmSim { @@ -59,20 +62,21 @@ export interface FilmSim { } export const FILM_SIMS: FilmSim[] = [ - { id: 'sim-provia', name: 'PROVIA', baseFilter: 'provia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-velvia', name: 'VELVIA', baseFilter: 'velvia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-classic-chrome', name: 'CLASSIC CHROME', baseFilter: 'classic-chrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-classic-vivid', name: 'CLASSIC VIVID', baseFilter: 'classic-vivid', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-classic-neg', name: 'CLASSIC NEGATIVE', baseFilter: 'classic-neg', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-astia', name: 'ASTIA', baseFilter: 'astia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-eterna', name: 'ETERNA', baseFilter: 'eterna', adjustments: { ...DEFAULT_ADJUSTMENTS } }, - { id: 'sim-acros', name: 'ACROS', baseFilter: 'monochrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-provia', name: 'PROVIPES', baseFilter: 'provia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-velvia', name: 'VELVIPES', baseFilter: 'velvia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-classic-chrome', name: 'CLASSIC CHRIPES', baseFilter: 'classic-chrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-classic-vivid', name: 'CLASSIC VIVIDIPES', baseFilter: 'classic-vivid', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-classic-neg', name: 'CLASSIC NEGIPES', baseFilter: 'classic-neg', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-astia', name: 'ASTIPES', baseFilter: 'astia', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-eterna', name: 'ETERNIPES', baseFilter: 'eterna', adjustments: { ...DEFAULT_ADJUSTMENTS } }, + { id: 'sim-acros', name: 'ACRIPES', baseFilter: 'monochrome', adjustments: { ...DEFAULT_ADJUSTMENTS } }, // The rangefinder digital look (M/Q/SL) is not a film stock, so it ships as its own // pair instead of one look that has to compromise. Both are still colour and // tone only: CLASSIC is Leica Authentic (the matrix carries the channel // separation and the warm European cast, nothing else), VIVID is Leica Vivid - // (the same separation opened up — again in the matrix, not as an exposure or - // saturation knob). + // (the same separation opened up — again in the matrix, with the one + // brightness step the stock owns folded in through SIM_EXPOSURE_BIAS in + // colorUtils, never as an `adjustments` value). { id: 'sim-leica', name: 'LC STREETLIFE CLASSIC', baseFilter: 'leica', adjustments: { ...DEFAULT_ADJUSTMENTS } }, { id: 'sim-leica-vivid', name: 'LC STREETLIFE VIVID', baseFilter: 'leica-vivid', adjustments: { ...DEFAULT_ADJUSTMENTS } }, ]; diff --git a/docker/frontend/src/App.tsx b/docker/frontend/src/App.tsx index 0fc24ec..a6283a6 100644 --- a/docker/frontend/src/App.tsx +++ b/docker/frontend/src/App.tsx @@ -864,7 +864,7 @@ export function Workspace() { const reset = useCallback(() => { remember(); - // Back to the startup look, exactly like the phone: the PROVIA sim, every + // Back to the startup look, exactly like the phone: the PROVIPES sim, every // knob neutral, no frame/crop, no rotation, both marks off and restyled. restoreLook(defaultLook()); setOpenParam(null); @@ -1824,7 +1824,7 @@ export function Workspace() { const toggleMono = () => { remember(); if (monoOn) { - const back = monoPrev.current ?? { baseFilter: 'provia' as Recipe['baseFilter'], simId: 'sim-provia', name: 'PROVIA' }; + const back = monoPrev.current ?? { baseFilter: 'provia' as Recipe['baseFilter'], simId: 'sim-provia', name: 'PROVIPES' }; setRecipe((prev) => ({ ...prev, baseFilter: back.baseFilter, name: back.name, isCustom: true })); setSimId(back.simId); } else {