summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine')
-rw-r--r--apps/gui/skin_engine/skin_backdrops.c25
-rw-r--r--apps/gui/skin_engine/skin_engine.c6
-rw-r--r--apps/gui/skin_engine/skin_engine.h2
-rw-r--r--apps/gui/skin_engine/skin_parser.c8
-rw-r--r--apps/gui/skin_engine/skin_render.c45
-rw-r--r--apps/gui/skin_engine/wps_internals.h1
6 files changed, 62 insertions, 25 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 243fc30a3a..caf705af54 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -204,11 +204,28 @@ bool skin_backdrops_preload(void)
204 return retval; 204 return retval;
205} 205}
206 206
207void* skin_backdrop_get_buffer(int backdrop_id) 207void skin_backdrop_set_buffer(int backdrop_id, struct skin_viewport *svp)
208{ 208{
209 if (backdrop_id < 0) 209 if (UNLIKELY(!svp))
210 return NULL; 210 return;
211 return backdrops[backdrop_id].buffer; 211 else if (backdrop_id < 0)
212 {
213 svp->vp.buffer = NULL; /*Default*/
214 return;
215 }
216
217 enum screen_type screen = backdrops[backdrop_id].screen;
218 svp->framebuf.ch_ptr = backdrops[backdrop_id].buffer;
219#if defined(HAVE_REMOTE_LCD)
220 if (screen == SCREEN_REMOTE)
221 svp->framebuf.elems = REMOTE_LCD_BACKDROP_BYTES / sizeof(fb_remote_data);
222 else
223#endif
224 {
225 svp->framebuf.elems = LCD_BACKDROP_BYTES / sizeof(fb_data);
226 }
227 svp->framebuf.get_address_fn = NULL; /*Default iterator*/
228 screens[screen].viewport_set_buffer(&svp->vp, &svp->framebuf);
212} 229}
213 230
214void skin_backdrop_show(int backdrop_id) 231void skin_backdrop_show(int backdrop_id)
diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c
index cd763def1c..049629b181 100644
--- a/apps/gui/skin_engine/skin_engine.c
+++ b/apps/gui/skin_engine/skin_engine.c
@@ -312,7 +312,11 @@ struct wps_state *skin_get_global_state(void)
312bool skin_do_full_update(enum skinnable_screens skin, 312bool skin_do_full_update(enum skinnable_screens skin,
313 enum screen_type screen) 313 enum screen_type screen)
314{ 314{
315 bool ret = skins[skin][screen].needs_full_update; 315 struct viewport *vp = *(screens[screen].current_viewport);
316
317 bool vp_is_dirty = ((vp->flags & VP_FLAG_VP_SET_CLEAN) == VP_FLAG_VP_DIRTY);
318
319 bool ret = (skins[skin][screen].needs_full_update || vp_is_dirty);
316 skins[skin][screen].needs_full_update = false; 320 skins[skin][screen].needs_full_update = false;
317 return ret; 321 return ret;
318} 322}
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index 55839608be..3b757a5f8b 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -70,7 +70,7 @@ void skin_backdrop_show(int backdrop_id);
70void skin_backdrop_load_setting(void); 70void skin_backdrop_load_setting(void);
71void skin_backdrop_unload(int backdrop_id); 71void skin_backdrop_unload(int backdrop_id);
72#define BACKDROP_BUFFERNAME "#backdrop_buffer#" 72#define BACKDROP_BUFFERNAME "#backdrop_buffer#"
73void* skin_backdrop_get_buffer(int backdrop_id); 73void skin_backdrop_set_buffer(int backdrop_id, struct skin_viewport *svp);
74 74
75/* do the button loop as often as required for the peak meters to update 75/* do the button loop as often as required for the peak meters to update
76 * with a good refresh rate. 76 * with a good refresh rate.
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index f3a23377ef..e1a8118190 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -259,7 +259,7 @@ static int parse_statusbar_tags(struct skin_element* element,
259 } 259 }
260 else 260 else
261 { 261 {
262 struct skin_viewport *default_vp = SKINOFFSETTOPTR(skin_buffer, first_viewport->data); 262 struct skin_viewport *skin_default = SKINOFFSETTOPTR(skin_buffer, first_viewport->data);
263 if (first_viewport->params_count == 0) 263 if (first_viewport->params_count == 0)
264 { 264 {
265 wps_data->wps_sb_tag = true; 265 wps_data->wps_sb_tag = true;
@@ -267,11 +267,11 @@ static int parse_statusbar_tags(struct skin_element* element,
267 } 267 }
268 if (wps_data->show_sb_on_wps) 268 if (wps_data->show_sb_on_wps)
269 { 269 {
270 viewport_set_defaults(&default_vp->vp, curr_screen); 270 viewport_set_defaults(&skin_default->vp, curr_screen);
271 } 271 }
272 else 272 else
273 { 273 {
274 viewport_set_fullscreen(&default_vp->vp, curr_screen); 274 viewport_set_fullscreen(&skin_default->vp, curr_screen);
275 } 275 }
276#ifdef HAVE_REMOTE_LCD 276#ifdef HAVE_REMOTE_LCD
277 /* This parser requires viewports which will use the settings font to 277 /* This parser requires viewports which will use the settings font to
@@ -279,7 +279,7 @@ static int parse_statusbar_tags(struct skin_element* element,
279 * the current real font id. So force 1 here it will be set correctly 279 * the current real font id. So force 1 here it will be set correctly
280 * at the end 280 * at the end
281 */ 281 */
282 default_vp->vp.font = 1; 282 skin_default->vp.font = 1;
283#endif 283#endif
284 } 284 }
285 return 0; 285 return 0;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 51c58fc196..00981f5b67 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -349,6 +349,8 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
349{ 349{
350 struct gui_wps *gwps = info->gwps; 350 struct gui_wps *gwps = info->gwps;
351 struct wps_data *data = gwps->data; 351 struct wps_data *data = gwps->data;
352 struct viewport *last_vp;
353
352 /* Tags here are ones which need to be "turned off" or cleared 354 /* Tags here are ones which need to be "turned off" or cleared
353 * if they are in a conditional branch which isnt being used */ 355 * if they are in a conditional branch which isnt being used */
354 if (branch->type == LINE_ALTERNATOR) 356 if (branch->type == LINE_ALTERNATOR)
@@ -420,22 +422,23 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
420#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 422#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
421 if (skin_viewport->output_to_backdrop_buffer) 423 if (skin_viewport->output_to_backdrop_buffer)
422 { 424 {
423 void *backdrop = skin_backdrop_get_buffer(data->backdrop_id); 425 skin_backdrop_set_buffer(data->backdrop_id, skin_viewport);
424 gwps->display->set_framebuffer(backdrop);
425 skin_backdrop_show(-1); 426 skin_backdrop_show(-1);
426 } 427 }
427#endif 428#endif
428 gwps->display->set_viewport(&skin_viewport->vp); 429 last_vp = gwps->display->set_viewport(&skin_viewport->vp);
429 gwps->display->clear_viewport(); 430 gwps->display->clear_viewport();
430 gwps->display->set_viewport(&info->skin_vp->vp); 431 gwps->display->set_viewport_ex(&info->skin_vp->vp, 0);
431 skin_viewport->hidden_flags |= VP_DRAW_HIDDEN; 432 skin_viewport->hidden_flags |= VP_DRAW_HIDDEN;
432 433
433#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 434#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
434 if (skin_viewport->output_to_backdrop_buffer) 435 if (skin_viewport->output_to_backdrop_buffer)
435 { 436 {
436 gwps->display->set_framebuffer(NULL); 437 gwps->display->set_viewport_ex(last_vp, 0);
437 skin_backdrop_show(data->backdrop_id); 438 skin_backdrop_show(data->backdrop_id);
438 } 439 }
440#else
441 (void)last_vp;
439#endif 442#endif
440 } 443 }
441 } 444 }
@@ -792,6 +795,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
792 795
793void skin_render(struct gui_wps *gwps, unsigned refresh_mode) 796void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
794{ 797{
798 const int vp_is_appearing = (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE);
795 struct wps_data *data = gwps->data; 799 struct wps_data *data = gwps->data;
796 struct screen *display = gwps->display; 800 struct screen *display = gwps->display;
797 801
@@ -801,7 +805,20 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
801 805
802 int old_refresh_mode = refresh_mode; 806 int old_refresh_mode = refresh_mode;
803 skin_buffer = get_skin_buffer(gwps->data); 807 skin_buffer = get_skin_buffer(gwps->data);
804 808
809 struct viewport* first_vp;
810 /* should already be the default buffer */
811 first_vp = display->set_viewport(NULL);
812
813 /* Framebuffer is likely dirty */
814 if ((refresh_mode&SKIN_REFRESH_ALL) == SKIN_REFRESH_ALL)
815 {
816 if ((first_vp->flags & VP_FLAG_VP_SET_CLEAN) == VP_FLAG_VP_DIRTY &&
817 get_current_activity() == ACTIVITY_WPS) /* only clear if in WPS */
818 {
819 display->clear_viewport();
820 }
821 }
805 822
806 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree); 823 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
807 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); 824 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
@@ -822,12 +839,12 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
822#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) 839#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
823 if (skin_viewport->output_to_backdrop_buffer) 840 if (skin_viewport->output_to_backdrop_buffer)
824 { 841 {
825 display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id)); 842 skin_backdrop_set_buffer(data->backdrop_id, skin_viewport);
826 skin_backdrop_show(-1); 843 skin_backdrop_show(-1);
827 } 844 }
828 else 845 else
829 { 846 {
830 display->set_framebuffer(NULL); 847 skin_backdrop_set_buffer(-1, skin_viewport);
831 skin_backdrop_show(data->backdrop_id); 848 skin_backdrop_show(data->backdrop_id);
832 } 849 }
833#endif 850#endif
@@ -842,15 +859,14 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
842 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN; 859 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN;
843 continue; 860 continue;
844 } 861 }
845 else if (((skin_viewport->hidden_flags& 862 else if ((skin_viewport->hidden_flags & vp_is_appearing) == vp_is_appearing)
846 (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))
847 == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)))
848 { 863 {
849 vp_refresh_mode = SKIN_REFRESH_ALL; 864 vp_refresh_mode = SKIN_REFRESH_ALL;
850 skin_viewport->hidden_flags = VP_DRAW_HIDEABLE; 865 skin_viewport->hidden_flags = VP_DRAW_HIDEABLE;
851 } 866 }
852 867
853 display->set_viewport(&skin_viewport->vp); 868 display->set_viewport_ex(&skin_viewport->vp, VP_FLAG_VP_SET_CLEAN);
869
854 if ((vp_refresh_mode&SKIN_REFRESH_ALL) == SKIN_REFRESH_ALL) 870 if ((vp_refresh_mode&SKIN_REFRESH_ALL) == SKIN_REFRESH_ALL)
855 { 871 {
856 display->clear_viewport(); 872 display->clear_viewport();
@@ -862,7 +878,6 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
862 refresh_mode = old_refresh_mode; 878 refresh_mode = old_refresh_mode;
863 } 879 }
864#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 880#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
865 display->set_framebuffer(NULL);
866 skin_backdrop_show(data->backdrop_id); 881 skin_backdrop_show(data->backdrop_id);
867#endif 882#endif
868 883
@@ -872,8 +887,8 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
872 * to redraw itself */ 887 * to redraw itself */
873 send_event(GUI_EVENT_NEED_UI_UPDATE, NULL); 888 send_event(GUI_EVENT_NEED_UI_UPDATE, NULL);
874 } 889 }
875 /* Restore the default viewport */ 890 /* Restore the first viewport */
876 display->set_viewport(NULL); 891 display->set_viewport_ex(first_vp, VP_FLAG_VP_SET_CLEAN);
877 display->update(); 892 display->update();
878} 893}
879 894
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index b7d7ff35d0..bf7f52bdbf 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -175,6 +175,7 @@ struct gradient_config {
175#define VP_DEFAULT_LABEL_STRING "|" 175#define VP_DEFAULT_LABEL_STRING "|"
176struct skin_viewport { 176struct skin_viewport {
177 struct viewport vp; /* The LCD viewport struct */ 177 struct viewport vp; /* The LCD viewport struct */
178 struct frame_buffer_t framebuf;
178 char hidden_flags; 179 char hidden_flags;
179 bool is_infovp; 180 bool is_infovp;
180 OFFSETTYPE(char*) label; 181 OFFSETTYPE(char*) label;