From e0622ab588583d1148af54c0e856ae63339a3491 Mon Sep 17 00:00:00 2001 From: Ben Basha Date: Fri, 10 Feb 2006 13:57:11 +0000 Subject: add a bitmap progress bar option + add %P|filename.bmp| tag to the WPS git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8648 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/scrollbar.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'apps/gui/scrollbar.c') diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c index 73c523f56a..4cf92f4b47 100644 --- a/apps/gui/scrollbar.c +++ b/apps/gui/scrollbar.c @@ -21,6 +21,7 @@ #ifdef HAVE_LCD_BITMAP #include "config.h" #include "limits.h" +#include "bmp.h" void gui_scrollbar_draw(struct screen * screen, int x, int y, int width, int height, int items, @@ -101,4 +102,94 @@ void gui_scrollbar_draw(struct screen * screen, int x, int y, else screen->fillrect(x + start + 1, y + 1, size, height - 2); } + +void gui_bitmap_scrollbar_draw(struct screen * screen, struct bitmap bm, int x, int y, + int width, int height, int items, + int min_shown, int max_shown, + enum orientation orientation) +{ + int min; + int max; + int inner_len; + int start; + int size; + + 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 (orientation == VERTICAL) + inner_len = height; + else + inner_len = width; + + /* 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; + } + + screen->set_drawmode(DRMODE_SOLID); + + if(orientation == VERTICAL) { +#if LCD_DEPTH > 1 + if (bm.format == FORMAT_MONO) +#endif + screen->mono_bitmap_part(bm.data, 0, 0, + bm.width, x, y + start, width, size); +#if LCD_DEPTH > 1 + else + screen->transparent_bitmap_part((fb_data *)bm.data, 0, 0, + bm.width, x, y + start, width, size); +#endif + } else { +#if LCD_DEPTH > 1 + if (bm.format == FORMAT_MONO) +#endif + screen->mono_bitmap_part(bm.data, 0, 0, + bm.width, x + start, y, size, height); +#if LCD_DEPTH > 1 + else + screen->transparent_bitmap_part((fb_data *)bm.data, 0, 0, + bm.width, x + start, y, size, height); +#endif + } +} #endif /* HAVE_LCD_BITMAP */ -- cgit v1.2.3