#version 330
/*
Faded Film / Eastmancolor (1970s-1980s) — picom shader
Warm Eastmancolor dye degradation. Taxi Driver, The Godfather era.
Cyan dye fades first, magenta persists longest, lifted maroon blacks.
*/
in vec2 texcoord;
uniform sampler2D tex;
const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);
float hash(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * .1031);
p3 += dot(p3, p3.yzx + 33.33);
return fract((p3.x + p3.y) * p3.z);
}
float vignette(vec2 uv) {
vec2 d = uv - 0.5;
float dist = length(d);
return 1.0 - smoothstep(0.4, 1.1, dist) * 0.15;
}
vec4 window_shader() {
vec2 texsize = textureSize(tex, 0);
vec4 pixColor = texture2D(tex, texcoord / texsize, 0);
vec3 color = pixColor.rgb;
// Fade amount — 0.6 is moderate, recognizable but not extreme
float fade = 0.6;
// Cyan dye loss — red channel lifts as cyan absorption weakens
color.r += 0.08 * fade;
color.g += 0.02 * fade;
// Yellow dye loss — blue channel loses contrast
color.b -= 0.04 * fade;
// Magenta shift — magenta dye persists longest
float magentaShift = fade * 0.12;
color.r += magentaShift;
color.b += magentaShift * 0.3;
color.g -= magentaShift * 0.5;
// Lifted blacks to dark maroon (shadow density loss)
float blackLift = fade * 0.08;
color = max(color, vec3(blackLift * 1.2, blackLift * 0.7, blackLift * 0.5));
// Desaturation — dye fading means less color intensity
float luma = dot(color, LUMA);
float desatAmount = mix(1.0, 0.65, fade);
color = mix(vec3(luma), color, desatAmount);
// Reduced contrast — faded prints are lower contrast
color = mix(vec3(0.5), color, mix(1.0, 0.85, fade));
// Warm color temperature shift
color.r += 0.03 * fade;
color.b -= 0.05 * fade;
// Medium grain
vec2 screenPos = gl_FragCoord.xy;
float grain = (hash(screenPos * 0.6) - 0.5) * 0.04;
// Luminance-dependent grain
float grainMask = 1.0 - abs(luma - 0.5) * 1.5;
grainMask = clamp(grainMask, 0.3, 1.0);
color += grain * grainMask;
// Vignette
vec2 normalizedCoord = texcoord / texsize;
color *= vignette(normalizedCoord);
return vec4(clamp(color, 0.0, 1.0), 1.0);
}