aboutsummaryrefslogtreecommitdiffstats
path: root/libglitter_compose_double.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglitter_compose_double.c')
-rw-r--r--libglitter_compose_double.c354
1 files changed, 351 insertions, 3 deletions
diff --git a/libglitter_compose_double.c b/libglitter_compose_double.c
index 53da733..0419f4a 100644
--- a/libglitter_compose_double.c
+++ b/libglitter_compose_double.c
@@ -114,15 +114,363 @@ libglitter_compose_double(double **outputs, const double *restrict input, size_t
#else
-# ifndef ONLY_INT_COMPATIBLE
int
main(void)
{
- return 0; /* TODO add test */
+ double input[20 * 60];
+ double output1[3 * 10 * 4];
+ double output2[sizeof(output1) / sizeof(*output1)];
+ double output3[sizeof(output1) / sizeof(*output1)];
+ double zeroes[sizeof(input) / sizeof(*input)];
+ double *outputs[3];
+ LIBGLITTER_RENDER_CONTEXT *ctx;
+ uint8_t cellmap[12];
+ uint8_t ncellvalues[3];
+ size_t input_rowsize;
+ size_t output_rowsize;
+ size_t output_cellsize;
+ size_t wmul, hmul;
+ size_t i;
+
+#define OPOS(X, Y) ((Y) * output_rowsize * output_cellsize + (X) * output_cellsize)
+#define IPOS(X, Y, IX, IY) (((Y) * hmul + (IY)) * input_rowsize + ((X) * wmul + (IX)))
+#define V(VAL) ((double)(VAL))
+#define VV(VAL) (V(VAL) + (double)1 / 2)
+
+ memset(zeroes, 0, sizeof(zeroes));
+
+ /* vstrips */
+ for (i = 0; i < 2; i++) {
+ input_rowsize = 5 * 3;
+ output_rowsize = 10;
+ output_cellsize = 4;
+ wmul = 3;
+ hmul = 1;
+ ncellvalues[0] = 1;
+ ncellvalues[1] = 1;
+ ncellvalues[2] = 1;
+ cellmap[0] = !i ? 0 : 1;
+ cellmap[1] = !i ? 1 : 2;
+ cellmap[2] = !i ? 2 : 0;
+ outputs[0] = !i ? output1 : output3;
+ outputs[1] = !i ? output2 : output1;
+ outputs[2] = !i ? output3 : output2;
+ memset(input, 0, sizeof(input));
+ memset(output1, 0, sizeof(output1));
+ memset(output2, 0, sizeof(output2));
+ memset(output3, 0, sizeof(output3));
+ input[IPOS(0, 0, 0, 0)] = V(111);
+ input[IPOS(0, 0, 1, 0)] = V(112);
+ input[IPOS(0, 0, 2, 0)] = V(113);
+ input[IPOS(0, 1, 0, 0)] = V(121);
+ input[IPOS(0, 1, 1, 0)] = V(122);
+ input[IPOS(0, 1, 2, 0)] = V(123);
+ input[IPOS(1, 0, 0, 0)] = V(211);
+ input[IPOS(1, 0, 1, 0)] = V(212);
+ input[IPOS(1, 0, 2, 0)] = V(213);
+ input[IPOS(1, 1, 0, 0)] = V(221);
+ input[IPOS(1, 1, 1, 0)] = V(222);
+ input[IPOS(1, 1, 2, 0)] = V(223);
+ input[IPOS(2, 0, 0, 0)] = V(311);
+ input[IPOS(2, 0, 1, 0)] = V(312);
+ input[IPOS(2, 0, 2, 0)] = V(313);
+ input[IPOS(2, 1, 0, 0)] = V(321);
+ input[IPOS(2, 1, 1, 0)] = V(322);
+ input[IPOS(2, 1, 2, 0)] = V(323);
+ ctx = libglitter_create_render_context(3, input_rowsize, wmul, hmul, cellmap, ncellvalues);
+ ASSERT(ctx);
+ ASSERT(ctx->render_method == RENDER_METHOD_VSTRIPS);
+ libglitter_compose_double(outputs, input, output_rowsize, output_cellsize, 3, 2, ctx);
+ ASSERT(output1[OPOS(0, 0)] == V(111));
+ ASSERT(output2[OPOS(0, 0)] == V(112));
+ ASSERT(output3[OPOS(0, 0)] == V(113));
+ ASSERT(output1[OPOS(0, 1)] == V(121));
+ ASSERT(output2[OPOS(0, 1)] == V(122));
+ ASSERT(output3[OPOS(0, 1)] == V(123));
+ ASSERT(output1[OPOS(1, 0)] == V(211));
+ ASSERT(output2[OPOS(1, 0)] == V(212));
+ ASSERT(output3[OPOS(1, 0)] == V(213));
+ ASSERT(output1[OPOS(1, 1)] == V(221));
+ ASSERT(output2[OPOS(1, 1)] == V(222));
+ ASSERT(output3[OPOS(1, 1)] == V(223));
+ ASSERT(output1[OPOS(2, 0)] == V(311));
+ ASSERT(output2[OPOS(2, 0)] == V(312));
+ ASSERT(output3[OPOS(2, 0)] == V(313));
+ ASSERT(output1[OPOS(2, 1)] == V(321));
+ ASSERT(output2[OPOS(2, 1)] == V(322));
+ ASSERT(output3[OPOS(2, 1)] == V(323));
+ output1[OPOS(0, 0)] = 0;
+ output2[OPOS(0, 0)] = 0;
+ output3[OPOS(0, 0)] = 0;
+ output1[OPOS(0, 1)] = 0;
+ output2[OPOS(0, 1)] = 0;
+ output3[OPOS(0, 1)] = 0;
+ output1[OPOS(1, 0)] = 0;
+ output2[OPOS(1, 0)] = 0;
+ output3[OPOS(1, 0)] = 0;
+ output1[OPOS(1, 1)] = 0;
+ output2[OPOS(1, 1)] = 0;
+ output3[OPOS(1, 1)] = 0;
+ output1[OPOS(2, 0)] = 0;
+ output2[OPOS(2, 0)] = 0;
+ output3[OPOS(2, 0)] = 0;
+ output1[OPOS(2, 1)] = 0;
+ output2[OPOS(2, 1)] = 0;
+ output3[OPOS(2, 1)] = 0;
+ ASSERT(!memcmp(output1, zeroes, sizeof(output1)));
+ ASSERT(!memcmp(output2, zeroes, sizeof(output2)));
+ ASSERT(!memcmp(output3, zeroes, sizeof(output3)));
+ libglitter_free_render_context(ctx);
+ }
+
+ /* hstrips */
+ for (i = 0; i < 2; i++) {
+ input_rowsize = 5;
+ output_rowsize = 10;
+ output_cellsize = 4;
+ wmul = 1;
+ hmul = 3;
+ ncellvalues[0] = 1;
+ ncellvalues[1] = 1;
+ ncellvalues[2] = 1;
+ cellmap[0] = !i ? 0 : 1;
+ cellmap[1] = !i ? 1 : 2;
+ cellmap[2] = !i ? 2 : 0;
+ outputs[0] = !i ? output1 : output3;
+ outputs[1] = !i ? output2 : output1;
+ outputs[2] = !i ? output3 : output2;
+ memset(input, 0, sizeof(input));
+ memset(output1, 0, sizeof(output1));
+ memset(output2, 0, sizeof(output2));
+ memset(output3, 0, sizeof(output3));
+ input[IPOS(0, 0, 0, 0)] = V(111);
+ input[IPOS(0, 0, 0, 1)] = V(112);
+ input[IPOS(0, 0, 0, 2)] = V(113);
+ input[IPOS(1, 0, 0, 0)] = V(121);
+ input[IPOS(1, 0, 0, 1)] = V(122);
+ input[IPOS(1, 0, 0, 2)] = V(123);
+ input[IPOS(0, 1, 0, 0)] = V(211);
+ input[IPOS(0, 1, 0, 1)] = V(212);
+ input[IPOS(0, 1, 0, 2)] = V(213);
+ input[IPOS(1, 1, 0, 0)] = V(221);
+ input[IPOS(1, 1, 0, 1)] = V(222);
+ input[IPOS(1, 1, 0, 2)] = V(223);
+ input[IPOS(0, 2, 0, 0)] = V(311);
+ input[IPOS(0, 2, 0, 1)] = V(312);
+ input[IPOS(0, 2, 0, 2)] = V(313);
+ input[IPOS(1, 2, 0, 0)] = V(321);
+ input[IPOS(1, 2, 0, 1)] = V(322);
+ input[IPOS(1, 2, 0, 2)] = V(323);
+ ctx = libglitter_create_render_context(3, input_rowsize, wmul, hmul, cellmap, ncellvalues);
+ ASSERT(ctx);
+ ASSERT(ctx->render_method == RENDER_METHOD_HSTRIPS);
+ libglitter_compose_double(outputs, input, output_rowsize, output_cellsize, 2, 3, ctx);
+ ASSERT(output1[OPOS(0, 0)] == V(111));
+ ASSERT(output2[OPOS(0, 0)] == V(112));
+ ASSERT(output3[OPOS(0, 0)] == V(113));
+ ASSERT(output1[OPOS(1, 0)] == V(121));
+ ASSERT(output2[OPOS(1, 0)] == V(122));
+ ASSERT(output3[OPOS(1, 0)] == V(123));
+ ASSERT(output1[OPOS(0, 1)] == V(211));
+ ASSERT(output2[OPOS(0, 1)] == V(212));
+ ASSERT(output3[OPOS(0, 1)] == V(213));
+ ASSERT(output1[OPOS(1, 1)] == V(221));
+ ASSERT(output2[OPOS(1, 1)] == V(222));
+ ASSERT(output3[OPOS(1, 1)] == V(223));
+ ASSERT(output1[OPOS(0, 2)] == V(311));
+ ASSERT(output2[OPOS(0, 2)] == V(312));
+ ASSERT(output3[OPOS(0, 2)] == V(313));
+ ASSERT(output1[OPOS(1, 2)] == V(321));
+ ASSERT(output2[OPOS(1, 2)] == V(322));
+ ASSERT(output3[OPOS(1, 2)] == V(323));
+ output1[OPOS(0, 0)] = 0;
+ output2[OPOS(0, 0)] = 0;
+ output3[OPOS(0, 0)] = 0;
+ output1[OPOS(1, 0)] = 0;
+ output2[OPOS(1, 0)] = 0;
+ output3[OPOS(1, 0)] = 0;
+ output1[OPOS(0, 1)] = 0;
+ output2[OPOS(0, 1)] = 0;
+ output3[OPOS(0, 1)] = 0;
+ output1[OPOS(1, 1)] = 0;
+ output2[OPOS(1, 1)] = 0;
+ output3[OPOS(1, 1)] = 0;
+ output1[OPOS(0, 2)] = 0;
+ output2[OPOS(0, 2)] = 0;
+ output3[OPOS(0, 2)] = 0;
+ output1[OPOS(1, 2)] = 0;
+ output2[OPOS(1, 2)] = 0;
+ output3[OPOS(1, 2)] = 0;
+ ASSERT(!memcmp(output1, zeroes, sizeof(output1)));
+ ASSERT(!memcmp(output2, zeroes, sizeof(output2)));
+ ASSERT(!memcmp(output3, zeroes, sizeof(output3)));
+ libglitter_free_render_context(ctx);
+ }
+
+ /* simple */
+ for (i = 0; i < 2; i++) {
+ input_rowsize = 14;
+ output_rowsize = 4;
+ output_cellsize = 2;
+ wmul = !i ? 4 : 1;
+ hmul = !i ? 1 : 4;
+ ncellvalues[0] = !i ? 1 : 2;
+ ncellvalues[1] = !i ? 1 : 1;
+ ncellvalues[2] = !i ? 2 : 1;
+ cellmap[0] = !i ? 0 : 1;
+ cellmap[1] = !i ? 1 : 2;
+ cellmap[2] = !i ? 2 : 0;
+ cellmap[3] = !i ? 2 : 0;
+ outputs[0] = !i ? output1 : output3;
+ outputs[1] = !i ? output2 : output1;
+ outputs[2] = !i ? output3 : output2;
+ memset(input, 0, sizeof(input));
+ memset(output1, 0, sizeof(output1));
+ memset(output2, 0, sizeof(output2));
+ memset(output3, 0, sizeof(output3));
+ input[IPOS(0, 0, !i ? 0 : 0, i ? 0 : 0)] = V(111);
+ input[IPOS(0, 0, !i ? 1 : 0, i ? 1 : 0)] = V(112);
+ input[IPOS(0, 0, !i ? 2 : 0, i ? 2 : 0)] = V(113);
+ input[IPOS(0, 0, !i ? 3 : 0, i ? 3 : 0)] = V(115);
+ input[IPOS(1, 0, !i ? 0 : 0, i ? 0 : 0)] = V(121);
+ input[IPOS(1, 0, !i ? 1 : 0, i ? 1 : 0)] = V(122);
+ input[IPOS(1, 0, !i ? 2 : 0, i ? 2 : 0)] = V(123);
+ input[IPOS(1, 0, !i ? 3 : 0, i ? 3 : 0)] = V(124);
+ input[IPOS(0, 1, !i ? 0 : 0, i ? 0 : 0)] = V(211);
+ input[IPOS(0, 1, !i ? 1 : 0, i ? 1 : 0)] = V(212);
+ input[IPOS(0, 1, !i ? 2 : 0, i ? 2 : 0)] = V(213);
+ input[IPOS(0, 1, !i ? 3 : 0, i ? 3 : 0)] = V(215);
+ input[IPOS(1, 1, !i ? 0 : 0, i ? 0 : 0)] = V(221);
+ input[IPOS(1, 1, !i ? 1 : 0, i ? 1 : 0)] = V(222);
+ input[IPOS(1, 1, !i ? 2 : 0, i ? 2 : 0)] = V(223);
+ input[IPOS(1, 1, !i ? 3 : 0, i ? 3 : 0)] = V(224);
+ input[IPOS(0, 2, !i ? 0 : 0, i ? 0 : 0)] = V(311);
+ input[IPOS(0, 2, !i ? 1 : 0, i ? 1 : 0)] = V(312);
+ input[IPOS(0, 2, !i ? 2 : 0, i ? 2 : 0)] = V(313);
+ input[IPOS(0, 2, !i ? 3 : 0, i ? 3 : 0)] = V(315);
+ input[IPOS(1, 2, !i ? 0 : 0, i ? 0 : 0)] = V(321);
+ input[IPOS(1, 2, !i ? 1 : 0, i ? 1 : 0)] = V(322);
+ input[IPOS(1, 2, !i ? 2 : 0, i ? 2 : 0)] = V(323);
+ input[IPOS(1, 2, !i ? 3 : 0, i ? 3 : 0)] = V(324);
+ ctx = libglitter_create_render_context(3, input_rowsize, wmul, hmul, cellmap, ncellvalues);
+ ASSERT(ctx);
+ ASSERT(ctx->render_method == RENDER_METHOD_SIMPLE);
+ libglitter_compose_double(outputs, input, output_rowsize, output_cellsize, 2, 3, ctx);
+ ASSERT(output1[OPOS(0, 0)] == V(111));
+ ASSERT(output2[OPOS(0, 0)] == V(112));
+ ASSERT(output3[OPOS(0, 0)] == V(114));
+ ASSERT(output1[OPOS(1, 0)] == V(121));
+ ASSERT(output2[OPOS(1, 0)] == V(122));
+ ASSERT(output3[OPOS(1, 0)] == VV(123));
+ ASSERT(output1[OPOS(0, 1)] == V(211));
+ ASSERT(output2[OPOS(0, 1)] == V(212));
+ ASSERT(output3[OPOS(0, 1)] == V(214));
+ ASSERT(output1[OPOS(1, 1)] == V(221));
+ ASSERT(output2[OPOS(1, 1)] == V(222));
+ ASSERT(output3[OPOS(1, 1)] == VV(223));
+ ASSERT(output1[OPOS(0, 2)] == V(311));
+ ASSERT(output2[OPOS(0, 2)] == V(312));
+ ASSERT(output3[OPOS(0, 2)] == V(314));
+ ASSERT(output1[OPOS(1, 2)] == V(321));
+ ASSERT(output2[OPOS(1, 2)] == V(322));
+ ASSERT(output3[OPOS(1, 2)] == VV(323));
+ output1[OPOS(0, 0)] = 0;
+ output2[OPOS(0, 0)] = 0;
+ output3[OPOS(0, 0)] = 0;
+ output1[OPOS(1, 0)] = 0;
+ output2[OPOS(1, 0)] = 0;
+ output3[OPOS(1, 0)] = 0;
+ output1[OPOS(0, 1)] = 0;
+ output2[OPOS(0, 1)] = 0;
+ output3[OPOS(0, 1)] = 0;
+ output1[OPOS(1, 1)] = 0;
+ output2[OPOS(1, 1)] = 0;
+ output3[OPOS(1, 1)] = 0;
+ output1[OPOS(0, 2)] = 0;
+ output2[OPOS(0, 2)] = 0;
+ output3[OPOS(0, 2)] = 0;
+ output1[OPOS(1, 2)] = 0;
+ output2[OPOS(1, 2)] = 0;
+ output3[OPOS(1, 2)] = 0;
+ ASSERT(!memcmp(output1, zeroes, sizeof(output1)));
+ ASSERT(!memcmp(output2, zeroes, sizeof(output2)));
+ ASSERT(!memcmp(output3, zeroes, sizeof(output3)));
+ libglitter_free_render_context(ctx);
+ }
+
+ /* generic */
+ for (i = 0; i < 1; i++) {
+ input_rowsize = 14;
+ output_rowsize = 4;
+ output_cellsize = 2;
+ wmul = !i ? 3 : 1;
+ hmul = !i ? 1 : 3;
+ ncellvalues[0] = !i ? 1 : 2;
+ ncellvalues[1] = !i ? 2 : 1;
+ cellmap[0] = !i ? 0 : 1;
+ cellmap[1] = !i ? 1 : 0;
+ cellmap[2] = !i ? 1 : 0;
+ outputs[0] = !i ? output1 : output2;
+ outputs[1] = !i ? output2 : output1;
+ outputs[2] = NULL;
+ memset(input, 0, sizeof(input));
+ memset(output1, 0, sizeof(output1));
+ memset(output2, 0, sizeof(output2));
+ input[IPOS(0, 0, !i ? 0 : 0, i ? 0 : 0)] = V(111);
+ input[IPOS(0, 0, !i ? 1 : 0, i ? 1 : 0)] = V(112);
+ input[IPOS(0, 0, !i ? 2 : 0, i ? 2 : 0)] = V(114);
+ input[IPOS(1, 0, !i ? 0 : 0, i ? 0 : 0)] = V(121);
+ input[IPOS(1, 0, !i ? 1 : 0, i ? 1 : 0)] = V(122);
+ input[IPOS(1, 0, !i ? 2 : 0, i ? 2 : 0)] = V(123);
+ input[IPOS(0, 1, !i ? 0 : 0, i ? 0 : 0)] = V(211);
+ input[IPOS(0, 1, !i ? 1 : 0, i ? 1 : 0)] = V(212);
+ input[IPOS(0, 1, !i ? 2 : 0, i ? 2 : 0)] = V(214);
+ input[IPOS(1, 1, !i ? 0 : 0, i ? 0 : 0)] = V(221);
+ input[IPOS(1, 1, !i ? 1 : 0, i ? 1 : 0)] = V(222);
+ input[IPOS(1, 1, !i ? 2 : 0, i ? 2 : 0)] = V(223);
+ input[IPOS(0, 2, !i ? 0 : 0, i ? 0 : 0)] = V(311);
+ input[IPOS(0, 2, !i ? 1 : 0, i ? 1 : 0)] = V(312);
+ input[IPOS(0, 2, !i ? 2 : 0, i ? 2 : 0)] = V(314);
+ input[IPOS(1, 2, !i ? 0 : 0, i ? 0 : 0)] = V(321);
+ input[IPOS(1, 2, !i ? 1 : 0, i ? 1 : 0)] = V(322);
+ input[IPOS(1, 2, !i ? 2 : 0, i ? 2 : 0)] = V(323);
+ ctx = libglitter_create_render_context(2, input_rowsize, wmul, hmul, cellmap, ncellvalues);
+ ASSERT(ctx);
+ ASSERT(ctx->render_method == RENDER_METHOD_GENERIC);
+ libglitter_compose_double(outputs, input, output_rowsize, output_cellsize, 2, 3, ctx);
+ ASSERT(output1[OPOS(0, 0)] == V(111));
+ ASSERT(output2[OPOS(0, 0)] == V(113));
+ ASSERT(output1[OPOS(1, 0)] == V(121));
+ ASSERT(output2[OPOS(1, 0)] == VV(122));
+ ASSERT(output1[OPOS(0, 1)] == V(211));
+ ASSERT(output2[OPOS(0, 1)] == V(213));
+ ASSERT(output1[OPOS(1, 1)] == V(221));
+ ASSERT(output2[OPOS(1, 1)] == VV(222));
+ ASSERT(output1[OPOS(0, 2)] == V(311));
+ ASSERT(output2[OPOS(0, 2)] == V(313));
+ ASSERT(output1[OPOS(1, 2)] == V(321));
+ ASSERT(output2[OPOS(1, 2)] == VV(322));
+ output1[OPOS(0, 0)] = 0;
+ output2[OPOS(0, 0)] = 0;
+ output1[OPOS(1, 0)] = 0;
+ output2[OPOS(1, 0)] = 0;
+ output1[OPOS(0, 1)] = 0;
+ output2[OPOS(0, 1)] = 0;
+ output1[OPOS(1, 1)] = 0;
+ output2[OPOS(1, 1)] = 0;
+ output1[OPOS(0, 2)] = 0;
+ output2[OPOS(0, 2)] = 0;
+ output1[OPOS(1, 2)] = 0;
+ output2[OPOS(1, 2)] = 0;
+ ASSERT(!memcmp(output1, zeroes, sizeof(output1)));
+ ASSERT(!memcmp(output2, zeroes, sizeof(output2)));
+ libglitter_free_render_context(ctx);
+ }
+
+ return 0;
}
-# endif
#endif