Mixer: Improve panner drawing.

This commit is contained in:
Jonathan Moore Liles 2012-04-25 20:31:12 -07:00
parent 363f2f04bc
commit f5240cb2f4
2 changed files with 115 additions and 52 deletions

View File

@ -18,9 +18,11 @@
/*******************************************************************************/ /*******************************************************************************/
#include "Panner.H" #include "Panner.H"
#include <FL/x.H>
#include <FL/Fl.H>
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
// #include <FL/fl_draw.H>
/* 2D Panner widget. Supports various multichannel configurations. */ /* 2D Panner widget. Supports various multichannel configurations. */
@ -81,8 +83,11 @@ Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const
bbox( tx, ty, tw, th ); bbox( tx, ty, tw, th );
tw -= pw(); const float PW = pw();
th -= ph(); const float PH = ph();
tw -= PW;
th -= PH;
float px, py; float px, py;
@ -91,8 +96,8 @@ Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const
*X = tx + ((tw / 2) * px + (tw / 2)); *X = tx + ((tw / 2) * px + (tw / 2));
*Y = ty + ((th / 2) * py + (th / 2)); *Y = ty + ((th / 2) * py + (th / 2));
*W = pw(); *W = PW;
*H = ph(); *H = PH;
} }
Panner::Point * Panner::Point *
@ -115,36 +120,13 @@ Panner::event_point ( void )
return NULL; return NULL;
} }
void void
Panner::draw ( void ) Panner::draw_the_box ( int tx, int ty, int tw, int th )
{ {
draw_box(); draw_box();
// draw_box( FL_FLAT_BOX, x(), y(), w(), h(), FL_BLACK );
draw_label();
fl_line_style( FL_SOLID, 2 );
if ( _bypassed )
{
fl_color( 0 );
fl_font( FL_HELVETICA, 12 );
fl_draw( "(bypass)", x(), y(), w(), h(), FL_ALIGN_CENTER );
return;
}
int tw, th, tx, ty;
bbox( tx, ty, tw, th );
fl_push_clip( tx, ty, tw, th );
fl_color( FL_RED );
const int b = 10;
tx += b;
ty += b;
tw -= b * 2;
th -= b * 2;
/* draw perimeter */ /* draw perimeter */
{ {
@ -154,8 +136,8 @@ Panner::draw ( void )
if ( Fl::belowmouse() == this ) if ( Fl::belowmouse() == this )
{ {
iter = 12; iter = 12;
c1 = fl_darker( FL_RED ); c1 = fl_darker( fl_darker( FL_RED ) );
c2 = FL_GRAY; c2 = FL_BLACK;
} }
else else
{ {
@ -172,11 +154,54 @@ Panner::draw ( void )
fl_arc( tx + (i * (tw / iter)) / 2, ty + (i * (th / iter)) / 2, tw - (i * (tw / iter)), th - (i * ( th / iter )), 0, 360 ); fl_arc( tx + (i * (tw / iter)) / 2, ty + (i * (th / iter)) / 2, tw - (i * (tw / iter)), th - (i * ( th / iter )), 0, 360 );
/* fl_arc( cr, */
/* tx + tw / 2, */
/* ty + th / 2, */
/* ((float)tw / iter) / 2, */
/* 0, 360 ); */
c = fl_color_average( c1, c2, (float)i / iter); c = fl_color_average( c1, c2, (float)i / iter);
} }
} }
/* fl_color( FL_WHITE ); */ }
void
Panner::draw ( void )
{
int tw, th, tx, ty;
bbox( tx, ty, tw, th );
fl_push_clip( tx, ty, tw, th );
const int b = 10;
// draw_box();
draw_label();
if ( _bypassed )
{
draw_box();
fl_color( 0 );
fl_font( FL_HELVETICA, 12 );
fl_draw( "(bypass)", x(), y(), w(), h(), FL_ALIGN_CENTER );
goto done;
}
tx += b;
ty += b;
tw -= b * 2;
th -= b * 2;
if ( damage() & FL_DAMAGE_ALL )
draw_the_box( tx, ty, tw, th );
// fl_color( FL_RED );
fl_color( FL_WHITE );
/* fl_arc( tx, ty, tw, th, 0, 360 ); */ /* fl_arc( tx, ty, tw, th, 0, 360 ); */
@ -225,23 +250,52 @@ Panner::draw ( void )
int px, py, pw, ph; int px, py, pw, ph;
point_bbox( p, &px, &py, &pw, &ph ); point_bbox( p, &px, &py, &pw, &ph );
/* draw point */
if ( p != drag )
fl_color( c ); {
else
const float S = ( 0.5 + ( 1.0f - p->d ) );
float po = 5 * S;
fl_push_clip( px - ( po * 12 ),
py - ( po * 12 ),
pw + ( po * 24 ), ph + (po * 24 ));
if ( damage() & FL_DAMAGE_EXPOSE )
draw_the_box( tx, ty, tw, th );
fl_color( FL_WHITE ); fl_color( FL_WHITE );
fl_pie( px, py, pw, ph, 0, 360 ); /* draw point */
if ( p != drag )
fl_color( c );
/* draw echo */ fl_pie( px, py, pw, ph, 0, 360 );
fl_color( c = fl_darker( c ) );
fl_arc( px - 5, py - 5, pw + 10, ph + 10, 0, 360 ); /* draw echo */
if ( Fl::belowmouse() == this )
{
fl_color( c = fl_darker( c ) ); fl_color( c = fl_darker( c ) );
fl_arc( px - 10, py - 10, pw + 20, ph + 20, 0, 360 ); // fl_color_alpha( c = fl_darker( c ), 0.5 );
// fl_arc( cr, px, py, pw + po * 1, 0, 360 );
fl_arc( px - po, py - po, pw + ( po * 2 ), ph + ( po * 2 ), 0, 360 );
if ( Fl::belowmouse() == this )
{
fl_color( c = fl_darker( c ) );
// fl_color_alpha( c = fl_darker( c ), 0.5 );
fl_arc( px - ( po * 2 ), py - ( po * 2 ), pw + ( po * 4 ), ph + ( po * 4 ), 0, 360 );
/* fl_arc( cr, px, py, pw + po * 1, 0, 360 ); */
fl_color( c = fl_darker( c ) ); fl_color( c = fl_darker( c ) );
fl_arc( px - 30, py - 30, pw + 60, ph + 60, 0, 360 );
// fl_color_alpha( c = fl_darker( c ), 0.5 );
fl_arc( px - ( po * 4 ), py - ( po * 4 ), pw + ( po * 8 ), ph + (po * 8 ), 0, 360 );
/* fl_arc( cr, px, py, pw + po * 1, 0, 360 ); */
}
fl_pop_clip();
} }
/* draw number */ /* draw number */
@ -258,6 +312,7 @@ Panner::draw ( void )
/* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */ /* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */
} }
done:
fl_pop_clip(); fl_pop_clip();
} }
@ -281,17 +336,19 @@ Panner::handle ( int m )
redraw(); redraw();
return 1; return 1;
case FL_PUSH: case FL_PUSH:
{
if ( Fl::event_button2() ) if ( Fl::event_button2() )
{ {
_bypassed = ! _bypassed; _bypassed = ! _bypassed;
redraw(); redraw();
return 1; return 1;
} }
else if ( Fl::event_button1() && ( drag = event_point() ) )
return 1; if ( Fl::event_button1() )
else drag = event_point();
return 0;
return 1;
}
case FL_RELEASE: case FL_RELEASE:
if ( Fl::event_button1() && drag ) if ( Fl::event_button1() && drag )
{ {
@ -311,6 +368,10 @@ Panner::handle ( int m )
if ( ! drag ) if ( ! drag )
return 0; return 0;
/* else if ( Fl::event_button1() && ( drag = event_point() ) ) */
/* return 1; */
/* else */
float X = Fl::event_x() - x(); float X = Fl::event_x() - x();
float Y = Fl::event_y() - y(); float Y = Fl::event_y() - y();
@ -325,7 +386,7 @@ Panner::handle ( int m )
if ( when() & FL_WHEN_CHANGED ) if ( when() & FL_WHEN_CHANGED )
do_callback(); do_callback();
redraw(); damage(FL_DAMAGE_EXPOSE);
return 1; return 1;
} }

View File

@ -31,6 +31,8 @@ using namespace std;
class Panner : public Fl_Widget class Panner : public Fl_Widget
{ {
void draw_the_box( int, int, int, int );
struct Point struct Point
{ {
/* axes */ /* axes */