0.0f, 0.0f,
0.0f, 0.0f,
};
- float out_data[2 * 2];
+ float out_data[4 * 3];
EffectChainTester tester(NULL, 4, 3); // Note non-square aspect.
EXPECT_EQ(7, input_store->input_height);
}
+// Tests that putting a BlueInput (constant color) into its own pass,
+// which creates a phase that doesn't need texture coordinates,
+// doesn't mess up a second phase that actually does.
+TEST(EffectChainTest, FirstPhaseWithNoTextureCoordinates) {
+ const int size = 2;
+ float data[] = {
+ 1.0f,
+ 0.0f,
+ };
+ float expected_data[] = {
+ 1.0f, 1.0f, 2.0f, 2.0f,
+ 0.0f, 0.0f, 1.0f, 2.0f,
+ };
+ float out_data[size * 4];
+ // First say that we have sRGB, linear input.
+ ImageFormat format;
+ format.color_space = COLORSPACE_sRGB;
+ format.gamma_curve = GAMMA_LINEAR;
+ FlatInput *input = new FlatInput(format, FORMAT_GRAYSCALE, GL_FLOAT, 1, size);
+
+ input->set_pixel_data(data);
+ EffectChainTester tester(NULL, 1, size);
+ tester.get_chain()->add_input(new BlueInput());
+ Effect *phase1_end = tester.get_chain()->add_effect(new BouncingIdentityEffect());
+ tester.get_chain()->add_input(input);
+ tester.get_chain()->add_effect(new AddEffect(), phase1_end, input);
+
+ tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED);
+
+ expect_equal(expected_data, out_data, 4, size);
+}
+
// An effect that does nothing except changing its output sizes.
class VirtualResizeEffect : public Effect {
public:
// the test will always succeed. Note that the OpenGL driver might call
// setlocale() behind-the-scenes, and that might corrupt the returned
// pointer, so we need to take our own copy of it here.
- char *saved_locale = strdup(setlocale(LC_ALL, "nb_NO.UTF_8"));
+ char *saved_locale = setlocale(LC_ALL, "nb_NO.UTF_8");
+ if (saved_locale == NULL) {
+ // The locale wasn't available.
+ return;
+ }
+ saved_locale = strdup(saved_locale);
float data[] = {
0.0f, 0.0f, 0.0f, 0.0f,
};
free(saved_locale);
}
+TEST(EffectChainTest, sRGBIntermediate) {
+ float data[] = {
+ 0.0f, 0.5f, 0.0f, 1.0f,
+ };
+ float out_data[4];
+ EffectChainTester tester(data, 1, 1, FORMAT_RGBA_PREMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR, GL_RGBA16F_ARB, GL_SRGB8);
+ tester.get_chain()->add_effect(new IdentityEffect());
+ tester.get_chain()->add_effect(new BouncingIdentityEffect());
+ tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR);
+
+ EXPECT_GE(fabs(out_data[1] - data[1]), 1e-3)
+ << "Expected sRGB not to be able to represent 0.5 exactly (got " << out_data[1] << ")";
+}
} // namespace movit