diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2005-10-28 00:00:00 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2005-10-28 00:00:00 +0000 |
| commit | 7da9477bc3401cbd90b2984f625f96f451ecaf6b (patch) | |
| tree | 8aea2c154ad0f666f57c4752fa541fa539de757c /apps/gui/scrollbar.c | |
| parent | 3efa91ed03797dd533c0add6db750ade67499587 (diff) | |
| download | rockbox-7da9477bc3401cbd90b2984f625f96f451ecaf6b.zip rockbox-7da9477bc3401cbd90b2984f625f96f451ecaf6b.tar.gz rockbox-7da9477bc3401cbd90b2984f625f96f451ecaf6b.tar.bz2 rockbox-7da9477bc3401cbd90b2984f625f96f451ecaf6b.tar.xz | |
Initial multi screen support by Kévin Ferrare (Patch #1318081)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7666 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/scrollbar.c')
| -rw-r--r-- | apps/gui/scrollbar.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c new file mode 100644 index 0000000..9d5717f --- /dev/null +++ b/apps/gui/scrollbar.c @@ -0,0 +1,106 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) Markus Braun (2002), Kévin FERRARE (2005) + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include "lcd.h" +#ifdef HAVE_LCD_BITMAP +#include "limits.h" +#include "scrollbar.h" +#include "screen_access.h" + +void gui_scrollbar_draw(struct screen * screen, 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; + + /* draw box */ + screen->drawrect(x, y, width, height); + + screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + + /* clear edge pixels */ + screen->drawpixel(x, y); + screen->drawpixel((x + width - 1), y); + screen->drawpixel(x, (y + height - 1)); + screen->drawpixel((x + width - 1), (y + height - 1)); + + /* clear pixels in progress bar */ + screen->fillrect(x + 1, y + 1, width - 2, height - 2); + + /* 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 - 2; + else + inner_len = width - 2; + + /* 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) + screen->fillrect(x + 1, y + start + 1, width - 2, size); + else + screen->fillrect(x + start + 1, y + 1, size, height - 2); +} +#endif /* HAVE_LCD_BITMAP */ |