1 // Unit tests for LiftGammaGainEffect.
3 #include "effect_chain.h"
4 #include "gtest/gtest.h"
5 #include "image_format.h"
6 #include "lift_gamma_gain_effect.h"
9 TEST(LiftGammaGainEffectTest, DefaultIsNoop) {
11 0.0f, 0.0f, 0.0f, 1.0f,
12 0.5f, 0.5f, 0.5f, 0.3f,
13 1.0f, 0.0f, 0.0f, 1.0f,
14 0.0f, 1.0f, 0.0f, 0.7f,
15 0.0f, 0.0f, 1.0f, 1.0f,
18 float out_data[5 * 4];
19 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
20 tester.get_chain()->add_effect(new LiftGammaGainEffect());
21 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
23 expect_equal(data, out_data, 4, 5);
26 TEST(LiftGammaGainEffectTest, Gain) {
28 0.0f, 0.0f, 0.0f, 1.0f,
29 0.5f, 0.5f, 0.5f, 0.3f,
30 1.0f, 0.0f, 0.0f, 1.0f,
31 0.0f, 1.0f, 0.0f, 0.7f,
32 0.0f, 0.0f, 1.0f, 1.0f,
34 float gain[3] = { 0.8f, 1.0f, 1.2f };
35 float expected_data[] = {
36 0.0f, 0.0f, 0.0f, 1.0f,
37 0.4f, 0.5f, 0.6f, 0.3f,
38 0.8f, 0.0f, 0.0f, 1.0f,
39 0.0f, 1.0f, 0.0f, 0.7f,
40 0.0f, 0.0f, 1.2f, 1.0f,
43 float out_data[5 * 4];
44 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
45 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
46 ASSERT_TRUE(lgg_effect->set_vec3("gain", gain));
47 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
49 expect_equal(expected_data, out_data, 4, 5);
52 TEST(LiftGammaGainEffectTest, LiftIsDoneInApproximatelysRGB) {
54 0.0f, 0.0f, 0.0f, 1.0f,
55 0.5f, 0.5f, 0.5f, 0.3f,
56 1.0f, 0.0f, 0.0f, 1.0f,
57 0.0f, 1.0f, 0.0f, 0.7f,
58 0.0f, 0.0f, 1.0f, 1.0f,
60 float lift[3] = { 0.0f, 0.1f, 0.2f };
61 float expected_data[] = {
62 0.0f, 0.1f , 0.2f, 1.0f,
63 0.5f, 0.55f, 0.6f, 0.3f,
64 1.0f, 0.1f, 0.2f, 1.0f,
65 0.0f, 1.0f, 0.2f, 0.7f,
66 0.0f, 0.1f, 1.0f, 1.0f,
69 float out_data[5 * 4];
70 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
71 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
72 ASSERT_TRUE(lgg_effect->set_vec3("lift", lift));
73 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_sRGB);
75 // sRGB is only approximately gamma-2.2, so loosen up the limits a bit.
76 expect_equal(expected_data, out_data, 4, 5, 0.03, 0.003);
79 TEST(LiftGammaGainEffectTest, Gamma22IsApproximatelysRGB) {
81 0.0f, 0.0f, 0.0f, 1.0f,
82 0.5f, 0.5f, 0.5f, 0.3f,
83 1.0f, 0.0f, 0.0f, 1.0f,
84 0.0f, 1.0f, 0.0f, 0.7f,
85 0.0f, 0.0f, 1.0f, 1.0f,
87 float gamma[3] = { 2.2f, 2.2f, 2.2f };
89 float out_data[5 * 4];
90 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
91 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
92 ASSERT_TRUE(lgg_effect->set_vec3("gamma", gamma));
93 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
95 expect_equal(data, out_data, 4, 5);