]> git.sesse.net Git - movit/blob - lift_gamma_gain_effect_test.cpp
Remove the finalize() member function from Input.
[movit] / lift_gamma_gain_effect_test.cpp
1 // Unit tests for LiftGammaGainEffect.
2
3 #include <GL/glew.h>
4
5 #include "effect_chain.h"
6 #include "gtest/gtest.h"
7 #include "image_format.h"
8 #include "lift_gamma_gain_effect.h"
9 #include "test_util.h"
10
11 TEST(LiftGammaGainEffectTest, DefaultIsNoop) {
12         float data[] = {
13                 0.0f, 0.0f, 0.0f, 1.0f,
14                 0.5f, 0.5f, 0.5f, 0.3f,
15                 1.0f, 0.0f, 0.0f, 1.0f,
16                 0.0f, 1.0f, 0.0f, 0.7f,
17                 0.0f, 0.0f, 1.0f, 1.0f,
18         };
19
20         float out_data[5 * 4];
21         EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
22         tester.get_chain()->add_effect(new LiftGammaGainEffect());
23         tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
24
25         expect_equal(data, out_data, 4, 5);
26 }
27
28 TEST(LiftGammaGainEffectTest, Gain) {
29         float data[] = {
30                 0.0f, 0.0f, 0.0f, 1.0f,
31                 0.5f, 0.5f, 0.5f, 0.3f,
32                 1.0f, 0.0f, 0.0f, 1.0f,
33                 0.0f, 1.0f, 0.0f, 0.7f,
34                 0.0f, 0.0f, 1.0f, 1.0f,
35         };
36         float gain[3] = { 0.8f, 1.0f, 1.2f };
37         float expected_data[] = {
38                 0.0f, 0.0f, 0.0f, 1.0f,
39                 0.4f, 0.5f, 0.6f, 0.3f,
40                 0.8f, 0.0f, 0.0f, 1.0f,
41                 0.0f, 1.0f, 0.0f, 0.7f,
42                 0.0f, 0.0f, 1.2f, 1.0f,
43         };
44
45         float out_data[5 * 4];
46         EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
47         Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
48         ASSERT_TRUE(lgg_effect->set_vec3("gain", gain));
49         tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
50
51         expect_equal(expected_data, out_data, 4, 5);
52 }
53
54 TEST(LiftGammaGainEffectTest, LiftIsDoneInApproximatelysRGB) {
55         float data[] = {
56                 0.0f, 0.0f, 0.0f, 1.0f,
57                 0.5f, 0.5f, 0.5f, 0.3f,
58                 1.0f, 0.0f, 0.0f, 1.0f,
59                 0.0f, 1.0f, 0.0f, 0.7f,
60                 0.0f, 0.0f, 1.0f, 1.0f,
61         };
62         float lift[3] = { 0.0f, 0.1f, 0.2f };
63         float expected_data[] = {
64                 0.0f, 0.1f , 0.2f, 1.0f,
65                 0.5f, 0.55f, 0.6f, 0.3f,
66                 1.0f, 0.1f,  0.2f, 1.0f,
67                 0.0f, 1.0f,  0.2f, 0.7f,
68                 0.0f, 0.1f,  1.0f, 1.0f,
69         };
70
71         float out_data[5 * 4];
72         EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
73         Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
74         ASSERT_TRUE(lgg_effect->set_vec3("lift", lift));
75         tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_sRGB);
76
77         // sRGB is only approximately gamma-2.2, so loosen up the limits a bit.
78         expect_equal(expected_data, out_data, 4, 5, 0.03, 0.003);
79 }
80
81 TEST(LiftGammaGainEffectTest, Gamma22IsApproximatelysRGB) {
82         float data[] = {
83                 0.0f, 0.0f, 0.0f, 1.0f,
84                 0.5f, 0.5f, 0.5f, 0.3f,
85                 1.0f, 0.0f, 0.0f, 1.0f,
86                 0.0f, 1.0f, 0.0f, 0.7f,
87                 0.0f, 0.0f, 1.0f, 1.0f,
88         };
89         float gamma[3] = { 2.2f, 2.2f, 2.2f };
90
91         float out_data[5 * 4];
92         EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
93         Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
94         ASSERT_TRUE(lgg_effect->set_vec3("gamma", gamma));
95         tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
96
97         expect_equal(data, out_data, 4, 5);
98 }
99
100 TEST(LiftGammaGainEffectTest, OutOfGamutColorsAreClipped) {
101         float data[] = {
102                 -0.5f, 0.3f, 0.0f, 1.0f,
103                  0.5f, 0.0f, 0.0f, 1.0f,
104                  0.0f, 1.5f, 0.5f, 0.3f,
105         };
106         float expected_data[] = {
107                  0.0f, 0.3f, 0.0f, 1.0f,  // Clipped to zero.
108                  0.5f, 0.0f, 0.0f, 1.0f,
109                  0.0f, 1.5f, 0.5f, 0.3f,
110         };
111
112         float out_data[3 * 4];
113         EffectChainTester tester(data, 1, 3, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
114         tester.get_chain()->add_effect(new LiftGammaGainEffect());
115         tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
116
117         expect_equal(expected_data, out_data, 4, 3);
118 }