web: the sim chips keep their legacy names

The name table is a reference for what each sim has to look like, not a
renaming order: the ten PHOTO STYLE chips go back to PROVIPES, VELVIPES,
CLASSIC CHRIPES, CLASSIC VIVIDIPES, CLASSIC NEGIPES, ASTIPES, ETERNIPES,
ACRIPES, LC STREETLIFE CLASSIC and LC STREETLIFE VIVID. The comment above
FILM_SIMS now says so outright — label on the left, the stock's colour and tone
it must match on the right, and neither side moves the other.

The grading is untouched: a sim is still colour and tone only, its `adjustments`
stay neutral, and LC STREETLIFE VIVID keeps its +2 exposure as SIM_EXPOSURE_BIAS
in colorUtils rather than as a knob.
This commit is contained in:
2026-09-22 08:37:19 +07:00
parent 428e7fa682
commit 59d90ae068
2 changed files with 26 additions and 22 deletions
+24 -20
View File
@@ -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 } },
];
+2 -2
View File
@@ -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 {