diff --git a/Timeline/Peaks.C b/Timeline/Peaks.C index e3a46a3..698616b 100644 --- a/Timeline/Peaks.C +++ b/Timeline/Peaks.C @@ -46,7 +46,7 @@ Peaks::peakbuffer Peaks::_peakbuf; /** Prepare a buffer of peaks from /s/ to /e/ for reading. Must be * called before any calls to operator[] */ int -Peaks::fill_buffer ( float fpp, int s, int e ) const +Peaks::fill_buffer ( float fpp, nframes_t s, nframes_t e ) const { _fpp = fpp; @@ -208,7 +208,7 @@ Peaks::read_source_peaks ( Peak *peaks, nframes_t s, int npeaks, int chunksize ) } int -Peaks::read_peaks ( int s, int e, int npeaks, int chunksize ) const +Peaks::read_peaks ( nframes_t s, nframes_t e, int npeaks, int chunksize ) const { printf( "reading peaks %d @ %d\n", npeaks, chunksize ); diff --git a/Timeline/Peaks.H b/Timeline/Peaks.H index 5f35be0..87a6c74 100644 --- a/Timeline/Peaks.H +++ b/Timeline/Peaks.H @@ -62,7 +62,7 @@ class Peaks mutable float _fpp; - int read_peaks ( int s, int e, int npeaks, int chunksize ) const; + int read_peaks ( nframes_t s, nframes_t e, int npeaks, int chunksize ) const; int read_source_peaks ( Peak *peaks, nframes_t s, int npeaks, int chunksize ) const; int read_source_peaks ( Peak *peaks, int npeaks, int chunksize ) const; int read_peakfile_peaks ( Peak *peaks, nframes_t s, int npeaks, int chunksize ) const; @@ -89,7 +89,7 @@ public: Peak *peakbuf ( void ) const { return Peaks::_peakbuf.buf->data; } void clip ( Audio_File *c ) { _clip = c; } - int fill_buffer ( float fpp, int s, int e ) const; + int fill_buffer ( float fpp, nframes_t s, nframes_t e ) const; void downsample ( Peak *peaks, int s, int e, float *mhi, float *mlo ) const; void read ( int X, float *hi, float *lo ) const; diff --git a/Timeline/Region.C b/Timeline/Region.C index 45bb381..7152934 100644 --- a/Timeline/Region.C +++ b/Timeline/Region.C @@ -569,6 +569,12 @@ Region::draw ( int X, int Y, int W, int H ) if ( ! shown() ) return; + /* intersect clip with region */ + /* FIXME: wouldn't it be better to get rid of the useless X Y W H arguments and + just intersect with the real clipping region? */ + + fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); + if ( ! ( W > 0 && H > 0 ) ) /* WTF? */ return; @@ -596,7 +602,7 @@ Region::draw ( int X, int Y, int W, int H ) { offset = timeline->x_to_ts( OX - ox ); - rw = timeline->ts_to_x( (_r->end - _r->start) - offset ); + rw -= OX - ox; } rw = min( rw, _track->w() ); @@ -614,13 +620,14 @@ Region::draw ( int X, int Y, int W, int H ) // const nframes_t start = _r->start + offset + timeline->x_to_ts( X - rx ); nframes_t start = _r->start + offset; -/* if ( X - rx > 0 ) */ -/* start += timeline->x_to_ts( X - rx ); */ + /* compensate for ??? */ + if ( X - rx > 0 ) + start += timeline->x_to_ts( X - rx ); printf( "offset=%lu start=%lu\n", offset, start, X, rx ); if ( _clip->read_peaks( timeline->fpp(), start, - start + timeline->x_to_ts( W ), + start + timeline->x_to_ts( min( rw, W ) ), &peaks, &pbuf, &channels ) ) { @@ -653,7 +660,13 @@ Region::draw ( int X, int Y, int W, int H ) /* pb[ j ].max *= g; */ /* } */ - Waveform::draw( max( X, rx ), (y() + Fl::box_dy( box() )) + (i * ch), min( W, rw ), ch, + const int nx = max( X, rx ); + const int nw = min( nx + W, nx + rw ) - nx; + + Waveform::draw( nx, + (y() + Fl::box_dy( box() )) + (i * ch), + nw, + ch, pb, peaks, selected() ? fl_invert_color( _color ) : _color ); }