From 4543d48c418d88a6f70d26595b53b24d86ad2364 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Thu, 17 Apr 2008 10:35:20 -0500 Subject: [PATCH] Fix a number of problems with region drawing. --- Timeline/Control_Track.H | 2 +- Timeline/Region.C | 42 +++++++++++++--------------------------- Timeline/Region.H | 4 ++-- Timeline/Track.C | 23 +++++++++++----------- Timeline/Track_Point.H | 4 ++-- Timeline/Track_Widget.H | 20 +++---------------- 6 files changed, 32 insertions(+), 63 deletions(-) diff --git a/Timeline/Control_Track.H b/Timeline/Control_Track.H index 32683db..a94a88b 100644 --- a/Timeline/Control_Track.H +++ b/Timeline/Control_Track.H @@ -93,7 +93,7 @@ public: timeline->draw_measure_lines( x(), y(), w(), h(), color() ); for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) - (*r)->draw_box( X, Y, W, H ); + (*r)->draw_box(); fl_pop_clip(); } diff --git a/Timeline/Region.C b/Timeline/Region.C index 7152934..0826b52 100644 --- a/Timeline/Region.C +++ b/Timeline/Region.C @@ -540,14 +540,11 @@ Region::draw_fade ( const Fade &fade, Fade::fade_dir_e dir, bool line, int X, in } void -Region::draw_box( int X, int Y, int W, int H ) +Region::draw_box( void ) { - if ( ! shown() ) - return; - /* dirty hack to keep the box from flipping to vertical at small sizes */ - fl_push_clip( x(), Y, w(), H ); + fl_push_clip( x(), y(), w(), h() ); if ( selected() ) fl_draw_box( fl_down( box() ), x() - 10, y(), w() + 50, h(), _selection_color ); @@ -556,27 +553,24 @@ Region::draw_box( int X, int Y, int W, int H ) fl_draw_box( box(), x() - 10, y(), w() + 50, h(), _box_color ); /* draw fades */ - draw_fade( _fade_in, Fade::In, false, X, W ); - draw_fade( _fade_out, Fade::Out, false, X, W ); + draw_fade( _fade_in, Fade::In, false, x(), w() ); + draw_fade( _fade_out, Fade::Out, false, x(), w() ); fl_pop_clip(); } /** Draw (part of) region. X, Y, W and H are the rectangle we're clipped to. */ void -Region::draw ( int X, int Y, int W, int H ) +Region::draw ( void ) { - 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? */ + + int X, Y, W, H; fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); if ( ! ( W > 0 && H > 0 ) ) - /* WTF? */ + /* no coverage */ return; int OX = scroll_x(); @@ -587,13 +581,7 @@ Region::draw ( int X, int Y, int W, int H ) /* not in viewport */ return; - if ( x() > X + W || x() + w() < X ) - /* no coverage */ - return; - - int rw = timeline->ts_to_x( _r->end - _r->start ); - // nframes_t end = _r->offset + ( _r->end - _r->start ); /* calculate waveform offset due to scrolling */ @@ -609,7 +597,7 @@ Region::draw ( int X, int Y, int W, int H ) int rx = x(); -// fl_push_clip( rx, Y, rw, H ); + fl_push_clip( rx, Y, rw, H ); /* get actual peak data */ int channels; @@ -624,10 +612,9 @@ Region::draw ( int X, int Y, int W, int H ) 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( min( rw, W ) ), + start + timeline->x_to_ts( W ), &peaks, &pbuf, &channels ) ) { @@ -660,12 +647,9 @@ Region::draw ( int X, int Y, int W, int H ) /* pb[ j ].max *= g; */ /* } */ - const int nx = max( X, rx ); - const int nw = min( nx + W, nx + rw ) - nx; - - Waveform::draw( nx, + Waveform::draw( X, (y() + Fl::box_dy( box() )) + (i * ch), - nw, + W, ch, pb, peaks, selected() ? fl_invert_color( _color ) : _color ); @@ -694,7 +678,7 @@ Region::draw ( int X, int Y, int W, int H ) draw_label( pat, (Fl_Align)(FL_ALIGN_INSIDE | FL_ALIGN_CENTER), FL_GREEN ); } -// fl_pop_clip(); + fl_pop_clip(); } diff --git a/Timeline/Region.H b/Timeline/Region.H index 4b5e4bf..b26c38e 100644 --- a/Timeline/Region.H +++ b/Timeline/Region.H @@ -262,8 +262,8 @@ public: int handle ( int m ); void draw_fade ( const Fade &fade, Fade::fade_dir_e dir, bool filled, int X, int W ); - void draw_box( int X, int Y, int W, int H ); - void draw ( int X, int Y, int W, int H ); + void draw_box( void ); + void draw ( void ); void resize ( void ); void normalize ( void ); diff --git a/Timeline/Track.C b/Timeline/Track.C index c867b94..5e17903 100644 --- a/Timeline/Track.C +++ b/Timeline/Track.C @@ -99,22 +99,19 @@ Track::draw ( void ) timeline->draw_measure_lines( x(), y(), w(), h(), color() ); for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) - (*r)->draw_box( X, Y, W, H ); + (*r)->draw_box(); for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) - (*r)->draw( X, Y, W, H ); + (*r)->draw(); /* draw crossfades */ for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) { - if ( ! (*r)->shown() ) - continue; - Track_Widget *o = overlaps( *r ); - if ( o && o->shown() ) + if ( o ) { if ( *o <= **r ) { @@ -153,12 +150,9 @@ Track::draw ( void ) for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) { - if ( ! (*r)->shown() ) - continue; - Track_Widget *o = overlaps( *r ); - if ( o && o->shown() ) + if ( o ) { if ( *o <= **r ) { @@ -179,8 +173,13 @@ Track::draw ( void ) /* o->color( FL_RED ); */ /* (*r)->color( FL_GREEN ); */ - o->draw( b.x, b.y, b.w, b.h ); - (*r)->draw( b.x, b.y, b.w, b.h ); + fl_push_clip( b.x, b.y, b.w, b.h ); + + o->draw(); + (*r)->draw(); + + fl_pop_clip(); + Waveform::fill = true; diff --git a/Timeline/Track_Point.H b/Timeline/Track_Point.H index e024824..17a15a3 100644 --- a/Timeline/Track_Point.H +++ b/Timeline/Track_Point.H @@ -49,9 +49,9 @@ public: } virtual void - draw ( int X, int Y, int W, int H ) + draw ( void ) { - Track_Widget::draw( x(), Y, w(), H ); + Track_Widget::draw(); draw_label( _label, align() ); } diff --git a/Timeline/Track_Widget.H b/Timeline/Track_Widget.H index 6e1339f..3a65bb8 100644 --- a/Timeline/Track_Widget.H +++ b/Timeline/Track_Widget.H @@ -74,8 +74,6 @@ protected: Fl_Color _color; /* color of waveform */ Fl_Color _box_color; /* color of background (box) */ - bool _shown; - Drag *_drag; public: @@ -88,8 +86,6 @@ public: _r->offset = _r->start = _r->end = 0; - _shown = true; - _drag = NULL; } @@ -165,10 +161,6 @@ public: // static void pushed ( Track_Widget *w ) { Track_Widget::_pushed = w; } - bool shown ( void ) const { return _shown; } - void show ( void ) { _shown = true; } - void hide ( void ) { _shown = false; } - void begin_drag ( const Drag &d ) { _drag = new Drag( d ); @@ -281,21 +273,15 @@ public: /* just draw a simple box */ virtual void - draw_box ( int X, int Y, int W, int H ) + draw_box ( void ) { - if ( x() > X + W || x() + w() < X ) - return; - fl_draw_box( box(), x(), y(), w(), h(), _box_color ); } virtual void - draw ( int X, int Y, int W, int H ) + draw ( void ) { - if ( x() > X + W || x() + w() < X ) - return; - - draw_box( X, Y, W, H ); + draw_box(); } bool