1 // Unit tests for FlatInput.
6 #include "effect_chain.h"
7 #include "flat_input.h"
8 #include "gtest/gtest.h"
14 TEST(FlatInput, SimpleGrayscale) {
23 float expected_data[4 * size] = {
29 float out_data[4 * size];
31 EffectChainTester tester(data, 1, size, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_LINEAR);
32 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
34 expect_equal(expected_data, out_data, 4, size);
37 TEST(FlatInput, RGB) {
40 float data[3 * size] = {
47 float expected_data[4 * size] = {
54 float out_data[4 * size];
56 EffectChainTester tester(data, 1, size, FORMAT_RGB, COLORSPACE_sRGB, GAMMA_LINEAR);
57 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
59 expect_equal(expected_data, out_data, 4, size);
62 TEST(FlatInput, RGBA) {
65 float data[4 * size] = {
72 float expected_data[4 * size] = {
79 float out_data[4 * size];
81 EffectChainTester tester(data, 1, size, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
82 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
84 expect_equal(expected_data, out_data, 4, size);
87 // Note: The sRGB conversion itself is tested in EffectChainTester,
88 // since it also wants to test the chain building itself.
89 // Here, we merely test that alpha is left alone; the test will usually
90 // run using the sRGB OpenGL extension, but might be run with a
91 // GammaExpansionEffect if the card/driver happens not to support that.
92 TEST(FlatInput, AlphaIsNotModifiedBySRGBConversion) {
95 unsigned char data[4 * size] = {
102 float expected_data[4 * size] = {
103 0, 0, 0, 0.0 / 255.0,
104 0, 0, 0, 63.0 / 255.0,
105 0, 0, 0, 127.0 / 255.0,
106 0, 0, 0, 191.0 / 255.0,
107 0, 0, 0, 255.0 / 255.0,
109 float out_data[4 * size];
111 EffectChainTester tester(NULL, 1, size);
112 tester.add_input(data, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_sRGB);
113 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
115 expect_equal(expected_data, out_data, 4, size);
118 TEST(FlatInput, BGR) {
121 float data[3 * size] = {
128 float expected_data[4 * size] = {
135 float out_data[4 * size];
137 EffectChainTester tester(data, 1, size, FORMAT_BGR, COLORSPACE_sRGB, GAMMA_LINEAR);
138 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
140 expect_equal(expected_data, out_data, 4, size);
143 TEST(FlatInput, BGRA) {
146 float data[4 * size] = {
153 float expected_data[4 * size] = {
160 float out_data[4 * size];
162 EffectChainTester tester(data, 1, size, FORMAT_BGRA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR);
163 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
165 expect_equal(expected_data, out_data, 4, size);
168 TEST(FlatInput, Pitch) {
171 const int height = 4;
173 float data[pitch * height] = {
179 float expected_data[4 * width * height] = {
180 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0,
181 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0,
182 0.7, 0.7, 0.7, 1.0, 0.2, 0.2, 0.2, 1.0,
183 1.0, 1.0, 1.0, 1.0, 0.6, 0.6, 0.6, 1.0,
185 float out_data[4 * width * height];
187 EffectChainTester tester(NULL, width, height);
190 format.color_space = COLORSPACE_sRGB;
191 format.gamma_curve = GAMMA_LINEAR;
193 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
194 input->set_pitch(pitch);
195 input->set_pixel_data(data);
196 tester.get_chain()->add_input(input);
198 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
199 expect_equal(expected_data, out_data, 4 * width, height);
202 TEST(FlatInput, UpdatedData) {
204 const int height = 4;
206 float data[width * height] = {
212 float out_data[width * height];
214 EffectChainTester tester(NULL, width, height);
217 format.color_space = COLORSPACE_sRGB;
218 format.gamma_curve = GAMMA_LINEAR;
220 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
221 input->set_pixel_data(data);
222 tester.get_chain()->add_input(input);
224 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
225 expect_equal(data, out_data, width, height);
228 input->invalidate_pixel_data();
230 tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_LINEAR);
231 expect_equal(data, out_data, width, height);
234 TEST(FlatInput, PBO) {
236 const int height = 2;
238 float data[width * height] = {
242 float expected_data[4 * width * height] = {
243 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 1.0,
244 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0, 0.2, 0.2, 0.2, 1.0,
246 float out_data[4 * width * height];
249 glGenBuffers(1, &pbo);
250 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
251 glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * sizeof(float), data, GL_STREAM_DRAW);
252 glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
254 EffectChainTester tester(NULL, width, height);
257 format.color_space = COLORSPACE_sRGB;
258 format.gamma_curve = GAMMA_LINEAR;
260 FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, width, height);
261 input->set_pixel_data((float *)BUFFER_OFFSET(0), pbo);
262 tester.get_chain()->add_input(input);
264 tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
265 expect_equal(expected_data, out_data, 4 * width, height);
267 glDeleteBuffers(1, &pbo);