diff options
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 */ |