From 1f0ab7c9e636ba3e88700b1b6fb75e876a0f0a44 Mon Sep 17 00:00:00 2001 From: Frank Gevaerts Date: Sun, 10 Oct 2010 23:46:15 +0000 Subject: Fix charcell %pb and %pf tags, FS#11592 This also moves draw_player_fullbar() and draw_player_progress() from skin_display.c to skin_tokens.c. Charcell is a bit different from bitmap here because drawing a progress bar is a combination of setting up the LCD controller (custom characters) and providing a format string. The custom character definition might fit in skin_display.c, but the format strings are needed in skin_tokens.c. Putting these functions in skin_tokens.c seemed to fit better. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28241 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_display.c | 144 +---------------------------------- apps/gui/skin_engine/skin_display.h | 3 - apps/gui/skin_engine/skin_render.c | 16 ++-- apps/gui/skin_engine/skin_tokens.c | 148 +++++++++++++++++++++++++++++++++++- 4 files changed, 154 insertions(+), 157 deletions(-) (limited to 'apps') diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 8638d2c902..24e976d393 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -349,149 +349,7 @@ void wps_display_images(struct gui_wps *gwps, struct viewport* vp) display->set_drawmode(DRMODE_SOLID); } -#else /* HAVE_LCD_CHARCELL */ - -bool draw_player_progress(struct gui_wps *gwps) -{ - struct wps_state *state = skin_get_global_state(); - struct screen *display = gwps->display; - unsigned char progress_pattern[7]; - int pos = 0; - int i; - - int elapsed, length; - if (LIKELY(state->id3)) - { - elapsed = state->id3->elapsed; - length = state->id3->length; - } - else - { - elapsed = 0; - length = 0; - } - - if (length) - pos = 36 * (elapsed + state->ff_rewind_count) / length; - - for (i = 0; i < 7; i++, pos -= 5) - { - if (pos <= 0) - progress_pattern[i] = 0x1fu; - else if (pos >= 5) - progress_pattern[i] = 0x00u; - else - progress_pattern[i] = 0x1fu >> pos; - } - - display->define_pattern(gwps->data->wps_progress_pat[0], progress_pattern); - return true; -} - -void draw_player_fullbar(struct gui_wps *gwps, char* buf, int buf_size) -{ - static const unsigned char numbers[10][4] = { - {0x0e, 0x0a, 0x0a, 0x0e}, /* 0 */ - {0x04, 0x0c, 0x04, 0x04}, /* 1 */ - {0x0e, 0x02, 0x04, 0x0e}, /* 2 */ - {0x0e, 0x02, 0x06, 0x0e}, /* 3 */ - {0x08, 0x0c, 0x0e, 0x04}, /* 4 */ - {0x0e, 0x0c, 0x02, 0x0c}, /* 5 */ - {0x0e, 0x08, 0x0e, 0x0e}, /* 6 */ - {0x0e, 0x02, 0x04, 0x08}, /* 7 */ - {0x0e, 0x0e, 0x0a, 0x0e}, /* 8 */ - {0x0e, 0x0e, 0x02, 0x0e}, /* 9 */ - }; - - struct wps_state *state = skin_get_global_state(); - struct screen *display = gwps->display; - struct wps_data *data = gwps->data; - unsigned char progress_pattern[7]; - char timestr[10]; - int time; - int time_idx = 0; - int pos = 0; - int pat_idx = 1; - int digit, i, j; - bool softchar; - - int elapsed, length; - if (LIKELY(state->id3)) - { - elapsed = state->id3->elapsed; - length = state->id3->length; - } - else - { - elapsed = 0; - length = 0; - } - - if (buf_size < 34) /* worst case: 11x UTF-8 char + \0 */ - return; - - time = elapsed + state->ff_rewind_count; - if (length) - pos = 55 * time / length; - - memset(timestr, 0, sizeof(timestr)); - format_time(timestr, sizeof(timestr)-2, time); - timestr[strlen(timestr)] = ':'; /* always safe */ - - for (i = 0; i < 11; i++, pos -= 5) - { - softchar = false; - memset(progress_pattern, 0, sizeof(progress_pattern)); - - if ((digit = timestr[time_idx])) - { - softchar = true; - digit -= '0'; - - if (timestr[time_idx + 1] == ':') /* ones, left aligned */ - { - memcpy(progress_pattern, numbers[digit], 4); - time_idx += 2; - } - else /* tens, shifted right */ - { - for (j = 0; j < 4; j++) - progress_pattern[j] = numbers[digit][j] >> 1; - - if (time_idx > 0) /* not the first group, add colon in front */ - { - progress_pattern[1] |= 0x10u; - progress_pattern[3] |= 0x10u; - } - time_idx++; - } - - if (pos >= 5) - progress_pattern[5] = progress_pattern[6] = 0x1fu; - } - - if (pos > 0 && pos < 5) - { - softchar = true; - progress_pattern[5] = progress_pattern[6] = (~0x1fu >> pos) & 0x1fu; - } - - if (softchar && pat_idx < 8) - { - display->define_pattern(data->wps_progress_pat[pat_idx], - progress_pattern); - buf = utf8encode(data->wps_progress_pat[pat_idx], buf); - pat_idx++; - } - else if (pos <= 0) - buf = utf8encode(' ', buf); - else - buf = utf8encode(0xe115, buf); /* 2/7 _ */ - } - *buf = '\0'; -} - -#endif /* HAVE_LCD_CHARCELL */ +#endif /* HAVE_LCD_BITMAP */ /* Evaluate the conditional that is at *token_index and return whether a skip has ocurred. *token_index is updated with the new position. diff --git a/apps/gui/skin_engine/skin_display.h b/apps/gui/skin_engine/skin_display.h index 67b7bfdf27..da4bb92aef 100644 --- a/apps/gui/skin_engine/skin_display.h +++ b/apps/gui/skin_engine/skin_display.h @@ -36,9 +36,6 @@ void draw_playlist_viewer_list(struct gui_wps *gwps, struct playlistviewer *view void clear_image_pos(struct gui_wps *gwps, struct gui_img *img); void wps_draw_image(struct gui_wps *gwps, struct gui_img *img, int subimage); void wps_display_images(struct gui_wps *gwps, struct viewport* vp); -#else -bool draw_player_progress(struct gui_wps *gwps); -void draw_player_fullbar(struct gui_wps *gwps, char* buf, int buf_size); #endif /* Evaluate the conditional that is at *token_index and return whether a skip diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c index bd86c0bdf8..9b86380ade 100644 --- a/apps/gui/skin_engine/skin_render.c +++ b/apps/gui/skin_engine/skin_render.c @@ -83,10 +83,14 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, { #ifndef HAVE_LCD_BITMAP (void)vp; /* silence warnings */ + (void)info; #endif struct wps_token *token = (struct wps_token *)element->data; + +#ifdef HAVE_LCD_BITMAP struct wps_data *data = gwps->data; bool do_refresh = (element->tag->flags & info->refresh_type) > 0; +#endif switch (token->type) { #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) @@ -137,22 +141,14 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, #endif case SKIN_TOKEN_VOLUMEBAR: case SKIN_TOKEN_BATTERY_PERCENTBAR: +#ifdef HAVE_LCD_BITMAP case SKIN_TOKEN_PROGRESSBAR: { -#ifdef HAVE_LCD_BITMAP struct progressbar *bar = (struct progressbar*)token->value.data; if (do_refresh) draw_progressbar(gwps, info->line_number, bar); -#else /* HAVE_LCD_CHARCELL */ - if (do_refresh) - { - if (data->full_line_progressbar) - draw_player_fullbar(gwps, info->buf, info->buf_size); - else - draw_player_progress(gwps); - } -#endif } +#endif break; #ifdef HAVE_LCD_BITMAP case SKIN_TOKEN_IMAGE_DISPLAY_LISTICON: diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index 11200e448c..78d141e743 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -554,6 +554,148 @@ static struct mp3entry* get_mp3entry_from_offset(int offset, char **filename) return pid3; } +#ifdef HAVE_LCD_CHARCELLS +void format_player_progress(struct gui_wps *gwps) +{ + struct wps_state *state = skin_get_global_state(); + struct screen *display = gwps->display; + unsigned char progress_pattern[7]; + int pos = 0; + int i; + + int elapsed, length; + if (LIKELY(state->id3)) + { + elapsed = state->id3->elapsed; + length = state->id3->length; + } + else + { + elapsed = 0; + length = 0; + } + + if (length) + pos = 36 * (elapsed + state->ff_rewind_count) / length; + + for (i = 0; i < 7; i++, pos -= 5) + { + if (pos <= 0) + progress_pattern[i] = 0x1fu; + else if (pos >= 5) + progress_pattern[i] = 0x00u; + else + progress_pattern[i] = 0x1fu >> pos; + } + + display->define_pattern(gwps->data->wps_progress_pat[0], progress_pattern); +} + +void format_player_fullbar(struct gui_wps *gwps, char* buf, int buf_size) +{ + static const unsigned char numbers[10][4] = { + {0x0e, 0x0a, 0x0a, 0x0e}, /* 0 */ + {0x04, 0x0c, 0x04, 0x04}, /* 1 */ + {0x0e, 0x02, 0x04, 0x0e}, /* 2 */ + {0x0e, 0x02, 0x06, 0x0e}, /* 3 */ + {0x08, 0x0c, 0x0e, 0x04}, /* 4 */ + {0x0e, 0x0c, 0x02, 0x0c}, /* 5 */ + {0x0e, 0x08, 0x0e, 0x0e}, /* 6 */ + {0x0e, 0x02, 0x04, 0x08}, /* 7 */ + {0x0e, 0x0e, 0x0a, 0x0e}, /* 8 */ + {0x0e, 0x0e, 0x02, 0x0e}, /* 9 */ + }; + + struct wps_state *state = skin_get_global_state(); + struct screen *display = gwps->display; + struct wps_data *data = gwps->data; + unsigned char progress_pattern[7]; + char timestr[10]; + int time; + int time_idx = 0; + int pos = 0; + int pat_idx = 1; + int digit, i, j; + bool softchar; + + int elapsed, length; + if (LIKELY(state->id3)) + { + elapsed = state->id3->elapsed; + length = state->id3->length; + } + else + { + elapsed = 0; + length = 0; + } + + if (buf_size < 34) /* worst case: 11x UTF-8 char + \0 */ + return; + + time = elapsed + state->ff_rewind_count; + if (length) + pos = 55 * time / length; + + memset(timestr, 0, sizeof(timestr)); + format_time(timestr, sizeof(timestr)-2, time); + timestr[strlen(timestr)] = ':'; /* always safe */ + + for (i = 0; i < 11; i++, pos -= 5) + { + softchar = false; + memset(progress_pattern, 0, sizeof(progress_pattern)); + + if ((digit = timestr[time_idx])) + { + softchar = true; + digit -= '0'; + + if (timestr[time_idx + 1] == ':') /* ones, left aligned */ + { + memcpy(progress_pattern, numbers[digit], 4); + time_idx += 2; + } + else /* tens, shifted right */ + { + for (j = 0; j < 4; j++) + progress_pattern[j] = numbers[digit][j] >> 1; + + if (time_idx > 0) /* not the first group, add colon in front */ + { + progress_pattern[1] |= 0x10u; + progress_pattern[3] |= 0x10u; + } + time_idx++; + } + + if (pos >= 5) + progress_pattern[5] = progress_pattern[6] = 0x1fu; + } + + if (pos > 0 && pos < 5) + { + softchar = true; + progress_pattern[5] = progress_pattern[6] = (~0x1fu >> pos) & 0x1fu; + } + + if (softchar && pat_idx < 8) + { + display->define_pattern(data->wps_progress_pat[pat_idx], + progress_pattern); + buf = utf8encode(data->wps_progress_pat[pat_idx], buf); + pat_idx++; + } + else if (pos <= 0) + buf = utf8encode(' ', buf); + else + buf = utf8encode(0xe115, buf); /* 2/7 _ */ + } + *buf = '\0'; +} + +#endif /* HAVE_LCD_CHARCELLS */ + /* Don't inline this; it was broken out of get_token_value to reduce stack * usage. */ @@ -1075,7 +1217,9 @@ const char *get_token_value(struct gui_wps *gwps, #ifdef HAVE_LCD_CHARCELLS case SKIN_TOKEN_PROGRESSBAR: { - char *end = utf8encode(data->wps_progress_pat[0], buf); + char *end; + format_player_progress(gwps); + end = utf8encode(data->wps_progress_pat[0], buf); *end = '\0'; return buf; } @@ -1086,6 +1230,8 @@ const char *get_token_value(struct gui_wps *gwps, /* we need 11 characters (full line) for progress-bar */ strlcpy(buf, " ", buf_size); + format_player_fullbar(gwps,buf,buf_size); + DEBUGF("bar='%s'\n",buf); } else { -- cgit