diff options
author | William Wilgus <wilgus.william@gmail.com> | 2020-10-07 02:01:35 -0400 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2020-10-26 12:28:48 -0400 |
commit | 3237ae4a4ff9296a377ff9194a11038da161208f (patch) | |
tree | af4338c78467b9b0845d76c39da1fbe10f25e23e /apps/gui/viewport.c | |
parent | 12f3ed1699d6bef25bed90ba95cbcc1a6bb4934a (diff) | |
download | rockbox-3237ae4a4ff9296a377ff9194a11038da161208f.tar.gz rockbox-3237ae4a4ff9296a377ff9194a11038da161208f.zip |
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
Diffstat (limited to 'apps/gui/viewport.c')
-rw-r--r-- | apps/gui/viewport.c | 26 |
1 files changed, 22 insertions, 4 deletions
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 @@ | |||
31 | #include "settings.h" | 31 | #include "settings.h" |
32 | #include "misc.h" | 32 | #include "misc.h" |
33 | #include "list.h" | 33 | #include "list.h" |
34 | |||
34 | /*some short cuts for fg/bg/line selector handling */ | 35 | /*some short cuts for fg/bg/line selector handling */ |
35 | #ifdef HAVE_LCD_COLOR | 36 | #ifdef HAVE_LCD_COLOR |
36 | #define FG_FALLBACK global_settings.fg_color | 37 | #define FG_FALLBACK global_settings.fg_color |
@@ -44,7 +45,6 @@ | |||
44 | #define REMOTE_BG_FALLBACK LCD_REMOTE_DEFAULT_BG | 45 | #define REMOTE_BG_FALLBACK LCD_REMOTE_DEFAULT_BG |
45 | #endif | 46 | #endif |
46 | 47 | ||
47 | |||
48 | /* all below isn't needed for pc tools (i.e. checkwps/wps editor) | 48 | /* all below isn't needed for pc tools (i.e. checkwps/wps editor) |
49 | * only viewport_parse_viewport() is */ | 49 | * only viewport_parse_viewport() is */ |
50 | #ifndef __PCTOOL__ | 50 | #ifndef __PCTOOL__ |
@@ -101,6 +101,7 @@ static void toggle_theme(enum screen_type screen, bool force) | |||
101 | bool enable_event = false; | 101 | bool enable_event = false; |
102 | static bool was_enabled[NB_SCREENS] = {false}; | 102 | static bool was_enabled[NB_SCREENS] = {false}; |
103 | static bool after_boot[NB_SCREENS] = {false}; | 103 | static bool after_boot[NB_SCREENS] = {false}; |
104 | struct viewport *last_vp; | ||
104 | 105 | ||
105 | FOR_NB_SCREENS(i) | 106 | FOR_NB_SCREENS(i) |
106 | { | 107 | { |
@@ -111,6 +112,7 @@ static void toggle_theme(enum screen_type screen, bool force) | |||
111 | 112 | ||
112 | if (is_theme_enabled(screen)) | 113 | if (is_theme_enabled(screen)) |
113 | { | 114 | { |
115 | last_vp = screens[screen].set_viewport(NULL); | ||
114 | bool first_boot = theme_stack_top[screen] == 0; | 116 | bool first_boot = theme_stack_top[screen] == 0; |
115 | /* remove the left overs from the previous screen. | 117 | /* remove the left overs from the previous screen. |
116 | * could cause a tiny flicker. Redo your screen code if that happens */ | 118 | * 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) | |||
162 | screens[screen].clear_viewport(); | 164 | screens[screen].clear_viewport(); |
163 | screens[screen].update_viewport(); | 165 | screens[screen].update_viewport(); |
164 | } | 166 | } |
165 | screens[screen].set_viewport(NULL); | 167 | screens[screen].set_viewport(last_vp); |
166 | } | 168 | } |
167 | intptr_t force = first_boot?0:1; | 169 | intptr_t force = first_boot?0:1; |
168 | 170 | ||
@@ -282,11 +284,11 @@ static void set_default_align_flags(struct viewport *vp) | |||
282 | void viewport_set_fullscreen(struct viewport *vp, | 284 | void viewport_set_fullscreen(struct viewport *vp, |
283 | const enum screen_type screen) | 285 | const enum screen_type screen) |
284 | { | 286 | { |
287 | screens[screen].init_viewport(vp); | ||
285 | vp->x = 0; | 288 | vp->x = 0; |
286 | vp->y = 0; | 289 | vp->y = 0; |
287 | vp->width = screens[screen].lcdwidth; | 290 | vp->width = screens[screen].lcdwidth; |
288 | vp->height = screens[screen].lcdheight; | 291 | vp->height = screens[screen].lcdheight; |
289 | |||
290 | #ifndef __PCTOOL__ | 292 | #ifndef __PCTOOL__ |
291 | set_default_align_flags(vp); | 293 | set_default_align_flags(vp); |
292 | #endif | 294 | #endif |
@@ -312,9 +314,25 @@ void viewport_set_fullscreen(struct viewport *vp, | |||
312 | #endif | 314 | #endif |
313 | } | 315 | } |
314 | 316 | ||
317 | void viewport_set_buffer(struct viewport *vp, struct frame_buffer_t *buffer, | ||
318 | const enum screen_type screen) | ||
319 | { | ||
320 | if (!vp) /* NULL vp grabs current framebuffer */ | ||
321 | vp = *(screens[screen].current_viewport); | ||
322 | |||
323 | /* NULL sets default buffer */ | ||
324 | if (buffer && buffer->elems == 0) | ||
325 | vp->buffer = NULL; | ||
326 | else | ||
327 | vp->buffer = buffer; | ||
328 | screens[screen].init_viewport(vp); | ||
329 | } | ||
330 | |||
315 | void viewport_set_defaults(struct viewport *vp, | 331 | void viewport_set_defaults(struct viewport *vp, |
316 | const enum screen_type screen) | 332 | const enum screen_type screen) |
317 | { | 333 | { |
334 | vp->buffer = NULL; /* use default frame_buffer */ | ||
335 | |||
318 | #if !defined(__PCTOOL__) | 336 | #if !defined(__PCTOOL__) |
319 | struct viewport *sbs_area = NULL; | 337 | struct viewport *sbs_area = NULL; |
320 | if (!is_theme_enabled(screen)) | 338 | if (!is_theme_enabled(screen)) |
@@ -323,7 +341,7 @@ void viewport_set_defaults(struct viewport *vp, | |||
323 | return; | 341 | return; |
324 | } | 342 | } |
325 | sbs_area = sb_skin_get_info_vp(screen); | 343 | sbs_area = sb_skin_get_info_vp(screen); |
326 | 344 | ||
327 | if (sbs_area) | 345 | if (sbs_area) |
328 | *vp = *sbs_area; | 346 | *vp = *sbs_area; |
329 | else | 347 | else |