summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/osd.c
diff options
context:
space:
mode:
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 */