summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/osd.c
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2020-10-07 02:01:35 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2020-10-26 12:28:48 -0400
commit3237ae4a4ff9296a377ff9194a11038da161208f (patch)
treeaf4338c78467b9b0845d76c39da1fbe10f25e23e /apps/plugins/lib/osd.c
parent12f3ed1699d6bef25bed90ba95cbcc1a6bb4934a (diff)
downloadrockbox-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.c27
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
691static 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 */
690bool osd_init(unsigned flags, void *backbuf, size_t backbuf_size, 711bool 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 */