Browse Source

Fl_Dial: Automatically downscale (and cache) pixmaps as needed.

tags/v1.3.1000
Jonathan Moore Liles 13 years ago
parent
commit
c322b87f4a
1 changed files with 62 additions and 9 deletions
  1. +62
    -9
      src/Fl_Dial.cxx

+ 62
- 9
src/Fl_Dial.cxx View File

@@ -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;
} }


Loading…
Cancel
Save