| @@ -28,6 +28,19 @@ | |||
| #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; | |||
| Fl_Image *Fl_Dial::_default_image = 0; | |||
| @@ -152,10 +165,10 @@ Fl_Dial::draw ( void ) | |||
| 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 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 ) || */ | |||
| /* ( ( damage() & FL_DAMAGE_EXPOSE ) && */ | |||
| @@ -168,13 +181,53 @@ Fl_Dial::draw ( void ) | |||
| /* 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; | |||
| } | |||