expect_equal(expected_data, out_data, 3, 2);
}
+TEST(EffectChainTest, RewritingWorksAndTexturesAreAskedForsRGB) {
+ unsigned char data[] = {
+ 0, 64,
+ 128, 255,
+ };
+ float expected_data[4] = {
+ 1.0f, 0.9771f,
+ 0.8983f, 0.0f,
+ };
+ float out_data[2];
+ EffectChainTester tester(NULL, 2, 2);
+ tester.add_input(data, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_sRGB);
+ RewritingToInvertEffect *effect = new RewritingToInvertEffect();
+ tester.get_chain()->add_effect(effect);
+ tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_sRGB);
+
+ Node *node = effect->invert_node;
+ ASSERT_EQ(1, node->incoming_links.size());
+ ASSERT_EQ(1, node->outgoing_links.size());
+ EXPECT_EQ("FlatInput", node->incoming_links[0]->effect->effect_type_id());
+ EXPECT_EQ("GammaCompressionEffect", node->outgoing_links[0]->effect->effect_type_id());
+
+ expect_equal(expected_data, out_data, 2, 2);
+}
+
TEST(EffectChainTest, RewritingWorksAndColorspaceConversionsAreInserted) {
float data[] = {
0.0f, 0.25f, 0.3f,
expect_equal(data, out_data, 256, 1);
}
+// Same, but uses the forward sRGB table from the GPU.
+TEST(EffectChainTest, IdentityThroughGPUsRGBConversions) {
+ unsigned char data[256];
+ float expected_data[256];
+ for (unsigned i = 0; i < 256; ++i) {
+ data[i] = i;
+ expected_data[i] = i / 255.0;
+ };
+ float out_data[256];
+ EffectChainTester tester(NULL, 256, 1);
+ tester.add_input(data, FORMAT_GRAYSCALE, COLORSPACE_sRGB, GAMMA_sRGB);
+ tester.get_chain()->add_effect(new IdentityEffect());
+ tester.run(out_data, GL_RED, COLORSPACE_sRGB, GAMMA_sRGB);
+
+ expect_equal(expected_data, out_data, 256, 1);
+}
+
// Same, for the Rec. 601/709 gamma curve.
TEST(EffectChainTest, IdentityThroughRec709) {
float data[256];
#include <algorithm>
-EffectChainTester::EffectChainTester(const float *data, unsigned width, unsigned height, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve)
+EffectChainTester::EffectChainTester(const float *data, unsigned width, unsigned height,
+ MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve)
: chain(width, height), width(width), height(height)
{
- add_input(data, pixel_format, color_space, gamma_curve);
+ if (data != NULL) {
+ add_input(data, pixel_format, color_space, gamma_curve);
+ }
glGenTextures(1, &texnum);
check_error();
return input;
}
+Input *EffectChainTester::add_input(const unsigned char *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve)
+{
+ ImageFormat format;
+ format.color_space = color_space;
+ format.gamma_curve = gamma_curve;
+
+ FlatInput *input = new FlatInput(format, pixel_format, GL_UNSIGNED_BYTE, width, height);
+ input->set_pixel_data(data);
+ chain.add_input(input);
+ return input;
+}
+
void EffectChainTester::run(float *out_data, GLenum format, Colorspace color_space, GammaCurve gamma_curve)
{
ImageFormat image_format;
class EffectChainTester {
public:
- EffectChainTester(const float *data, unsigned width, unsigned height, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve);
+ EffectChainTester(const float *data, unsigned width, unsigned height,
+ MovitPixelFormat pixel_format = FORMAT_GRAYSCALE,
+ Colorspace color_space = COLORSPACE_sRGB,
+ GammaCurve gamma_curve = GAMMA_LINEAR);
~EffectChainTester();
EffectChain *get_chain() { return &chain; }
Input *add_input(const float *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve);
+ Input *add_input(const unsigned char *data, MovitPixelFormat pixel_format, Colorspace color_space, GammaCurve gamma_curve);
void run(float *out_data, GLenum format, Colorspace color_space, GammaCurve gamma_curve);
private: