diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2005-09-01 08:14:09 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2005-09-01 08:14:09 +0000 |
commit | d887c176c1e18d90fca568edd195045c2ff1d915 (patch) | |
tree | 6115d084e596b84f044e6d1885b81b0d2b87ec20 /apps | |
parent | 6c2af7c2aa8afde380b5a5f7c606c49dd38bef18 (diff) | |
download | rockbox-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.h | 1 | ||||
-rw-r--r-- | apps/wps-display.c | 218 |
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 |
59 | static unsigned char img_buf[IMG_BUFSIZE]; /* image buffer */ | 60 | static unsigned char img_buf[IMG_BUFSIZE]; /* image buffer */ |
60 | static unsigned char* img_buf_ptr = img_buf; /* where are in image buffer? */ | 61 | static 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 | ||