summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r--apps/gui/skin_engine/skin_display.c102
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 @@
68static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode); 68static 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 */
73static 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 */
88void skin_data_init(struct wps_data *wps_data) 72void 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 */
194static void clear_image_pos(struct gui_wps *gwps, int n) 176static 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
205static void wps_draw_image(struct gui_wps *gwps, int n, int subimage) 185static 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 479struct 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 */