summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_render.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_render.c')
-rw-r--r--apps/gui/skin_engine/skin_render.c45
1 files changed, 30 insertions, 15 deletions
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