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/plugins/lib/osd.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'apps/plugins/lib/osd.c') 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 OSD_ERASED, /* Erased in preparation for regular drawing */ } status; /* View status */ struct viewport vp; /* Clipping viewport */ + struct frame_buffer_t framebuf; /* Holds framebuffer reference */ int lcd_bitmap_stride; /* Stride of LCD bitmap */ void *lcd_bitmap_data; /* Backbuffer framebuffer data */ int back_bitmap_stride; /* Stride of backbuffer bitmap */ @@ -68,7 +69,7 @@ struct osd int height); void (*lcd_update)(void); void (*lcd_update_rect)(int x, int y, int width, int height); - void (*lcd_set_viewport)(struct viewport *vp); + struct viewport *(*lcd_set_viewport)(struct viewport *vp); void (*lcd_set_framebuffer)(void *buf); void (*lcd_framebuffer_set_pos)(int x, int y, int width, int height); 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, osd->back_bitmap_stride = w; #endif /* end stride type selection */ - osd->lcd_bitmap_data = (void *)*rb->lcd_framebuffer; + /* vp is currently initialized to the default framebuffer */ + osd->lcd_bitmap_data = osd->vp.buffer->data; osd->back_bitmap_data = buf; osd->maxwidth = w; @@ -686,6 +688,25 @@ static void _osd_lcd_update_rect(struct osd *osd, osd->lcd_update_rect(x, y, width, height); } +static void _osd_lcd_viewport_set_buffer(void *buffer) +{ + if (buffer) + { + native_osd.framebuf.data = buffer; + native_osd.framebuf.elems = native_osd.maxheight * native_osd.maxwidth; + native_osd.framebuf.get_address_fn = NULL; /*Default iterator*/ + + if (buffer == native_osd.back_bitmap_data) + native_osd.framebuf.stride = (native_osd.back_bitmap_stride); + else + native_osd.framebuf.stride = (native_osd.lcd_bitmap_stride); + + rb->viewport_set_buffer(NULL, &native_osd.framebuf, SCREEN_MAIN); + } + else + rb->viewport_set_buffer(NULL, NULL, SCREEN_MAIN); +} + /* Native LCD, public */ bool osd_init(unsigned flags, void *backbuf, size_t backbuf_size, 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, native_osd.lcd_update = rb->lcd_update; native_osd.lcd_update_rect = rb->lcd_update_rect; native_osd.lcd_set_viewport = rb->lcd_set_viewport; - native_osd.lcd_set_framebuffer = (void *)rb->lcd_set_framebuffer; + native_osd.lcd_set_framebuffer = (void *)_osd_lcd_viewport_set_buffer; #if LCD_DEPTH < 4 native_osd.lcd_framebuffer_set_pos = NULL; #endif /* LCD_DEPTH < 4 */ -- cgit v1.2.3