commit 2bf47b15ecea79ecc7fc155d19d19b1fee6fc348
parent 99b9f559df6a1960d919434e1d7d40a05012725b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 8 Mar 2017 16:37:34 +0100
Fix the parsing of the rendering options
A null image definition did not produce an error. Furthermore, if the
parsing of a rendering option failed but that there is subsequent
valid rendering options, no error was reported.
Diffstat:
2 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/src/solstice_args.c b/src/solstice_args.c
@@ -182,6 +182,7 @@ parse_image_definition
tk = strtok_r(buf, "x", &ctx);
res = cstr_to_ulong(tk, width);
+ if(res == RES_OK && !*width) res = RES_BAD_ARG;
if(res != RES_OK) {
fprintf(stderr, "Invalid image width `%s'\n", tk);
return res;
@@ -189,6 +190,7 @@ parse_image_definition
tk = strtok_r(NULL, "", &ctx);
res = cstr_to_ulong(tk, height);
+ if(res == RES_OK && !*height) res = RES_BAD_ARG;
if(res != RES_OK) {
fprintf(stderr, "Invalid image height `%s'\n", tk);
return res;
@@ -225,13 +227,13 @@ parse_rendering_option(const char* str, struct solstice_args* args)
goto error;
}
- if(!strcmp(key, "fov")) {
+ if(!strcmp(key, "fov")) { /* Camera horizontal field of view in degrees */
res = parse_fov(val, &args->camera.fov_x);
if(res != RES_OK) goto error;
- } else if(!strcmp(key, "img")) {
+ } else if(!strcmp(key, "img")) { /* Image definition */
res = parse_image_definition(val, &args->img.width, &args->img.height);
if(res != RES_OK) goto error;
- } else if(!strcmp(key, "pos")) {
+ } else if(!strcmp(key, "pos")) { /* Camera position */
res = cstr_to_list_double(val, ',', args->camera.pos, &len, 3);
if(res == RES_OK && len != 3) res = RES_BAD_ARG;
if(res != RES_OK ) {
@@ -247,7 +249,7 @@ parse_rendering_option(const char* str, struct solstice_args* args)
goto error;
}
args->camera.auto_look_at = 0; /* Disable auto look at */
- } else if(!strcmp(key, "up")) {
+ } else if(!strcmp(key, "up")) { /* Camera up vector */
res = cstr_to_list_double(val, ',', args->camera.up, &len, 3);
if(res == RES_OK && len != 3) res = RES_BAD_ARG;
if(res != RES_OK) {
@@ -294,6 +296,7 @@ parse_rendering_options(const char* str, struct solstice_args* args)
tk = strtok_r(buf, ":", &ctx);
do {
res = parse_rendering_option(tk, args);
+ if(res != RES_OK) goto error;
tk = strtok_r(NULL, ":", &ctx);
} while(tk);
diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c
@@ -90,6 +90,7 @@ test_rendering(void)
CHECK(args.camera.fov_x, SOLSTICE_ARGS_DEFAULT.camera.fov_x);
CHECK(args.img.width, 1280);
CHECK(args.img.height, 720);
+ CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp);
CHECK(args.quiet, 0);
CHECK(args.output_filename, NULL);
solstice_args_release(&args);
@@ -104,6 +105,7 @@ test_rendering(void)
CHECK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up), 1);
CHECK(args.img.width, 640);
CHECK(args.img.height, 480);
+ CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp);
CHECK(args.quiet, 1);
CHECK(eq_eps(args.camera.fov_x, 70, 1.e-6), 1);
CHECK(args.output_filename, NULL);
@@ -118,12 +120,25 @@ test_rendering(void)
CHECK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)), 1);
CHECK(args.img.width, SOLSTICE_ARGS_DEFAULT.img.width);
CHECK(args.img.height, SOLSTICE_ARGS_DEFAULT.img.height);
+ CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp);
CHECK(args.rendering, 1);
CHECK(args.quiet, 0);
CHECK(args.output_filename, NULL);
solstice_args_release(&args);
cmd_delete(cmd);
+ cmd = cmd_create(0, "test", "-r", "up=0,0,1:spp=4", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
+ CHECK(args.nrealisations, SOLSTICE_ARGS_DEFAULT.nrealisations);
+ CHECK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)), 1);
+ CHECK(args.img.width, SOLSTICE_ARGS_DEFAULT.img.width);
+ CHECK(args.img.height, SOLSTICE_ARGS_DEFAULT.img.height);
+ CHECK(args.rendering, 1);
+ CHECK(args.output_filename, NULL);
+ CHECK(args.img.spp, 4);
+ solstice_args_release(&args);
+ cmd_delete(cmd);
+
cmd = cmd_create(0, "test", "-r", "up=0,10,0", "-o", "my_output", NULL);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
CHECK(d3_eq(args.camera.up, d3(tmp, 0, 10, 0)), 1);
@@ -133,6 +148,12 @@ test_rendering(void)
solstice_args_release(&args);
cmd_delete(cmd);
+ cmd = cmd_create(0, "test", "-r", "spp=16", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
+ CHECK(args.img.spp, 16);
+ solstice_args_release(&args);
+ cmd_delete(cmd);
+
cmd = cmd_create(0, "test", "-r", "up=0,1", NULL);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
cmd_delete(cmd);
@@ -151,6 +172,10 @@ test_rendering(void)
solstice_args_release(&args);
cmd_delete(cmd);
+ cmd = cmd_create(0, "test", "-r", "spp=0", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
+ cmd_delete(cmd);
+
cmd = cmd_create(0, "test", "-r", "img=32X32", NULL);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
cmd_delete(cmd);
@@ -159,6 +184,18 @@ test_rendering(void)
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
cmd_delete(cmd);
+ cmd = cmd_create(0, "test", "-r", "img=0x64", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
+ cmd_delete(cmd);
+
+ cmd = cmd_create(0, "test", "-r", "img=64x0", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
+ cmd_delete(cmd);
+
+ cmd = cmd_create(0, "test", "-r", "img=32x32@12:up=0,0,1", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
+ cmd_delete(cmd);
+
cmd = cmd_create(0, "test", "-r", "tgt=1,1,1:img=32x32:12", NULL);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG);
cmd_delete(cmd);