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]);
    }
}
Esempio n. 2
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);
}