From 02e5b6af7df001cc105e874ade35b47d560b1f83 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sat, 28 Feb 2015 10:25:40 +0100 Subject: Drop oversampling Just scale it down. --- filters.c | 56 ----------------------------------------------- flam3.c | 5 ----- flam3.h | 1 - interpolation.c | 1 - main.c | 15 +------------ palettes.c | 2 -- parser.c | 4 ---- rect.c | 68 ++++++++++++--------------------------------------------- 8 files changed, 15 insertions(+), 137 deletions(-) diff --git a/filters.c b/filters.c index 392c7eb..29ecb22 100644 --- a/filters.c +++ b/filters.c @@ -217,62 +217,6 @@ int normalize_vector(double *v, int n) { return 0; } - -int flam3_create_spatial_filter(flam3_frame *spec, int field, double **filter) { - - int sf_kernel = spec->genomes[0].spatial_filter_select; - int supersample = spec->genomes[0].spatial_oversample; - double sf_radius = spec->genomes[0].spatial_filter_radius; - double aspect_ratio = spec->pixel_aspect_ratio; - double sf_supp = flam3_spatial_support[sf_kernel]; - - double fw = 2.0 * sf_supp * supersample * sf_radius / aspect_ratio; - double adjust, ii, jj; - - int fwidth = ((int) fw) + 1; - int i,j; - - - /* Make sure the filter kernel has same parity as oversample */ - if ((fwidth ^ supersample) & 1) - fwidth++; - - /* Calculate the coordinate scaling factor for the kernel values */ - if (fw > 0.0) - adjust = sf_supp * fwidth / fw; - else - adjust = 1.0; - - /* Calling function MUST FREE THE RETURNED KERNEL, lest ye leak memory */ - (*filter) = (double *)calloc(fwidth * fwidth,sizeof(double)); - - /* fill in the coefs */ - for (i = 0; i < fwidth; i++) - for (j = 0; j < fwidth; j++) { - - /* Calculate the function inputs for the kernel function */ - ii = ((2.0 * i + 1.0) / (double)fwidth - 1.0)*adjust; - jj = ((2.0 * j + 1.0) / (double)fwidth - 1.0)*adjust; - - /* Scale for scanlines */ - if (field) jj *= 2.0; - - /* Adjust for aspect ratio */ - jj /= aspect_ratio; - - (*filter)[i + j * fwidth] = - flam3_spatial_filter(sf_kernel,ii) * flam3_spatial_filter(sf_kernel,jj); - } - - - if (normalize_vector((*filter), fwidth * fwidth)) { - fprintf(stderr, "Spatial filter value is too small: %g. Terminating.\n",sf_radius); - return(-1); - } - - return (fwidth); -} - double flam3_create_temporal_filter(int numsteps, int filter_type, double filter_exp, double filter_width, double **temporal_filter, double **temporal_deltas) { diff --git a/flam3.c b/flam3.c index 74a0c59..8adceeb 100644 --- a/flam3.c +++ b/flam3.c @@ -1061,7 +1061,6 @@ void clear_cp(flam3_genome *cp, int default_flag) { cp->background[2] = 0.0; cp->width = 100; cp->height = 100; - cp->spatial_oversample = 1; cp->spatial_filter_radius = 0.5; cp->zoom = 0.0; cp->sample_density = 1; @@ -1083,7 +1082,6 @@ void clear_cp(flam3_genome *cp, int default_flag) { cp->background[1] = -1.0; cp->background[2] = -1.0; cp->zoom = 999999999; - cp->spatial_oversample = -1; cp->spatial_filter_radius = -1; cp->nbatches = -1; cp->ntemporal_samples = -1; @@ -1304,8 +1302,6 @@ void flam3_apply_template(flam3_genome *cp, flam3_genome *templ) { cp->background[2] = templ->background[2]; if (templ->zoom < 999999998) cp->zoom = templ->zoom; - if (templ->spatial_oversample > 0) - cp->spatial_oversample = templ->spatial_oversample; if (templ->spatial_filter_radius >= 0) cp->spatial_filter_radius = templ->spatial_filter_radius; if (templ->sample_density > 0) @@ -1410,7 +1406,6 @@ void flam3_print(FILE *f, flam3_genome *cp, char *extra_attributes, int print_ed fprintf(f, " zoom=\"%g\"", cp->zoom); fprintf(f, " rotate=\"%g\"", cp->rotate); - fprintf(f, " supersample=\"%d\"", cp->spatial_oversample); fprintf(f, " filter=\"%g\"", cp->spatial_filter_radius); /* Need to print the correct kernel to use */ diff --git a/flam3.h b/flam3.h index de2ad07..4611196 100644 --- a/flam3.h +++ b/flam3.h @@ -469,7 +469,6 @@ typedef struct { double gamma; double highlight_power; int width, height; /* of the final image */ - int spatial_oversample; double center[2]; /* of camera */ double rot_center[2]; /* really the center */ double rotate; /* camera */ diff --git a/interpolation.c b/interpolation.c index 78b798f..8a5c87b 100644 --- a/interpolation.c +++ b/interpolation.c @@ -424,7 +424,6 @@ void flam3_interpolate_n(flam3_genome *result, int ncp, INTERP(hue_rotation); INTERI(width); INTERI(height); - INTERI(spatial_oversample); INTERP(center[0]); INTERP(center[1]); INTERP(rot_center[0]); diff --git a/main.c b/main.c index bfc0c7c..4c18336 100644 --- a/main.c +++ b/main.c @@ -33,7 +33,7 @@ const char *argp_program_version = typedef struct { bool verbose; - unsigned int threads, bpc, quality, oversample; + unsigned int threads, bpc, quality; float scale; } render_arguments; @@ -51,16 +51,6 @@ static error_t parse_render_opt (int key, char *arg, break; } - case 'o': { - int i = atoi (arg); - if (i < 1) { - argp_error (state, "Oversample must be >= 1"); - } else { - arguments->oversample = i; - } - break; - } - case 'q': { int i = atoi (arg); if (i < 1) { @@ -126,7 +116,6 @@ static void do_render (const render_arguments * const arguments) { genome->height *= arguments->scale; genome->width *= arguments->scale; genome->pixels_per_unit *= arguments->scale; - genome->spatial_oversample = arguments->oversample; flam3_frame f; f.genomes = genome; @@ -510,7 +499,6 @@ int main (int argc, char **argv) { {"scale", 's', "factor", 0, "Scale image dimensions by factor (1.0)" }, {"bpc", 'b', "8|16", 0, "Bits per channel of output image (8)" }, {"quality", 'q', "num", 0, "Average samples per pixel (100)" }, - {"oversample", 'o', "num", 0, "Super-/Oversample image (1)" }, {"width", 'w', "pixels", 0, "Output image width" }, {"height", 'h', "pixels", 0, "Output image height" }, { 0 }, @@ -527,7 +515,6 @@ int main (int argc, char **argv) { .scale = 1.0, .quality = 100, .verbose = true, - .oversample = 1, }; argp_parse (&argp, argc, argv, 0, NULL, &arguments); diff --git a/palettes.c b/palettes.c index 53e99c1..1f891f0 100644 --- a/palettes.c +++ b/palettes.c @@ -359,7 +359,6 @@ static double try_colors(flam3_genome *g, int color_resolution) { flam3_copy(&saved, g); g->sample_density = 1; - g->spatial_oversample = 1; /* Scale the image so that the total number of pixels is ~10000 */ pixtotal = g->width * g->height; @@ -424,7 +423,6 @@ static double try_colors(flam3_genome *g, int color_resolution) { g->sample_density = saved.sample_density; g->width = saved.width; g->height = saved.height; - g->spatial_oversample = saved.spatial_oversample; g->pixels_per_unit = saved.pixels_per_unit; g->nbatches = saved.nbatches; g->ntemporal_samples = saved.ntemporal_samples; diff --git a/parser.c b/parser.c index 1738925..06ce22c 100644 --- a/parser.c +++ b/parser.c @@ -389,10 +389,6 @@ int parse_flame_element(xmlNode *flame_node, flam3_genome *loc_current_cp, cp->rotate = flam3_atof(att_str); } else if (!xmlStrcmp(cur_att->name, (const xmlChar *)"zoom")) { cp->zoom = flam3_atof(att_str); - } else if (!xmlStrcmp(cur_att->name, (const xmlChar *)"oversample")) { - cp->spatial_oversample = flam3_atoi(att_str); - } else if (!xmlStrcmp(cur_att->name, (const xmlChar *)"supersample")) { - cp->spatial_oversample = flam3_atoi(att_str); } else if (!xmlStrcmp(cur_att->name, (const xmlChar *)"filter")) { cp->spatial_filter_radius = flam3_atof(att_str); } else if (!xmlStrcmp(cur_att->name, (const xmlChar *)"filter_shape")) { diff --git a/rect.c b/rect.c index ed68f72..cb310a5 100644 --- a/rect.c +++ b/rect.c @@ -304,18 +304,15 @@ int render_rectangle(flam3_frame *spec, void *out, long nbuckets; int i, j, k, batch_num, temporal_sample_num; double nsamples, batch_size; - double *filter, *temporal_filter, *temporal_deltas, *batch_filter; + double *temporal_filter, *temporal_deltas, *batch_filter; double ppux=0, ppuy=0; int image_width, image_height; /* size of the image to produce */ int out_width; - int filter_width=0; int bytes_per_channel = spec->bytes_per_channel; - int oversample; double highpow; int nbatches; int ntemporal_samples; flam3_palette dmap; - int gutter_width; double vibrancy = 0.0; double gamma = 0.0; int vib_gam_n = 0; @@ -352,7 +349,6 @@ int render_rectangle(flam3_frame *spec, void *out, /* interpolate and get a control point */ flam3_interpolate(spec->genomes, spec->ngenomes, spec->time, 0, &cp); - oversample = cp.spatial_oversample; highpow = cp.highlight_power; nbatches = cp.nbatches; ntemporal_samples = cp.ntemporal_samples; @@ -362,11 +358,6 @@ int render_rectangle(flam3_frame *spec, void *out, return(1); } - if (oversample < 1) { - fprintf(stderr, "oversample must be positive, not %d.\n", oversample); - return(1); - } - /* Initialize the thread helper structures */ fth = (flam3_thread_helper *)calloc(spec->nthreads,sizeof(flam3_thread_helper)); for (i=0;inthreads;i++) @@ -387,17 +378,6 @@ int render_rectangle(flam3_frame *spec, void *out, image_height = cp.height; - /* Spatial Filter kernel creation */ - filter_width = flam3_create_spatial_filter(spec, field, &filter); - - /* handle error */ - if (filter_width<0) { - fprintf(stderr,"flam3_create_spatial_filter returned error: aborting\n"); - return(1); - } - - /* note we must free 'filter' at the end */ - /* batch filter */ /* may want to revisit this at some point */ batch_filter = (double *) malloc(sizeof(double) * nbatches); @@ -412,15 +392,9 @@ int render_rectangle(flam3_frame *spec, void *out, &temporal_filter, &temporal_deltas); - /* - the number of additional rows of buckets we put at the edge so - that the filter doesn't go off the edge - */ - gutter_width = (filter_width - oversample) / 2; - /* Allocate the space required to render the image */ - fic.height = oversample * image_height + 2 * gutter_width; - fic.width = oversample * image_width + 2 * gutter_width; + fic.height = image_height; + fic.width = image_width; nbuckets = (long)fic.width * (long)fic.height; @@ -484,7 +458,7 @@ int render_rectangle(flam3_frame *spec, void *out, /* compute camera */ if (1) { - double t0, t1, shift=0.0, corner0, corner1; + double shift=0.0, corner0, corner1; double scale; if (cp.sample_density <= 0.0) { @@ -506,14 +480,12 @@ int render_rectangle(flam3_frame *spec, void *out, case flam3_field_odd: shift = 0.5; break; } shift = shift / ppux; - t0 = (double) gutter_width / (oversample * ppux); - t1 = (double) gutter_width / (oversample * ppuy); corner0 = cp.center[0] - image_width / ppux / 2.0; corner1 = cp.center[1] - image_height / ppuy / 2.0; - fic.bounds[0] = corner0 - t0; - fic.bounds[1] = corner1 - t1 + shift; - fic.bounds[2] = corner0 + image_width / ppux + t0; - fic.bounds[3] = corner1 + image_height / ppuy + t1 + shift; + fic.bounds[0] = corner0; + fic.bounds[1] = corner1 + shift; + fic.bounds[2] = corner0 + image_width / ppux; + fic.bounds[3] = corner1 + image_height / ppuy + shift; fic.size[0] = 1.0 / (fic.bounds[2] - fic.bounds[0]); fic.size[1] = 1.0 / (fic.bounds[3] - fic.bounds[1]); rotate_center ((double2) { cp.rot_center[0], cp.rot_center[1] }, @@ -613,14 +585,13 @@ int render_rectangle(flam3_frame *spec, void *out, /* XXX: the original formula has a factor 268/256 in here, not sure why */ k1 = cp.contrast * cp.brightness * batch_filter[batch_num]; area = image_width * image_height / (ppux * ppuy); - k2 = (oversample * oversample * nbatches) / - (cp.contrast * area * sample_density * sumfilt); + k2 = nbatches / (cp.contrast * area * sample_density * sumfilt); #if 0 printf("iw=%d,ih=%d,ppux=%f,ppuy=%f\n",image_width,image_height,ppux,ppuy); printf("contrast=%f, brightness=%f, PREFILTER=%d, temporal_filter=%f\n", cp.contrast, cp.brightness, PREFILTER_WHITE, temporal_filter[batch_num]); - printf("oversample=%d, nbatches=%d, area = %f, WHITE_LEVEL=%d, sample_density=%f\n", - oversample, nbatches, area, WHITE_LEVEL, sample_density); + printf("nbatches=%d, area = %f, WHITE_LEVEL=%d, sample_density=%f\n", + nbatches, area, WHITE_LEVEL, sample_density); printf("k1=%f,k2=%15.12f\n",k1,k2); #endif @@ -672,17 +643,7 @@ int render_rectangle(flam3_frame *spec, void *out, for (j = 0; j < image_height; j++) { x = 0; for (i = 0; i < image_width; i++) { - int ii, jj; - double4 t = (double4) { 0.0, 0.0, 0.0, 0.0 }; - - for (ii = 0; ii < filter_width; ii++) { - for (jj = 0; jj < filter_width; jj++) { - const double k = filter[ii + jj * filter_width]; - const double4 ac = accumulate[x+ii + (y+jj)*fic.width]; - - t += k * ac; - } - } + double4 t = accumulate[x + y * fic.width]; /* The old way, spatial filter first and then clip after gamma */ if (!spec->earlyclip) { @@ -708,9 +669,9 @@ int render_rectangle(flam3_frame *spec, void *out, assert (0); } - x += oversample; + x += 1; } - y += oversample; + y += 1; } } @@ -721,7 +682,6 @@ int render_rectangle(flam3_frame *spec, void *out, free(temporal_filter); free(temporal_deltas); free(batch_filter); - free(filter); free(buckets); free(accumulate); /* We have to clear the cps in fth first */ -- cgit v1.2.3