diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-28 22:26:32 +1100 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2012-02-28 23:03:04 +1100 |
commit | 2c71aa9feb0268da7d993feddbbe4db591fcd3ba (patch) | |
tree | 29b3c1480abca46813ef2dc3bb8f0862b596fe34 /apps/gui/skin_engine/skin_render.c | |
parent | 13f98df5ed6b8183d972f85a1bfe55cf02194941 (diff) | |
download | rockbox-2c71aa9feb0268da7d993feddbbe4db591fcd3ba.tar.gz rockbox-2c71aa9feb0268da7d993feddbbe4db591fcd3ba.zip |
lcd/skin_engine: Add the ability to draw onto the backdrop layer
The framebuffer the lcd driver uses can now be changed on the fly
which means that regular lcd_* drawing functions can draw onto the
"backdrop" buffer. The skin engine can use this to create layered
effects.
Add the tag %VB to a viewport to draw that viewport onto the
backdrop layer. If you want to draw an image onto the backdrop
framebuffer use %x(backdrop filename) instead of %X() inside
a viewport with %VB.
Change-Id: I741498e2af6d4f2d78932cabe8942317893e7cfc
Diffstat (limited to 'apps/gui/skin_engine/skin_render.c')
-rw-r--r-- | apps/gui/skin_engine/skin_render.c | 27 |
1 files changed, 26 insertions, 1 deletions
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, skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN; else { + if (skin_viewport->output_to_backdrop_buffer) + { + void *backdrop = skin_backdrop_get_buffer(data->backdrop_id); + gwps->display->set_framebuffer(backdrop); + skin_backdrop_show(-1); + } gwps->display->set_viewport(&skin_viewport->vp); gwps->display->clear_viewport(); gwps->display->scroll_stop(&skin_viewport->vp); gwps->display->set_viewport(&info->skin_vp->vp); skin_viewport->hidden_flags |= VP_DRAW_HIDDEN; + if (skin_viewport->output_to_backdrop_buffer) + { + gwps->display->set_framebuffer(NULL); + skin_backdrop_show(data->backdrop_id); + } } } } @@ -767,6 +778,7 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) data->wps_progress_pat[i] = display->get_locked_pattern(); } #endif + viewport = SKINOFFSETTOPTR(skin_buffer, data->tree); skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label); @@ -786,6 +798,16 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour; skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour; + if (skin_viewport->output_to_backdrop_buffer) + { + display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id)); + skin_backdrop_show(-1); + } + else + { + display->set_framebuffer(NULL); + skin_backdrop_show(data->backdrop_id); + } #endif #ifdef HAVE_LCD_COLOR skin_viewport->vp.lss_pattern = skin_viewport->start_gradient.start; @@ -822,7 +844,10 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) skin_viewport, vp_refresh_mode); refresh_mode = old_refresh_mode; } - +#ifdef HAVE_LCD_BITMAP + display->set_framebuffer(NULL); + skin_backdrop_show(data->backdrop_id); +#endif /* Restore the default viewport */ display->set_viewport(NULL); display->update(); |