From 3237ae4a4ff9296a377ff9194a11038da161208f Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Wed, 7 Oct 2020 02:01:35 -0400 Subject: LCD core move buf ptr and address look up function viewport struct I'm currently running up against the limitations of the lcd_draw functions I want these functions to be able to be used on any size buffer not just buffers with a stride matching the underlying device [DONE] allow the framebuffer to be decoupled from the device framebuffer [DONE need examples] allow for some simple blit like transformations [DONE] remove the device framebuffer from the plugin api [DONE}ditto remote framebuffer [DONE] remove _viewport_get_framebuffer you can call struct *vp = lcd_set_viewport(NULL) and vp->buffer->fb_ptr while remote lcds may compile (and work in the sim) its not been tested on targets [FIXED] backdrops need work to be screen agnostic [FIXED] screen statusbar is not being combined into the main viewport correctly yet [FIXED] screen elements are displayed incorrectly after switch to void* [FIXED] core didn't restore proper viewport on splash etc. [NEEDS TESTING] remote lcd garbled data [FIXED] osd lib garbled screen on bmp_part [FIXED] grey_set_vp needs to return old viewport like lcd_set_viewport [FIXED] Viewport update now handles viewports with differing buffers/strides by copying to the main buffer [FIXED] splash on top of WPS leaves old framebuffer data (doesn't redraw) [UPDATE] refined this a bit more to have clear_viewport set the clean bit and have skin_render do its own screen clear scrolling viewports no longer trigger wps refresh also fixed a bug where guisyncyesno was displaying and then disappearing [ADDED!] New LCD macros that allow you to create properly size frame buffers in you desired size without wasting bytes (LCD_ and LCD_REMOTE_) LCD_STRIDE(w, h) same as STRIDE_MAIN LCD_FBSTRIDE(w, h) returns target specific stride for a buffer W x H LCD_NBELEMS(w, h) returns the number of fb_data sized elemenst needed for a buffer W x H LCD_NATIVE_STRIDE(s) conversion between rockbox native vertical and lcd native stride (2bitH) test_viewports.c has an example of usage [FIXED!!] 2bit targets don't respect non-native strides [FIXED] Few define snags Change-Id: I0d04c3834e464eca84a5a715743a297a0cefd0af --- apps/gui/viewport.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'apps/gui/viewport.c') diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c index db58b5d72d..9fdf88e8f0 100644 --- a/apps/gui/viewport.c +++ b/apps/gui/viewport.c @@ -31,6 +31,7 @@ #include "settings.h" #include "misc.h" #include "list.h" + /*some short cuts for fg/bg/line selector handling */ #ifdef HAVE_LCD_COLOR #define FG_FALLBACK global_settings.fg_color @@ -44,7 +45,6 @@ #define REMOTE_BG_FALLBACK LCD_REMOTE_DEFAULT_BG #endif - /* all below isn't needed for pc tools (i.e. checkwps/wps editor) * only viewport_parse_viewport() is */ #ifndef __PCTOOL__ @@ -101,6 +101,7 @@ static void toggle_theme(enum screen_type screen, bool force) bool enable_event = false; static bool was_enabled[NB_SCREENS] = {false}; static bool after_boot[NB_SCREENS] = {false}; + struct viewport *last_vp; FOR_NB_SCREENS(i) { @@ -111,6 +112,7 @@ static void toggle_theme(enum screen_type screen, bool force) if (is_theme_enabled(screen)) { + last_vp = screens[screen].set_viewport(NULL); bool first_boot = theme_stack_top[screen] == 0; /* remove the left overs from the previous screen. * could cause a tiny flicker. Redo your screen code if that happens */ @@ -162,7 +164,7 @@ static void toggle_theme(enum screen_type screen, bool force) screens[screen].clear_viewport(); screens[screen].update_viewport(); } - screens[screen].set_viewport(NULL); + screens[screen].set_viewport(last_vp); } intptr_t force = first_boot?0:1; @@ -282,11 +284,11 @@ static void set_default_align_flags(struct viewport *vp) void viewport_set_fullscreen(struct viewport *vp, const enum screen_type screen) { + screens[screen].init_viewport(vp); vp->x = 0; vp->y = 0; vp->width = screens[screen].lcdwidth; vp->height = screens[screen].lcdheight; - #ifndef __PCTOOL__ set_default_align_flags(vp); #endif @@ -312,9 +314,25 @@ void viewport_set_fullscreen(struct viewport *vp, #endif } +void viewport_set_buffer(struct viewport *vp, struct frame_buffer_t *buffer, + const enum screen_type screen) +{ + if (!vp) /* NULL vp grabs current framebuffer */ + vp = *(screens[screen].current_viewport); + + /* NULL sets default buffer */ + if (buffer && buffer->elems == 0) + vp->buffer = NULL; + else + vp->buffer = buffer; + screens[screen].init_viewport(vp); +} + void viewport_set_defaults(struct viewport *vp, const enum screen_type screen) { + vp->buffer = NULL; /* use default frame_buffer */ + #if !defined(__PCTOOL__) struct viewport *sbs_area = NULL; if (!is_theme_enabled(screen)) @@ -323,7 +341,7 @@ void viewport_set_defaults(struct viewport *vp, return; } sbs_area = sb_skin_get_info_vp(screen); - + if (sbs_area) *vp = *sbs_area; else -- cgit v1.2.3