1 // Unit tests for FlatInput.
6 #include "effect_chain.h"
7 #include "flat_input.h"
8 #include "gtest/gtest.h"
12 TEST(FlatInput, SimpleGrayscale) {
21 float expected_data[4 * size] = {
27 float out_data[4 * size];
29 EffectChainTester tester(data, 1, size, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
30 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
32 expect_equal(expected_data, out_data, 4, size);
35 TEST(FlatInput, RGB) {
38 float data[3 * size] = {
45 float expected_data[4 * size] = {
52 float out_data[4 * size];
54 EffectChainTester tester(data, 1, size, FORMAT_RGB, COLORSPACE_sRGB, GAMMA_LINEAR);
55 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
57 expect_equal(expected_data, out_data, 4, size);
60 TEST(FlatInput, RGBA) {
63 float data[4 * size] = {
70 float expected_data[4 * size] = {
77 float out_data[4 * size];
79 EffectChainTester tester(data, 1, size, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
80 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
82 expect_equal(expected_data, out_data, 4, size);
85 // Note: The sRGB conversion itself is tested in EffectChainTester,
86 // since it also wants to test the chain building itself.
87 // Here, we merely test that alpha is left alone; the test will usually
88 // run using the sRGB OpenGL extension, but might be run with a
89 // GammaExpansionEffect if the card/driver happens not to support that.
90 TEST(FlatInput, AlphaIsNotModifiedBySRGBConversion) {
93 unsigned char data[4 * size] = {
100 float expected_data[4 * size] = {
101 0, 0, 0, 0.0 / 255.0,
102 0, 0, 0, 63.0 / 255.0,
103 0, 0, 0, 127.0 / 255.0,
104 0, 0, 0, 191.0 / 255.0,
105 0, 0, 0, 255.0 / 255.0,
107 float out_data[4 * size];
109 EffectChainTester tester(NULL, 1, size);
110 tester.add_input(data, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
111 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
113 expect_equal(expected_data, out_data, 4, size);
116 TEST(FlatInput, BGR) {
119 float data[3 * size] = {
126 float expected_data[4 * size] = {
133 float out_data[4 * size];
135 EffectChainTester tester(data, 1, size, FORMAT_BGR, COLORSPACE_sRGB, GAMMA_LINEAR);
136 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
138 expect_equal(expected_data, out_data, 4, size);
141 TEST(FlatInput, BGRA) {
144 float data[4 * size] = {
151 float expected_data[4 * size] = {
158 float out_data[4 * size];
160 EffectChainTester tester(data, 1, size, FORMAT_BGRA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
161 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
163 expect_equal(expected_data, out_data, 4, size);
166 TEST(FlatInput, Pitch) {
169 const int height = 4;
171 float data[pitch * height] = {
177 float expected_data[4 * width * height] = {
178 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0,
179 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0,
180 0.7, 0.7, 0.7, 1.0, 0.2, 0.2, 0.2, 1.0,
181 1.0, 1.0, 1.0, 1.0, 0.6, 0.6, 0.6, 1.0,
183 float out_data[4 * width * height];
185 EffectChainTester tester(NULL, width, height);
188 format.color_space = COLORSPACE_sRGB;
189 format.gamma_curve = GAMMA_LINEAR;
191 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
192 input->set_pitch(pitch);
193 input->set_pixel_data(data);
194 tester.get_chain()->add_input(input);
196 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
197 expect_equal(expected_data, out_data, 4 * width, height);
200 TEST(FlatInput, UpdatedData) {
202 const int height = 4;
204 float data[width * height] = {
210 float out_data[width * height];
212 EffectChainTester tester(NULL, width, height);
215 format.color_space = COLORSPACE_sRGB;
216 format.gamma_curve = GAMMA_LINEAR;
218 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
219 input->set_pixel_data(data);
220 tester.get_chain()->add_input(input);
222 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
223 expect_equal(data, out_data, width, height);
226 input->invalidate_pixel_data();
228 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
229 expect_equal(data, out_data, width, height);
232 TEST(FlatInput, PBO) {
234 const int height = 2;
236 float data[width * height] = {
240 float expected_data[4 * width * height] = {
241 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 1.0,
242 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0, 0.2, 0.2, 0.2, 1.0,
244 float out_data[4 * width * height];
247 glGenBuffers(1, &pbo);
248 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
249 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * sizeof(float), data, GL_STREAM_DRAW);
250 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
252 EffectChainTester tester(NULL, width, height);
255 format.color_space = COLORSPACE_sRGB;
256 format.gamma_curve = GAMMA_LINEAR;
258 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
259 input->set_pixel_data((float *)BUFFER_OFFSET(0), pbo);
260 tester.get_chain()->add_input(input);
262 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
263 expect_equal(expected_data, out_data, 4 * width, height);
265 glDeleteBuffers(1, &pbo);