/** * Prepare a picture for display */ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture) { vout_display_sys_t *sys = vd->sys; if (!sys->dither) { /* Create the libcaca dither object */ sys->dither = cucul_create_dither(32, vd->source.i_visible_width, vd->source.i_visible_height, picture->p[0].i_pitch, vd->fmt.i_rmask, vd->fmt.i_gmask, vd->fmt.i_bmask, 0x00000000); if (!sys->dither) { msg_Err(vd, "could not create libcaca dither object"); return; } } vout_display_place_t place; Place(vd, &place); cucul_set_color_ansi(sys->cv, CUCUL_COLOR_DEFAULT, CUCUL_COLOR_BLACK); cucul_clear_canvas(sys->cv); const int crop_offset = vd->source.i_y_offset * picture->p->i_pitch + vd->source.i_x_offset * picture->p->i_pixel_pitch; cucul_dither_bitmap(sys->cv, place.x, place.y, place.width, place.height, sys->dither, &picture->p->p_pixels[crop_offset]); VLC_UNUSED(subpicture); }
/***************************************************************************** * Init: initialize libcaca video output thread *****************************************************************************/ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic = NULL; I_OUTPUTPICTURES = 0; p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2'); p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; p_vout->output.i_rmask = 0x00ff0000; p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x000000ff; /* Create the libcaca dither object */ p_vout->p_sys->p_dither = cucul_create_dither ( 32, p_vout->output.i_width, p_vout->output.i_height, 4 * ((p_vout->output.i_width + 15) & ~15), p_vout->output.i_rmask, p_vout->output.i_gmask, p_vout->output.i_bmask, 0x00000000 ); if( !p_vout->p_sys->p_dither ) { msg_Err( p_vout, "could not create libcaca dither object" ); return VLC_EGENERIC; } /* Find an empty picture slot */ for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ ) { if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE ) { p_pic = p_vout->p_picture + i_index; break; } } if( p_pic == NULL ) { return VLC_EGENERIC; } /* Allocate the picture */ p_pic->p->i_lines = p_vout->output.i_height; p_pic->p->i_visible_lines = p_vout->output.i_height; p_pic->p->i_pitch = 4 * ((p_vout->output.i_width + 15) & ~15); p_pic->p->i_pixel_pitch = 4; p_pic->p->i_visible_pitch = 4 * p_vout->output.i_width; p_pic->i_planes = 1; p_pic->p->p_pixels = malloc( p_pic->p->i_pitch * p_pic->p->i_lines ); p_pic->i_status = DESTROYED_PICTURE; p_pic->i_type = DIRECT_PICTURE; PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic; I_OUTPUTPICTURES++; return VLC_SUCCESS; }