double noise1(int x) { int iterations, invpersistence, period_factor, smallest_period; int i; double y; iterations = 8; invpersistence = 2; period_factor = 2; smallest_period = 1; y = 0; for (i = 1; i <= iterations; i++) { double c, period, x_anchor, v0, v1, v2, v3, x_transformed; int x_i; c = 1 / pow(invpersistence, i); period = smallest_period * pow(period_factor, (iterations-i)); x_i = x / period; x_anchor = x_i * period; x_transformed = (x - x_anchor) / period; v0 = nrand(x_i-1, 0, i); v1 = nrand(x_i+0, 0, i); v2 = nrand(x_i+1, 0, i); v3 = nrand(x_i+2, 0, i); y += c * interpolate_cubic(v0, v1, v2, v3, x_transformed); } y *= (invpersistence - 1); return (y+1)/2; }
void run ( float *buf, float *delaybuf, float delay, nframes_t nframes ) { const nframes_t min_delay_samples = 4; if ( delaybuf ) { for (nframes_t i = 0; i < nframes; i++ ) { float delay_samples = delaybuf[i] * _sample_rate; if ( delay_samples > _buffer_mask + 1 ) delay_samples = _buffer_mask; else if ( delay_samples < min_delay_samples ) delay_samples = min_delay_samples; long idelay_samples = (long)delay_samples; const float frac = delay_samples - idelay_samples; const long read_index = _write_index - idelay_samples; _buffer[_write_index++ & _buffer_mask] = buf[i]; const float read = interpolate_cubic (frac, _buffer[(read_index-1) & _buffer_mask], _buffer[read_index & _buffer_mask], _buffer[(read_index+1) & _buffer_mask], _buffer[(read_index+2) & _buffer_mask]); buf[i] = read; } _samples_since_motion = 0; } else { float delay_samples = delay * _sample_rate; if ( delay_samples > _buffer_mask + 1 ) delay_samples = _buffer_mask; else if ( delay_samples < min_delay_samples ) delay_samples = min_delay_samples; long idelay_samples = (long)delay_samples; if ( _samples_since_motion >= _interpolation_delay_samples ) { /* switch to non-interpolating mode */ for (nframes_t i = 0; i < nframes; i++ ) { const long read_index = _write_index - idelay_samples; _buffer[_write_index++ & _buffer_mask] = buf[i]; const float read = _buffer[read_index & _buffer_mask]; buf[i] = read; } } else { /* linearly interpolate our way to an integer sample delay */ float frac = delay_samples - idelay_samples; const float scale = 1.0f - (_samples_since_motion * _interpolation_delay_coeff); for (nframes_t i = 0; i < nframes; i++ ) { const long read_index = _write_index - idelay_samples; _buffer[_write_index++ & _buffer_mask] = buf[i]; frac *= scale; const float read = interpolate_cubic (frac, _buffer[(read_index-1) & _buffer_mask], _buffer[read_index & _buffer_mask], _buffer[(read_index+1) & _buffer_mask], _buffer[(read_index+2) & _buffer_mask]); buf[i] = read; } _samples_since_motion += nframes; } } }
static void process_file(FILE *fin, FILE *fout, char *infile, char *outfile) { int r; greymap_t *gm; potrace_bitmap_t *bm; void *sm; int x, y; int count; for (count=0; ; count++) { r = gm_read(fin, &gm); switch (r) { case -1: /* system error */ fprintf(stderr, "mkbitmap: %s: %s\n", infile, strerror(errno)); exit(2); case -2: /* corrupt file format */ fprintf(stderr, "mkbitmap: %s: file format error: %s\n", infile, gm_read_error); exit(2); case -3: /* empty file */ if (count>0) { /* end of file */ return; } fprintf(stderr, "mkbitmap: %s: empty file\n", infile); exit(2); case -4: /* wrong magic */ if (count>0) { fprintf(stderr, "mkbitmap: %s: warning: junk at end of file\n", infile); return; } fprintf(stderr, "mkbitmap: %s: file format not recognized\n", infile); fprintf(stderr, "Possible input file formats are: pnm (pbm, pgm, ppm), bmp.\n"); exit(2); case 1: /* unexpected end of file */ fprintf(stderr, "mkbitmap: %s: warning: premature end of file\n", infile); break; } if (info.invert) { for (y=0; y<gm->h; y++) { for (x=0; x<gm->w; x++) { GM_UPUT(gm, x, y, 255-GM_UGET(gm, x, y)); } } } if (info.highpass) { r = highpass(gm, info.lambda); if (r) { fprintf(stderr, "mkbitmap: %s: %s\n", infile, strerror(errno)); exit(2); } } if (info.lowpass) { lowpass(gm, info.lambda1); } if (info.scale == 1 && info.bilevel) { /* no interpolation necessary */ sm = threshold(gm, info.level); gm_free(gm); } else if (info.scale == 1) { sm = gm; } else if (info.linear) { /* linear interpolation */ sm = interpolate_linear(gm, info.scale, info.bilevel, info.level); gm_free(gm); } else { /* cubic interpolation */ sm = interpolate_cubic(gm, info.scale, info.bilevel, info.level); gm_free(gm); } if (!sm) { fprintf(stderr, "mkbitmap: %s: %s\n", infile, strerror(errno)); exit(2); } if (info.bilevel) { bm = (potrace_bitmap_t *)sm; bm_writepbm(fout, bm); bm_free(bm); } else { gm = (greymap_t *)sm; gm_writepgm(fout, gm, NULL, 1, GM_MODE_POSITIVE, 1.0); gm_free(gm); } } }