Constant COLOUR_WGSL
Source pub const COLOUR_WGSL: &str = r#"
fn look_decode(c: vec3f) -> vec3f {
return select(pow((c + 0.055) / 1.055, vec3f(2.4)), c / 12.92, c <= vec3f(0.04045));
}
fn look_encode(c: vec3f) -> vec3f {
let x = clamp(c, vec3f(0.0), vec3f(1.0));
return select(1.055 * pow(x, vec3f(1.0 / 2.4)) - 0.055, x * 12.92, x <= vec3f(0.0031308));
}
fn look_cbrt(x: f32) -> f32 {
return sign(x) * pow(abs(x), 1.0 / 3.0);
}
fn look_oklab(encoded: vec3f) -> vec3f {
let c = look_decode(encoded);
let l = look_cbrt(0.41222146 * c.r + 0.53633255 * c.g + 0.051445995 * c.b);
let m = look_cbrt(0.2119035 * c.r + 0.6806995 * c.g + 0.10739696 * c.b);
let s = look_cbrt(0.08830246 * c.r + 0.28171885 * c.g + 0.6299787 * c.b);
return vec3f(
0.21045426 * l + 0.7936178 * m - 0.004072047 * s,
1.9779985 * l - 2.4285922 * m + 0.4505937 * s,
0.025904037 * l + 0.78277177 * m - 0.80867577 * s,
);
}
fn look_srgb(lab: vec3f) -> vec3f {
let l_ = lab.x + 0.39633778 * lab.y + 0.21580376 * lab.z;
let m_ = lab.x - 0.105561346 * lab.y - 0.06385417 * lab.z;
let s_ = lab.x - 0.08948418 * lab.y - 1.2914855 * lab.z;
let l = l_ * l_ * l_;
let m = m_ * m_ * m_;
let s = s_ * s_ * s_;
return look_encode(vec3f(
4.0767417 * l - 3.3077116 * m + 0.23096994 * s,
-1.268438 * l + 2.6097574 * m - 0.34131938 * s,
-0.0041960863 * l - 0.7034186 * m + 1.7076147 * s,
));
}
fn look_stop_mix(a: vec4f, b: vec4f, f: f32, oklab: bool) -> vec4f {
if (oklab) {
let lab = mix(look_oklab(a.rgb), look_oklab(b.rgb), f);
return vec4f(look_srgb(lab), mix(a.a, b.a, f));
}
return mix(a, b, f);
}
fn look_gradient_position(kind: f32, geometry: vec4f, p: vec2f) -> f32 {
if (kind < 0.5) {
let d = geometry.zw - geometry.xy;
return clamp(dot(p - geometry.xy, d) / max(dot(d, d), 1e-12), 0.0, 1.0);
}
return clamp(length((p - geometry.xy) / max(geometry.zw, vec2f(1e-6))), 0.0, 1.0);
}
"#;