From be61b4e95eabc1582774b756f86ea03f135e195b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Wernst=C3=A5l?= Date: Mon, 23 Jan 2023 19:19:35 +0100 Subject: [PATCH] feat: sRGB lookup table --- gen-srgb-lut.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++ kitty/srgb_gamma.c | 21 ++++++++++++++++++++ kitty/srgb_gamma.h | 4 ++++ 3 files changed, 73 insertions(+) create mode 100755 gen-srgb-lut.py create mode 100644 kitty/srgb_gamma.c create mode 100644 kitty/srgb_gamma.h diff --git a/gen-srgb-lut.py b/gen-srgb-lut.py new file mode 100755 index 000000000..7d4a328a8 --- /dev/null +++ b/gen-srgb-lut.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# vim:fileencoding=utf-8 + +import os +from typing import List + + +def to_linear(a: float) -> float: + if a <= 0.04045: + return a / 12.92 + else: + return float(pow((a + 0.055) / 1.055, 2.4)) + + +def generate_srgb_lut(line_prefix: str = '') -> List[str]: + values: List[str] = [] + lines: List[str] = [] + + for i in range(256): + values.append('{:1.5f}f'.format(to_linear(i / 255.0))) + + for i in range(16): + lines.append(line_prefix + ', '.join(values[i * 16:(i + 1) * 16]) + ',') + + return lines + + +def generate_srgb_gamma_c() -> str: + lines: List[str] = [] + + lines.append('// Generated by gen-srgb-lut.py DO NOT edit') + lines.append('#include "srgb_gamma.h"') + lines.append('') + lines.append('const GLfloat srgb_lut[256] = {') + lines += generate_srgb_lut(' ') + lines.append('};') + + return "\n".join(lines) + + +def main() -> None: + c = generate_srgb_gamma_c() + with open(os.path.join('kitty', 'srgb_gamma.c'), 'w') as f: + f.write(f'{c}\n') + + +if __name__ == '__main__': + main() diff --git a/kitty/srgb_gamma.c b/kitty/srgb_gamma.c new file mode 100644 index 000000000..f34cfd482 --- /dev/null +++ b/kitty/srgb_gamma.c @@ -0,0 +1,21 @@ +// Generated by gen-srgb-lut.py DO NOT edit +#include "srgb_gamma.h" + +const GLfloat srgb_lut[256] = { + 0.00000f, 0.00030f, 0.00061f, 0.00091f, 0.00121f, 0.00152f, 0.00182f, 0.00212f, 0.00243f, 0.00273f, 0.00304f, 0.00335f, 0.00368f, 0.00402f, 0.00439f, 0.00478f, + 0.00518f, 0.00561f, 0.00605f, 0.00651f, 0.00700f, 0.00750f, 0.00802f, 0.00857f, 0.00913f, 0.00972f, 0.01033f, 0.01096f, 0.01161f, 0.01229f, 0.01298f, 0.01370f, + 0.01444f, 0.01521f, 0.01600f, 0.01681f, 0.01764f, 0.01850f, 0.01938f, 0.02029f, 0.02122f, 0.02217f, 0.02315f, 0.02416f, 0.02519f, 0.02624f, 0.02732f, 0.02843f, + 0.02956f, 0.03071f, 0.03190f, 0.03310f, 0.03434f, 0.03560f, 0.03689f, 0.03820f, 0.03955f, 0.04092f, 0.04231f, 0.04374f, 0.04519f, 0.04667f, 0.04817f, 0.04971f, + 0.05127f, 0.05286f, 0.05448f, 0.05613f, 0.05781f, 0.05951f, 0.06125f, 0.06301f, 0.06480f, 0.06663f, 0.06848f, 0.07036f, 0.07227f, 0.07421f, 0.07619f, 0.07819f, + 0.08022f, 0.08228f, 0.08438f, 0.08650f, 0.08866f, 0.09084f, 0.09306f, 0.09531f, 0.09759f, 0.09990f, 0.10224f, 0.10462f, 0.10702f, 0.10946f, 0.11193f, 0.11444f, + 0.11697f, 0.11954f, 0.12214f, 0.12477f, 0.12744f, 0.13014f, 0.13287f, 0.13563f, 0.13843f, 0.14126f, 0.14413f, 0.14703f, 0.14996f, 0.15293f, 0.15593f, 0.15896f, + 0.16203f, 0.16513f, 0.16827f, 0.17144f, 0.17465f, 0.17789f, 0.18116f, 0.18447f, 0.18782f, 0.19120f, 0.19462f, 0.19807f, 0.20156f, 0.20508f, 0.20864f, 0.21223f, + 0.21586f, 0.21953f, 0.22323f, 0.22697f, 0.23074f, 0.23455f, 0.23840f, 0.24228f, 0.24620f, 0.25016f, 0.25415f, 0.25818f, 0.26225f, 0.26636f, 0.27050f, 0.27468f, + 0.27889f, 0.28315f, 0.28744f, 0.29177f, 0.29614f, 0.30054f, 0.30499f, 0.30947f, 0.31399f, 0.31855f, 0.32314f, 0.32778f, 0.33245f, 0.33716f, 0.34191f, 0.34670f, + 0.35153f, 0.35640f, 0.36131f, 0.36625f, 0.37124f, 0.37626f, 0.38133f, 0.38643f, 0.39157f, 0.39676f, 0.40198f, 0.40724f, 0.41254f, 0.41789f, 0.42327f, 0.42869f, + 0.43415f, 0.43966f, 0.44520f, 0.45079f, 0.45641f, 0.46208f, 0.46778f, 0.47353f, 0.47932f, 0.48515f, 0.49102f, 0.49693f, 0.50289f, 0.50888f, 0.51492f, 0.52100f, + 0.52712f, 0.53328f, 0.53948f, 0.54572f, 0.55201f, 0.55834f, 0.56471f, 0.57112f, 0.57758f, 0.58408f, 0.59062f, 0.59720f, 0.60383f, 0.61050f, 0.61721f, 0.62396f, + 0.63076f, 0.63760f, 0.64448f, 0.65141f, 0.65837f, 0.66539f, 0.67244f, 0.67954f, 0.68669f, 0.69387f, 0.70110f, 0.70838f, 0.71569f, 0.72306f, 0.73046f, 0.73791f, + 0.74540f, 0.75294f, 0.76052f, 0.76815f, 0.77582f, 0.78354f, 0.79130f, 0.79910f, 0.80695f, 0.81485f, 0.82279f, 0.83077f, 0.83880f, 0.84687f, 0.85499f, 0.86316f, + 0.87137f, 0.87962f, 0.88792f, 0.89627f, 0.90466f, 0.91310f, 0.92158f, 0.93011f, 0.93869f, 0.94731f, 0.95597f, 0.96469f, 0.97345f, 0.98225f, 0.99110f, 1.00000f, +}; diff --git a/kitty/srgb_gamma.h b/kitty/srgb_gamma.h new file mode 100644 index 000000000..752a84c35 --- /dev/null +++ b/kitty/srgb_gamma.h @@ -0,0 +1,4 @@ +#pragma once +#include "gl.h" + +extern const GLfloat srgb_lut[256];