summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_backdrops.c34
-rw-r--r--apps/gui/skin_engine/skin_engine.h2
-rw-r--r--apps/gui/skin_engine/skin_parser.c6
-rw-r--r--apps/gui/skin_engine/skin_render.c27
-rw-r--r--apps/gui/skin_engine/wps_internals.h3
-rw-r--r--apps/screen_access.c6
-rw-r--r--apps/screen_access.h3
-rw-r--r--firmware/drivers/lcd-bitmap-common.c8
-rw-r--r--firmware/export/lcd-remote.h1
-rw-r--r--firmware/export/lcd.h1
-rw-r--r--lib/skin_parser/tag_table.c1
-rw-r--r--lib/skin_parser/tag_table.h3
-rw-r--r--manual/appendix/wps_tags.tex2
13 files changed, 87 insertions, 10 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 12b21ccb50..15b68589a9 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -95,6 +95,10 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir,
95 filename[2] = '\0'; /* we check this later to see if we actually have an 95 filename[2] = '\0'; /* we check this later to see if we actually have an
96 image to load. != '\0' means display the image */ 96 image to load. != '\0' means display the image */
97 } 97 }
98 else if (!strcmp(backdrop, BACKDROP_BUFFERNAME))
99 {
100 strcpy(filename, backdrop);
101 }
98 else 102 else
99 { 103 {
100 get_image_filename(backdrop, bmpdir, filename, sizeof(filename)); 104 get_image_filename(backdrop, bmpdir, filename, sizeof(filename));
@@ -156,15 +160,20 @@ bool skin_backdrops_preload(void)
156 { 160 {
157 backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle); 161 backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle);
158 handle_being_loaded = backdrops[i].buflib_handle; 162 handle_being_loaded = backdrops[i].buflib_handle;
159 backdrops[i].loaded = 163 if (strcmp(filename, BACKDROP_BUFFERNAME))
160 screens[screen].backdrop_load(filename, backdrops[i].buffer);
161 handle_being_loaded = -1;
162 if (!backdrops[i].loaded)
163 { 164 {
164 core_free(backdrops[i].buflib_handle); 165 backdrops[i].loaded =
165 backdrops[i].buflib_handle = -1; 166 screens[screen].backdrop_load(filename, backdrops[i].buffer);
166 retval = false; 167 handle_being_loaded = -1;
168 if (!backdrops[i].loaded)
169 {
170 core_free(backdrops[i].buflib_handle);
171 backdrops[i].buflib_handle = -1;
172 retval = false;
173 }
167 } 174 }
175 else
176 backdrops[i].loaded = true;
168 } 177 }
169 else 178 else
170 retval = false; 179 retval = false;
@@ -176,10 +185,21 @@ bool skin_backdrops_preload(void)
176 return retval; 185 return retval;
177} 186}
178 187
188void* skin_backdrop_get_buffer(int backdrop_id)
189{
190 if (backdrop_id < 0)
191 return NULL;
192 return backdrops[backdrop_id].buffer;
193}
194
179void skin_backdrop_show(int backdrop_id) 195void skin_backdrop_show(int backdrop_id)
180{ 196{
181 if (backdrop_id < 0) 197 if (backdrop_id < 0)
198 {
199 screens[0].backdrop_show(NULL);
200 current_lcd_backdrop[0] = -1;
182 return; 201 return;
202 }
183 enum screen_type screen = backdrops[backdrop_id].screen; 203 enum screen_type screen = backdrops[backdrop_id].screen;
184 if ((backdrops[backdrop_id].loaded == false) || 204 if ((backdrops[backdrop_id].loaded == false) ||
185 (backdrops[backdrop_id].name[0] == '-' && 205 (backdrops[backdrop_id].name[0] == '-' &&
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index ac839fff2e..625467ea3b 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -70,6 +70,8 @@ bool skin_backdrops_preload(void);
70void skin_backdrop_show(int backdrop_id); 70void skin_backdrop_show(int backdrop_id);
71void skin_backdrop_load_setting(void); 71void skin_backdrop_load_setting(void);
72void skin_backdrop_unload(int backdrop_id); 72void skin_backdrop_unload(int backdrop_id);
73#define BACKDROP_BUFFERNAME "#backdrop_buffer#"
74void* skin_backdrop_get_buffer(int backdrop_id);
73 75
74/* do the button loop as often as required for the peak meters to update 76/* do the button loop as often as required for the peak meters to update
75 * with a good refresh rate. 77 * with a good refresh rate.
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 340cbbdb01..0fe8789bcb 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -1832,6 +1832,7 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element)
1832 viewport_set_defaults(&skin_vp->vp, curr_screen); 1832 viewport_set_defaults(&skin_vp->vp, curr_screen);
1833 1833
1834#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 1834#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
1835 skin_vp->output_to_backdrop_buffer = false;
1835 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; 1836 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern;
1836 skin_vp->start_bgcolour = skin_vp->vp.bg_pattern; 1837 skin_vp->start_bgcolour = skin_vp->vp.bg_pattern;
1837#endif 1838#endif
@@ -2023,6 +2024,11 @@ static int skin_element_callback(struct skin_element* element, void* data)
2023 case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: 2024 case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
2024 function = parse_viewporttextstyle; 2025 function = parse_viewporttextstyle;
2025 break; 2026 break;
2027 case SKIN_TOKEN_VIEWPORT_DRAWONBG:
2028 curr_vp->output_to_backdrop_buffer = true;
2029 backdrop_filename = BACKDROP_BUFFERNAME;
2030 wps_data->use_extra_framebuffer = true;
2031 break;
2026#endif 2032#endif
2027#ifdef HAVE_LCD_COLOR 2033#ifdef HAVE_LCD_COLOR
2028 case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP: 2034 case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP:
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 951d34a724..d4ddf99c34 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -385,11 +385,22 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
385 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN; 385 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN;
386 else 386 else
387 { 387 {
388 if (skin_viewport->output_to_backdrop_buffer)
389 {
390 void *backdrop = skin_backdrop_get_buffer(data->backdrop_id);
391 gwps->display->set_framebuffer(backdrop);
392 skin_backdrop_show(-1);
393 }
388 gwps->display->set_viewport(&skin_viewport->vp); 394 gwps->display->set_viewport(&skin_viewport->vp);
389 gwps->display->clear_viewport(); 395 gwps->display->clear_viewport();
390 gwps->display->scroll_stop(&skin_viewport->vp); 396 gwps->display->scroll_stop(&skin_viewport->vp);
391 gwps->display->set_viewport(&info->skin_vp->vp); 397 gwps->display->set_viewport(&info->skin_vp->vp);
392 skin_viewport->hidden_flags |= VP_DRAW_HIDDEN; 398 skin_viewport->hidden_flags |= VP_DRAW_HIDDEN;
399 if (skin_viewport->output_to_backdrop_buffer)
400 {
401 gwps->display->set_framebuffer(NULL);
402 skin_backdrop_show(data->backdrop_id);
403 }
393 } 404 }
394 } 405 }
395 } 406 }
@@ -767,6 +778,7 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
767 data->wps_progress_pat[i] = display->get_locked_pattern(); 778 data->wps_progress_pat[i] = display->get_locked_pattern();
768 } 779 }
769#endif 780#endif
781
770 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree); 782 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
771 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); 783 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
772 label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label); 784 label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label);
@@ -786,6 +798,16 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
786#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) 798#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
787 skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour; 799 skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour;
788 skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour; 800 skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour;
801 if (skin_viewport->output_to_backdrop_buffer)
802 {
803 display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id));
804 skin_backdrop_show(-1);
805 }
806 else
807 {
808 display->set_framebuffer(NULL);
809 skin_backdrop_show(data->backdrop_id);
810 }
789#endif 811#endif
790#ifdef HAVE_LCD_COLOR 812#ifdef HAVE_LCD_COLOR
791 skin_viewport->vp.lss_pattern = skin_viewport->start_gradient.start; 813 skin_viewport->vp.lss_pattern = skin_viewport->start_gradient.start;
@@ -822,7 +844,10 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
822 skin_viewport, vp_refresh_mode); 844 skin_viewport, vp_refresh_mode);
823 refresh_mode = old_refresh_mode; 845 refresh_mode = old_refresh_mode;
824 } 846 }
825 847#ifdef HAVE_LCD_BITMAP
848 display->set_framebuffer(NULL);
849 skin_backdrop_show(data->backdrop_id);
850#endif
826 /* Restore the default viewport */ 851 /* Restore the default viewport */
827 display->set_viewport(NULL); 852 display->set_viewport(NULL);
828 display->update(); 853 display->update();
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index c55c8d2515..1ea5dbf467 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -44,7 +44,6 @@
44#include "statusbar.h" 44#include "statusbar.h"
45#include "metadata.h" 45#include "metadata.h"
46 46
47
48#define TOKEN_VALUE_ONLY 0x0DEADC0D 47#define TOKEN_VALUE_ONLY 0x0DEADC0D
49 48
50/* wps_data*/ 49/* wps_data*/
@@ -166,6 +165,7 @@ struct skin_viewport {
166 OFFSETTYPE(char*) label; 165 OFFSETTYPE(char*) label;
167 int parsed_fontid; 166 int parsed_fontid;
168#if LCD_DEPTH > 1 167#if LCD_DEPTH > 1
168 bool output_to_backdrop_buffer;
169 unsigned start_fgcolour; 169 unsigned start_fgcolour;
170 unsigned start_bgcolour; 170 unsigned start_bgcolour;
171#ifdef HAVE_LCD_COLOR 171#ifdef HAVE_LCD_COLOR
@@ -328,6 +328,7 @@ struct wps_data
328#endif 328#endif
329#ifdef HAVE_BACKDROP_IMAGE 329#ifdef HAVE_BACKDROP_IMAGE
330 int backdrop_id; 330 int backdrop_id;
331 bool use_extra_framebuffer;
331#endif 332#endif
332 333
333#ifdef HAVE_TOUCHSCREEN 334#ifdef HAVE_TOUCHSCREEN
diff --git a/apps/screen_access.c b/apps/screen_access.c
index 5ab08b7fc5..43000e1360 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -262,6 +262,9 @@ struct screen screens[NB_SCREENS] =
262#ifdef HAVE_BUTTONBAR 262#ifdef HAVE_BUTTONBAR
263 .has_buttonbar=false, 263 .has_buttonbar=false,
264#endif 264#endif
265#if defined(HAVE_LCD_BITMAP)
266 .set_framebuffer = (void*)lcd_set_framebuffer,
267#endif
265 }, 268 },
266#if NB_SCREENS == 2 269#if NB_SCREENS == 2
267 { 270 {
@@ -357,6 +360,9 @@ struct screen screens[NB_SCREENS] =
357#ifdef HAVE_BUTTONBAR 360#ifdef HAVE_BUTTONBAR
358 .has_buttonbar=false, 361 .has_buttonbar=false,
359#endif 362#endif
363#if defined(HAVE_LCD_BITMAP)
364 .set_framebuffer = (void*)lcd_remote_set_framebuffer,
365#endif
360 } 366 }
361#endif /* NB_SCREENS == 2 */ 367#endif /* NB_SCREENS == 2 */
362}; 368};
diff --git a/apps/screen_access.h b/apps/screen_access.h
index a9d1408898..343829b915 100644
--- a/apps/screen_access.h
+++ b/apps/screen_access.h
@@ -160,6 +160,9 @@ struct screen
160 bool (*backdrop_load)(const char *filename, char* backdrop_buffer); 160 bool (*backdrop_load)(const char *filename, char* backdrop_buffer);
161 void (*backdrop_show)(char* backdrop_buffer); 161 void (*backdrop_show)(char* backdrop_buffer);
162#endif 162#endif
163#if defined(HAVE_LCD_BITMAP)
164 void (*set_framebuffer)(void *framebuffer);
165#endif
163}; 166};
164 167
165#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) 168#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD)
diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c
index f122e336d7..b0be687ed2 100644
--- a/firmware/drivers/lcd-bitmap-common.c
+++ b/firmware/drivers/lcd-bitmap-common.c
@@ -81,6 +81,14 @@ static void lcd_gradient_rect(int x1, int x2, int y, unsigned h,
81} 81}
82#endif 82#endif
83 83
84void LCDFN(set_framebuffer)(FBFN(data) *fb)
85{
86 if (fb)
87 LCDFN(framebuffer) = fb;
88 else
89 LCDFN(framebuffer) = &LCDFN(static_framebuffer)[0][0];
90}
91
84/* 92/*
85 * draws the borders of the current viewport 93 * draws the borders of the current viewport
86 **/ 94 **/
diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h
index 0f5f7ed6b7..1bb19a5cfa 100644
--- a/firmware/export/lcd-remote.h
+++ b/firmware/export/lcd-remote.h
@@ -132,6 +132,7 @@ void lcd_remote_init(void);
132void lcd_remote_write_command(int cmd); 132void lcd_remote_write_command(int cmd);
133void lcd_remote_write_command_ex(int cmd, int data); 133void lcd_remote_write_command_ex(int cmd, int data);
134void lcd_remote_write_data(const fb_remote_data *data, int count); 134void lcd_remote_write_data(const fb_remote_data *data, int count);
135extern void lcd_remote_set_framebuffer(fb_remote_data *fb);
135 136
136extern void lcd_remote_bitmap_part(const fb_remote_data *src, int src_x, 137extern void lcd_remote_bitmap_part(const fb_remote_data *src, int src_x,
137 int src_y, int stride, int x, int y, 138 int src_y, int stride, int x, int y,
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 052b368d9b..7e0e979821 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -529,6 +529,7 @@ extern void lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
529 int stride, int x, int y, int width, int height); 529 int stride, int x, int y, int width, int height);
530extern void lcd_bitmap(const fb_data *src, int x, int y, int width, 530extern void lcd_bitmap(const fb_data *src, int x, int y, int width,
531 int height); 531 int height);
532extern void lcd_set_framebuffer(fb_data *fb);
532 533
533extern void lcd_scroll_step(int pixels); 534extern void lcd_scroll_step(int pixels);
534 535
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index 9a183986ce..a44b2ef251 100644
--- a/lib/skin_parser/tag_table.c
+++ b/lib/skin_parser/tag_table.c
@@ -204,6 +204,7 @@ static const struct tag_info legal_tags[] =
204 { SKIN_TOKEN_VIEWPORT_BGCOLOUR, "Vb" , "s", SKIN_REFRESH_STATIC|NOBREAK }, 204 { SKIN_TOKEN_VIEWPORT_BGCOLOUR, "Vb" , "s", SKIN_REFRESH_STATIC|NOBREAK },
205 { SKIN_TOKEN_VIEWPORT_TEXTSTYLE, "Vs" , "S|s", SKIN_REFRESH_STATIC }, 205 { SKIN_TOKEN_VIEWPORT_TEXTSTYLE, "Vs" , "S|s", SKIN_REFRESH_STATIC },
206 { SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, "Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK }, 206 { SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, "Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK },
207 { SKIN_TOKEN_VIEWPORT_DRAWONBG, "VB" , "", SKIN_REFRESH_STATIC|NOBREAK },
207 208
208 { SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "SIIiii", 0 }, 209 { SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "SIIiii", 0 },
209 { SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "sIIiii", 0 }, 210 { SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "sIIiii", 0 },
diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
index d14d31fcb2..cf0096f28d 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -92,7 +92,8 @@ enum skin_token_type {
92 SKIN_TOKEN_VIEWPORT_BGCOLOUR, 92 SKIN_TOKEN_VIEWPORT_BGCOLOUR,
93 SKIN_TOKEN_VIEWPORT_TEXTSTYLE, 93 SKIN_TOKEN_VIEWPORT_TEXTSTYLE,
94 SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, 94 SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP,
95 95 SKIN_TOKEN_VIEWPORT_DRAWONBG,
96
96 /* Battery */ 97 /* Battery */
97 SKIN_TOKEN_BATTERY_PERCENT, 98 SKIN_TOKEN_BATTERY_PERCENT,
98 SKIN_TOKEN_BATTERY_PERCENTBAR, 99 SKIN_TOKEN_BATTERY_PERCENTBAR,
diff --git a/manual/appendix/wps_tags.tex b/manual/appendix/wps_tags.tex
index ba4cbd16ee..5890e20e93 100644
--- a/manual/appendix/wps_tags.tex
+++ b/manual/appendix/wps_tags.tex
@@ -91,6 +91,8 @@ show the information for the next song to be played.
91 91
92 \config{\%VI('label')} & Set the Info Viewport to use the viewport called 92 \config{\%VI('label')} & Set the Info Viewport to use the viewport called
93 label, as declared with the previous tag.\\ 93 label, as declared with the previous tag.\\
94
95 \config{\%VB} & Draw this viewport on the backdrop layer.
94 \end{tagmap} 96 \end{tagmap}
95 97
96 \section{Additional Fonts} 98 \section{Additional Fonts}