X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fcaca.c;h=c0287b3707f1b5117f3cb7b4adb8e156d5b95e8e;hb=d253749f68a85d8c720e66e4a0f7ad9693ba84e3;hp=6b8d8773e6af0f471100285e140892588952e9d0;hpb=56b5483c5684b5e91e56fdbc7429b264728e2e77;p=vlc diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c index 6b8d8773e6..c0287b3707 100644 --- a/modules/video_output/caca.c +++ b/modules/video_output/caca.c @@ -1,7 +1,7 @@ /***************************************************************************** * caca.c: Color ASCII Art video output plugin using libcaca ***************************************************************************** - * Copyright (C) 2003, 2004 VideoLAN + * Copyright (C) 2003, 2004 the VideoLAN team * $Id$ * * Authors: Sam Hocevar @@ -18,23 +18,49 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * 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 *****************************************************************************/ @@ -51,7 +77,10 @@ static void Display ( vout_thread_t *, picture_t * ); * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("color ASCII art video output") ); + set_shortname( "Caca" ); + set_category( CAT_VIDEO ); + set_subcategory( SUBCAT_VIDEO_VOUT ); + set_description( N_("Color ASCII art video output") ); set_capability( "video output", 12 ); set_callbacks( Create, Destroy ); vlc_module_end(); @@ -64,7 +93,9 @@ vlc_module_end(); *****************************************************************************/ struct vout_sys_t { - struct caca_bitmap *p_bitmap; + cucul_canvas_t *p_cv; + caca_display_t *p_dp; + cucul_dither_t *p_dither; }; /***************************************************************************** @@ -77,76 +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; + } + + if( !SetConsoleActiveScreenBuffer( hstdout) ) + { + msg_Err( p_vout, "cannot set active screen buffer" ); + FreeConsole(); + return VLC_EGENERIC; + } - coord = GetLargestConsoleWindowSize( hstdout ); - msg_Dbg( p_vout, "SetConsoleWindowInfo: %ix%i", coord.X, coord.Y ); + coord = GetLargestConsoleWindowSize( hstdout ); + msg_Dbg( p_vout, "SetConsoleWindowInfo: %ix%i", coord.X, coord.Y ); - /* Force size for now */ - coord.X = 100; - coord.Y = 40; + /* Force size for now */ + coord.X = 100; + coord.Y = 40; - if( !SetConsoleScreenBufferSize( hstdout, coord ) ) - msg_Warn( p_vout, "SetConsoleScreenBufferSize %i %i", - coord.X, coord.Y ); + 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 ) ) - { - 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 + /* 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; + + 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; } - 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)" ); + 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; @@ -176,19 +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 = - caca_create_bitmap( 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 ) + /* 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 bitmap" ); + msg_Err( p_vout, "could not create libcaca dither object" ); return VLC_EGENERIC; } @@ -230,7 +264,7 @@ static int Init( vout_thread_t *p_vout ) *****************************************************************************/ static void End( vout_thread_t *p_vout ) { - caca_free_bitmap( p_vout->p_sys->p_bitmap ); + cucul_free_dither( p_vout->p_sys->p_dither ); } /***************************************************************************** @@ -242,7 +276,8 @@ static void Destroy( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; - caca_end(); + 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(); @@ -259,31 +294,96 @@ 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 + struct caca_event ev; +#else + int ev; +#endif - while(( event = caca_get_event(CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE) )) + while( caca_get_event(p_vout->p_sys->p_dp, CACA_EVENT_ANY, &ev, 0) ) { - if( event == CACA_EVENT_RESIZE ) + playlist_t *p_playlist; + vlc_value_t val; + +#ifdef CACA_API_VERSION_1 +#ifdef CACA_EVENT_OPAQUE + switch( caca_get_event_type( &ev ) ) +#else + switch( ev.type ) +#endif /* CACA_EVENT_OPAQUE */ +#else + switch( ev ) +#endif { + 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(); - continue; - } - - switch( event & 0x00ffffff ) - { - case 'q': - val.i_int = KEY_MODIFIER_CTRL | 'q'; + 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 = pl_Yield( p_vout ); + if( p_playlist ) + { + playlist_Stop( p_playlist ); + pl_Release( p_vout ); + } + vlc_object_kill( p_vout->p_libvlc ); + break; + } +#endif default: - continue; + break; } - - var_Set( p_vout->p_vlc, "key-pressed", val ); } return VLC_SUCCESS; @@ -294,9 +394,13 @@ static int Manage( vout_thread_t *p_vout ) *****************************************************************************/ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) { - 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 ); + cucul_set_color_ansi( 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 ); } /***************************************************************************** @@ -304,6 +408,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 ) { - caca_refresh(); + VLC_UNUSED(p_pic); + caca_refresh_display( p_vout->p_sys->p_dp ); }