diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 102 |
1 files changed, 50 insertions, 52 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index bf342116a6..4e264b0489 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c | |||
@@ -68,34 +68,16 @@ | |||
68 | static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode); | 68 | static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode); |
69 | 69 | ||
70 | 70 | ||
71 | #ifdef HAVE_LCD_BITMAP | ||
72 | /* Clear the WPS image cache */ | ||
73 | static void wps_images_clear(struct wps_data *data) | ||
74 | { | ||
75 | int i; | ||
76 | /* set images to unloaded and not displayed */ | ||
77 | for (i = 0; i < MAX_IMAGES; i++) | ||
78 | { | ||
79 | data->img[i].loaded = false; | ||
80 | data->img[i].display = -1; | ||
81 | data->img[i].always_display = false; | ||
82 | data->img[i].num_subimages = 1; | ||
83 | } | ||
84 | } | ||
85 | #endif | ||
86 | |||
87 | /* initial setup of wps_data */ | 71 | /* initial setup of wps_data */ |
88 | void skin_data_init(struct wps_data *wps_data) | 72 | void skin_data_init(struct wps_data *wps_data) |
89 | { | 73 | { |
90 | #ifdef HAVE_LCD_BITMAP | 74 | #ifdef HAVE_LCD_BITMAP |
91 | wps_images_clear(wps_data); | ||
92 | wps_data->wps_sb_tag = false; | 75 | wps_data->wps_sb_tag = false; |
93 | wps_data->show_sb_on_wps = false; | 76 | wps_data->show_sb_on_wps = false; |
94 | wps_data->img_buf_ptr = wps_data->img_buf; /* where in image buffer */ | ||
95 | wps_data->img_buf_free = IMG_BUFSIZE; /* free space in image buffer */ | ||
96 | wps_data->peak_meter_enabled = false; | 77 | wps_data->peak_meter_enabled = false; |
78 | wps_data->images = NULL; | ||
79 | wps_data->progressbars = NULL; | ||
97 | /* progress bars */ | 80 | /* progress bars */ |
98 | wps_data->progressbar_count = 0; | ||
99 | #else /* HAVE_LCD_CHARCELLS */ | 81 | #else /* HAVE_LCD_CHARCELLS */ |
100 | int i; | 82 | int i; |
101 | for (i = 0; i < 8; i++) | 83 | for (i = 0; i < 8; i++) |
@@ -191,41 +173,38 @@ static void draw_progressbar(struct gui_wps *gwps, | |||
191 | } | 173 | } |
192 | 174 | ||
193 | /* clears the area where the image was shown */ | 175 | /* clears the area where the image was shown */ |
194 | static void clear_image_pos(struct gui_wps *gwps, int n) | 176 | static void clear_image_pos(struct gui_wps *gwps, struct gui_img *img) |
195 | { | 177 | { |
196 | if(!gwps) | 178 | if(!gwps) |
197 | return; | 179 | return; |
198 | struct wps_data *data = gwps->data; | ||
199 | gwps->display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); | 180 | gwps->display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); |
200 | gwps->display->fillrect(data->img[n].x, data->img[n].y, | 181 | gwps->display->fillrect(img->x, img->y, img->bm.width, img->subimage_height); |
201 | data->img[n].bm.width, data->img[n].subimage_height); | ||
202 | gwps->display->set_drawmode(DRMODE_SOLID); | 182 | gwps->display->set_drawmode(DRMODE_SOLID); |
203 | } | 183 | } |
204 | 184 | ||
205 | static void wps_draw_image(struct gui_wps *gwps, int n, int subimage) | 185 | static void wps_draw_image(struct gui_wps *gwps, struct gui_img *img, int subimage) |
206 | { | 186 | { |
207 | struct screen *display = gwps->display; | 187 | struct screen *display = gwps->display; |
208 | struct wps_data *data = gwps->data; | 188 | if(img->always_display) |
209 | if(data->img[n].always_display) | ||
210 | display->set_drawmode(DRMODE_FG); | 189 | display->set_drawmode(DRMODE_FG); |
211 | else | 190 | else |
212 | display->set_drawmode(DRMODE_SOLID); | 191 | display->set_drawmode(DRMODE_SOLID); |
213 | 192 | ||
214 | #if LCD_DEPTH > 1 | 193 | #if LCD_DEPTH > 1 |
215 | if(data->img[n].bm.format == FORMAT_MONO) { | 194 | if(img->bm.format == FORMAT_MONO) { |
216 | #endif | 195 | #endif |
217 | display->mono_bitmap_part(data->img[n].bm.data, | 196 | display->mono_bitmap_part(img->bm.data, |
218 | 0, data->img[n].subimage_height * subimage, | 197 | 0, img->subimage_height * subimage, |
219 | data->img[n].bm.width, data->img[n].x, | 198 | img->bm.width, img->x, |
220 | data->img[n].y, data->img[n].bm.width, | 199 | img->y, img->bm.width, |
221 | data->img[n].subimage_height); | 200 | img->subimage_height); |
222 | #if LCD_DEPTH > 1 | 201 | #if LCD_DEPTH > 1 |
223 | } else { | 202 | } else { |
224 | display->transparent_bitmap_part((fb_data *)data->img[n].bm.data, | 203 | display->transparent_bitmap_part((fb_data *)img->bm.data, |
225 | 0, data->img[n].subimage_height * subimage, | 204 | 0, img->subimage_height * subimage, |
226 | data->img[n].bm.width, data->img[n].x, | 205 | img->bm.width, img->x, |
227 | data->img[n].y, data->img[n].bm.width, | 206 | img->y, img->bm.width, |
228 | data->img[n].subimage_height); | 207 | img->subimage_height); |
229 | } | 208 | } |
230 | #endif | 209 | #endif |
231 | } | 210 | } |
@@ -235,22 +214,25 @@ static void wps_display_images(struct gui_wps *gwps, struct viewport* vp) | |||
235 | if(!gwps || !gwps->data || !gwps->display) | 214 | if(!gwps || !gwps->data || !gwps->display) |
236 | return; | 215 | return; |
237 | 216 | ||
238 | int n; | ||
239 | struct wps_data *data = gwps->data; | 217 | struct wps_data *data = gwps->data; |
240 | struct screen *display = gwps->display; | 218 | struct screen *display = gwps->display; |
219 | struct skin_token_list *list = data->images; | ||
241 | 220 | ||
242 | for (n = 0; n < MAX_IMAGES; n++) | 221 | while (list) |
243 | { | 222 | { |
244 | if (data->img[n].loaded) | 223 | struct gui_img *img = (struct gui_img*)list->token->value.data; |
224 | if (img->loaded) | ||
245 | { | 225 | { |
246 | if (data->img[n].display >= 0) | 226 | if (img->display >= 0) |
247 | { | 227 | { |
248 | wps_draw_image(gwps, n, data->img[n].display); | 228 | wps_draw_image(gwps, img, img->display); |
249 | } else if (data->img[n].always_display && data->img[n].vp == vp) | 229 | } |
230 | else if (img->always_display && img->vp == vp) | ||
250 | { | 231 | { |
251 | wps_draw_image(gwps, n, 0); | 232 | wps_draw_image(gwps, img, 0); |
252 | } | 233 | } |
253 | } | 234 | } |
235 | list = list->next; | ||
254 | } | 236 | } |
255 | display->set_drawmode(DRMODE_SOLID); | 237 | display->set_drawmode(DRMODE_SOLID); |
256 | } | 238 | } |
@@ -484,7 +466,7 @@ static bool evaluate_conditional(struct gui_wps *gwps, int *token_index) | |||
484 | #ifdef HAVE_LCD_BITMAP | 466 | #ifdef HAVE_LCD_BITMAP |
485 | /* clear all pictures in the conditional and nested ones */ | 467 | /* clear all pictures in the conditional and nested ones */ |
486 | if (data->tokens[i].type == WPS_TOKEN_IMAGE_PRELOAD_DISPLAY) | 468 | if (data->tokens[i].type == WPS_TOKEN_IMAGE_PRELOAD_DISPLAY) |
487 | clear_image_pos(gwps, data->tokens[i].value.i & 0xFF); | 469 | clear_image_pos(gwps, find_image(data->tokens[i].value.i&0xFF, gwps->data)); |
488 | #endif | 470 | #endif |
489 | #ifdef HAVE_ALBUMART | 471 | #ifdef HAVE_ALBUMART |
490 | if (data->tokens[i].type == WPS_TOKEN_ALBUMART_DISPLAY) | 472 | if (data->tokens[i].type == WPS_TOKEN_ALBUMART_DISPLAY) |
@@ -494,7 +476,20 @@ static bool evaluate_conditional(struct gui_wps *gwps, int *token_index) | |||
494 | 476 | ||
495 | return true; | 477 | return true; |
496 | } | 478 | } |
497 | 479 | struct gui_img* find_image(int n, struct wps_data *data) | |
480 | { | ||
481 | struct skin_token_list *list = data->images; | ||
482 | while (list) | ||
483 | { | ||
484 | struct gui_img *img = (struct gui_img *)list->token->value.data; | ||
485 | if (img->id == n) | ||
486 | return img; | ||
487 | list = list->next; | ||
488 | } | ||
489 | return NULL; | ||
490 | } | ||
491 | |||
492 | |||
498 | /* Read a (sub)line to the given alignment format buffer. | 493 | /* Read a (sub)line to the given alignment format buffer. |
499 | linebuf is the buffer where the data is actually stored. | 494 | linebuf is the buffer where the data is actually stored. |
500 | align is the alignment format that'll be used to display the text. | 495 | align is the alignment format that'll be used to display the text. |
@@ -544,12 +539,12 @@ static bool get_line(struct gui_wps *gwps, | |||
544 | #ifdef HAVE_LCD_BITMAP | 539 | #ifdef HAVE_LCD_BITMAP |
545 | case WPS_TOKEN_IMAGE_PRELOAD_DISPLAY: | 540 | case WPS_TOKEN_IMAGE_PRELOAD_DISPLAY: |
546 | { | 541 | { |
547 | struct gui_img *img = data->img; | ||
548 | int n = data->tokens[i].value.i & 0xFF; | 542 | int n = data->tokens[i].value.i & 0xFF; |
549 | int subimage = data->tokens[i].value.i >> 8; | 543 | int subimage = data->tokens[i].value.i >> 8; |
544 | struct gui_img *img = find_image(n, data); | ||
550 | 545 | ||
551 | if (n >= 0 && n < MAX_IMAGES && img[n].loaded) | 546 | if (img && img->loaded) |
552 | img[n].display = subimage; | 547 | img->display = subimage; |
553 | break; | 548 | break; |
554 | } | 549 | } |
555 | #endif | 550 | #endif |
@@ -992,9 +987,12 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
992 | 987 | ||
993 | #ifdef HAVE_LCD_BITMAP | 988 | #ifdef HAVE_LCD_BITMAP |
994 | /* Set images to not to be displayed */ | 989 | /* Set images to not to be displayed */ |
995 | for (i = 0; i < MAX_IMAGES; i++) | 990 | struct skin_token_list *imglist = data->images; |
991 | while (imglist) | ||
996 | { | 992 | { |
997 | data->img[i].display = -1; | 993 | struct gui_img *img = (struct gui_img *)imglist->token->value.data; |
994 | img->display = -1; | ||
995 | imglist = imglist->next; | ||
998 | } | 996 | } |
999 | #endif | 997 | #endif |
1000 | /* dont redraw the viewport if its disabled */ | 998 | /* dont redraw the viewport if its disabled */ |