import { Recipe, ColorAdjustments } from '../types'; // Fallback values for every adjustable knob. Old recipes/sessions persisted in // AsyncStorage lack the newer fields — merge this under stored JSON to keep // every adjustment well-defined (see storageUtils.getAllRecipes / App session). export const DEFAULT_ADJUSTMENTS: ColorAdjustments = { exposure: 0, contrast: 0, saturation: 0, temperature: 5500, tint: 0, wbRed: 0, wbBlue: 0, highlight: 0, shadow: 0, denoise: 0, clarity: 0, grain: 0, colorChrome: 'none', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }; // Standard Fuji film simulations. These are the fixed "look" presets shown at // the front of the PRESETS chip row: tapping one applies the simulation via // its baseFilter colour matrix ONLY — every other knob resets to its neutral // default (0 / auto) so the sim is a clean starting point, never a baked // recipe. Any look beyond the matrix (grain, DR, CC, contrast…) is added by // the user afterwards. export interface FilmSim { id: string; // Recipe-like id used only while the sim is the current selection name: string; baseFilter: Recipe['baseFilter']; adjustments: ColorAdjustments; } 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-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 } }, // Leica digital look (M/Q/SL) is NOT a film stock: neutral-but-warm colour // with restrained saturation, deep open shadows and gentle highlight rolloff. // Matrix-only here (like every sim) — the tonal half lives in the leica // matrix (mild contrast + warm neutrality); users stack DR/tone on top. { id: 'sim-leica', name: 'LEICA', baseFilter: 'leica', adjustments: { ...DEFAULT_ADJUSTMENTS } }, ]; // Film sim → full Recipe (never persisted; sims are applied on the fly). export function filmSimToRecipe(sim: FilmSim): Recipe { return { id: sim.id, name: sim.name, baseFilter: sim.baseFilter, adjustments: { ...sim.adjustments }, frameId: 'none', useGeotag: true, }; } export const DEFAULT_RECIPES: Recipe[] = [ { id: 'classic-neg-default', name: 'CLASSIC NEG.', baseFilter: 'classic-neg', adjustments: { exposure: 2, contrast: 1, saturation: -1, temperature: 6300, tint: 2, highlight: -2, shadow: 1, denoise: 1, clarity: 2, grain: 4, colorChrome: 'weak', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', useGeotag: true, }, { id: 'velvia-default', name: 'VELVIA VIVID', baseFilter: 'velvia', adjustments: { exposure: 0, contrast: 2, saturation: 3, temperature: 5500, tint: 0, highlight: 1, shadow: -1, denoise: 2, clarity: 4, grain: 1, colorChrome: 'strong', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', useGeotag: true, }, { id: 'provia-default', name: 'PROVIA STD', baseFilter: 'provia', adjustments: { exposure: 1, contrast: 0, saturation: 0, temperature: 5000, tint: 0, highlight: 0, shadow: 0, denoise: 2, clarity: 1, grain: 2, colorChrome: 'none', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', useGeotag: true, }, { id: 'acros-default', name: 'ACROS MONO', baseFilter: 'monochrome', adjustments: { exposure: 0, contrast: 4, saturation: 0, temperature: 5000, tint: 0, highlight: 3, shadow: -2, denoise: 0, clarity: 3, grain: 6, colorChrome: 'none', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', useGeotag: true, }, { id: 'retro-amber-default', name: 'RETRO AMBER 🏮', baseFilter: 'classic-neg', adjustments: { exposure: 3, contrast: 2, saturation: 1, temperature: 7500, tint: -2, highlight: -3, shadow: 2, denoise: 3, clarity: -2, grain: 5, colorChrome: 'strong', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'classic-white', useGeotag: true, }, { id: 'cinema-spring-default', name: 'CINEMA SPRING', baseFilter: 'none', adjustments: { exposure: 0, contrast: 1, saturation: 1, temperature: 5800, tint: 0, highlight: -1, shadow: 1, denoise: 2, clarity: 1, grain: 3, colorChrome: 'none', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', cinema: 'spring', useGeotag: true, }, { id: 'cinema-summer-default', name: 'CINEMA SUMMER', baseFilter: 'none', adjustments: { exposure: 0, contrast: 2, saturation: 2, temperature: 6000, tint: -1, highlight: 1, shadow: -1, denoise: 1, clarity: 2, grain: 2, colorChrome: 'weak', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', cinema: 'summer', useGeotag: true, }, { id: 'cinema-autumn-default', name: 'CINEMA AUTUMN', baseFilter: 'none', adjustments: { exposure: 0, contrast: 1, saturation: 2, temperature: 7200, tint: -2, highlight: -2, shadow: 1, denoise: 2, clarity: 0, grain: 4, colorChrome: 'weak', colorChromeBlue: 'none', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', cinema: 'autumn', useGeotag: true, }, { id: 'cinema-winter-default', name: 'CINEMA WINTER', baseFilter: 'none', adjustments: { exposure: 1, contrast: -1, saturation: -2, temperature: 4500, tint: 2, highlight: -2, shadow: 2, denoise: 3, clarity: -2, grain: 3, colorChrome: 'none', colorChromeBlue: 'weak', dynamicRange: 'auto', sharpening: 0, exposureCompensation: 0, }, frameId: 'none', cinema: 'winter', useGeotag: true, }, ];