summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2005-09-01 08:14:09 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2005-09-01 08:14:09 +0000
commitd887c176c1e18d90fca568edd195045c2ff1d915 (patch)
tree6115d084e596b84f044e6d1885b81b0d2b87ec20 /apps
parent6c2af7c2aa8afde380b5a5f7c606c49dd38bef18 (diff)
downloadrockbox-d887c176c1e18d90fca568edd195045c2ff1d915.tar.gz
rockbox-d887c176c1e18d90fca568edd195045c2ff1d915.zip
Changed WPS image tag format, allowing for conditional image display
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7439 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/settings.h1
-rw-r--r--apps/wps-display.c218
2 files changed, 136 insertions, 83 deletions
diff --git a/apps/settings.h b/apps/settings.h
index 8387fe02a8..1c1e664b90 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -27,6 +27,7 @@
27#include "abrepeat.h" 27#include "abrepeat.h"
28 28
29#define ROCKBOX_DIR "/.rockbox" 29#define ROCKBOX_DIR "/.rockbox"
30#define ROCKBOX_DIR_LEN 9
30#define FONT_DIR "/fonts" 31#define FONT_DIR "/fonts"
31#define LANG_DIR "/langs" 32#define LANG_DIR "/langs"
32#define PLUGIN_DIR ROCKBOX_DIR"/rocks" 33#define PLUGIN_DIR ROCKBOX_DIR"/rocks"
diff --git a/apps/wps-display.c b/apps/wps-display.c
index 6501942d05..fa6494ecee 100644
--- a/apps/wps-display.c
+++ b/apps/wps-display.c
@@ -47,6 +47,7 @@
47#include "abrepeat.h" 47#include "abrepeat.h"
48 48
49#ifdef HAVE_LCD_BITMAP 49#ifdef HAVE_LCD_BITMAP
50#include <ctype.h>
50#include "icons.h" 51#include "icons.h"
51#include "widgets.h" 52#include "widgets.h"
52#include "peakmeter.h" 53#include "peakmeter.h"
@@ -54,8 +55,8 @@
54/* Image stuff */ 55/* Image stuff */
55#include "bmp.h" 56#include "bmp.h"
56#include "atoi.h" 57#include "atoi.h"
57#define MAX_IMAGES 10 58#define MAX_IMAGES 26 /* a-z */
58#define IMG_BUFSIZE (LCD_HEIGHT * LCD_WIDTH) / 8 59#define IMG_BUFSIZE (LCD_HEIGHT * LCD_WIDTH * MAX_IMAGES/10) / 8
59static unsigned char img_buf[IMG_BUFSIZE]; /* image buffer */ 60static unsigned char img_buf[IMG_BUFSIZE]; /* image buffer */
60static unsigned char* img_buf_ptr = img_buf; /* where are in image buffer? */ 61static unsigned char* img_buf_ptr = img_buf; /* where are in image buffer? */
61 62
@@ -68,6 +69,8 @@ struct {
68 int w; /* width */ 69 int w; /* width */
69 int h; /* height */ 70 int h; /* height */
70 bool loaded; /* load state */ 71 bool loaded; /* load state */
72 bool display; /* is to be displayed */
73 bool always_display; /* not using the preload/display mechanism */
71} img[MAX_IMAGES] ; 74} img[MAX_IMAGES] ;
72 75
73 76
@@ -122,7 +125,7 @@ static void wps_display_images(void) {
122 int n; 125 int n;
123 lcd_set_drawmode(DRMODE_FG); 126 lcd_set_drawmode(DRMODE_FG);
124 for (n = 0; n < MAX_IMAGES; n++) { 127 for (n = 0; n < MAX_IMAGES; n++) {
125 if (img[n].loaded) { 128 if (img[n].loaded && img[n].display) {
126 lcd_mono_bitmap(img[n].ptr, img[n].x, img[n].y, img[n].w, img[n].h); 129 lcd_mono_bitmap(img[n].ptr, img[n].x, img[n].y, img[n].w, img[n].h);
127 } 130 }
128 } 131 }
@@ -160,9 +163,13 @@ static void wps_format(const char* fmt)
160 { 163 {
161 switch (*buf) 164 switch (*buf)
162 { 165 {
163 /* skip % sequences so "%;" doesn't start a new subline */ 166 /*
167 * skip % sequences so "%;" doesn't start a new subline
168 * don't skip %x lines (pre-load bitmaps)
169 */
164 case '%': 170 case '%':
165 buf++; 171 if (*(buf+1) != 'x')
172 buf++;
166 break; 173 break;
167 174
168 case '\r': /* CR */ 175 case '\r': /* CR */
@@ -204,6 +211,107 @@ static void wps_format(const char* fmt)
204 subline = 0; 211 subline = 0;
205 } 212 }
206 break; 213 break;
214
215 case 'x':
216#ifdef HAVE_LCD_BITMAP
217 /* Preload images so the %xd# tag can display it */
218 {
219 int ret = 0;
220 int n;
221 char *ptr = buf+1;
222 char *pos = NULL;
223 char imgname[MAX_PATH];
224 char qual = *ptr;
225 if (qual == 'l' || qual == '|') /* format:
226 %x|n|filename.bmp|x|y|
227 or
228 %xl|n|filename.bmp|x|y|
229 */
230 {
231 ptr = strchr(ptr, '|') + 1;
232 pos = strchr(ptr, '|');
233 if (pos)
234 {
235 /* get the image number */
236 n = tolower(*ptr) - 'a';
237 if(n < 0 || n >= MAX_IMAGES)
238 {
239 buf++;
240 break;
241 }
242 ptr = pos+1;
243
244 /* check the image number and load state */
245 if ((n < MAX_IMAGES) && (!img[n].loaded))
246 {
247 /* get filename */
248 pos = strchr(ptr, '|');
249 if ((pos - ptr) <
250 (int)sizeof(imgname)-ROCKBOX_DIR_LEN-2)
251 {
252 memcpy(imgname, ROCKBOX_DIR, ROCKBOX_DIR_LEN);
253 imgname[ROCKBOX_DIR_LEN] = '/';
254 memcpy(&imgname[ROCKBOX_DIR_LEN+1],
255 ptr, pos - ptr);
256 imgname[ROCKBOX_DIR_LEN+1+pos-ptr] = 0;
257 }
258 else
259 /* filename too long */
260 imgname[0] = 0;
261
262 ptr = pos+1;
263
264 /* get x-position */
265 pos = strchr(ptr, '|');
266 if (pos)
267 img[n].x = atoi(ptr);
268 else
269 {
270 /* weird syntax, bail out */
271 buf++;
272 break;
273 }
274
275 /* get y-position */
276 ptr = pos+1;
277 pos = strchr(ptr, '|');
278 if (pos)
279 img[n].y = atoi(ptr);
280 else
281 {
282 /* weird syntax, bail out */
283 buf++;
284 break;
285 }
286
287 pos++;
288
289 /* reposition buf pointer to next WPS element */
290 while (*pos && *pos != ';' &&
291 *pos != '\r' && *pos != '\n')
292 pos++;
293
294 buf = pos;
295
296 /* load the image */
297 ret = read_bmp_file(imgname, &img[n].w, &img[n].h,
298 img_buf_ptr, img_buf_free);
299 if (ret > 0)
300 {
301 img[n].ptr = img_buf_ptr;
302 img_buf_ptr += ret;
303 img_buf_free -= ret;
304 img[n].loaded = true;
305 if(qual == '|')
306 img[n].always_display = true;
307 }
308 }
309 buf++;
310 }
311 }
312 }
313#endif
314 break;
207 } 315 }
208 buf++; 316 buf++;
209 } 317 }
@@ -234,9 +342,11 @@ bool wps_load(const char* file, bool display)
234 img_buf_ptr = img_buf; 342 img_buf_ptr = img_buf;
235 img_buf_free = IMG_BUFSIZE; 343 img_buf_free = IMG_BUFSIZE;
236 344
237 /* set images to unloaded */ 345 /* set images to unloaded and not displayed */
238 for (i = 0; i < MAX_IMAGES; i++) { 346 for (i = 0; i < MAX_IMAGES; i++) {
239 img[i].loaded = false; 347 img[i].loaded = false;
348 img[i].display = false;
349 img[i].always_display = false;
240 } 350 }
241#endif 351#endif
242 buffer[numread] = 0; 352 buffer[numread] = 0;
@@ -830,17 +940,16 @@ static void format_display(char* buf,
830 unsigned char tag_length; 940 unsigned char tag_length;
831 int intval; 941 int intval;
832 942
833 /* needed for images (ifdef is to kill a warning on player)*/
834 int n;
835 int cur_align; 943 int cur_align;
836 char* cur_align_start; 944 char* cur_align_start;
837#ifdef HAVE_LCD_BITMAP 945#ifdef HAVE_LCD_BITMAP
838 int ret; 946 int n;
839 char *pos, *posn; 947 /* Set images to not to be displayed */
840 char imgname[MAX_PATH]; 948 for (n = 0; n < MAX_IMAGES; n++) {
841 char *ptr; 949 img[n].display = img[n].always_display?true:false;
950 }
842#endif 951#endif
843 952
844 cur_align_start = buf; 953 cur_align_start = buf;
845 cur_align = WPS_ALIGN_LEFT; 954 cur_align = WPS_ALIGN_LEFT;
846 *subline_time_mult = DEFAULT_SUBLINE_TIME_MULTIPLIER; 955 *subline_time_mult = DEFAULT_SUBLINE_TIME_MULTIPLIER;
@@ -916,80 +1025,23 @@ static void format_display(char* buf,
916 ++fmt; 1025 ++fmt;
917 break; 1026 break;
918 1027
919 case 'x': /* image support (format: %xn|filename|x|y|) */ 1028 case 'x': /* image support */
920#ifdef HAVE_LCD_BITMAP 1029#ifdef HAVE_LCD_BITMAP
921 /* get image number */ 1030 /* skip preload or regular image tag */
922 pos = strchr(fmt, '|'); /* get the first '|' */ 1031 if ('l' == *(fmt+1) || '|' == *(fmt+1))
923 ptr = (char *)fmt+1; 1032 {
924 if (pos && ((pos - ptr) < (int)sizeof(temp_buf))) { 1033 while (*fmt && *fmt != '\n')
925 memcpy(temp_buf, ptr, pos - ptr); 1034 fmt++;
926 temp_buf[pos - ptr] = 0; 1035 }
927 n = atoi(temp_buf); 1036 else if ('d' == *(fmt+1))
928 ptr = pos+1; 1037 {
929 1038 fmt+=2;
930 /* check image number, and load state. */ 1039 n = tolower(*fmt) - 'a';
931 if ((n < MAX_IMAGES) && (!img[n].loaded)) { 1040 if (n >= 0 && n < MAX_IMAGES && img[n].loaded) {
932 /* Get filename */ 1041 img[n].display = true;
933 pos = strchr(ptr, '|'); /* get the second '|' */
934 if ((pos - ptr) < (int)sizeof(temp_buf)) {
935 memcpy(temp_buf, ptr, pos - ptr);
936 /* get the filename */
937 temp_buf[pos - ptr] = 0;
938 snprintf(imgname, MAX_PATH, "/.rockbox/%s",
939 temp_buf);
940 }
941 else {
942 /* filename too long! */
943 imgname[0]=0;
944 }
945
946 /* Get X-position */
947 ptr=pos+1;
948 posn = strchr(ptr, '|'); /* get the 3th '|' */
949 if ((posn - ptr) < (int)sizeof(temp_buf)) {
950 memcpy(temp_buf, ptr, posn - ptr);
951 temp_buf[posn - ptr] = 0;
952 img[n].x = atoi(temp_buf);
953 }
954 else
955 /* weird syntax, get out */
956 break;
957
958 /* Get Y-position */
959 pos = posn;
960 ptr = posn+1;
961 posn = strchr(ptr, '|'); /* get the 4th '|' */
962 if ((posn - ptr) < (int)sizeof(temp_buf)) {
963 memcpy(temp_buf, ptr, posn - ptr);
964 temp_buf[posn - ptr] = 0;
965 img[n].y = atoi(temp_buf);
966 }
967 else
968 /* weird syntax, get out */
969 break;
970
971 /* and load the image */
972 ret = read_bmp_file(imgname, &img[n].w, &img[n].h, img_buf_ptr,
973 img_buf_free);
974 if (ret > 0) {
975 img[n].ptr = img_buf_ptr;
976 img_buf_ptr += ret;
977 img_buf_free -= ret;
978 }
979 img[n].loaded = true;
980 } 1042 }
981 } 1043 }
982#endif 1044#endif
983 /* skip the tag */
984 for (n = 0; n < 4; n++) {
985 char *ptr;
986 ptr = strchr(fmt+1, '|'); /* get the next '|' */
987 if(ptr)
988 fmt=ptr;
989 else
990 /* syntax error, bail out of loop */
991 break;
992 }
993 fmt++; 1045 fmt++;
994 break; 1046 break;
995 1047