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>

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


Loading…
Cancel
Save