From 81dedee7d050e2b52dfe1a294dbd349c4fe79155 Mon Sep 17 00:00:00 2001 From: Nicolas Pennequin Date: Mon, 12 Nov 2007 01:31:42 +0000 Subject: Various album art improvements: * Make the album art display tag static instead of dynamic, making it be drawn less often, which is good. * Add the possibility of clearing the album art bitmap instead of drawing it, and use this abaility when the display tag is inside a conditional construct. * Add the album art display tag to wps_debug.c. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15592 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/gwps-common.c | 7 ++++++- apps/gui/gwps.h | 2 ++ apps/gui/wps_debug.c | 9 +++++++++ apps/gui/wps_parser.c | 6 +++++- apps/recorder/albumart.c | 25 ++++++++++++++++++------- apps/recorder/albumart.h | 5 +++-- 6 files changed, 43 insertions(+), 11 deletions(-) (limited to 'apps') diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c index 3c29884260..00505afbed 100644 --- a/apps/gui/gwps-common.c +++ b/apps/gui/gwps-common.c @@ -932,7 +932,7 @@ static char *get_token_value(struct gui_wps *gwps, #ifdef HAVE_ALBUMART case WPS_TOKEN_ALBUMART_DISPLAY: - draw_album_art(gwps, audio_current_aa_hid()); + draw_album_art(gwps, audio_current_aa_hid(), false); return NULL; case WPS_TOKEN_ALBUMART_FOUND: @@ -1418,6 +1418,11 @@ static int evaluate_conditional(struct gui_wps *gwps, int cond_index) } #endif +#ifdef HAVE_ALBUMART + if (data->albumart_cond_index == cond_index) + draw_album_art(gwps, audio_current_aa_hid(), true); +#endif + return ret; } diff --git a/apps/gui/gwps.h b/apps/gui/gwps.h index 391fc72943..f57656b0ae 100644 --- a/apps/gui/gwps.h +++ b/apps/gui/gwps.h @@ -344,6 +344,8 @@ struct wps_data + .._INCREASE, + .._DECREASE */ short albumart_max_width; short albumart_max_height; + + int albumart_cond_index; #endif #else /*HAVE_LCD_CHARCELLS */ diff --git a/apps/gui/wps_debug.c b/apps/gui/wps_debug.c index 58e6ab49aa..883626d040 100644 --- a/apps/gui/wps_debug.c +++ b/apps/gui/wps_debug.c @@ -214,6 +214,15 @@ static void dump_wps_tokens(struct wps_data *data) break; #endif +#ifdef HAVE_ALBUMART + case WPS_TOKEN_ALBUMART_DISPLAY: + snprintf(buf, sizeof(buf), "album art display at x=%d, y=%d, " + "maxwidth=%d, maxheight=%d", data->albumart_x, + data->albumart_y, data->albumart_max_width, + data->albumart_max_height); + break; +#endif + #ifdef HAVE_LCD_BITMAP case WPS_TOKEN_IMAGE_BACKDROP: snprintf(buf, sizeof(buf), "backdrop image"); diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c index 097a60c90f..86bd096e8c 100644 --- a/apps/gui/wps_parser.c +++ b/apps/gui/wps_parser.c @@ -293,7 +293,7 @@ static const struct wps_tag all_tags[] = { { 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_DYNAMIC, + { WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_STATIC, parse_albumart_conditional }, #endif #if (LCD_DEPTH > 1) || (defined(HAVE_LCD_REMOTE) && (LCD_REMOTE_DEPTH > 1)) @@ -824,7 +824,11 @@ static int parse_albumart_conditional(const char *wps_bufptr, } } else + { + /* This %C tag is in a conditional construct. */ + wps_data->albumart_cond_index = condindex[level]; return 0; + } }; #endif /* HAVE_ALBUMART */ diff --git a/apps/recorder/albumart.c b/apps/recorder/albumart.c index abae8c1afc..2722b57f8a 100644 --- a/apps/recorder/albumart.c +++ b/apps/recorder/albumart.c @@ -231,8 +231,9 @@ bool find_albumart(const struct mp3entry *id3, char *buf, int buflen) return search_files(id3, size_string, buf, buflen); } -/* Draw the album art bitmap from the given handle ID onto the given WPS. */ -void draw_album_art(struct gui_wps *gwps, int handle_id) +/* Draw the album art bitmap from the given handle ID onto the given WPS. + Call with clear = true to clear the bitmap instead of drawing it. */ +void draw_album_art(struct gui_wps *gwps, int handle_id, bool clear) { if (!gwps || !gwps->data || !gwps->display || handle_id < 0) return; @@ -277,9 +278,19 @@ void draw_album_art(struct gui_wps *gwps, int handle_id) y += (data->albumart_max_height - height) / 2; } - /* Draw the bitmap */ - gwps->display->set_drawmode(DRMODE_FG); - gwps->display->bitmap_part((fb_data*)bmp->data, 0, 0, bmp->width, - x, y, width, height); - gwps->display->set_drawmode(DRMODE_SOLID); + if (!clear) + { + /* Draw the bitmap */ + gwps->display->set_drawmode(DRMODE_FG); + gwps->display->bitmap_part((fb_data*)bmp->data, 0, 0, bmp->width, + x, y, width, height); + gwps->display->set_drawmode(DRMODE_SOLID); + } + else + { + /* Clear the bitmap */ + gwps->display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + gwps->display->fillrect(x, y, width, height); + gwps->display->set_drawmode(DRMODE_SOLID); + } } diff --git a/apps/recorder/albumart.h b/apps/recorder/albumart.h index 21ae50edb9..dcd106465b 100644 --- a/apps/recorder/albumart.h +++ b/apps/recorder/albumart.h @@ -31,8 +31,9 @@ * Returns true if a bitmap was found, false otherwise */ bool find_albumart(const struct mp3entry *id3, char *buf, int buflen); -/* Draw the album art bitmap from the given handle ID onto the given WPS. */ -void draw_album_art(struct gui_wps *gwps, int handle_id); +/* Draw the album art bitmap from the given handle ID onto the given WPS. + Call with clear = true to clear the bitmap instead of drawing it. */ +void draw_album_art(struct gui_wps *gwps, int handle_id, bool clear); #endif /* HAVE_ALBUMART */ -- cgit v1.2.3