From 7da9477bc3401cbd90b2984f625f96f451ecaf6b Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Fri, 28 Oct 2005 00:00:00 +0000 Subject: Initial multi screen support by Kévin Ferrare (Patch #1318081) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7666 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/scrollbar.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 apps/gui/scrollbar.c (limited to 'apps/gui/scrollbar.c') diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c new file mode 100644 index 0000000000..9d5717f1a7 --- /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 */ -- cgit v1.2.3