Skip to content

Instantly share code, notes, and snippets.

@Atreyagaurav
Last active April 3, 2023 23:45
Show Gist options
  • Save Atreyagaurav/7377af3f0a8890d6c933fc1a86014065 to your computer and use it in GitHub Desktop.
Save Atreyagaurav/7377af3f0a8890d6c933fc1a86014065 to your computer and use it in GitHub Desktop.
Oklab Lightness inversion shader for Picom
#version 430
uniform float opacity;
uniform bool invert_color;
uniform sampler2D tex;
in vec2 texcoord; // texture coordinate of the fragment
const float pow_cbrt = 1./3;
vec3 rgb2oklab(vec3 rgb) {
vec3 srgb = rgb / 12.92;
for (int i = 0; i < 3; i++) {
if (rgb[i] > 0.04045) {
srgb[i] = pow((rgb[i] + 0.055) / 1.055, 2.4);
}
}
float l = 0.4121656120 * srgb[0] + 0.5362752080 * srgb[1] + 0.0514575653 * srgb[2];
float m = 0.2118591070 * srgb[0] + 0.6807189584 * srgb[1] + 0.1074065790 * srgb[2];
float s = 0.0883097947 * srgb[0] + 0.2818474174 * srgb[1] + 0.6302613616 * srgb[2];
l = pow(l, pow_cbrt);
m = pow(m, pow_cbrt);
s = pow(s, pow_cbrt);
return (vec3(
0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s
));
}
vec3 oklab2rgb(vec3 lab)
{
double l = lab[0] + 0.3963377774 * lab[1] + 0.2158037573 * lab[2];
double m = lab[0] - 0.1055613458 * lab[1] - 0.0638541728 * lab[2];
double s = lab[0] - 0.0894841775 * lab[1] - 1.2914855480 * lab[2];
l = l * l * l;
m = m * m * m;
s = s * s * s;
vec3 srgb = vec3(
4.0767245293 * l - 3.3072168827 * m + 0.2307590544 * s,
-1.2681437731 * l + 2.6093323231 * m - 0.3411344290 * s,
-0.0041119885 * l - 0.7034763098 * m + 1.7068625689 * s
);
vec3 rgb = srgb * 12.92;
for (int i = 0; i < 3; i++)
{
if (srgb[i] > 0.0031308){
rgb[i] = (1.055 * pow(srgb[i], 1 / 2.4) - 0.055);
}
if (rgb[i] < 0.){
rgb[i] = 0.;
}
if (rgb[i] > 1.){
rgb[i] = 1.;
}
}
return rgb;
}
vec3 invert_lightness(vec3 rgb){
vec3 lab = rgb2oklab(rgb);
/* lightness thresholds for lower constrast*/
lab[0] = (1 - lab[0]) * .95 + .25;
return oklab2rgb(lab);
}
vec4 window_shader() {
vec4 c = texelFetch(tex, ivec2(texcoord), 0);
vec4 inv = vec4(invert_lightness(vec3(c[0], c[1], c[2])), c[3]);
return (inv);
}
@Atreyagaurav
Copy link
Author

Made it based on:

Useful for any application without dark mode:

Example picom.conf

window-shader-fg-rule = [
  "/path/to/picom-oklab-shader.gsgl:class_g='qpdfview'"
]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment