diff --git a/mixer/pixmaps/panner-512x512.png b/mixer/pixmaps/panner-512x512.png new file mode 100644 index 0000000..a3a6510 Binary files /dev/null and b/mixer/pixmaps/panner-512x512.png differ diff --git a/mixer/pixmaps/panner-92x92.png b/mixer/pixmaps/panner-92x92.png new file mode 100644 index 0000000..df2c412 Binary files /dev/null and b/mixer/pixmaps/panner-92x92.png differ diff --git a/mixer/src/Controller_Module.C b/mixer/src/Controller_Module.C index 087a100..afc34cb 100644 --- a/mixer/src/Controller_Module.C +++ b/mixer/src/Controller_Module.C @@ -269,9 +269,9 @@ Controller_Module::connect_spatializer_to ( Module *m ) { clear(); - Panner *o = new Panner( 0,0, 100, 100 ); + Panner *o = new Panner( 0,0, 92,92 ); - o->box(FL_THIN_UP_BOX); + o->box(FL_FLAT_BOX); o->color(FL_GRAY0); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NORMAL_LABEL); @@ -756,7 +756,7 @@ Controller_Module::handle ( int m ) if ( Fl::event_button3() ) { /* context menu */ - if ( type() != SPATIALIZATION ) + /* if ( type() != SPATIALIZATION ) */ menu_popup( &menu() ); return 1; diff --git a/mixer/src/Mixer_Strip.C b/mixer/src/Mixer_Strip.C index fd4de36..4d46158 100644 --- a/mixer/src/Mixer_Strip.C +++ b/mixer/src/Mixer_Strip.C @@ -506,7 +506,7 @@ Mixer_Strip::init ( ) o->hide(); o->label( 0 ); o->pad( false ); - o->size( 100, 100 ); + o->size( 92,92 ); } /* o->end(); */ /* } */ diff --git a/mixer/src/Module_Parameter_Editor.C b/mixer/src/Module_Parameter_Editor.C index a9f48f9..4a6528d 100644 --- a/mixer/src/Module_Parameter_Editor.C +++ b/mixer/src/Module_Parameter_Editor.C @@ -305,8 +305,8 @@ Module_Parameter_Editor::make_controls ( void ) if ( azimuth_port_number >= 0 && elevation_port_number >= 0 ) { - Panner *o = new Panner( 0,0, 300, 300 ); - o->box(FL_THIN_UP_BOX); + Panner *o = new Panner( 0,0, 512,512 ); + o->box(FL_FLAT_BOX); o->color(FL_GRAY0); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NORMAL_LABEL); diff --git a/mixer/src/Panner.C b/mixer/src/Panner.C index 5d63258..197acf6 100644 --- a/mixer/src/Panner.C +++ b/mixer/src/Panner.C @@ -24,57 +24,12 @@ #include // #include +#include + /* 2D Panner widget. Supports various multichannel configurations. */ Panner::Point *Panner::drag; -/* multichannel layouts, in degrees */ -int Panner::_configs[][12] = -{ - /* none, error condition? */ - { NONE }, - /* mono, panner disabled */ - { NONE }, - /* stereo */ - { L, R }, - /* stereo + mono */ - { L, R, C }, - /* quad */ - { FL, FR, RL, RR }, - /* 5.1 */ - { FL, FR, RL, RR, C }, - /* no such config */ - { NONE }, - /* 7.1 */ - { FL, FR, RL, RR, C, L, R }, -}; - - -/* speaker symbol */ -#define BP fl_begin_polygon() -#define EP fl_end_polygon() -#define BCP fl_begin_complex_polygon() -#define ECP fl_end_complex_polygon() -#define BL fl_begin_line() -#define EL fl_end_line() -#define BC fl_begin_loop() -#define EC fl_end_loop() -#define vv(x,y) fl_vertex(x,y) - -static void draw_speaker ( Fl_Color col ) -{ - fl_color(col); - - BP; vv(0.2,0.4); vv(0.6,0.4); vv(0.6,-0.4); vv(0.2,-0.4); EP; - BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP; - - fl_color( fl_darker( col ) ); - - BC; vv(0.2,0.4); vv(0.6,0.4); vv(0.6,-0.4); vv(0.2,-0.4); EC; - BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC; -} - - /** set X, Y, W, and H to the bounding box of point /p/ in screen coords */ void Panner::point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const @@ -126,46 +81,18 @@ Panner::draw_the_box ( int tx, int ty, int tw, int th ) { draw_box(); - fl_line_style( FL_SOLID, 2 ); - - /* draw perimeter */ - { - Fl_Color c1, c2; - int iter; - - if ( Fl::belowmouse() == this ) - { - iter = 12; - c1 = fl_darker( fl_darker( FL_RED ) ); - c2 = FL_BLACK; - } - else - { - iter = 6; - c1 = FL_GRAY; - c2 = FL_BLACK; - } - - Fl_Color c = c1; - - for ( int i = iter; i--; ) - { - fl_color( c ); - - 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); - } - } - - fl_line_style( FL_SOLID, 0 ); - + if ( tw == 92 ) + { + Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-92x92.png" ); + + i->draw( tx, ty ); + } + else if ( tw > 400 ) + { + Fl_Image *i = Fl_Shared_Image::get( PIXMAP_PATH "/non-mixer/panner-512x512.png" ); + + i->draw( tx, ty ); + } } void @@ -175,8 +102,9 @@ Panner::draw ( void ) bbox( tx, ty, tw, th ); - fl_push_clip( tx, ty, tw, th ); + fl_push_clip( x(),y(),w(),h() ); + draw_the_box( tx, ty, tw, th ); const int b = 10; @@ -193,69 +121,26 @@ Panner::draw ( void ) } - tx += b; - ty += b; - tw -= b * 2; - th -= b * 2; + /* tx += b; */ + /* ty += b; */ + /* tw -= b * 2; */ + /* th -= b * 2; */ - if ( damage() & FL_DAMAGE_ALL ) - draw_the_box( tx, ty, tw, th ); - fl_line_style( FL_SOLID, 2 ); - -// fl_color( FL_RED ); + fl_line_style( FL_SOLID, 1 ); fl_color( FL_WHITE ); -/* fl_arc( tx, ty, tw, th, 0, 360 ); */ - - if ( _configs[ _outs ][0] >= 0 ) - { - for ( int i = _outs; i--; ) - { - int a = _configs[ _outs ][ i ]; - - Point p( 1.2f, (float)a ); - - float px, py; - - p.axes( &px, &py ); - - fl_push_matrix(); - - const int bx = tx + ((tw / 2) * px + (tw / 2)); - const int by = ty + ((th / 2) * py + (th / 2)); - - fl_translate( bx, by ); - - fl_scale( 5, 5 ); - - a = 90 - a; - - fl_rotate( a ); - - draw_speaker( FL_WHITE ); - - fl_rotate( -a ); - - fl_pop_matrix(); - - } - } - - /* ensure that points are drawn *inside* the circle */ - - for ( int i = _ins; i--; ) { - Point *p = &_points[ i ]; + Point *p = &_points[0]; - Fl_Color c = (Fl_Color)(10 + i); +// Fl_Color c = (Fl_Color)(10 + i); + Fl_Color c = fl_color_add_alpha( fl_rgb_color( 192, 192, 206 ), 127 ); + int px, py, pw, ph; point_bbox( p, &px, &py, &pw, &ph ); - - { const float S = ( 0.5 + ( 1.0f - p->d ) ); @@ -266,56 +151,36 @@ Panner::draw ( void ) py - ( po * 12 ), pw + ( po * 24 ), ph + (po * 24 )); - if ( damage() & FL_DAMAGE_EXPOSE ) - draw_the_box( tx, ty, tw, th ); + fl_color( fl_color_add_alpha( fl_rgb_color( 254,254,254 ), 254 ) ); + + fl_pie( px + 5, py + 5, pw - 10, ph - 10, 0, 360 ); + + fl_color(c); - fl_color( FL_WHITE ); - - /* draw point */ - if ( p != drag ) - fl_color( c ); - fl_pie( px, py, pw, ph, 0, 360 ); - - /* draw echo */ - fl_color( c = fl_darker( c ) ); -// 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 ) { + /* draw echo */ + fl_color( c = fl_darker( c ) ); + + fl_arc( px - po, py - po, pw + ( po * 2 ), ph + ( po * 2 ), 0, 360 ); + 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_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(); } + + const char *s = p->label; - /* draw number */ - char pat[4]; - snprintf( pat, 4, "%d", i + 1 ); - - fl_color( FL_BLACK ); + fl_color( fl_rgb_color( 125,125,130 ) ); fl_font( FL_HELVETICA, ph + 2 ); - fl_draw( pat, px + 1, py + 1, pw - 1, ph - 1, FL_ALIGN_CENTER ); - - /* draw line */ - -/* fl_color( FL_WHITE ); */ -/* fl_line( bx + pw() / 2, by + ph() / 2, tx + (tw / 2), ty + (th / 2) ); */ - + fl_draw( s, px + 20, py + 1, 50, ph - 1, FL_ALIGN_LEFT ); } + done: fl_line_style( FL_SOLID, 0 ); @@ -378,12 +243,13 @@ Panner::handle ( int m ) /* return 1; */ /* else */ - float X = Fl::event_x() - x(); - float Y = Fl::event_y() - y(); int tx, ty, tw, th; bbox( tx, ty, tw, th ); + float X = Fl::event_x() - tx; + float Y = Fl::event_y() - ty; + /* if ( _outs < 3 ) */ /* drag->angle( (float)(X / (tw / 2)) - 1.0f, 0.0f ); */ /* else */ diff --git a/mixer/src/Panner.H b/mixer/src/Panner.H index 08943c0..7fb2bfd 100644 --- a/mixer/src/Panner.H +++ b/mixer/src/Panner.H @@ -42,8 +42,10 @@ class Panner : public Fl_Widget /* angle */ float a; - Point ( ) : d( 0.0f ), a( 0.0f ) { } - Point ( float D, float A ) : d( D ), a( A ) { } + const char *label; + + Point ( ) : d( 0.0f ), a( 0.0f ), label(0) { } + Point ( float D, float A ) : d( D ), a( A ), label(0) { } /** translate angle /a/ into x/y coords and place the result in /X/ and /Y/ */ void @@ -132,8 +134,8 @@ class Panner : public Fl_Widget vector _points; - static int pw ( void ) { return 12; } - static int ph ( void ) { return 12; } + static int pw ( void ) { return 16; } + static int ph ( void ) { return 16; } static int _configs[][12]; @@ -143,6 +145,15 @@ class Panner : public Fl_Widget H = h() - Fl::box_dh( box() ); X = x() + Fl::box_dx( box() ); Y = y() + Fl::box_dy( box() ); + + int S = W > H ? H : W; + + if ( W > H ) + X += ( (W/2) - (S/2) ); + else if ( H > W ) + Y += ( (H/2) - (S/2) ); + + W = H = S; } void point_bbox ( const Point *p, int *X, int *Y, int *W, int *H ) const; @@ -150,17 +161,6 @@ class Panner : public Fl_Widget Point * event_point ( void ); Point angle_to_axes ( float a ); - enum { - NONE = -1, - R = 90, - L = 270, - C = 0, - FL = 315, - FR = 45, - RL = 225, - RR = 135, - }; - static Point * drag; protected: @@ -180,16 +180,7 @@ public: _outs = 1; -// _ins = _outs = 4; - -// _points.push_back( Point( 1, FL ) ); - _points.push_back( Point( 1, C ) ); - -/* _points.push_back( Point( 1, FR ) ); */ -/* _points.push_back( Point( 1, RL ) ); */ -/* _points.push_back( Point( 1, RR ) ); */ - - + _points.push_back( Point( 1, 0 ) ); } virtual ~Panner ( ) { } diff --git a/mixer/wscript b/mixer/wscript index b36b636..b593f73 100644 --- a/mixer/wscript +++ b/mixer/wscript @@ -92,6 +92,8 @@ src/main.C cwd=start_dir, relative_trick=True) bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/icon-256x256.png', 'icons/hicolor/256x256/apps/' + APPNAME + '.png') + bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/panner-512x125.png', 'pixmaps/panner-512x512.png') + bld.install_as('${DATADIR}/pixmaps/' + APPNAME + '/panner-92x125.png', 'pixmaps/panner-92x92.png') bld.install_files( '/'.join( [ '${DATADIR}/doc', APPNAME ] ), bld.path.ant_glob( 'doc/*.html doc/*.png' ) )