From c322b87f4aab367c2376568b1261b426e8212500 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Mon, 7 May 2012 23:35:39 -0700 Subject: [PATCH] Fl_Dial: Automatically downscale (and cache) pixmaps as needed. --- src/Fl_Dial.cxx | 71 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/src/Fl_Dial.cxx b/src/Fl_Dial.cxx index 56cff62..dcb3881 100644 --- a/src/Fl_Dial.cxx +++ b/src/Fl_Dial.cxx @@ -28,6 +28,19 @@ #include +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; }