diff options
-rw-r--r-- | libglitter_create_render_context.c | 384 |
1 files changed, 383 insertions, 1 deletions
diff --git a/libglitter_create_render_context.c b/libglitter_create_render_context.c index 7898ff8..9dd7871 100644 --- a/libglitter_create_render_context.c +++ b/libglitter_create_render_context.c @@ -54,7 +54,389 @@ fail: int main(void) { - return 0; /* TODO add test */ +#define POS(Y, X) ((Y) * ctx->rowsize + (X)) + + LIBGLITTER_RENDER_CONTEXT *ctx; + uint8_t cellmap[6]; + uint8_t ncellvalues[4]; + uint8_t a, b, c, i; + + ncellvalues[0] = 2; + ncellvalues[1] = 16; + ncellvalues[2] = 4; + ncellvalues[3] = 8; + cellmap[0] = 0, cellmap[1] = 1, cellmap[2] = 2; + cellmap[3] = 1, cellmap[4] = 2, cellmap[5] = 0; + ctx = libglitter_create_render_context(4, 10, 3, 2, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 2); + ASSERT(ctx->ncellvalues[1] == 16); + ASSERT(ctx->ncellvalues[2] == 4); + ASSERT(ctx->ncellvalues[3] == 8); + ASSERT(ctx->noutputs == 4); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / 2); + ASSERT(ctx->cellweights_double[1] == (double)1 / 16); + ASSERT(ctx->cellweights_double[2] == (double)1 / 4); + ASSERT(ctx->cellweights_double[3] == (double)1 / 8); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / 2); + ASSERT(ctx->cellweights_float[1] == (float)1 / 16); + ASSERT(ctx->cellweights_float[2] == (float)1 / 4); + ASSERT(ctx->cellweights_float[3] == (float)1 / 8); + ASSERT(ctx->render_method == RENDER_METHOD_GENERIC); + ASSERT(ctx->rowsize == 10); + libglitter_update_render_context(ctx, 20); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 2); + ASSERT(ctx->ncellvalues[1] == 16); + ASSERT(ctx->ncellvalues[2] == 4); + ASSERT(ctx->ncellvalues[3] == 8); + ASSERT(ctx->noutputs == 4); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / 2); + ASSERT(ctx->cellweights_double[1] == (double)1 / 16); + ASSERT(ctx->cellweights_double[2] == (double)1 / 4); + ASSERT(ctx->cellweights_double[3] == (double)1 / 8); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / 2); + ASSERT(ctx->cellweights_float[1] == (float)1 / 16); + ASSERT(ctx->cellweights_float[2] == (float)1 / 4); + ASSERT(ctx->cellweights_float[3] == (float)1 / 8); + ASSERT(ctx->render_method == RENDER_METHOD_GENERIC); + ASSERT(ctx->rowsize == 20); + libglitter_free_render_context(ctx); + + ncellvalues[0] = 1; + ncellvalues[1] = 1; + ncellvalues[2] = 1; + cellmap[0] = 1, cellmap[1] = 0, cellmap[2] = 2; + ctx = libglitter_create_render_context(3, 6, 3, 1, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 0); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 1); + ASSERT(ctx->ncellvalues[1] == 1); + ASSERT(ctx->ncellvalues[2] == 1); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 1); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == 1); + ASSERT(ctx->cellweights_double[1] == 1); + ASSERT(ctx->cellweights_double[2] == 1); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == 1); + ASSERT(ctx->cellweights_float[1] == 1); + ASSERT(ctx->cellweights_float[2] == 1); + ASSERT(ctx->render_method == RENDER_METHOD_VSTRIPS); + ASSERT(ctx->rowsize == 6); + libglitter_update_render_context(ctx, 15); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 0); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 1); + ASSERT(ctx->ncellvalues[1] == 1); + ASSERT(ctx->ncellvalues[2] == 1); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 1); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == 1); + ASSERT(ctx->cellweights_double[1] == 1); + ASSERT(ctx->cellweights_double[2] == 1); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == 1); + ASSERT(ctx->cellweights_float[1] == 1); + ASSERT(ctx->cellweights_float[2] == 1); + ASSERT(ctx->render_method == RENDER_METHOD_VSTRIPS); + ASSERT(ctx->rowsize == 15); + libglitter_free_render_context(ctx); + + ncellvalues[0] = 1; + ncellvalues[1] = 1; + ncellvalues[2] = 1; + cellmap[0] = 1, cellmap[1] = 0, cellmap[2] = 2; + ctx = libglitter_create_render_context(3, 6, 1, 3, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 0); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 1); + ASSERT(ctx->ncellvalues[1] == 1); + ASSERT(ctx->ncellvalues[2] == 1); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 1); + ASSERT(ctx->heightmul == 3); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == 1); + ASSERT(ctx->cellweights_double[1] == 1); + ASSERT(ctx->cellweights_double[2] == 1); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == 1); + ASSERT(ctx->cellweights_float[1] == 1); + ASSERT(ctx->cellweights_float[2] == 1); + ASSERT(ctx->render_method == RENDER_METHOD_HSTRIPS); + ASSERT(ctx->rowsize == 6); + libglitter_update_render_context(ctx, 15); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 0); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == 1); + ASSERT(ctx->ncellvalues[1] == 1); + ASSERT(ctx->ncellvalues[2] == 1); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 1); + ASSERT(ctx->heightmul == 3); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == 1); + ASSERT(ctx->cellweights_double[1] == 1); + ASSERT(ctx->cellweights_double[2] == 1); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == 1); + ASSERT(ctx->cellweights_float[1] == 1); + ASSERT(ctx->cellweights_float[2] == 1); + ASSERT(ctx->render_method == RENDER_METHOD_HSTRIPS); + ASSERT(ctx->rowsize == 15); + libglitter_free_render_context(ctx); + + for (i = 1; i < 8; i++) { + ncellvalues[0] = a = 2 + !!(i & 1); + ncellvalues[1] = b = 2 + !!(i & 2); + ncellvalues[2] = c = 2 + !!(i & 4); + cellmap[0] = 0, cellmap[1] = 1, cellmap[2] = 2; + cellmap[3] = 1, cellmap[4] = 2, cellmap[5] = 0; + ctx = libglitter_create_render_context(3, 8, 3, 2, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_GENERIC); + ASSERT(ctx->rowsize == 8); + libglitter_update_render_context(ctx, 30); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_GENERIC); + ASSERT(ctx->rowsize == 30); + libglitter_free_render_context(ctx); + } + + for (i = 0; i < 8; i++) { + ncellvalues[0] = a = 1 + !!(i & 1); + ncellvalues[1] = b = 1 + !!(i & 2); + ncellvalues[2] = c = 1 + !!(i & 4); + cellmap[0] = 0, cellmap[1] = 1, cellmap[2] = 2; + cellmap[3] = 1, cellmap[4] = 2, cellmap[5] = 0; + ctx = libglitter_create_render_context(3, 8, 3, 2, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_SIMPLE); + ASSERT(ctx->rowsize == 8); + ASSERT(ctx->cells[0][0] == POS(0, 0) || ctx->cells[0][0] == POS(1, 2)); + ASSERT(ctx->cells[0][1] == POS(1, 2) || ctx->cells[0][1] == POS(0, 0)); + ASSERT(ctx->cells[1][0] == POS(0, 1) || ctx->cells[1][0] == POS(1, 0)); + ASSERT(ctx->cells[1][1] == POS(1, 0) || ctx->cells[1][1] == POS(0, 1)); + ASSERT(ctx->cells[2][0] == POS(0, 2) || ctx->cells[2][0] == POS(1, 1)); + ASSERT(ctx->cells[2][1] == POS(1, 1) || ctx->cells[2][1] == POS(0, 2)); + ASSERT(ctx->cells[0][0] != ctx->cells[0][1]); + ASSERT(ctx->cells[1][0] != ctx->cells[1][1]); + ASSERT(ctx->cells[2][0] != ctx->cells[2][1]); + libglitter_update_render_context(ctx, 30); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 0); + ASSERT(ctx->cellmap[1] == 1); + ASSERT(ctx->cellmap[2] == 2); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->cellmap[4] == 2); + ASSERT(ctx->cellmap[5] == 0); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 3); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_SIMPLE); + ASSERT(ctx->rowsize == 30); + ASSERT(ctx->cells[0][0] == POS(0, 0) || ctx->cells[0][0] == POS(1, 2)); + ASSERT(ctx->cells[0][1] == POS(1, 2) || ctx->cells[0][1] == POS(0, 0)); + ASSERT(ctx->cells[1][0] == POS(0, 1) || ctx->cells[1][0] == POS(1, 0)); + ASSERT(ctx->cells[1][1] == POS(1, 0) || ctx->cells[1][1] == POS(0, 1)); + ASSERT(ctx->cells[2][0] == POS(0, 2) || ctx->cells[2][0] == POS(1, 1)); + ASSERT(ctx->cells[2][1] == POS(1, 1) || ctx->cells[2][1] == POS(0, 2)); + ASSERT(ctx->cells[0][0] != ctx->cells[0][1]); + ASSERT(ctx->cells[1][0] != ctx->cells[1][1]); + ASSERT(ctx->cells[2][0] != ctx->cells[2][1]); + libglitter_free_render_context(ctx); + } + + ncellvalues[0] = a = 1; + ncellvalues[1] = b = 2; + ncellvalues[2] = c = 1; + cellmap[0] = 1, cellmap[1] = 2; + cellmap[2] = 0, cellmap[3] = 1; + ctx = libglitter_create_render_context(3, 8, 2, 2, cellmap, ncellvalues); + ASSERT(ctx); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 2); + ASSERT(ctx->cellmap[2] == 0); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 2); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_SIMPLE); + ASSERT(ctx->rowsize == 8); + ASSERT(ctx->cells[0][0] == POS(1, 0)); + ASSERT(ctx->cells[1][0] == POS(0, 0) || ctx->cells[1][0] == POS(1, 1)); + ASSERT(ctx->cells[1][1] == POS(1, 1) || ctx->cells[1][1] == POS(0, 0)); + ASSERT(ctx->cells[2][0] == POS(0, 1)); + ASSERT(ctx->cells[0][0] == ctx->cells[0][1]); + ASSERT(ctx->cells[1][0] != ctx->cells[1][1]); + ASSERT(ctx->cells[2][0] == ctx->cells[2][1]); + libglitter_update_render_context(ctx, 30); + ASSERT(ctx->cellmap); + ASSERT(ctx->cellmap[0] == 1); + ASSERT(ctx->cellmap[1] == 2); + ASSERT(ctx->cellmap[2] == 0); + ASSERT(ctx->cellmap[3] == 1); + ASSERT(ctx->ncellvalues); + ASSERT(ctx->ncellvalues[0] == a); + ASSERT(ctx->ncellvalues[1] == b); + ASSERT(ctx->ncellvalues[2] == c); + ASSERT(ctx->noutputs == 3); + ASSERT(ctx->widthmul == 2); + ASSERT(ctx->heightmul == 2); + ASSERT(ctx->cellweights_double); + ASSERT(ctx->cellweights_double[0] == (double)1 / a); + ASSERT(ctx->cellweights_double[1] == (double)1 / b); + ASSERT(ctx->cellweights_double[2] == (double)1 / c); + ASSERT(ctx->cellweights_float); + ASSERT(ctx->cellweights_float[0] == (float)1 / a); + ASSERT(ctx->cellweights_float[1] == (float)1 / b); + ASSERT(ctx->cellweights_float[2] == (float)1 / c); + ASSERT(ctx->render_method == RENDER_METHOD_SIMPLE); + ASSERT(ctx->rowsize == 30); + ASSERT(ctx->cells[0][0] == POS(1, 0)); + ASSERT(ctx->cells[1][0] == POS(0, 0) || ctx->cells[1][0] == POS(1, 1)); + ASSERT(ctx->cells[1][1] == POS(1, 1) || ctx->cells[1][1] == POS(0, 0)); + ASSERT(ctx->cells[2][0] == POS(0, 1)); + ASSERT(ctx->cells[0][0] == ctx->cells[0][1]); + ASSERT(ctx->cells[1][0] != ctx->cells[1][1]); + ASSERT(ctx->cells[2][0] == ctx->cells[2][1]); + libglitter_free_render_context(ctx); + +#undef POS + + return 0; } |