diff options
author | Tomas Salfischberger <tomas@rockbox.org> | 2005-06-22 12:41:59 +0000 |
---|---|---|
committer | Tomas Salfischberger <tomas@rockbox.org> | 2005-06-22 12:41:59 +0000 |
commit | 6d4b78b12ceadfd4e6114a58fc9a72f0dce22e8d (patch) | |
tree | 2a73f3997741aa5d102fe060a7d9d4801be07084 /apps | |
parent | 83b4a83b4719c7c52a35b0768b3eb465c0084f4a (diff) |
Image support for the WPS.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6803 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/wps-display.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/apps/wps-display.c b/apps/wps-display.c index aca7350904..6df7752e6b 100644 --- a/apps/wps-display.c +++ b/apps/wps-display.c @@ -48,6 +48,27 @@ #include "icons.h" #include "widgets.h" #include "peakmeter.h" + +/* Image stuff */ +#include "bmp.h" +#include "atoi.h" +#define MAX_IMAGES 10 +#define IMG_BUFSIZE (LCD_HEIGHT * LCD_WIDTH) / 8 +static unsigned char img_buf[IMG_BUFSIZE]; /* image buffer */ +static unsigned char* img_buf_ptr = img_buf; /* where are in image buffer? */ + +static int img_buf_free = IMG_BUFSIZE; /* free space in image buffer */ + +struct { + unsigned char* ptr; /* pointer */ + int x; /* x-pos */ + int y; /* y-pos */ + int w; /* width */ + int h; /* height */ + bool loaded; /* load state */ +} img[MAX_IMAGES] ; + + #endif #define WPS_CONFIG ROCKBOX_DIR "/default.wps" @@ -87,6 +108,18 @@ static int ff_rewind_count; bool wps_time_countup = true; static bool wps_loaded = false; +#ifdef HAVE_LCD_BITMAP +/* Display images */ +static void wps_display_images(void) { + int n; + for (n = 0; n < MAX_IMAGES; n++) { + if (img[n].loaded) { + lcd_bitmap(img[n].ptr, img[n].x, img[n].y, img[n].w, img[n].h, false); + } + } +} +#endif + /* Set format string to use for WPS, splitting it into lines */ static void wps_format(const char* fmt) { @@ -218,6 +251,9 @@ bool wps_load(const char* file, bool display) } if (any_defined_line) { +#ifdef HAVE_LCD_BITMAP + wps_display_images(); +#endif lcd_update(); sleep(HZ/2); } @@ -707,6 +743,12 @@ static void format_display(char* buf, char* value = NULL; int level = 0; unsigned char tag_length; + + /* needed for images (ifdef is to kill a warning on player)*/ +#ifdef HAVE_LCD_BITMAP + int n, ret; + char imgtmp[32]; +#endif *subline_time_mult = DEFAULT_SUBLINE_TIME_MULTIPLIER; @@ -744,6 +786,31 @@ static void format_display(char* buf, ++fmt; break; + case 'x': /* image support */ +#ifdef HAVE_LCD_BITMAP + strncpy(imgtmp, fmt+1, 1); + n = atoi(imgtmp); /* get image number */ + if (!img[n].loaded) { + /* image not loaded, get extra info. */ + strncpy(imgtmp, fmt+2, 3); + img[n].x = atoi(imgtmp); + strncpy(imgtmp, fmt+5, 3); + img[n].y = atoi(imgtmp); + /* and load the image */ + snprintf(imgtmp, 32, "/.rockbox/img_%d.bmp", n); + ret = read_bmp_file(imgtmp, &img[n].w, &img[n].h, img_buf_ptr, img_buf_free); + if (ret > 0) { + img[n].ptr = img_buf_ptr; + img_buf_ptr += ret; + img_buf_free -= ret; + } + img[n].loaded = true; + } +#endif + fmt += 8; + break; + + case '%': case '|': case '<': @@ -981,6 +1048,7 @@ bool wps_refresh(struct mp3entry* id3, } #ifdef HAVE_LCD_BITMAP if (update_line) { + wps_display_images(); lcd_update_rect(0, i*h + offset, LCD_WIDTH, h); } #endif @@ -1020,6 +1088,7 @@ bool wps_display(struct mp3entry* id3, lcd_puts(0, 0, str(LANG_END_PLAYLIST_PLAYER)); #else lcd_puts(0, 2, str(LANG_END_PLAYLIST_RECORDER)); + wps_display_images(); lcd_update(); #endif global_settings.resume_index = -1; @@ -1050,6 +1119,9 @@ bool wps_display(struct mp3entry* id3, yield(); wps_refresh(id3, nid3, 0, WPS_REFRESH_ALL); status_draw(true); +#ifdef HAVE_LCD_BITMAP + wps_display_images(); +#endif lcd_update(); return false; } |