void osd_init(struct osd_t* osd) { uint32_t display_width, display_height; char str[2] = { 0, 0 }; uint32_t width, height; int n; int s; s = gx_graphics_init(tiresias_pcfont, sizeof(tiresias_pcfont)); assert(s == 0); s = graphics_get_display_size(0, &display_width, &display_height); osd->display_width = display_width; osd->display_height = display_height; printf("osd_init: %d %d\n", display_width, display_height); assert(s == 0); //fprintf(stderr,"Display width=%d, height=%d\n",display_width,display_height); /* The main OSD image */ s = gx_create_window(SCREEN, display_width, display_height, GRAPHICS_RESOURCE_RGBA32, &osd->img); assert(s == 0); graphics_resource_fill(osd->img, 0, 0, display_width, display_height, GRAPHICS_RGBA32(0,0,0,0)); graphics_display_resource(osd->img, 0, OSD_LAYER, 0, 0, GRAPHICS_RESOURCE_WIDTH, GRAPHICS_RESOURCE_HEIGHT, VC_DISPMAN_ROT0, 1); /* A full-screen black image to either remove any left-over console text (BG_LAYER) or to hide the video (FG_LAYER) */ s = gx_create_window(SCREEN, display_width, display_height, GRAPHICS_RESOURCE_RGBA32, &osd->img_blank); assert(s == 0); graphics_resource_fill(osd->img_blank, 0, 0, display_width, display_height, GRAPHICS_RGBA32(0,0,0,255)); graphics_display_resource(osd->img_blank, 0, BG_LAYER, 0, 0, GRAPHICS_RESOURCE_WIDTH, GRAPHICS_RESOURCE_HEIGHT, VC_DISPMAN_ROT0, 1); osd->video_blanked = 0; osd->osd_cleartime = 0.0; osd->last_now = time(NULL); pthread_mutex_init(&osd->osd_mutex,NULL); // cache font widths since graphics_resource_text_dimensions_ext is kind of slow for (n = 32; n < 256; n++) { str[0] = n; graphics_resource_text_dimensions_ext(osd->img, str, 1, &width, &height, 40); fontWidth[n] = (uint8_t)width; } (void)s; // remove compiler warning }
int main(void) { GRAPHICS_RESOURCE_HANDLE img; uint32_t width, height; int LAYER=1; bcm_host_init(); int s; s = gx_graphics_init("."); assert(s == 0); s = graphics_get_display_size(0, &width, &height); assert(s == 0); s = gx_create_window(0, width, height, GRAPHICS_RESOURCE_RGBA32, &img); assert(s == 0); // transparent before display to avoid screen flash graphics_resource_fill(img, 0, 0, width, height, GRAPHICS_RGBA32(0,0,0,0x00)); graphics_display_resource(img, 0, LAYER, 0, 0, GRAPHICS_RESOURCE_WIDTH, GRAPHICS_RESOURCE_HEIGHT, VC_DISPMAN_ROT0, 1); uint32_t text_size = 10; while (1) { const char *text = "The quick brown fox jumps over the lazy dog"; uint32_t y_offset = height-60+text_size/2; graphics_resource_fill(img, 0, 0, width, height, GRAPHICS_RGBA32(0,0,0,0x00)); // blue, at the top (y=40) graphics_resource_fill(img, 0, 40, width, 1, GRAPHICS_RGBA32(0,0,0xff,0xff)); // green, at the bottom (y=height-40) graphics_resource_fill(img, 0, height-40, width, 1, GRAPHICS_RGBA32(0,0xff,0,0xff)); // draw the subtitle text render_subtitle(img, text, 0, text_size, y_offset); graphics_update_displayed_resource(img, 0, 0, 0, 0); text_size += 1; if (text_size > 50) text_size = 10; } graphics_display_resource(img, 0, LAYER, 0, 0, GRAPHICS_RESOURCE_WIDTH, GRAPHICS_RESOURCE_HEIGHT, VC_DISPMAN_ROT0, 0); graphics_delete_resource(img); return 0; }