| @@ -458,112 +458,120 @@ Audio_Region::draw ( void ) | |||
| /* no coverage */ | |||
| return; | |||
| /* account for waveform outlines... */ | |||
| X -= 2; | |||
| W += 4; | |||
| int OX = scroll_x(); | |||
| int ox = timeline->ts_to_x( _r->start ); | |||
| const int scroll_x = this->scroll_x(); | |||
| const int start_x = timeline->ts_to_x( _r->start ); | |||
| if ( ox > OX + sequence()->w() || | |||
| ( ox < OX && ox + abs_w() < OX ) ) | |||
| if ( start_x > scroll_x + sequence()->w() || | |||
| start_x + abs_w() < scroll_x ) | |||
| /* not in viewport */ | |||
| return; | |||
| int rw = timeline->ts_to_x( _r->length ); | |||
| /* account for waveform outlines... */ | |||
| X -= 2; | |||
| W += 4; | |||
| /* start with region length... */ | |||
| int rw = min( abs_w(), sequence()->w() ); | |||
| /* calculate waveform offset due to scrolling */ | |||
| nframes_t offset = 0; | |||
| if ( ox < OX ) | |||
| if ( start_x < scroll_x ) | |||
| { | |||
| offset = timeline->x_to_ts( OX - ox ); | |||
| offset = timeline->x_to_ts( scroll_x - start_x ); | |||
| rw -= OX - ox; | |||
| rw -= scroll_x - start_x; | |||
| } | |||
| rw = min( rw, sequence()->w() ); | |||
| int rx = x(); | |||
| const int rx = x(); | |||
| fl_push_clip( rx, Y, rw, H ); | |||
| /* get actual peak data */ | |||
| int channels; | |||
| int peaks; | |||
| Peak *pbuf; | |||
| /* draw fade curve outlines--this is only here because of crossfades */ | |||
| draw_fade( _fade_in, Fade::In, true, X, W ); | |||
| draw_fade( _fade_out, Fade::Out, true, X, W ); | |||
| int xo = 0; | |||
| // const nframes_t start = _r->start + offset + timeline->x_to_ts( X - rx ); | |||
| // nframes_t start = _r->start + offset; | |||
| nframes_t start = _r->offset + offset; | |||
| do { | |||
| /* compensate for ??? */ | |||
| if ( X - rx > 0 ) | |||
| start += timeline->x_to_ts( X - rx ); | |||
| int channels; | |||
| int peaks; | |||
| Peak *pbuf; | |||
| const int peaks_needed = min( timeline->ts_to_x( _clip->length() - start ), W ); | |||
| nframes_t start = _r->offset; | |||
| const nframes_t end = start + timeline->x_to_ts( peaks_needed ); | |||
| /* int loop_peaks_needed = min( _loop ? timeline->ts_to_x( _loop ) : timeline->ts_to_x( _clip->length() ), rw ); */ | |||
| if ( _clip->read_peaks( timeline->fpp(), | |||
| start, | |||
| end, | |||
| &peaks, &pbuf, &channels ) && | |||
| peaks ) | |||
| { | |||
| int loop_peaks_needed = _loop ? timeline->ts_to_x( _loop ) : timeline->ts_to_x( _clip->length() ); | |||
| if ( ! xo ) | |||
| { | |||
| if ( _loop ) | |||
| start += offset % _loop; | |||
| else | |||
| start += offset; | |||
| assert( pbuf ); | |||
| /* compensate for ??? */ | |||
| /* compensate for scrolling */ | |||
| if ( X - rx > 0 ) | |||
| start += timeline->x_to_ts( X - rx ); | |||
| /* draw fade curve outlines--this is only here because of crossfades */ | |||
| draw_fade( _fade_in, Fade::In, true, X, W ); | |||
| draw_fade( _fade_out, Fade::Out, true, X, W ); | |||
| loop_peaks_needed -= timeline->ts_to_x( offset ) % loop_peaks_needed; | |||
| int ch = (h() - Fl::box_dh( box() )) / channels; | |||
| assert( loop_peaks_needed > 0 ); | |||
| Waveform::scale( pbuf, peaks * channels, _scale ); | |||
| if ( _loop && offset < _loop ) | |||
| { | |||
| const int x = loop_peaks_needed; | |||
| /* FIXME: is there no way to draw these symbols direclty? */ | |||
| fl_font( FL_SYMBOL, 14 ); | |||
| fl_color( FL_WHITE ); | |||
| fl_draw( "@2>", X + x - 7, y(), 14, 14, (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_BOTTOM), 0, 1 ); | |||
| fl_color( FL_WHITE ); | |||
| fl_draw( "@2<", X + x - 7, y() + h() - 14, 14, 14, (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_BOTTOM), 0, 1 ); | |||
| } | |||
| } | |||
| const int total_peaks_needed = min( timeline->ts_to_x( _clip->length() - start ), rw ); | |||
| const nframes_t end = start + timeline->x_to_ts( loop_peaks_needed ); | |||
| if ( _clip->read_peaks( timeline->fpp(), | |||
| start, | |||
| end, | |||
| &peaks, &pbuf, &channels ) && | |||
| peaks ) | |||
| { | |||
| assert( pbuf ); | |||
| int ch = (h() - Fl::box_dh( box() )) / channels; | |||
| Waveform::scale( pbuf, peaks * channels, _scale ); | |||
| for ( int i = 0; i < channels; ++i ) | |||
| for ( int i = 0; i < channels; ++i ) | |||
| { | |||
| Waveform::draw( X + xo, | |||
| (y() + Fl::box_dy( box() )) + (i * ch), | |||
| loop_peaks_needed, | |||
| ch, | |||
| pbuf + i, peaks, channels, | |||
| selected() ? fl_invert_color( _color ) : _color ); | |||
| } | |||
| } | |||
| if ( peaks < loop_peaks_needed ) | |||
| { | |||
| // Peak *pb = pbuf + (peaks * i); | |||
| /* int fw = timeline->ts_to_x( fade.length ); */ | |||
| /* /\* if ( draw_fade_waveform ) *\/ */ | |||
| /* for ( int j = min( fw, peaks ); j--; ) */ | |||
| /* { */ | |||
| /* const float g = fade.gain( j * timeline->fpp() ); */ | |||
| /* pb[ j ].min *= g; */ | |||
| /* pb[ j ].max *= g; */ | |||
| /* } */ | |||
| Waveform::draw( X, | |||
| (y() + Fl::box_dy( box() )) + (i * ch), | |||
| W, | |||
| ch, | |||
| pbuf + i, peaks, channels, | |||
| selected() ? fl_invert_color( _color ) : _color ); | |||
| /* couldn't read peaks--perhaps they're being generated. Try again later. */ | |||
| Fl::add_timeout( 0.1f, &Audio_Region::peaks_pending_cb, | |||
| new Peaks_Redraw_Request( this, start + timeline->x_to_ts( peaks ), end ) ); | |||
| } | |||
| } | |||
| if ( peaks < peaks_needed ) | |||
| { | |||
| /* couldn't read peaks--perhaps they're being generated. Try again later. */ | |||
| Fl::add_timeout( 0.1f, &Audio_Region::peaks_pending_cb, | |||
| new Peaks_Redraw_Request( this, start + timeline->x_to_ts( peaks ), end ) ); | |||
| } | |||
| xo += loop_peaks_needed; | |||
| if ( _loop ) | |||
| { | |||
| const int x = timeline->ts_to_x( _loop - offset ); | |||
| /* FIXME: is there no way to draw these symbols direclty? */ | |||
| fl_font( FL_SYMBOL, 14 ); | |||
| fl_color( FL_WHITE ); | |||
| fl_draw( "@2>", X + x - 7, y(), 14, 14, (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_BOTTOM), 0, 1 ); | |||
| fl_color( FL_WHITE ); | |||
| fl_draw( "@2<", X + x - 7, y() + h() - 14, 14, 14, (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_BOTTOM), 0, 1 ); | |||
| } | |||
| while ( _loop && xo < W ); | |||
| timeline->draw_measure_lines( X, Y, W, H, _box_color ); | |||