Index: apps/gui/gwps-common.c =================================================================== --- apps/gui/gwps-common.c (revision 17668) +++ apps/gui/gwps-common.c (working copy) @@ -494,37 +494,37 @@ #ifdef HAVE_LCD_BITMAP -static void draw_progressbar(struct gui_wps *gwps, int line) +static void draw_progressbar(struct gui_wps *gwps, int line, + struct progressbar *pb) { - struct wps_data *data = gwps->data; struct screen *display = gwps->display; struct wps_state *state = gwps->state; int h = font_get(display->getfont())->height; int sb_y; - if (data->progress_top < 0) + if (pb->top < 0) sb_y = line*h + display->getymargin() + - ((h > data->progress_height + 1) - ? (h - data->progress_height) / 2 : 1); + ((h > pb->height + 1) + ? (h - pb->height) / 2 : 1); else - sb_y = data->progress_top; + sb_y = pb->top; - if (!data->progress_end) - data->progress_end=display->getwidth(); + if (!pb->end) + pb->end=display->getwidth(); - if (gwps->data->progressbar.have_bitmap_pb) - gui_bitmap_scrollbar_draw(display, data->progressbar.bm, - data->progress_start, sb_y, - data->progress_end-data->progress_start, - data->progressbar.bm.height, + if (pb->have_bitmap_pb) + gui_bitmap_scrollbar_draw(display, pb->bm, + pb->start, sb_y, + pb->end-pb->start, + pb->bm.height, state->id3->length ? state->id3->length : 1, 0, state->id3->length ? state->id3->elapsed + state->ff_rewind_count : 0, HORIZONTAL); else - gui_scrollbar_draw(display, data->progress_start, sb_y, - data->progress_end-data->progress_start, - data->progress_height, + gui_scrollbar_draw(display, pb->start, sb_y, + pb->end-pb->start, + pb->height, state->id3->length ? state->id3->length : 1, 0, state->id3->length ? state->id3->elapsed + state->ff_rewind_count : 0, @@ -533,14 +533,14 @@ #ifdef AB_REPEAT_ENABLE if ( ab_repeat_mode_enabled() && state->id3->length != 0 ) ab_draw_markers(display, state->id3->length, - data->progress_start, data->progress_end, sb_y, - data->progress_height); + pb->start, pb->end, sb_y, + pb->height); #endif if ( cuesheet_is_enabled() && state->id3->cuesheet_type ) cue_draw_markers(display, state->id3->length, - data->progress_start, data->progress_end, - sb_y+1, data->progress_height-2); + pb->start, pb->end, + sb_y+1, pb->height-2); } /* clears the area where the image was shown */ @@ -2025,7 +2025,9 @@ { /* the progressbar should be alone on its line */ update_line = false; - draw_progressbar(gwps, line - data->viewports[v].first_line); + if (data->viewports[v].pb) + draw_progressbar(gwps, line - data->viewports[v].first_line, + data->viewports[v].pb); } /* peakmeter */ Index: apps/gui/gwps.h =================================================================== --- apps/gui/gwps.h (revision 17668) +++ apps/gui/gwps.h (working copy) @@ -70,7 +70,13 @@ bool always_display; /* not using the preload/display mechanism */ }; -struct prog_img{ /*progressbar image*/ +struct progressbar { + /* regular pb */ + short top; + short height; + short start; + short end; + /*progressbar image*/ struct bitmap bm; bool have_bitmap_pb; }; @@ -85,6 +91,7 @@ #ifdef HAVE_LCD_BITMAP #define MAX_IMAGES (26*2) /* a-z and A-Z */ +#define MAX_PRGRESSBARS 3 /* The image buffer is big enough to store one full-screen native bitmap, plus two full-screen mono bitmaps. */ @@ -325,7 +332,7 @@ struct wps_viewport { struct viewport vp; /* The LCD viewport struct */ - + struct progressbar *pb; /* Indexes of the first and last lines belonging to this viewport in the lines[] array */ int first_line, last_line; @@ -338,17 +345,15 @@ { #ifdef HAVE_LCD_BITMAP struct gui_img img[MAX_IMAGES]; - struct prog_img progressbar; unsigned char img_buf[IMG_BUFSIZE]; unsigned char* img_buf_ptr; int img_buf_free; bool wps_sb_tag; bool show_sb_on_wps; - short progress_top; - short progress_height; - short progress_start; - short progress_end; + struct progressbar progressbar[MAX_PRGRESSBARS]; + short progressbar_count; + bool peak_meter_enabled; #ifdef HAVE_ALBUMART Index: apps/gui/wps_parser.c =================================================================== --- apps/gui/wps_parser.c (revision 17668) +++ apps/gui/wps_parser.c (working copy) @@ -80,13 +80,13 @@ #ifdef HAVE_LCD_BITMAP #if LCD_DEPTH > 1 -#define MAX_BITMAPS (MAX_IMAGES+2) /* WPS images + pbar bitmap + backdrop */ +#define MAX_BITMAPS (MAX_IMAGES+MAX_PRGRESSBARS+1) /* WPS images + pbar bitmap + backdrop */ #else -#define MAX_BITMAPS (MAX_IMAGES+1) /* WPS images + pbar bitmap */ +#define MAX_BITMAPS (MAX_IMAGES+MAX_PRGRESSBARS) /* WPS images + pbar bitmap */ #endif #define PROGRESSBAR_BMP MAX_IMAGES -#define BACKDROP_BMP (MAX_IMAGES+1) +#define BACKDROP_BMP (MAX_BITMAPS-1) /* pointers to the bitmap filenames in the WPS source */ static const char *bmp_names[MAX_BITMAPS]; @@ -317,7 +317,6 @@ parse_image_display }, { WPS_TOKEN_IMAGE_DISPLAY, "x", 0, parse_image_load }, - { WPS_TOKEN_IMAGE_PROGRESS_BAR, "P", 0, parse_image_special }, #ifdef HAVE_ALBUMART { WPS_NO_TOKEN, "Cl", 0, parse_albumart_load }, { WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_STATIC, @@ -662,14 +661,8 @@ if (pos > newline) return WPS_ERROR_INVALID_PARAM; - - if (token->type == WPS_TOKEN_IMAGE_PROGRESS_BAR) - { - /* format: %P|filename.bmp| */ - bmp_names[PROGRESSBAR_BMP] = wps_bufptr + 1; - } #if LCD_DEPTH > 1 - else if (token->type == WPS_TOKEN_IMAGE_BACKDROP) + if (token->type == WPS_TOKEN_IMAGE_BACKDROP) { /* format: %X|filename.bmp| */ bmp_names[BACKDROP_BMP] = wps_bufptr + 1; @@ -738,18 +731,27 @@ { (void)token; /* Kill warnings */ #ifdef HAVE_LCD_BITMAP + enum { + HEIGHT = 0, + START, + END, + TOP + }; + int pb = wps_data->progressbar_count; short *vals[] = { - &wps_data->progress_height, - &wps_data->progress_start, - &wps_data->progress_end, - &wps_data->progress_top }; + &wps_data->progressbar[pb].height, + &wps_data->progressbar[pb].start, + &wps_data->progressbar[pb].end, + &wps_data->progressbar[pb].top }; + if (wps_data->progressbar_count +1 >= MAX_PRGRESSBARS) + return WPS_ERROR_INVALID_PARAM; /* default values : */ - wps_data->progress_height = 6; - wps_data->progress_start = 0; - wps_data->progress_end = 0; - wps_data->progress_top = -1; + *vals[HEIGHT] = 6; + *vals[START] = 0; + *vals[END] = 0; + *vals[TOP] = -1; int i = 0; char *newline = strchr(wps_bufptr, '\n'); @@ -763,12 +765,19 @@ next = strchr(++next, '|'); } - if (wps_data->progress_height < 3) - wps_data->progress_height = 3; - if (wps_data->progress_end < wps_data->progress_start + 3) - wps_data->progress_end = 0; + if (*vals[HEIGHT] < 3) + *vals[HEIGHT] = 3; + if (*vals[END] < *vals[START] + 3) + *vals[END] = 0; + if (i==4 && next < newline) /* check for a file name */ + { + bmp_names[PROGRESSBAR_BMP+pb] = prev+1; + } } - + wps_data->progressbar[pb].have_bitmap_pb = false; + wps_data->viewports[wps_data->num_viewports].pb = + &wps_data->progressbar[pb]; + wps_data->progressbar_count++; return newline - wps_bufptr; #else @@ -1334,7 +1343,6 @@ data->img[i].always_display = false; data->img[i].num_subimages = 1; } - data->progressbar.have_bitmap_pb = false; } #endif @@ -1348,6 +1356,8 @@ wps_data->img_buf_ptr = wps_data->img_buf; /* where in image buffer */ wps_data->img_buf_free = IMG_BUFSIZE; /* free space in image buffer */ wps_data->peak_meter_enabled = false; + /* progress bars */ + wps_data->progressbar_count = 0; #else /* HAVE_LCD_CHARCELLS */ int i; for (i = 0; i < 8; i++) @@ -1389,10 +1399,10 @@ get_image_filename(bmp_names[n], bmpdir, img_path, sizeof(img_path)); - if (n == PROGRESSBAR_BMP) { + if (n >= PROGRESSBAR_BMP ) { /* progressbar bitmap */ - bitmap = &wps_data->progressbar.bm; - loaded = &wps_data->progressbar.have_bitmap_pb; + bitmap = &wps_data->progressbar[n-PROGRESSBAR_BMP].bm; + loaded = &wps_data->progressbar[n-PROGRESSBAR_BMP].have_bitmap_pb; } else { /* regular bitmap */ bitmap = &wps_data->img[n].bm;