From cab0e4c6c5420e6253bce50127a0c70fb0cd0552 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 15 Feb 2015 15:50:59 +0100 Subject: Improve command line interface Initial arguments-based cli, replacing the three tools -animate, -genome and -render with just one. Still need to get rid of most calls to getenv. --- flam3-animate.c | 297 -------------------------------------------------------- 1 file changed, 297 deletions(-) delete mode 100644 flam3-animate.c (limited to 'flam3-animate.c') diff --git a/flam3-animate.c b/flam3-animate.c deleted file mode 100644 index bdd5dfd..0000000 --- a/flam3-animate.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - FLAM3 - cosmic recursive fractal flames - Copyright (C) 1992-2009 Spotworks LLC - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - -#include "private.h" -#include "img.h" - -int main(int argc, char **argv) { - char *ai, *fname; - char flamename[256]; - char *prefix = args("prefix", ""); - int first_frame = argi("begin", 0); - int last_frame = argi("end", 0); - int frame_time = argi("time", 0); - int dtime = argi("dtime", 1); - int do_fields = argi("fields", 0); - int write_genome = argi("write_genome",0); - double qs = argf("qs", 1.0); - double ss = argf("ss", 1.0); - const char *format = "png"; - int verbose = argi("verbose", 1); - int transparency = argi("transparency", 0); - int bits = argi("bits", 33); - int sub_batch_size = argi("sub_batch_size", 10000); - int bpc = argi("bpc",8); - int earlyclip = argi("earlyclip",0); - int ftime, channels; - unsigned char *image; - flam3_genome *cps,center_cp; - int i, ncps = 0; - char *inf = getenv("in"); - double pixel_aspect = argf("pixel_aspect", 1.0); - int num_threads = argi("nthreads",0); - FILE *in,*fp,*genfp; - flam3_frame f; - flam3_img_comments fpc; - stat_struct stats,stats2; - randctx rc; - - char badval_string[64]; - char numiter_string[64]; - char rtime_string[64]; - - memset(¢er_cp,0, sizeof(flam3_genome)); - - if (1 != argc) { - docstring(); - exit(0); - } - - rand_seed(&rc); - - /* Set the number of threads */ - if (num_threads==0) { - num_threads = flam3_count_nthreads(); - if (verbose > 1) - fprintf(stderr,"Automatically detected %d core(s)...\n",num_threads); - } else{ - if (verbose) - fprintf(stderr,"Manually specified %d thread(s)...\n",num_threads); - } - - if (getenv("frame")) { - if (getenv("time")) { - fprintf(stderr, "cannot specify both time and frame.\n"); - exit(1); - } - if (getenv("begin") || getenv("end")) { - fprintf(stderr, "cannot specify both frame and begin or end.\n"); - exit(1); - } - first_frame = last_frame = atoi(getenv("frame")); - } - - if (getenv("time")) { - if (getenv("begin") || getenv("end")) { - fprintf(stderr, "cannot specify both time and begin or end.\n"); - exit(1); - } - first_frame = last_frame = frame_time; - } - - if (pixel_aspect <= 0.0) { - fprintf(stderr, "pixel aspect ratio must be positive, not %g.\n", - pixel_aspect); - exit(1); - } - - if (inf) - in = fopen(inf, "rb"); - else - in = stdin; - if (NULL == in) { - perror(inf); - exit(1); - } - - cps = flam3_parse_from_file(in, inf, flam3_defaults_on, &ncps, &rc); - if (inf) - fclose(in); - if (NULL == cps) { - fprintf(stderr," error reading genomes.\n"); - exit(1); - } - if (0 == ncps) { - fprintf(stderr, "error: no genomes.\n"); - exit(1); - } - for (i = 0; i < ncps; i++) { - cps[i].sample_density *= qs; - cps[i].height = (int)(cps[i].height * ss); - cps[i].width = (int)(cps[i].width * ss); - cps[i].pixels_per_unit *= ss; - if (cps[i].height<=0 || cps[i].width<=0) { - fprintf(stderr,"output image has dimension <=0, aborting.\n"); - exit(1); - } - if (i > 0 && cps[i].time <= cps[i-1].time) { - fprintf(stderr, "error: control points must be sorted by time, but %g <= %g, index %d.\n", - cps[i].time, cps[i-1].time, i); - exit(1); - } - if ((cps[i].width != cps[0].width) || - (cps[i].height != cps[0].height)) { - fprintf(stderr, "warning: flame %d at time %g size mismatch. " - "(%d,%d) should be (%d,%d).\n", - i, cps[i].time, - cps[i].width, cps[i].height, - cps[0].width, cps[0].height); - cps[i].width = cps[0].width; - cps[i].height = cps[0].height; - } - } - if (!getenv("time") && !getenv("frame")) { - if (!getenv("begin")) { - first_frame = (int) cps[0].time; - } - if (!getenv("end")) { - last_frame = (int) cps[ncps-1].time - 1; - if (last_frame < first_frame) last_frame = first_frame; - } - } - channels = strcmp(format, "png") ? 3 : 4; - - /* Check for 16-bit-per-channel processing */ - if ( (16 == bpc) && (strcmp(format,"png") != 0)) { - fprintf(stderr,"Support for 16 bpc images is only present for the png format.\n"); - exit(1); - } else if (bpc != 8 && bpc != 16) { - fprintf(stderr,"Unexpected bpc specified (%d)\n",bpc); - exit(1); - } - -// f.temporal_filter_radius = argf("blur", 0.5); - f.pixel_aspect_ratio = pixel_aspect; - f.genomes = cps; - f.ngenomes = ncps; - f.verbose = verbose; - f.bits = bits; - f.progress = 0; - f.earlyclip = earlyclip; - f.nthreads = num_threads; - f.sub_batch_size = sub_batch_size; - - if (16==bpc) - f.bytes_per_channel = 2; - else - f.bytes_per_channel = 1; - - - image = (void *) calloc((size_t)channels * - (size_t)cps[0].width * - (size_t)cps[0].height * f.bytes_per_channel, sizeof(char)); - - if (dtime < 1) { - fprintf(stderr, "dtime must be positive, not %d.\n", dtime); - exit(1); - } - - for (ftime = first_frame; ftime <= last_frame; ftime += dtime) { - f.time = (double) ftime; - - if (verbose && ((last_frame-first_frame)/dtime) >= 1) { - fprintf(stderr, "time = %d/%d/%d\n", ftime, last_frame, dtime); - } - - if (do_fields) { - - if (flam3_render(&f, image, flam3_field_even, channels, transparency,&stats)) { - fprintf(stderr,"error rendering image: aborting.\n"); - exit(1); - } - f.time += 0.5; - if (flam3_render(&f, image, flam3_field_odd, channels, transparency,&stats2)) { - fprintf(stderr,"error rendering image: aborting.\n"); - exit(1); - } - - stats.badvals+=stats2.badvals; - stats.render_seconds+=stats2.render_seconds; - stats.num_iters+=stats2.num_iters; - } else { - if (flam3_render(&f, image, flam3_field_both, channels, transparency,&stats)) { - fprintf(stderr,"error rendering image: aborting.\n"); - exit(1); - } - } - - if (getenv("out")) - fname = getenv("out"); - else { - fname = malloc(strlen(prefix) + 20); - sprintf(fname, "%s%05d.%s", prefix, ftime, format); - } - - if (verbose) - fprintf(stderr, "writing %s...", fname); - - if (write_genome) { - sprintf(flamename,"%s.flam3",fname); - - /* get center genome */ - flam3_interpolate(f.genomes, f.ngenomes, f.time, 0, ¢er_cp); - - /* write it out */ - genfp = fopen(flamename,"w"); - if (NULL == genfp) { - perror(flamename); - exit(1); - } - - flam3_print(genfp, ¢er_cp, NULL, flam3_print_edits); - - fclose(genfp); - } - - fp = fopen(fname, "wb"); - if (NULL == fp) { - perror(fname); - exit(1); - } - - /* Get center cp for embedding in png file */ - flam3_interpolate(f.genomes, f.ngenomes, f.time, 0, ¢er_cp); - - /* Convert to string */ - fpc.genome = flam3_print_to_string(¢er_cp); - sprintf(badval_string, "%g",stats.badvals/(double)stats.num_iters); - fpc.badvals = badval_string; - sprintf(numiter_string,"%g",(double)stats.num_iters); - fpc.numiters = numiter_string; - sprintf(rtime_string,"%d",stats.render_seconds); - fpc.rtime = rtime_string; - - write_png(fp, image, cps[0].width, cps[0].height, &fpc, f.bytes_per_channel); - - /* Free string */ - free(fpc.genome); - - clear_cp(¢er_cp,0); - - fclose(fp); - - if (!getenv("out")) - free(fname); - - } - - for (i = 0; i < ncps; i++) { - xmlFreeDoc(cps[i].edits); - clear_cp(&cps[i],0); - } - free(cps); - - free(image); - - if (verbose) - fprintf(stderr, "done.\n"); - - fflush(stderr); - return 0; -} -- cgit v1.2.3