Timeline: Fix region/fade drawing at tight zoom levels.

Closes #164
pull/186/head
Jonathan Moore Liles 2015-09-17 19:34:22 -07:00
parent 037ecb5d9f
commit 319a393cd6
5 changed files with 24 additions and 16 deletions

View File

@ -405,7 +405,7 @@ Audio_Region::draw_fade ( const Fade &fade, Fade::fade_dir_e dir, bool line, int
if ( dir == Fade::In )
{
fx = line_x();
fx = curve_x();
if ( fx + width < X ||
fx > X + W )
@ -414,7 +414,7 @@ Audio_Region::draw_fade ( const Fade &fade, Fade::fade_dir_e dir, bool line, int
}
else
{
fx = line_x() + abs_w();
fx = curve_x() + abs_w();
if ( fx - width > X + W ||
fx < X )
@ -431,8 +431,8 @@ Audio_Region::draw_fade ( const Fade &fade, Fade::fade_dir_e dir, bool line, int
fl_vertex( fx, dy + height );
{
const float ti = 1.0f / (float)width;
float ts = 0.0f;
const double ti = 1.0 / (double)width;
double ts = 0.0;
const int xi = dir == Fade::In ? 1 : -1;
@ -487,8 +487,7 @@ Audio_Region::draw_box( void )
b = FL_DOWN_FRAME;
}
fl_draw_box( b, line_x(), y(), abs_w(), h(), c );
fl_draw_box( b, x(), y(), w(), h(), c );
// fl_pop_clip();
}

View File

@ -57,7 +57,7 @@ public:
/* only for playback thread */
nframes_t when ( void ) const { return _range.start; }
int abs_w ( void ) const { return 8; }
long abs_w ( void ) const { return 8; }
int y ( void ) const { return parent()->y() + ((float)parent()->h() * _y); }
int h ( void ) const { return 8; }

View File

@ -41,7 +41,7 @@ protected:
public:
Fl_Align align ( void ) const { return FL_ALIGN_RIGHT; }
virtual int abs_w ( void ) const { return 8; }
virtual long abs_w ( void ) const { return 8; }
// virtual int abs_x ( void ) const { return Sequence_Widget::abs_x() - ( abs_w() >> 1 ); }
// virtual int x ( void ) const { return Sequence_Widget::line_x() - ( abs_w() >> 1 ); }

View File

@ -239,7 +239,7 @@ Sequence_Region::draw_box ( void )
{
Fl_Color c = selected() ? selection_color() : box_color();
fl_draw_box( box(), line_x(), y(), abs_w(), h(), fl_color_add_alpha( c, 127 ) );
fl_draw_box( box(), x(), y(), w(), h(), fl_color_add_alpha( c, 127 ) );
}
void

View File

@ -189,8 +189,9 @@ public:
int get_x( nframes_t frame ) const
{
return frame < timeline->xoffset ?
_sequence->drawable_x() :
min( _sequence->drawable_x() + _sequence->drawable_w(), _sequence->drawable_x() + timeline->ts_to_x( frame - timeline->xoffset ) );
_sequence->drawable_x() - 10 :
min( _sequence->drawable_x() + _sequence->drawable_w(),
_sequence->drawable_x() + timeline->ts_to_x( frame - timeline->xoffset ) );
}
virtual int x ( void ) const
@ -198,19 +199,27 @@ public:
return get_x( _r->start );
}
/* use this as x() when you need to draw lines between widgets */
/* use this as x() when you need to draw lines between widgets. Clamped to -32767-32767 to match max canvas size of FLTK/NTK */
int line_x ( void ) const
{
return _r->start < timeline->xoffset ?
max( -32767, _sequence->drawable_x() - timeline->ts_to_x( timeline->xoffset - _r->start )) :
min( 32767, _sequence->drawable_x() + timeline->ts_to_x( _r->start - timeline->xoffset ) );
min( 32767, _sequence->drawable_x() + timeline->ts_to_x( _r->start - timeline->xoffset ));
}
/* same as above but un-clamped for cairo */
long curve_x ( void ) const
{
return _r->start < timeline->xoffset ?
_sequence->drawable_x() - timeline->ts_to_x( timeline->xoffset - _r->start ) :
_sequence->drawable_x() + timeline->ts_to_x( _r->start - timeline->xoffset );
}
virtual int w ( void ) const
{
// int tx = timeline->ts_to_x( _r->start );
int rw;
long rw;
if ( _r->start < timeline->xoffset )
{
@ -222,11 +231,11 @@ public:
else
rw = abs_w();
return min( rw, _sequence->drawable_w() );
return (int)min( rw, (long)(_sequence->drawable_w() + 20) );
}
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); }
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->length ); }
virtual long abs_w ( void ) const { return timeline->ts_to_x( _r->length ); }
Fl_Color color ( void ) const { return _color; }
void color ( Fl_Color v ) { _color = v; }