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/plugins/lib/osd.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/plugins/lib/osd.c')
-rw-r--r-- | apps/plugins/lib/osd.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/apps/plugins/lib/osd.c b/apps/plugins/lib/osd.c index 97db09cc1e..7d6e10a410 100644 --- a/apps/plugins/lib/osd.c +++ b/apps/plugins/lib/osd.c | |||
@@ -52,6 +52,7 @@ struct osd | |||
52 | OSD_ERASED, /* Erased in preparation for regular drawing */ | 52 | OSD_ERASED, /* Erased in preparation for regular drawing */ |
53 | } status; /* View status */ | 53 | } status; /* View status */ |
54 | struct viewport vp; /* Clipping viewport */ | 54 | struct viewport vp; /* Clipping viewport */ |
55 | struct frame_buffer_t framebuf; /* Holds framebuffer reference */ | ||
55 | int lcd_bitmap_stride; /* Stride of LCD bitmap */ | 56 | int lcd_bitmap_stride; /* Stride of LCD bitmap */ |
56 | void *lcd_bitmap_data; /* Backbuffer framebuffer data */ | 57 | void *lcd_bitmap_data; /* Backbuffer framebuffer data */ |
57 | int back_bitmap_stride; /* Stride of backbuffer bitmap */ | 58 | int back_bitmap_stride; /* Stride of backbuffer bitmap */ |
@@ -68,7 +69,7 @@ struct osd | |||
68 | int height); | 69 | int height); |
69 | void (*lcd_update)(void); | 70 | void (*lcd_update)(void); |
70 | void (*lcd_update_rect)(int x, int y, int width, int height); | 71 | void (*lcd_update_rect)(int x, int y, int width, int height); |
71 | void (*lcd_set_viewport)(struct viewport *vp); | 72 | struct viewport *(*lcd_set_viewport)(struct viewport *vp); |
72 | void (*lcd_set_framebuffer)(void *buf); | 73 | void (*lcd_set_framebuffer)(void *buf); |
73 | void (*lcd_framebuffer_set_pos)(int x, int y, int width, int height); | 74 | void (*lcd_framebuffer_set_pos)(int x, int y, int width, int height); |
74 | void (*lcd_bitmap_part)(const void *src, int src_x, int src_y, | 75 | void (*lcd_bitmap_part)(const void *src, int src_x, int src_y, |
@@ -227,7 +228,8 @@ static void * _osd_lcd_init_buffers(struct osd *osd, unsigned flags, | |||
227 | osd->back_bitmap_stride = w; | 228 | osd->back_bitmap_stride = w; |
228 | #endif /* end stride type selection */ | 229 | #endif /* end stride type selection */ |
229 | 230 | ||
230 | osd->lcd_bitmap_data = (void *)*rb->lcd_framebuffer; | 231 | /* vp is currently initialized to the default framebuffer */ |
232 | osd->lcd_bitmap_data = osd->vp.buffer->data; | ||
231 | osd->back_bitmap_data = buf; | 233 | osd->back_bitmap_data = buf; |
232 | 234 | ||
233 | osd->maxwidth = w; | 235 | osd->maxwidth = w; |
@@ -686,6 +688,25 @@ static void _osd_lcd_update_rect(struct osd *osd, | |||
686 | osd->lcd_update_rect(x, y, width, height); | 688 | osd->lcd_update_rect(x, y, width, height); |
687 | } | 689 | } |
688 | 690 | ||
691 | static void _osd_lcd_viewport_set_buffer(void *buffer) | ||
692 | { | ||
693 | if (buffer) | ||
694 | { | ||
695 | native_osd.framebuf.data = buffer; | ||
696 | native_osd.framebuf.elems = native_osd.maxheight * native_osd.maxwidth; | ||
697 | native_osd.framebuf.get_address_fn = NULL; /*Default iterator*/ | ||
698 | |||
699 | if (buffer == native_osd.back_bitmap_data) | ||
700 | native_osd.framebuf.stride = (native_osd.back_bitmap_stride); | ||
701 | else | ||
702 | native_osd.framebuf.stride = (native_osd.lcd_bitmap_stride); | ||
703 | |||
704 | rb->viewport_set_buffer(NULL, &native_osd.framebuf, SCREEN_MAIN); | ||
705 | } | ||
706 | else | ||
707 | rb->viewport_set_buffer(NULL, NULL, SCREEN_MAIN); | ||
708 | } | ||
709 | |||
689 | /* Native LCD, public */ | 710 | /* Native LCD, public */ |
690 | bool osd_init(unsigned flags, void *backbuf, size_t backbuf_size, | 711 | bool osd_init(unsigned flags, void *backbuf, size_t backbuf_size, |
691 | osd_draw_cb_fn_t draw_cb, int *width, int *height, | 712 | osd_draw_cb_fn_t draw_cb, int *width, int *height, |
@@ -696,7 +717,7 @@ bool osd_init(unsigned flags, void *backbuf, size_t backbuf_size, | |||
696 | native_osd.lcd_update = rb->lcd_update; | 717 | native_osd.lcd_update = rb->lcd_update; |
697 | native_osd.lcd_update_rect = rb->lcd_update_rect; | 718 | native_osd.lcd_update_rect = rb->lcd_update_rect; |
698 | native_osd.lcd_set_viewport = rb->lcd_set_viewport; | 719 | native_osd.lcd_set_viewport = rb->lcd_set_viewport; |
699 | native_osd.lcd_set_framebuffer = (void *)rb->lcd_set_framebuffer; | 720 | native_osd.lcd_set_framebuffer = (void *)_osd_lcd_viewport_set_buffer; |
700 | #if LCD_DEPTH < 4 | 721 | #if LCD_DEPTH < 4 |
701 | native_osd.lcd_framebuffer_set_pos = NULL; | 722 | native_osd.lcd_framebuffer_set_pos = NULL; |
702 | #endif /* LCD_DEPTH < 4 */ | 723 | #endif /* LCD_DEPTH < 4 */ |