1 // Unit tests for AlphaMultiplicationEffect.
5 #include "effect_chain.h"
6 #include "flat_input.h"
7 #include "gtest/gtest.h"
8 #include "image_format.h"
9 #include "padding_effect.h"
10 #include "test_util.h"
13 TEST(PaddingEffectTest, SimpleCenter) {
18 float expected_data[4 * 4] = {
19 0.0f, 0.0f, 0.0f, 0.0f,
20 0.0f, 1.0f, 0.5f, 0.0f,
21 0.0f, 0.8f, 0.3f, 0.0f,
22 0.0f, 0.0f, 0.0f, 0.0f,
24 float out_data[4 * 4];
26 EffectChainTester tester(NULL, 4, 4);
29 format.color_space = COLORSPACE_sRGB;
30 format.gamma_curve = GAMMA_LINEAR;
32 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 2, 2);
33 input->set_pixel_data(data);
34 tester.get_chain()->add_input(input);
36 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
37 CHECK(effect->set_int("width", 4));
38 CHECK(effect->set_int("height", 4));
39 CHECK(effect->set_float("left", 1.0f));
40 CHECK(effect->set_float("top", 1.0f));
42 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
43 expect_equal(expected_data, out_data, 4, 4);
46 TEST(PaddingEffectTest, WhiteBorderColor) {
51 float expected_data[4 * 4] = {
52 1.0f, 1.0f, 1.0f, 1.0f,
53 1.0f, 1.0f, 0.5f, 1.0f,
54 1.0f, 0.8f, 0.3f, 1.0f,
55 1.0f, 1.0f, 1.0f, 1.0f,
57 float out_data[4 * 4];
59 EffectChainTester tester(NULL, 4, 4);
62 format.color_space = COLORSPACE_sRGB;
63 format.gamma_curve = GAMMA_LINEAR;
65 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 2, 2);
66 input->set_pixel_data(data);
67 tester.get_chain()->add_input(input);
69 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
70 CHECK(effect->set_int("width", 4));
71 CHECK(effect->set_int("height", 4));
72 CHECK(effect->set_float("left", 1.0f));
73 CHECK(effect->set_float("top", 1.0f));
75 RGBATuple border_color(1.0f, 1.0f, 1.0f, 1.0f);
76 CHECK(effect->set_vec4("border_color", (float *)&border_color));
78 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
79 expect_equal(expected_data, out_data, 4, 4);
82 TEST(PaddingEffectTest, BorderColorIsInLinearGamma) {
84 0.2f, 0.4f, 0.6f, 0.8f,
86 float expected_data[4 * 2] = {
87 0.5005, 0.7051, 0.8677, 0.7998, // Pixel from data[].
88 0.5005, 0.7051, 0.8677, 0.7998, // Pixel from the border color.
90 float out_data[4 * 2];
92 EffectChainTester tester(NULL, 1, 2);
95 format.color_space = COLORSPACE_sRGB;
96 format.gamma_curve = GAMMA_LINEAR;
98 FlatInput *input = new FlatInput(format, FORMAT_RGBA_PREMULTIPLIED_ALPHA, GL_FLOAT, 1, 1);
99 input->set_pixel_data(data);
100 tester.get_chain()->add_input(input);
102 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
103 CHECK(effect->set_int("width", 1));
104 CHECK(effect->set_int("height", 2));
105 CHECK(effect->set_float("left", 0.0f));
106 CHECK(effect->set_float("top", 0.0f));
108 RGBATuple border_color(0.2f, 0.4f, 0.6f, 0.8f); // Same as the pixel in data[].
109 CHECK(effect->set_vec4("border_color", (float *)&border_color));
111 tester.run(out_data, GL_RGBA, COLORSPACE_REC_601_625, GAMMA_REC_601, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED);
112 expect_equal(expected_data, out_data, 4, 2);
115 TEST(PaddingEffectTest, DifferentXAndYOffset) {
116 float data[1 * 1] = {
119 float expected_data[3 * 3] = {
124 float out_data[3 * 3];
126 EffectChainTester tester(NULL, 3, 3);
129 format.color_space = COLORSPACE_sRGB;
130 format.gamma_curve = GAMMA_LINEAR;
132 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 1, 1);
133 input->set_pixel_data(data);
134 tester.get_chain()->add_input(input);
136 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
137 CHECK(effect->set_int("width", 3));
138 CHECK(effect->set_int("height", 3));
139 CHECK(effect->set_float("left", 2.0f));
140 CHECK(effect->set_float("top", 1.0f));
142 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
143 expect_equal(expected_data, out_data, 3, 3);
146 TEST(PaddingEffectTest, NonIntegerOffset) {
147 float data[4 * 1] = {
148 0.25f, 0.50f, 0.75f, 1.0f,
150 // Note that the first pixel is completely blank, since the cutoff goes
151 // at the immediate left of the texel.
152 float expected_data[5 * 2] = {
153 0.0f, 0.4375f, 0.6875f, 0.9375f, 0.0f,
154 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
156 float out_data[5 * 2];
158 EffectChainTester tester(NULL, 5, 2);
161 format.color_space = COLORSPACE_sRGB;
162 format.gamma_curve = GAMMA_LINEAR;
164 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 4, 1);
165 input->set_pixel_data(data);
166 tester.get_chain()->add_input(input);
168 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
169 CHECK(effect->set_int("width", 5));
170 CHECK(effect->set_int("height", 2));
171 CHECK(effect->set_float("left", 0.25f));
172 CHECK(effect->set_float("top", 0.0f));
174 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
175 expect_equal(expected_data, out_data, 5, 2);
178 TEST(PaddingEffectTest, Crop) {
179 float data[2 * 2] = {
183 float expected_data[1 * 1] = {
186 float out_data[1 * 1];
188 EffectChainTester tester(NULL, 1, 1);
191 format.color_space = COLORSPACE_sRGB;
192 format.gamma_curve = GAMMA_LINEAR;
194 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 2, 2);
195 input->set_pixel_data(data);
196 tester.get_chain()->add_input(input);
198 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
199 CHECK(effect->set_int("width", 1));
200 CHECK(effect->set_int("height", 1));
201 CHECK(effect->set_float("left", -1.0f));
202 CHECK(effect->set_float("top", -1.0f));
204 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_PREMULTIPLIED);
205 expect_equal(expected_data, out_data, 1, 1);
208 TEST(PaddingEffectTest, AlphaIsCorrectEvenWithNonLinearInputsAndOutputs) {
209 float data[2 * 1] = {
213 float expected_data[4 * 4] = {
214 1.0f, 1.0f, 1.0f, 0.5f,
215 1.0f, 1.0f, 1.0f, 1.0f,
216 0.8f, 0.8f, 0.8f, 1.0f,
217 1.0f, 1.0f, 1.0f, 0.5f,
219 float out_data[4 * 4];
221 EffectChainTester tester(NULL, 1, 4);
224 format.color_space = COLORSPACE_REC_601_625;
225 format.gamma_curve = GAMMA_REC_709;
227 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 1, 2);
228 input->set_pixel_data(data);
229 tester.get_chain()->add_input(input);
231 Effect *effect = tester.get_chain()->add_effect(new PaddingEffect());
232 CHECK(effect->set_int("width", 1));
233 CHECK(effect->set_int("height", 4));
234 CHECK(effect->set_float("left", 0.0f));
235 CHECK(effect->set_float("top", 1.0f));
237 RGBATuple border_color(1.0f, 1.0f, 1.0f, 0.5f);
238 CHECK(effect->set_vec4("border_color", (float *)&border_color));
240 tester.run(out_data, GL_RGBA, COLORSPACE_REC_601_625, GAMMA_REC_709, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED);
241 expect_equal(expected_data, out_data, 4, 4);