static int DISPMANX_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) { int i; static unsigned short pal[256]; //Set up the colormap for (i = 0; i < ncolors; i++) { pal[i] = RGB565 ((colors[i]).r, (colors[i]).g, (colors[i]).b); } vc_dispmanx_resource_set_palette( dispvars->resources[flip_page], pal, 0, sizeof pal ); vc_dispmanx_resource_set_palette( dispvars->resources[!flip_page], pal, 0, sizeof pal ); return(1); }
int main(int argc, char *argv[]) { int ret; VC_RECT_T src_rect; VC_RECT_T dst_rect; DISPMANX_UPDATE_HANDLE_T update; uint32_t vc_image_ptr; bcm_host_init(); display = vc_dispmanx_display_open( 0 ); image = calloc( 1, PITCH * HEIGHT ); // buffer 0 assert(image); // initialize image buffer with clock run in int n, m, clock = 0x275555; for (m=0; m<24; m++) { for (n=0; n<HEIGHT; n++) { ROW(n)[m] = clock&1; } clock = clock >> 1; } // fill up image with filler packets // get_packet will return filler because we haven't loaded the fifo yet. get_packet(ROW(0)+24); for (n=1; n<HEIGHT; n++) { memcpy(ROW(n)+24, ROW(0)+24, 336); } // set up some resources vc_dispmanx_rect_set( &image_rect, 0, 0, WIDTH, HEIGHT); for (n=0;n<3;n++) { resource[n] = vc_dispmanx_resource_create( TYPE, WIDTH, HEIGHT, &vc_image_ptr ); assert( resource[n] ); ret = vc_dispmanx_resource_set_palette( resource[n], palette, 0, sizeof palette ); assert( ret == 0 ); ret = vc_dispmanx_resource_write_data( resource[n], TYPE, PITCH, image, &image_rect ); assert( ret == 0 ); } vc_dispmanx_rect_set( &image_rect, OFFSET+24, 0, 336, HEIGHT); // from now on, only copy the parts that change update = vc_dispmanx_update_start( 10 ); assert( update ); vc_dispmanx_rect_set( &src_rect, 0, 0, WIDTH << 16, HEIGHT << 16 ); vc_dispmanx_rect_set( &dst_rect, 0, 0, 720, HEIGHT ); element = vc_dispmanx_element_add( update, display, 2000, &dst_rect, resource[2], &src_rect, DISPMANX_PROTECTION_NONE, NULL, NULL, VC_IMAGE_ROT0 ); ret = vc_dispmanx_update_submit_sync( update ); assert( ret == 0 ); // BUG: clear any existing callbacks, even to other apps. // https://github.com/raspberrypi/userland/issues/218 vc_dispmanx_vsync_callback(display, NULL, NULL); vc_dispmanx_vsync_callback(display, vsync, NULL); if (argc == 2 && argv[1][0] == '-') { while(read_packets()) { ; } } else { demo(); } vc_dispmanx_vsync_callback(display, NULL, NULL); // disable callback update = vc_dispmanx_update_start( 10 ); assert( update ); ret = vc_dispmanx_element_remove( update, element ); assert( ret == 0 ); ret = vc_dispmanx_update_submit_sync( update ); assert( ret == 0 ); for (n=0; n<3; n++) { ret = vc_dispmanx_resource_delete( resource[0] ); assert( ret == 0 ); } ret = vc_dispmanx_display_close( display ); assert( ret == 0 ); return 0; }