summaryrefslogtreecommitdiff
path: root/apps/gui/scrollbar.c
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2007-11-25 14:07:40 +0000
committerNils Wallménius <nils@rockbox.org>2007-11-25 14:07:40 +0000
commit54ecc698a54cf0b30dfda243ff149a1c6858e0f2 (patch)
tree7d47b879bd9094ca5e7c02c2cdda1d8c07046d23 /apps/gui/scrollbar.c
parent475e64eb5cdf4535b7d8a259aff05e35a9e9386e (diff)
downloadrockbox-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/scrollbar.c')
-rw-r--r--apps/gui/scrollbar.c108
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);