| @@ -28,6 +28,19 @@ | |||||
| #include <FL/Fl_Shared_Image.H> | #include <FL/Fl_Shared_Image.H> | ||||
| class image_node { | |||||
| public: | |||||
| Fl_Image *original; /* originl image */ | |||||
| Fl_Image *scaled; /* downscaled image */ | |||||
| class image_node *next; | |||||
| }; | |||||
| static image_node *_first = 0; | |||||
| int Fl_Dial::_default_style = Fl_Dial::PLASTIC_DIAL; | int Fl_Dial::_default_style = Fl_Dial::PLASTIC_DIAL; | ||||
| Fl_Image *Fl_Dial::_default_image = 0; | Fl_Image *Fl_Dial::_default_image = 0; | ||||
| @@ -152,10 +165,10 @@ Fl_Dial::draw ( void ) | |||||
| fl_push_clip( x(), y(), w(), h() ); | fl_push_clip( x(), y(), w(), h() ); | ||||
| const int knob_width = im->h(); | |||||
| int knob_width = im->h(); | |||||
| const int frames = im->w() / im->h(); | const int frames = im->w() / im->h(); | ||||
| const int index = knob_width * (int)( ( frames - 1 ) * ( value() - minimum()) / ( maximum() - minimum() )); | |||||
| const int index = (int)( ( frames - 1 ) * ( value() - minimum()) / ( maximum() - minimum() )); | |||||
| /* if ( ( damage() == FL_DAMAGE_ALL ) || */ | /* if ( ( damage() == FL_DAMAGE_ALL ) || */ | ||||
| /* ( ( damage() & FL_DAMAGE_EXPOSE ) && */ | /* ( ( damage() & FL_DAMAGE_EXPOSE ) && */ | ||||
| @@ -168,13 +181,53 @@ Fl_Dial::draw ( void ) | |||||
| /* im->inactive(); */ | /* im->inactive(); */ | ||||
| /* } */ | /* } */ | ||||
| im->draw( x() + ( w() / 2 ) - ( knob_width / 2 ), | |||||
| y() + ( h() / 2 ) - ( knob_width / 2 ), | |||||
| knob_width, | |||||
| knob_width, | |||||
| index, | |||||
| 0 ); | |||||
| if ( w() >= knob_width ) | |||||
| { | |||||
| im->draw( x() + ( w() / 2 ) - ( knob_width / 2 ), | |||||
| y() + ( h() / 2 ) - ( knob_width / 2 ), | |||||
| knob_width, | |||||
| knob_width, | |||||
| knob_width * index, | |||||
| 0 ); | |||||
| } | |||||
| else | |||||
| { | |||||
| // while ( knob_width > w() ) | |||||
| knob_width = w(); | |||||
| image_node *i; | |||||
| Fl_Image *scaled = 0; | |||||
| for ( i = _first; i; i = i->next ) | |||||
| { | |||||
| if ( i->original == im && | |||||
| i->scaled && i->scaled->h() == knob_width ) | |||||
| { | |||||
| scaled = i->scaled; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if ( ! scaled ) | |||||
| { | |||||
| scaled = im->copy( knob_width * frames, knob_width ); | |||||
| i = new image_node(); | |||||
| i->original = im; | |||||
| i->scaled = scaled; | |||||
| i->next = _first; | |||||
| _first = i; | |||||
| } | |||||
| scaled->draw( x() + ( w() / 2 ) - ( knob_width / 2 ), | |||||
| y() + ( h() / 2 ) - ( knob_width / 2 ), | |||||
| knob_width, | |||||
| knob_width, | |||||
| knob_width * index, | |||||
| 0 ); | |||||
| } | |||||
| _last_pixmap_index = index; | _last_pixmap_index = index; | ||||
| } | } | ||||