void tonemap_image () { double Lmax2; int x, y; int scale, prefscale; if (white < 1e20) Lmax2 = white * white; else { if( temporal_coherent ) { max_luminance.set( get_maxvalue() ); Lmax2 = max_luminance.get(); } else Lmax2 = get_maxvalue(); Lmax2 *= Lmax2; } for (y = 0; y < cvts.ymax; y++) for (x = 0; x < cvts.xmax; x++) { if (use_scales) { prefscale = range - 1; for (scale = 0; scale < range - 1; scale++) if ( scale >= PyramidHeight || fabs (ACTIVITY(x,y,scale)) > threshold) { prefscale = scale; break; } image[y][x][0] /= 1. + V1(x,y,prefscale); } else image[y][x][0] = image[y][x][0] * (1. + (image[y][x][0] / Lmax2)) / (1. + image[y][x][0]); // image[y][x][0] /= (1. + image[y][x][0]); } }
int envel_preprocess(dataptr dz) { int exit_status; int filestsmplen; //TW UPDATES double *d; double maxsplen, minwidth; int n; double sec = (double)(ENV_FSECSIZE)/(double)(dz->infile->channels * dz->infile->srate); switch(dz->process) { case(ENV_WARPING): case(ENV_RESHAPING): case(ENV_REPLOTTING): switch(dz->mode) { case(ENV_NORMALISE): case(ENV_REVERSE): case(ENV_CEILING): case(ENV_EXAGGERATING): case(ENV_ATTENUATING): case(ENV_FLATTENING): case(ENV_TSTRETCHING): case(ENV_CORRUGATING): case(ENV_PEAKCNT): case(ENV_LIFTING): case(ENV_GATING): case(ENV_DUCKED): case(ENV_TRIGGERING): break; case(ENV_LIMITING): if(!first_param_not_less_than_second(ENV_LIMIT,ENV_THRESHOLD,dz)) return(DATA_ERROR); break; case(ENV_INVERTING): if(!first_param_greater_than_second(ENV_MIRROR,ENV_GATE,dz)) return(DATA_ERROR); break; case(ENV_EXPANDING): if(!first_param_not_less_than_second(ENV_THRESHOLD,ENV_GATE,dz)) return(DATA_ERROR); break; default: sprintf(errstr,"Unknown case: envwarp,reshape or replot: envelope_preprocess()\n"); return(PROGRAM_ERROR); } break; case(ENV_CURTAILING): switch(dz->mode) { case(ENV_START_AND_END): case(ENV_START_AND_DUR): switch(dz->iparam[ENV_TIMETYPE]) { case(ENV_TIMETYPE_SMPS): dz->param[ENV_STARTTIME] = (double)(round(dz->param[ENV_STARTTIME])/dz->infile->channels); dz->param[ENV_ENDTIME] = (double)(round(dz->param[ENV_ENDTIME])/dz->infile->channels); /* fall thro */ case(ENV_TIMETYPE_STSMPS): dz->param[ENV_STARTTIME] = dz->param[ENV_STARTTIME]/(double)dz->infile->srate; dz->param[ENV_ENDTIME] = dz->param[ENV_ENDTIME]/(double)dz->infile->srate; break; case(ENV_TIMETYPE_SECS): break; default: sprintf(errstr,"Unknown case: ENV_CURTAILING: envelope_preprocess()\n"); return(PROGRAM_ERROR); } if(dz->param[ENV_STARTTIME] < 0.0 || dz->param[ENV_STARTTIME] >= dz->duration) { sprintf(errstr,"Start of fade time : out of range.\n"); return(USER_ERROR); } if(dz->mode==ENV_START_AND_DUR) { /* "ENDTIME" is actually FADE DURATION */ if(dz->param[ENV_ENDTIME] < FLTERR) { sprintf(errstr,"Negative or zero fade duration : impossible.\n"); return(USER_ERROR); } dz->param[ENV_ENDTIME] = dz->param[ENV_STARTTIME] + dz->param[ENV_ENDTIME]; if(dz->param[ENV_ENDTIME] > dz->duration + FLTERR) { fprintf(stdout,"WARNING: Fade duration goes beyond file end: curtailing to file end.\n"); fflush(stdout); } if(dz->param[ENV_ENDTIME] > dz->duration-FLTERR) { dz->param[ENV_ENDTIME] = dz->duration; } } else { if(dz->param[ENV_STARTTIME] + sec >= dz->param[ENV_ENDTIME]) { sprintf(errstr,"Fade times too close or reversed.\n"); return(USER_ERROR); } if(dz->param[ENV_ENDTIME] < 0.0) { sprintf(errstr,"End-of-fade time : out of range.\n"); return(USER_ERROR); } else if(dz->param[ENV_ENDTIME] > dz->duration) { dz->param[ENV_ENDTIME] = dz->duration; fprintf(stdout,"WARNING: End-of-fade beyond file end: defaulting to end of file.\n"); fflush(stdout); } } break; case(ENV_START_ONLY): switch(dz->iparam[ENV_TIMETYPE]) { case(ENV_TIMETYPE_SMPS): dz->param[ENV_STARTTIME] = (double)(round(dz->param[ENV_STARTTIME])/dz->infile->channels); /* fall thro */ case(ENV_TIMETYPE_STSMPS): dz->param[ENV_STARTTIME] = dz->param[ENV_STARTTIME]/(double)dz->infile->srate; break; case(ENV_TIMETYPE_SECS): break; default: sprintf(errstr,"Unknown case: ENV_CURTAILING: envelope_preprocess()\n"); return(PROGRAM_ERROR); } dz->param[ENV_ENDTIME] = dz->duration; } dz->itemcnt = 3; if((exit_status = create_initial_envelope_params(dz->duration,dz))<0) return(exit_status); if((exit_status = establish_additional_brktable(dz))<0) return(exit_status); break; case(ENV_DOVETAILING): filestsmplen = dz->insams[0]/dz->infile->channels; switch(dz->iparam[ENV_TIMETYPE]) { case(ENV_TIMETYPE_SMPS): dz->param[ENV_STARTTRIM] = (double)round(dz->param[ENV_STARTTRIM])/(double)(dz->infile->channels * dz->infile->srate); dz->param[ENV_ENDTRIM] = (double)round(dz->param[ENV_ENDTRIM])/(double)(dz->infile->channels * dz->infile->srate); dz->param[ENV_ENDTRIM] = dz->duration - dz->param[ENV_ENDTRIM]; break; case(ENV_TIMETYPE_STSMPS): dz->param[ENV_STARTTRIM] = (double)round(dz->param[ENV_STARTTRIM])/(double)dz->infile->srate; dz->iparam[ENV_ENDTRIM] = (int)round(dz->param[ENV_ENDTRIM]); dz->iparam[ENV_ENDTRIM] = (int)(filestsmplen - dz->iparam[ENV_ENDTRIM]); dz->param[ENV_ENDTRIM] = (double)dz->iparam[ENV_ENDTRIM]/(double)dz->infile->srate; break; case(ENV_TIMETYPE_SECS): dz->param[ENV_ENDTRIM] = dz->duration - dz->param[ENV_ENDTRIM]; break; default: sprintf(errstr,"Unknown case: ENV_DOVETAILING: envelope_preprocess()\n"); return(PROGRAM_ERROR); } if(dz->param[ENV_ENDTRIM] < 0.0) { sprintf(errstr,"End Trim is too large.\n"); return(USER_ERROR); } if(dz->param[ENV_STARTTRIM] > dz->duration) { sprintf(errstr,"Start Trim is too large.\n"); return(USER_ERROR); } if(dz->param[ENV_ENDTRIM] < dz->param[ENV_STARTTRIM]) { sprintf(errstr,"Start and End Trims overlap: cannot proceed.\n"); return(USER_ERROR); } if(flteq(dz->param[ENV_ENDTRIM],dz->duration) && flteq(dz->param[ENV_STARTTRIM],0.0)) { sprintf(errstr,"Start and End Trims are zero: no change in file.\n"); return(USER_ERROR); } if(flteq(dz->param[ENV_ENDTRIM],dz->duration) || flteq(dz->param[ENV_STARTTRIM],0.0)) dz->itemcnt = 3; else dz->itemcnt = 4; if((exit_status = create_initial_envelope_params(dz->duration,dz))<0) return(exit_status); if((exit_status = establish_additional_brktable(dz))<0) return(exit_status); break; case(ENV_SWELL): dz->itemcnt = 3; if((exit_status = create_initial_envelope_params(dz->duration,dz))<0) return(exit_status); if((exit_status = establish_additional_brktable(dz))<0) return(exit_status); break; case(ENV_ATTACK): dz->param[ENV_ATK_GATE] *= (double)F_MAXSAMP; /* RWD actually redundant, but do it anyway */ if((exit_status = find_and_test_attack_peak(dz))<0) return(exit_status); dz->param[ENV_ATK_ONSET] *= MS_TO_SECS; dz->param[ENV_ATK_TAIL] *= MS_TO_SECS; if(dz->iparam[ENV_ATK_ENVTYPE] == ENVTYPE_EXP) dz->iparam[ENV_ATK_ENVTYPE] = ENVTYPE_STEEP; dz->itemcnt = 5; if((exit_status = create_initial_envelope_params(dz->duration,dz))<0) return(exit_status); if((exit_status = establish_additional_brktable(dz))<0) return(exit_status); break; case(ENV_CREATE): if(dz->mode==ENV_ENVFILE_OUT) { if(dz->extrabrkno>=0) { /* If a brktable passed in from framework */ if(dz->brk == NULL || dz->brk[dz->extrabrkno] == NULL) { /* clear it */ sprintf(errstr,"Problem freeing inbrkfile-table: ENV_CREATE: envelope_preprocess()\n"); return(PROGRAM_ERROR); } free(dz->brk[dz->extrabrkno]); } /* allocate temporary brkpnt array */ if((exit_status = establish_additional_brktable(dz))<0) return(exit_status); } break; case(ENV_EXTRACT): case(ENV_IMPOSE): case(ENV_REPLACE): case(ENV_ENVTOBRK): case(ENV_ENVTODBBRK): case(ENV_BRKTOENV): case(ENV_DBBRKTOENV):case(ENV_DBBRKTOBRK): case(ENV_BRKTODBBRK): //TW NEW CASE case(ENV_PROPOR): break; case(ENV_PLUCK): if(dz->infile->channels!=MONO) { sprintf(errstr,"This process only works with MONO files\n"); return(USER_ERROR); } initrand48(); break; case(ENV_TREMOL): if(dz->brksize[ENV_TREM_FRQ] && dz->mode==ENV_TREM_LOG) convert_tremol_frq_to_log10(dz); return create_tremol_sintable(dz); break; case(TIME_GRID): dz->tempsize = dz->insams[0] * dz->iparam[GRID_COUNT]; if(dz->brksize[GRID_SPLEN] > 0) { d = dz->brk[GRID_SPLEN] + 1; for(n= 0;n < dz->brksize[GRID_SPLEN];n++) { *d *= MS_TO_SECS; d += 2; } } else dz->param[GRID_SPLEN] *= MS_TO_SECS; if(dz->brksize[GRID_WIDTH]) { if((exit_status = get_minvalue_in_brktable(&minwidth,GRID_WIDTH,dz))<0) return(exit_status); } else minwidth = dz->param[GRID_WIDTH]; if((exit_status = get_maxvalue(GRID_SPLEN,&maxsplen,dz))<0) return(exit_status); if(maxsplen >= minwidth) { sprintf(errstr,"Maximum splicelen too large for minimum grid-width\n"); return(DATA_ERROR); } break; default: sprintf(errstr,"Unknown case: envelope_preprocess()\n"); return(PROGRAM_ERROR); } return(FINISHED); }