X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fvideo_output%2Fcaca.c;h=41292b4b47ce9b62ba403056ce8ebcf4fcb3accf;hb=11b51d62210fb0cd6f0c067eec6e40074e9c9c7d;hp=a2bc38dd1dfae2c770b40eb3fb5a0597d1ca7ab5;hpb=1548a691c730bac930e9630d80f9ff8f3939c251;p=vlc diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c index a2bc38dd1d..41292b4b47 100644 --- a/modules/video_output/caca.c +++ b/modules/video_output/caca.c @@ -24,17 +24,43 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* ENOMEM */ -#include /* free() */ -#include /* strerror() */ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -#include -#include -#include +#include +#include +#include +#include +#include #include +#include + +#ifndef CACA_API_VERSION_1 + /* Upward compatibility macros */ + typedef char cucul_canvas_t; + typedef struct caca_bitmap cucul_dither_t; + typedef char caca_display_t; +# define CUCUL_COLOR_DEFAULT CACA_COLOR_LIGHTGRAY +# define CUCUL_COLOR_BLACK CACA_COLOR_BLACK +# define cucul_clear_canvas(x) caca_clear() +# define cucul_create_canvas(x,y) "" /* kinda hacky */ +# define cucul_create_dither caca_create_bitmap +# define cucul_dither_bitmap(x,y,z,t,u,v,w) caca_draw_bitmap(y,z,t,u,v,w) +# define cucul_free_dither caca_free_bitmap +# define cucul_free_canvas(x) +# define cucul_get_canvas_width(x) caca_get_width() +# define cucul_get_canvas_height(x) caca_get_height() +# define cucul_set_color(x,y,z) caca_set_color(y,z) +# define caca_create_display(x) (caca_init() ? NULL : "") /* hacky, too */ +# define caca_free_display(x) caca_end() +# define caca_get_event(x,y,z,t) *(z) = caca_get_event(y) +# define caca_refresh_display(x) caca_refresh() +# define caca_set_display_title(x,y) caca_set_window_title(y) +#endif + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -54,7 +80,7 @@ vlc_module_begin(); set_shortname( "Caca" ); set_category( CAT_VIDEO ); set_subcategory( SUBCAT_VIDEO_VOUT ); - set_description( _("Color ASCII art video output") ); + set_description( N_("Color ASCII art video output") ); set_capability( "video output", 12 ); set_callbacks( Create, Destroy ); vlc_module_end(); @@ -67,13 +93,9 @@ vlc_module_end(); *****************************************************************************/ struct vout_sys_t { -#ifdef CACA_API_VERSION_1 - struct cucul_context *p_qq; - struct caca_context *p_kk; - struct cucul_bitmap *p_bitmap; -#else - struct caca_bitmap *p_bitmap; -#endif + cucul_canvas_t *p_cv; + caca_display_t *p_dp; + cucul_dither_t *p_dither; }; /***************************************************************************** @@ -86,98 +108,82 @@ static int Create( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; #if defined( WIN32 ) && !defined( UNDER_CE ) - if( AllocConsole() ) + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + SMALL_RECT rect; + COORD coord; + HANDLE hstdout; + + if( !AllocConsole() ) { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - SMALL_RECT rect; - COORD coord; - - HANDLE hstdout = - CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, CONSOLE_TEXTMODE_BUFFER, NULL ); - if( !hstdout || hstdout == INVALID_HANDLE_VALUE ) - { - msg_Err( p_vout, "cannot create screen buffer" ); - FreeConsole(); - return VLC_EGENERIC; - } + msg_Err( p_vout, "cannot create console" ); + return VLC_EGENERIC; + } - if( !SetConsoleActiveScreenBuffer( hstdout) ) - { - msg_Err( p_vout, "cannot set active screen buffer" ); - FreeConsole(); - return VLC_EGENERIC; - } + hstdout = + CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, CONSOLE_TEXTMODE_BUFFER, NULL ); + if( !hstdout || hstdout == INVALID_HANDLE_VALUE ) + { + msg_Err( p_vout, "cannot create screen buffer" ); + FreeConsole(); + return VLC_EGENERIC; + } - coord = GetLargestConsoleWindowSize( hstdout ); - msg_Dbg( p_vout, "SetConsoleWindowInfo: %ix%i", coord.X, coord.Y ); + if( !SetConsoleActiveScreenBuffer( hstdout) ) + { + msg_Err( p_vout, "cannot set active screen buffer" ); + FreeConsole(); + return VLC_EGENERIC; + } - /* Force size for now */ - coord.X = 100; - coord.Y = 40; + coord = GetLargestConsoleWindowSize( hstdout ); + msg_Dbg( p_vout, "SetConsoleWindowInfo: %ix%i", coord.X, coord.Y ); - if( !SetConsoleScreenBufferSize( hstdout, coord ) ) - msg_Warn( p_vout, "SetConsoleScreenBufferSize %i %i", - coord.X, coord.Y ); + /* Force size for now */ + coord.X = 100; + coord.Y = 40; - /* Get the current screen buffer size and window position. */ - if( GetConsoleScreenBufferInfo( hstdout, &csbiInfo ) ) - { - rect.Top = 0; rect.Left = 0; - rect.Right = csbiInfo.dwMaximumWindowSize.X - 1; - rect.Bottom = csbiInfo.dwMaximumWindowSize.Y - 1; - if( !SetConsoleWindowInfo( hstdout, TRUE, &rect ) ) - msg_Dbg( p_vout, "SetConsoleWindowInfo failed: %ix%i", - rect.Right, rect.Bottom ); - } - } - else + if( !SetConsoleScreenBufferSize( hstdout, coord ) ) + msg_Warn( p_vout, "SetConsoleScreenBufferSize %i %i", + coord.X, coord.Y ); + + /* Get the current screen buffer size and window position. */ + if( GetConsoleScreenBufferInfo( hstdout, &csbiInfo ) ) { - msg_Err( p_vout, "cannot create console" ); - return VLC_EGENERIC; + rect.Top = 0; rect.Left = 0; + rect.Right = csbiInfo.dwMaximumWindowSize.X - 1; + rect.Bottom = csbiInfo.dwMaximumWindowSize.Y - 1; + if( !SetConsoleWindowInfo( hstdout, TRUE, &rect ) ) + msg_Dbg( p_vout, "SetConsoleWindowInfo failed: %ix%i", + rect.Right, rect.Bottom ); } - #endif /* Allocate structure */ p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) - { - msg_Err( p_vout, "out of memory" ); return VLC_ENOMEM; - } -#ifdef CACA_API_VERSION_1 - p_vout->p_sys->p_qq = cucul_init(0, 0); - if( !p_vout->p_sys->p_qq ) + p_vout->p_sys->p_cv = cucul_create_canvas(0, 0); + if( !p_vout->p_sys->p_cv ) { msg_Err( p_vout, "cannot initialize libcucul" ); free( p_vout->p_sys ); return VLC_EGENERIC; } - p_vout->p_sys->p_kk = caca_attach( p_vout->p_sys->p_qq ); - if( !p_vout->p_sys->p_kk ) - { - msg_Err( p_vout, "cannot initialize libcaca" ); - cucul_end( p_vout->p_sys->p_qq ); - free( p_vout->p_sys ); - return VLC_EGENERIC; - } - - caca_set_window_title( p_vout->p_sys->p_kk, - VOUT_TITLE " - Colour AsCii Art (caca)" ); -#else - if( caca_init() ) + p_vout->p_sys->p_dp = caca_create_display( p_vout->p_sys->p_cv ); + if( !p_vout->p_sys->p_dp ) { msg_Err( p_vout, "cannot initialize libcaca" ); + cucul_free_canvas( p_vout->p_sys->p_cv ); free( p_vout->p_sys ); return VLC_EGENERIC; } - caca_set_window_title( VOUT_TITLE " - Colour AsCii Art (caca)" ); -#endif + caca_set_display_title( p_vout->p_sys->p_dp, + VOUT_TITLE " - Colour AsCii Art (caca)" ); p_vout->pf_init = Init; p_vout->pf_end = End; @@ -207,21 +213,16 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_gmask = 0x0000ff00; p_vout->output.i_bmask = 0x000000ff; - /* Create the libcaca bitmap */ - p_vout->p_sys->p_bitmap = -#ifdef CACA_API_VERSION_1 - cucul_create_bitmap -#else - caca_create_bitmap -#endif + /* 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_bitmap ) + if( !p_vout->p_sys->p_dither ) { - msg_Err( p_vout, "could not create libcaca bitmap" ); + msg_Err( p_vout, "could not create libcaca dither object" ); return VLC_EGENERIC; } @@ -263,11 +264,7 @@ static int Init( vout_thread_t *p_vout ) *****************************************************************************/ static void End( vout_thread_t *p_vout ) { -#ifdef CACA_API_VERSION_1 - cucul_free_bitmap( p_vout->p_sys->p_bitmap ); -#else - caca_free_bitmap( p_vout->p_sys->p_bitmap ); -#endif + cucul_free_dither( p_vout->p_sys->p_dither ); } /***************************************************************************** @@ -279,12 +276,8 @@ static void Destroy( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; -#ifdef CACA_API_VERSION_1 - caca_detach( p_vout->p_sys->p_kk ); - cucul_end( p_vout->p_sys->p_qq ); -#else - caca_end(); -#endif + caca_free_display( p_vout->p_sys->p_dp ); + cucul_free_canvas( p_vout->p_sys->p_cv ); #if defined( WIN32 ) && !defined( UNDER_CE ) FreeConsole(); @@ -301,40 +294,97 @@ static void Destroy( vlc_object_t *p_this ) *****************************************************************************/ static int Manage( vout_thread_t *p_vout ) { - int event; - vlc_value_t val; - #ifdef CACA_API_VERSION_1 - while(( event = caca_get_event(p_vout->p_sys->p_kk, - CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE) )) + struct caca_event ev; #else - while(( event = caca_get_event(CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE) )) + int ev; #endif + + while( caca_get_event(p_vout->p_sys->p_dp, CACA_EVENT_ANY, &ev, 0) ) { - if( event == CACA_EVENT_RESIZE ) - { - /* Acknowledge the resize */ + playlist_t *p_playlist; + vlc_value_t val; + #ifdef CACA_API_VERSION_1 - caca_display( p_vout->p_sys->p_kk ); +#ifdef CACA_EVENT_OPAQUE + switch( caca_get_event_type( &ev ) ) #else - caca_refresh(); + switch( ev.type ) +#endif /* CACA_EVENT_OPAQUE */ +#else + switch( ev ) #endif - continue; - } - - switch( event & 0x00ffffff ) { - case 'q': - val.i_int = KEY_MODIFIER_CTRL | 'q'; + case CACA_EVENT_KEY_RELEASE: +#ifdef CACA_API_VERSION_1 +#ifdef CACA_EVENT_OPAQUE + switch( caca_get_event_key_ch( &ev ) ) +#else + switch( ev.data.key.ch ) +#endif /* CACA_EVENT_OPAQUE */ +#else + switch( ev & 0x00ffffff ) +#endif + { + case 'q': + val.i_int = KEY_MODIFIER_CTRL | 'q'; + break; + case ' ': + val.i_int = KEY_SPACE; + break; + default: + continue; + } + + var_Set( p_vout->p_libvlc, "key-pressed", val ); + break; + case CACA_EVENT_RESIZE: + /* Acknowledge the resize */ + caca_refresh_display( p_vout->p_sys->p_dp ); + break; +#ifdef CACA_API_VERSION_1 + case CACA_EVENT_MOUSE_MOTION: + val.i_int = +#ifdef CACA_EVENT_OPAQUE + caca_get_event_mouse_x( &ev ) +#else + ev.data.mouse.x +#endif /* CACA_EVENT_OPAQUE */ + * p_vout->render.i_width + / cucul_get_canvas_width( p_vout->p_sys->p_cv ); + var_Set( p_vout, "mouse-x", val ); + val.i_int = +#ifdef CACA_EVENT_OPAQUE + caca_get_event_mouse_y( &ev ) +#else + ev.data.mouse.y +#endif /* CACA_EVENT_OPAQUE */ + * p_vout->render.i_height + / cucul_get_canvas_height( p_vout->p_sys->p_cv ); + var_Set( p_vout, "mouse-y", val ); + val.b_bool = true; + var_Set( p_vout, "mouse-moved", val ); break; - case ' ': - val.i_int = KEY_SPACE; + case CACA_EVENT_MOUSE_RELEASE: + val.b_bool = true; + var_Set( p_vout, "mouse-clicked", val ); + break; + case CACA_EVENT_QUIT: + { + p_playlist = vlc_object_find( p_vout, + VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); + if( p_playlist ) + { + playlist_Stop( p_playlist ); + vlc_object_release( p_playlist ); + } + vlc_object_kill( p_vout->p_libvlc ); break; + } +#endif default: - continue; + break; } - - var_Set( p_vout->p_vlc, "key-pressed", val ); } return VLC_SUCCESS; @@ -345,18 +395,13 @@ static int Manage( vout_thread_t *p_vout ) *****************************************************************************/ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) { -#ifdef CACA_API_VERSION_1 - cucul_clear( p_vout->p_sys->p_qq ); - cucul_draw_bitmap( p_vout->p_sys->p_qq, - 0, 0, - cucul_get_width( p_vout->p_sys->p_qq ) - 1, - cucul_get_height( p_vout->p_sys->p_qq ) - 1, - p_vout->p_sys->p_bitmap, p_pic->p->p_pixels ); -#else - caca_clear(); - caca_draw_bitmap( 0, 0, caca_get_width() - 1, caca_get_height() - 1, - p_vout->p_sys->p_bitmap, p_pic->p->p_pixels ); -#endif + cucul_set_color( p_vout->p_sys->p_cv, + CUCUL_COLOR_DEFAULT, CUCUL_COLOR_BLACK ); + cucul_clear_canvas( p_vout->p_sys->p_cv ); + cucul_dither_bitmap( p_vout->p_sys->p_cv, 0, 0, + cucul_get_canvas_width( p_vout->p_sys->p_cv ) - 1, + cucul_get_canvas_height( p_vout->p_sys->p_cv ) - 1, + p_vout->p_sys->p_dither, p_pic->p->p_pixels ); } /***************************************************************************** @@ -364,10 +409,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) *****************************************************************************/ static void Display( vout_thread_t *p_vout, picture_t *p_pic ) { -#ifdef CACA_API_VERSION_1 - caca_display( p_vout->p_sys->p_kk ); -#else - caca_refresh(); -#endif + VLC_UNUSED(p_pic); + caca_refresh_display( p_vout->p_sys->p_dp ); }