diff options
| author | Nils Wallménius <nils@rockbox.org> | 2007-11-25 14:07:40 +0000 |
|---|---|---|
| committer | Nils Wallménius <nils@rockbox.org> | 2007-11-25 14:07:40 +0000 |
| commit | 54ecc698a54cf0b30dfda243ff149a1c6858e0f2 (patch) | |
| tree | 7d47b879bd9094ca5e7c02c2cdda1d8c07046d23 /apps/gui | |
| parent | 475e64eb5cdf4535b7d8a259aff05e35a9e9386e (diff) | |
| download | rockbox-54ecc698a54cf0b30dfda243ff149a1c6858e0f2.zip rockbox-54ecc698a54cf0b30dfda243ff149a1c6858e0f2.tar.gz rockbox-54ecc698a54cf0b30dfda243ff149a1c6858e0f2.tar.bz2 rockbox-54ecc698a54cf0b30dfda243ff149a1c6858e0f2.tar.xz | |
Break out some duplicated code into a seperate function
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15802 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui')
| -rw-r--r-- | apps/gui/scrollbar.c | 108 |
1 files changed, 38 insertions, 70 deletions
diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c index e2e70fd..5a12ea6 100644 --- a/apps/gui/scrollbar.c +++ b/apps/gui/scrollbar.c @@ -23,17 +23,11 @@ #include "limits.h" #include "bmp.h" -void gui_scrollbar_draw(struct screen * screen, int x, int y, - int width, int height, int items, - int min_shown, int max_shown, - unsigned flags) +/* calculates the start and size of the knob */ +static void scrollbar_helper(int min_shown, int max_shown, int items, + int inner_len, int *size, int *start) { - int inner_x, inner_y, inner_wd, inner_ht, inner_len; int min, max, range; - int start, size; -#ifdef HAVE_LCD_COLOR - int infill; -#endif /* min should be min */ if(min_shown < max_shown) { @@ -58,16 +52,6 @@ void gui_scrollbar_draw(struct screen * screen, int x, int y, range = max - min; - inner_x = x + 1; - inner_y = y + 1; - inner_wd = width - 2; - inner_ht = height - 2; - - if (flags & HORIZONTAL) - inner_len = inner_wd; - else - inner_len = inner_ht; - /* avoid overflows */ while (items > (INT_MAX / inner_len)) { items >>= 1; @@ -76,17 +60,43 @@ void gui_scrollbar_draw(struct screen * screen, int x, int y, /* calc start and end of the knob */ if (items > 0 && items > range) { - size = inner_len * range / items; - if (size == 0) { /* width of knob is null */ - size = 1; - start = (inner_len - 1) * min / items; + *size = inner_len * range / items; + if (*size == 0) { /* width of knob is null */ + *size = 1; + *start = (inner_len - 1) * min / items; } else { - start = (inner_len - size) * min / (items - range); + *start = (inner_len - *size) * min / (items - range); } } else { /* if null draw full bar */ - size = inner_len; - start = 0; + *size = inner_len; + *start = 0; } + + return; +} + +void gui_scrollbar_draw(struct screen * screen, int x, int y, + int width, int height, int items, + int min_shown, int max_shown, + unsigned flags) +{ + int inner_x, inner_y, inner_wd, inner_ht, inner_len; + int start, size; +#ifdef HAVE_LCD_COLOR + int infill; +#endif + + inner_x = x + 1; + inner_y = y + 1; + inner_wd = width - 2; + inner_ht = height - 2; + + if (flags & HORIZONTAL) + inner_len = inner_wd; + else + inner_len = inner_ht; + + scrollbar_helper(min_shown, max_shown, items, inner_len, &size, &start); /* draw box */ #ifdef HAVE_LCD_COLOR @@ -157,63 +167,21 @@ void gui_bitmap_scrollbar_draw(struct screen * screen, struct bitmap bm, int x, int min_shown, int max_shown, unsigned flags) { - int min; - int max; - int inner_len; int start; int size; + int inner_len; screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); /* clear pixels in progress bar */ screen->fillrect(x, y, width, height); - /* min should be min */ - if(min_shown < max_shown) { - min = min_shown; - max = max_shown; - } - else { - min = max_shown; - max = min_shown; - } - - /* limit min and max */ - if(min < 0) - min = 0; - if(min > items) - min = items; - - if(max < 0) - max = 0; - if(max > items) - max = items; - if (flags & HORIZONTAL) inner_len = width; else inner_len = height; - /* avoid overflows */ - while (items > (INT_MAX / inner_len)) { - items >>= 1; - min >>= 1; - max >>= 1; - } - - /* calc start and end of the knob */ - if (items > 0 && items > (max - min)) { - size = inner_len * (max - min) / items; - if (size == 0) { /* width of knob is null */ - size = 1; - start = (inner_len - 1) * min / items; - } else { - start = (inner_len - size) * min / (items - (max - min)); - } - } else { /* if null draw full bar */ - size = inner_len; - start = 0; - } + scrollbar_helper(min_shown, max_shown, items, inner_len, &size, &start); screen->set_drawmode(DRMODE_SOLID); |