X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=gamma_expansion_effect.cpp;h=5b5f44d64ac03086acc8db44b3e1b9e8c0b499c1;hb=0059fbc390f8a50b5848cc9de52d4208450c7d71;hp=9391a91f55bd9be3c171a9ad911d71d1e4ca6a9c;hpb=db1fbb73b18b68850f61d1c8b89f2e4d3f7aadc1;p=movit diff --git a/gamma_expansion_effect.cpp b/gamma_expansion_effect.cpp index 9391a91..5b5f44d 100644 --- a/gamma_expansion_effect.cpp +++ b/gamma_expansion_effect.cpp @@ -1,3 +1,4 @@ +#include #include #include "gamma_expansion_effect.h" @@ -7,18 +8,48 @@ GammaExpansionEffect::GammaExpansionEffect() : source_curve(GAMMA_LINEAR) { register_int("source_curve", (int *)&source_curve); + memset(expansion_curve, 0, sizeof(expansion_curve)); + register_1d_texture("expansion_curve_tex", expansion_curve, EXPANSION_CURVE_SIZE); } std::string GammaExpansionEffect::output_fragment_shader() { - switch (source_curve) { - case GAMMA_LINEAR: - return read_file("identity-fs.glsl"); - case GAMMA_sRGB: - return read_file("gamma_expansion_effect_srgb.glsl"); - case GAMMA_REC_709: // and GAMMA_REC_601 - return read_file("gamma_expansion_effect_rec709.glsl"); - default: - assert(false); + if (source_curve == GAMMA_LINEAR) { + return read_file("identity.frag"); } + if (source_curve == GAMMA_sRGB) { + for (unsigned i = 0; i < EXPANSION_CURVE_SIZE; ++i) { + float x = i / (float)(EXPANSION_CURVE_SIZE - 1); + if (x < 0.04045f) { + expansion_curve[i] = (1.0/12.92f) * x; + } else { + expansion_curve[i] = pow((x + 0.055) * (1.0/1.055f), 2.4); + } + } + invalidate_1d_texture("expansion_curve_tex"); + return read_file("gamma_expansion_effect.frag"); + } + if (source_curve == GAMMA_REC_709 || // Also includes Rec. 601, and 10-bit Rec. 2020. + source_curve == GAMMA_REC_2020_12_BIT) { + // Rec. 2020, page 3. + float alpha, beta; + if (source_curve == GAMMA_REC_2020_12_BIT) { + alpha = 1.0993f; + beta = 0.0181f; + } else { + alpha = 1.099f; + beta = 0.018f; + } + for (unsigned i = 0; i < EXPANSION_CURVE_SIZE; ++i) { + float x = i / (float)(EXPANSION_CURVE_SIZE - 1); + if (x < beta * 4.5f) { + expansion_curve[i] = (1.0/4.5f) * x; + } else { + expansion_curve[i] = pow((x + (alpha - 1.0f)) / alpha, 1.0f/0.45f); + } + } + invalidate_1d_texture("expansion_curve_tex"); + return read_file("gamma_expansion_effect.frag"); + } + assert(false); }