4 #include "gamma_expansion_effect.h"
7 GammaExpansionEffect::GammaExpansionEffect()
8 : source_curve(GAMMA_LINEAR)
10 register_int("source_curve", (int *)&source_curve);
11 memset(expansion_curve, 0, sizeof(expansion_curve));
12 register_1d_texture("expansion_curve_tex", expansion_curve, EXPANSION_CURVE_SIZE);
15 std::string GammaExpansionEffect::output_fragment_shader()
17 if (source_curve == GAMMA_LINEAR) {
18 return read_file("identity.frag");
20 if (source_curve == GAMMA_sRGB) {
21 for (unsigned i = 0; i < EXPANSION_CURVE_SIZE; ++i) {
22 float x = i / (float)(EXPANSION_CURVE_SIZE - 1);
24 expansion_curve[i] = (1.0/12.92f) * x;
26 expansion_curve[i] = pow((x + 0.055) * (1.0/1.055f), 2.4);
29 invalidate_1d_texture("expansion_curve_tex");
30 return read_file("gamma_expansion_effect.frag");
32 if (source_curve == GAMMA_REC_709 || // Also includes Rec. 601, and 10-bit Rec. 2020.
33 source_curve == GAMMA_REC_2020_12_BIT) {
36 if (source_curve == GAMMA_REC_2020_12_BIT) {
43 for (unsigned i = 0; i < EXPANSION_CURVE_SIZE; ++i) {
44 float x = i / (float)(EXPANSION_CURVE_SIZE - 1);
45 if (x < beta * 4.5f) {
46 expansion_curve[i] = (1.0/4.5f) * x;
48 expansion_curve[i] = pow((x + (alpha - 1.0f)) / alpha, 1.0f/0.45f);
51 invalidate_1d_texture("expansion_curve_tex");
52 return read_file("gamma_expansion_effect.frag");