summaryrefslogtreecommitdiff
path: root/apps/gui/scrollbar.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2005-10-28 00:00:00 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2005-10-28 00:00:00 +0000
commit7da9477bc3401cbd90b2984f625f96f451ecaf6b (patch)
tree8aea2c154ad0f666f57c4752fa541fa539de757c /apps/gui/scrollbar.c
parent3efa91ed03797dd533c0add6db750ade67499587 (diff)
downloadrockbox-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.c106
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 */