diff --git a/packages/deck.gl-geotiff/src/webgl/cielab.glsl b/packages/deck.gl-geotiff/src/webgl/cielab.glsl new file mode 100644 index 0000000..24717f0 --- /dev/null +++ b/packages/deck.gl-geotiff/src/webgl/cielab.glsl @@ -0,0 +1,41 @@ +const vec3 D65 = vec3( + 0.95047, // Xn + 1.00000, // Yn + 1.08883 // Zn +); + +vec3 cielabToRgb(vec3 labTex) { + // labTex in [0,1] from RGB8 texture + float L = labTex.r * 255.0; + float a = (labTex.g - 0.5) * 255.0; + float b = (labTex.b - 0.5) * 255.0; + + float y = (L + 16.0) / 116.0; + float x = (a / 500.0) + y; + float z = y - (b / 200.0); + + vec3 xyz; + vec3 v = vec3(x, y, z); + vec3 v3 = v * v * v; + + xyz = D65 * mix( + (v - 16.0 / 116.0) / 7.787, + v3, + step(0.008856, v3) + ); + + vec3 rgb = mat3( + 3.2406, -1.5372, -0.4986, + -0.9689, 1.8758, 0.0415, + 0.0557, -0.2040, 1.0570 + ) * xyz; + + // sRGB gamma + rgb = mix( + 12.92 * rgb, + 1.055 * pow(rgb, vec3(1.0 / 2.4)) - 0.055, + step(0.0031308, rgb) + ); + + return clamp(rgb, 0.0, 1.0); +} diff --git a/packages/deck.gl-geotiff/src/webgl/cmyk.glsl b/packages/deck.gl-geotiff/src/webgl/cmyk.glsl new file mode 100644 index 0000000..c83941f --- /dev/null +++ b/packages/deck.gl-geotiff/src/webgl/cmyk.glsl @@ -0,0 +1,10 @@ +vec3 cmykToRgb(vec4 cmyk) { + // cmyk in [0.0, 1.0] + float invK = 1.0 - cmyk.a; + + return vec3( + (1.0 - cmyk.r) * invK, + (1.0 - cmyk.g) * invK, + (1.0 - cmyk.b) * invK + ); +} diff --git a/packages/deck.gl-geotiff/src/webgl/index.ts b/packages/deck.gl-geotiff/src/webgl/index.ts new file mode 100644 index 0000000..73ee184 --- /dev/null +++ b/packages/deck.gl-geotiff/src/webgl/index.ts @@ -0,0 +1,3 @@ +export { default as cmykToRgb } from "./cymk.glsl"; +export { default as ycbcrToRgb } from "./ycbcr.glsl"; +export { default as cielabToRgb } from "./cielab.glsl"; diff --git a/packages/deck.gl-geotiff/src/webgl/shims.d.ts b/packages/deck.gl-geotiff/src/webgl/shims.d.ts new file mode 100644 index 0000000..35e0469 --- /dev/null +++ b/packages/deck.gl-geotiff/src/webgl/shims.d.ts @@ -0,0 +1,4 @@ +declare module "*.glsl" { + const value: string; + export default value; +} diff --git a/packages/deck.gl-geotiff/src/webgl/ycbcr.glsl b/packages/deck.gl-geotiff/src/webgl/ycbcr.glsl new file mode 100644 index 0000000..4d9e780 --- /dev/null +++ b/packages/deck.gl-geotiff/src/webgl/ycbcr.glsl @@ -0,0 +1,12 @@ +vec3 ycbcrToRgb(vec3 ycbcr) { + // ycbcr in [0.0, 1.0] + float y = ycbcr.r; + float cb = ycbcr.g - 0.5; + float cr = ycbcr.b - 0.5; + + return vec3( + y + 1.40200 * cr, + y - 0.34414 * cb - 0.71414 * cr, + y + 1.77200 * cb + ); +}