1 // Unit tests for LiftGammaGainEffect.
5 #include "effect_chain.h"
6 #include "gtest/gtest.h"
7 #include "image_format.h"
8 #include "lift_gamma_gain_effect.h"
13 TEST(LiftGammaGainEffectTest, DefaultIsNoop) {
15 0.0f, 0.0f, 0.0f, 1.0f,
16 0.5f, 0.5f, 0.5f, 0.3f,
17 1.0f, 0.0f, 0.0f, 1.0f,
18 0.0f, 1.0f, 0.0f, 0.7f,
19 0.0f, 0.0f, 1.0f, 1.0f,
22 float out_data[5 * 4];
23 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
24 tester.get_chain()->add_effect(new LiftGammaGainEffect());
25 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
27 expect_equal(data, out_data, 4, 5);
30 TEST(LiftGammaGainEffectTest, Gain) {
32 0.0f, 0.0f, 0.0f, 1.0f,
33 0.5f, 0.5f, 0.5f, 0.3f,
34 1.0f, 0.0f, 0.0f, 1.0f,
35 0.0f, 1.0f, 0.0f, 0.7f,
36 0.0f, 0.0f, 1.0f, 1.0f,
38 float gain[3] = { 0.8f, 1.0f, 1.2f };
39 float expected_data[] = {
40 0.0f, 0.0f, 0.0f, 1.0f,
41 0.4f, 0.5f, 0.6f, 0.3f,
42 0.8f, 0.0f, 0.0f, 1.0f,
43 0.0f, 1.0f, 0.0f, 0.7f,
44 0.0f, 0.0f, 1.2f, 1.0f,
47 float out_data[5 * 4];
48 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
49 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
50 ASSERT_TRUE(lgg_effect->set_vec3("gain", gain));
51 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
53 expect_equal(expected_data, out_data, 4, 5);
56 TEST(LiftGammaGainEffectTest, LiftIsDoneInApproximatelysRGB) {
58 0.0f, 0.0f, 0.0f, 1.0f,
59 0.5f, 0.5f, 0.5f, 0.3f,
60 1.0f, 0.0f, 0.0f, 1.0f,
61 0.0f, 1.0f, 0.0f, 0.7f,
62 0.0f, 0.0f, 1.0f, 1.0f,
64 float lift[3] = { 0.0f, 0.1f, 0.2f };
65 float expected_data[] = {
66 0.0f, 0.1f , 0.2f, 1.0f,
67 0.5f, 0.55f, 0.6f, 0.3f,
68 1.0f, 0.1f, 0.2f, 1.0f,
69 0.0f, 1.0f, 0.2f, 0.7f,
70 0.0f, 0.1f, 1.0f, 1.0f,
73 float out_data[5 * 4];
74 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
75 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
76 ASSERT_TRUE(lgg_effect->set_vec3("lift", lift));
77 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_sRGB);
79 // sRGB is only approximately gamma-2.2, so loosen up the limits a bit.
80 expect_equal(expected_data, out_data, 4, 5, 0.03, 0.003);
83 TEST(LiftGammaGainEffectTest, Gamma22IsApproximatelysRGB) {
85 0.0f, 0.0f, 0.0f, 1.0f,
86 0.5f, 0.5f, 0.5f, 0.3f,
87 1.0f, 0.0f, 0.0f, 1.0f,
88 0.0f, 1.0f, 0.0f, 0.7f,
89 0.0f, 0.0f, 1.0f, 1.0f,
91 float gamma[3] = { 2.2f, 2.2f, 2.2f };
93 float out_data[5 * 4];
94 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
95 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
96 ASSERT_TRUE(lgg_effect->set_vec3("gamma", gamma));
97 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
99 expect_equal(data, out_data, 4, 5);
102 TEST(LiftGammaGainEffectTest, OutOfGamutColorsAreClipped) {
104 -0.5f, 0.3f, 0.0f, 1.0f,
105 0.5f, 0.0f, 0.0f, 1.0f,
106 0.0f, 1.5f, 0.5f, 0.3f,
108 float expected_data[] = {
109 0.0f, 0.3f, 0.0f, 1.0f, // Clipped to zero.
110 0.5f, 0.0f, 0.0f, 1.0f,
111 0.0f, 1.5f, 0.5f, 0.3f,
114 float out_data[3 * 4];
115 EffectChainTester tester(data, 1, 3, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
116 tester.get_chain()->add_effect(new LiftGammaGainEffect());
117 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
119 expect_equal(expected_data, out_data, 4, 3);
122 TEST(LiftGammaGainEffectTest, NegativeLiftIsClamped) {
124 0.0f, 0.0f, 0.0f, 1.0f,
125 0.5f, 0.5f, 0.5f, 0.3f,
126 1.0f, 0.0f, 0.0f, 1.0f,
127 0.0f, 1.0f, 0.0f, 0.7f,
128 0.0f, 0.0f, 1.0f, 1.0f,
130 float lift[3] = { 0.0f, -0.1f, -0.2f };
131 float expected_data[] = {
132 0.0f, 0.0f , 0.0f, 1.0f, // Note: Clamped below zero.
133 0.5f, 0.45f, 0.4f, 0.3f,
134 1.0f, 0.0f, 0.0f, 1.0f, // Unaffected.
135 0.0f, 1.0f, 0.0f, 0.7f,
136 0.0f, 0.0f, 1.0f, 1.0f,
139 float out_data[5 * 4];
140 EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
141 Effect *lgg_effect = tester.get_chain()->add_effect(new LiftGammaGainEffect());
142 ASSERT_TRUE(lgg_effect->set_vec3("lift", lift));
143 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_sRGB);
145 // sRGB is only approximately gamma-2.2, so loosen up the limits a bit.
146 expect_equal(expected_data, out_data, 4, 5, 0.03, 0.003);