Commit aa3efe4e authored by Yoann Peronneau's avatar Yoann Peronneau

Added Play and Pause OSD Icons for hotkeys.

parent a8037049
...@@ -31,6 +31,9 @@ ...@@ -31,6 +31,9 @@
#define OSD_ALIGN_TOP 0x4 #define OSD_ALIGN_TOP 0x4
#define OSD_ALIGN_BOTTOM 0x8 #define OSD_ALIGN_BOTTOM 0x8
#define OSD_PLAY_ICON 1
#define OSD_PAUSE_ICON 2
/** /**
* Text style information. * Text style information.
* This struct is currently ignored * This struct is currently ignored
...@@ -57,3 +60,4 @@ VLC_EXPORT( void, __vout_OSDMessage, ( vlc_object_t *, char *, ... ) ); ...@@ -57,3 +60,4 @@ VLC_EXPORT( void, __vout_OSDMessage, ( vlc_object_t *, char *, ... ) );
# define vout_OSDMessage __vout_OSDMessage # define vout_OSDMessage __vout_OSDMessage
#endif #endif
VLC_EXPORT( void, vout_OSDSlider, ( vlc_object_t *, int , short ) ); VLC_EXPORT( void, vout_OSDSlider, ( vlc_object_t *, int , short ) );
VLC_EXPORT( void, vout_OSDIcon, ( vlc_object_t *, short ) );
...@@ -332,7 +332,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -332,7 +332,7 @@ static void Run( intf_thread_t *p_intf )
} }
if( p_input && val.i_int != PAUSE_S ) if( p_input && val.i_int != PAUSE_S )
{ {
vout_OSDMessage( p_intf, _( "Pause" ) ); vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PAUSE_ICON );
val.i_int = PAUSE_S; val.i_int = PAUSE_S;
var_Set( p_input, "state", val ); var_Set( p_input, "state", val );
} }
...@@ -342,7 +342,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -342,7 +342,7 @@ static void Run( intf_thread_t *p_intf )
FIND_ANYWHERE ); FIND_ANYWHERE );
if( p_playlist ) if( p_playlist )
{ {
vout_OSDMessage( p_intf, _( "Play" ) ); vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PLAY_ICON );
playlist_Play( p_playlist ); playlist_Play( p_playlist );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
......
/***************************************************************************** /*****************************************************************************
* video_widgets.c : widgets manipulation functions * video_widgets.c : OSD widgets manipulation functions
***************************************************************************** *****************************************************************************
* Copyright (C) 2004 VideoLAN * Copyright (C) 2004 VideoLAN
* $Id:$ * $Id$
* *
* Author: Yoann Peronneau <yoann@videolan.org> * Author: Yoann Peronneau <yoann@videolan.org>
* *
...@@ -34,8 +34,10 @@ ...@@ -34,8 +34,10 @@
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static void DrawRect ( vout_thread_t *, subpicture_t *, int, int, int, int, static void DrawRect( vout_thread_t *, subpicture_t *, int, int, int, int,
short ); short );
static void DrawTriangle( vout_thread_t *, subpicture_t *, int, int, int, int,
short );
static void Render ( vout_thread_t *, picture_t *, const subpicture_t * ); static void Render ( vout_thread_t *, picture_t *, const subpicture_t * );
static void RenderI420( vout_thread_t *, picture_t *, const subpicture_t *, static void RenderI420( vout_thread_t *, picture_t *, const subpicture_t *,
int ); int );
...@@ -43,6 +45,7 @@ static void RenderYUY2( vout_thread_t *, picture_t *, const subpicture_t *, ...@@ -43,6 +45,7 @@ static void RenderYUY2( vout_thread_t *, picture_t *, const subpicture_t *,
int ); int );
static void RenderRV32( vout_thread_t *, picture_t *, const subpicture_t *, static void RenderRV32( vout_thread_t *, picture_t *, const subpicture_t *,
int ); int );
static subpicture_t *vout_CreateWidget( vout_thread_t * );
static void FreeWidget( subpicture_t * ); static void FreeWidget( subpicture_t * );
/** /**
...@@ -92,6 +95,43 @@ static void DrawRect( vout_thread_t *p_vout, subpicture_t *p_subpic, ...@@ -92,6 +95,43 @@ static void DrawRect( vout_thread_t *p_vout, subpicture_t *p_subpic,
} }
} }
/*****************************************************************************
* Draws a triangle at the given position in the subpic.
* It may be filled (fill == RECT_FILLED) or empty (fill == RECT_EMPTY).
*****************************************************************************/
static void DrawTriangle( vout_thread_t *p_vout, subpicture_t *p_subpic,
int i_x1, int i_y1, int i_x2, int i_y2, short fill )
{
int x, y, i_mid, h;
subpicture_sys_t *p_widget = p_subpic->p_sys;
i_mid = i_y1 + ( ( i_y2 - i_y1 ) >> 1 );
if( fill == RECT_FILLED )
{
for( y = i_y1; y <= i_mid; y++ )
{
h = y - i_y1;
for( x = i_x1; x <= i_x1 + h && x <= i_x2; x++ )
{
p_widget->p_pic[ x + p_widget->i_width * y ] = 1;
p_widget->p_pic[ x + p_widget->i_width * ( i_y2 - h ) ] = 1;
}
}
}
else
{
for( y = i_y1; y <= i_mid; y++ )
{
h = y - i_y1;
p_widget->p_pic[ i_x1 + p_widget->i_width * y ] = 1;
p_widget->p_pic[ i_x1 + h + p_widget->i_width * y ] = 1;
p_widget->p_pic[ i_x1 + p_widget->i_width * ( i_y2 - h ) ] = 1;
p_widget->p_pic[ i_x1 + h + p_widget->i_width * ( i_y2 - h ) ] = 1;
}
}
}
/***************************************************************************** /*****************************************************************************
* Render: place string in picture * Render: place string in picture
***************************************************************************** *****************************************************************************
...@@ -158,6 +198,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -158,6 +198,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic,
{ {
for( x = 0; x < p_widget->i_width; x++ ) for( x = 0; x < p_widget->i_width; x++ )
{ {
if( alpha == 0 ) continue;
pen_y--; pen_y--;
pixel = ( ( pixel * ( 255 - alpha ) ) >> 8 ); pixel = ( ( pixel * ( 255 - alpha ) ) >> 8 );
pen_y++; pen_x--; pen_y++; pen_x--;
...@@ -190,6 +231,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -190,6 +231,7 @@ static void RenderI420( vout_thread_t *p_vout, picture_t *p_pic,
{ {
for( x = 0; x < p_widget->i_width; x+=2 ) for( x = 0; x < p_widget->i_width; x+=2 )
{ {
if( alpha == 0 ) continue;
pixel = ( ( pixel * ( 0xFF - alpha ) ) >> 8 ) + pixel = ( ( pixel * ( 0xFF - alpha ) ) >> 8 ) +
( 0x80 * alpha >> 8 ); ( 0x80 * alpha >> 8 );
} }
...@@ -298,114 +340,204 @@ static void RenderRV32( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -298,114 +340,204 @@ static void RenderRV32( vout_thread_t *p_vout, picture_t *p_pic,
#undef pixel #undef pixel
} }
/*****************************************************************************
* Creates and initializes an OSD widget.
*****************************************************************************/
subpicture_t *vout_CreateWidget( vout_thread_t *p_vout )
{
subpicture_t *p_subpic;
subpicture_sys_t *p_widget;
mtime_t i_now = mdate();
p_subpic = 0;
p_widget = 0;
/* Create and initialize a subpicture */
p_subpic = vout_CreateSubPicture( p_vout, MEMORY_SUBPICTURE );
if( p_subpic == NULL )
{
return NULL;
}
p_subpic->pf_render = Render;
p_subpic->pf_destroy = FreeWidget;
p_subpic->i_start = i_now;
p_subpic->i_stop = i_now + 1200000;
p_subpic->b_ephemer = VLC_FALSE;
p_widget = malloc( sizeof(subpicture_sys_t) );
if( p_widget == NULL )
{
FreeWidget( p_subpic );
vout_DestroySubPicture( p_vout, p_subpic );
return NULL;
}
p_subpic->p_sys = p_widget;
return p_subpic;
}
/***************************************************************************** /*****************************************************************************
* Displays an OSD slider. * Displays an OSD slider.
* Type 0 is position slider-like, and type 1 is volume slider-like. * Type 0 is position slider-like, and type 1 is volume slider-like.
*****************************************************************************/ *****************************************************************************/
void vout_OSDSlider( vlc_object_t *p_caller, int i_position, short i_type ) void vout_OSDSlider( vlc_object_t *p_caller, int i_position, short i_type )
{ {
vout_thread_t *p_vout; vout_thread_t *p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT,
FIND_ANYWHERE );
subpicture_t *p_subpic; subpicture_t *p_subpic;
subpicture_sys_t *p_widget; subpicture_sys_t *p_widget;
mtime_t i_now = mdate();
int i_x_margin, i_y_margin; int i_x_margin, i_y_margin;
if( !config_GetInt( p_caller, "osd" ) || i_position < 0 ) return; if( p_vout == NULL || !config_GetInt( p_caller, "osd" ) || i_position < 0 )
{
return;
}
p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT, FIND_ANYWHERE ); p_subpic = vout_CreateWidget( p_vout );
if( p_subpic == NULL )
{
return;
}
p_widget = p_subpic->p_sys;
if( p_vout ) i_y_margin = p_vout->render.i_height / 10;
i_x_margin = i_y_margin;
if( i_type == 0 )
{ {
p_subpic = 0; p_widget->i_width = p_vout->render.i_width - 2 * i_x_margin;
p_widget = 0; p_widget->i_height = p_vout->render.i_height / 20;
p_widget->i_x = i_x_margin;
p_widget->i_y = p_vout->render.i_height - i_y_margin -
p_widget->i_height;
}
else
{
p_widget->i_width = p_vout->render.i_width / 40;
p_widget->i_height = p_vout->render.i_height - 2 * i_y_margin;
p_widget->i_x = p_vout->render.i_width - i_x_margin -
p_widget->i_width;
p_widget->i_y = i_y_margin;
}
/* Create and initialize a subpicture */ p_widget->p_pic = (uint8_t *)malloc( p_widget->i_width *
p_subpic = vout_CreateSubPicture( p_vout, MEMORY_SUBPICTURE ); p_widget->i_height );
if( p_subpic == NULL ) if( p_widget->p_pic == NULL )
{ {
return; FreeWidget( p_subpic );
} vout_DestroySubPicture( p_vout, p_subpic );
p_subpic->pf_render = Render; return;
p_subpic->pf_destroy = FreeWidget; }
p_subpic->i_start = i_now; memset( p_widget->p_pic, 0, p_widget->i_width * p_widget->i_height );
p_subpic->i_stop = i_now + 1200000;
p_subpic->b_ephemer = VLC_FALSE;
p_widget = malloc( sizeof(subpicture_sys_t) );
if( p_widget == NULL )
{
FreeWidget( p_subpic );
vout_DestroySubPicture( p_vout, p_subpic );
return;
}
p_subpic->p_sys = p_widget;
i_y_margin = p_vout->render.i_height / 10; if( i_type == 0 )
i_x_margin = i_y_margin; {
if( i_type == 0 ) int i_x_pos = ( p_widget->i_width - 2 ) * i_position / 100;
{ int i_y_pos = p_widget->i_height / 2;
p_widget->i_width = p_vout->render.i_width - 2 * i_x_margin; DrawRect( p_vout, p_subpic, i_x_pos - 1, 2, i_x_pos + 1,
p_widget->i_height = p_vout->render.i_height / 20; p_widget->i_height - 3, RECT_FILLED );
p_widget->i_x = i_x_margin; DrawRect( p_vout, p_subpic, 0, 0, p_widget->i_width - 1,
p_widget->i_y = p_vout->render.i_height - i_y_margin - p_widget->i_height - 1, RECT_EMPTY );
p_widget->i_height; }
} else if( i_type == 1 )
else {
{ int i_y_pos = p_widget->i_height / 2;
p_widget->i_width = p_vout->render.i_width / 40; DrawRect( p_vout, p_subpic, 2, p_widget->i_height -
p_widget->i_height = p_vout->render.i_height - 2 * i_y_margin; ( p_widget->i_height - 2 ) * i_position / 100,
p_widget->i_height = ( ( p_widget->i_height - 2 ) >> 2 ) * 4 + 2; p_widget->i_width - 3, p_widget->i_height - 3,
p_widget->i_x = p_vout->render.i_width - i_x_margin - RECT_FILLED );
p_widget->i_width; DrawRect( p_vout, p_subpic, 1, i_y_pos, 1, i_y_pos, RECT_FILLED );
p_widget->i_y = i_y_margin; DrawRect( p_vout, p_subpic, p_widget->i_width - 2, i_y_pos,
} p_widget->i_width - 2, i_y_pos, RECT_FILLED );
DrawRect( p_vout, p_subpic, 0, 0, p_widget->i_width - 1,
p_widget->i_height - 1, RECT_EMPTY );
}
p_widget->p_pic = (uint8_t *)malloc( p_widget->i_width * vlc_mutex_lock( &p_vout->change_lock );
p_widget->i_height );
if( p_widget->p_pic == NULL )
{
FreeWidget( p_subpic );
vout_DestroySubPicture( p_vout, p_subpic );
return;
}
memset( p_widget->p_pic, 0, p_widget->i_width * p_widget->i_height );
if( i_type == 0 ) if( p_vout->p_last_osd_message )
{ {
int i_x_pos = ( p_widget->i_width - 2 ) * i_position / 100; vout_DestroySubPicture( p_vout, p_vout->p_last_osd_message );
int i_y_pos = p_widget->i_height / 2; }
DrawRect( p_vout, p_subpic, i_x_pos - 1, 2, i_x_pos + 1, p_vout->p_last_osd_message = p_subpic;
p_widget->i_height - 3, RECT_FILLED ); vout_DisplaySubPicture( p_vout, p_subpic );
DrawRect( p_vout, p_subpic, 0, 0, p_widget->i_width - 1,
p_widget->i_height - 1, RECT_EMPTY );
}
else if( i_type == 1 )
{
int i_y_pos = p_widget->i_height / 2;
DrawRect( p_vout, p_subpic, 2, p_widget->i_height -
( p_widget->i_height - 2 ) * i_position / 100,
p_widget->i_width - 3, p_widget->i_height - 3,
RECT_FILLED );
DrawRect( p_vout, p_subpic, 1, i_y_pos, 1, i_y_pos, RECT_FILLED );
DrawRect( p_vout, p_subpic, p_widget->i_width - 2, i_y_pos,
p_widget->i_width - 2, i_y_pos, RECT_FILLED );
DrawRect( p_vout, p_subpic, 0, 0, p_widget->i_width - 1,
p_widget->i_height - 1, RECT_EMPTY );
}
vlc_mutex_lock( &p_vout->change_lock ); vlc_mutex_unlock( &p_vout->change_lock );
if( p_vout->p_last_osd_message ) vlc_object_release( p_vout );
{ return;
vout_DestroySubPicture( p_vout, p_vout->p_last_osd_message ); }
}
p_vout->p_last_osd_message = p_subpic; /*****************************************************************************
vout_DisplaySubPicture( p_vout, p_subpic ); * Displays an OSD icon.
* Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON
*****************************************************************************/
void vout_OSDIcon( vlc_object_t *p_caller, short i_type )
{
vout_thread_t *p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT,
FIND_ANYWHERE );
subpicture_t *p_subpic;
subpicture_sys_t *p_widget;
int i_x_margin, i_y_margin;
if( p_vout == NULL || !config_GetInt( p_caller, "osd" ) )
{
return;
}
p_subpic = vout_CreateWidget( p_vout );
if( p_subpic == NULL )
{
return;
}
p_widget = p_subpic->p_sys;
i_y_margin = p_vout->render.i_height / 15;
i_x_margin = i_y_margin;
p_widget->i_width = p_vout->render.i_width / 22;
p_widget->i_height = p_widget->i_width;
p_widget->i_x = p_vout->render.i_width - i_x_margin -
p_widget->i_width;
p_widget->i_y = i_y_margin;
p_widget->p_pic = (uint8_t *)malloc( p_widget->i_width *
p_widget->i_height );
if( p_widget->p_pic == NULL )
{
FreeWidget( p_subpic );
vout_DestroySubPicture( p_vout, p_subpic );
return;
}
memset( p_widget->p_pic, 0, p_widget->i_width * p_widget->i_height );
if( i_type == OSD_PAUSE_ICON )
{
int i_bar_width = p_widget->i_width / 3;
DrawRect( p_vout, p_subpic, 0, 0, i_bar_width - 1,
p_widget->i_height - 1, RECT_FILLED );
DrawRect( p_vout, p_subpic, p_widget->i_width - i_bar_width, 0,
p_widget->i_width - 1, p_widget->i_height - 1, RECT_FILLED );
}
else if( i_type == OSD_PLAY_ICON )
{
int i_mid = p_widget->i_height >> 1;
int i_delta = ( p_widget->i_width - i_mid ) >> 1;
int i_y2 = ( ( p_widget->i_height - 1 ) >> 1 ) * 2;
DrawTriangle( p_vout, p_subpic, i_delta, 0,
p_widget->i_width - i_delta, i_y2, RECT_FILLED );
}
vlc_mutex_unlock( &p_vout->change_lock ); vlc_mutex_lock( &p_vout->change_lock );
vlc_object_release( p_vout ); if( p_vout->p_last_osd_message )
{
vout_DestroySubPicture( p_vout, p_vout->p_last_osd_message );
} }
p_vout->p_last_osd_message = p_subpic;
vout_DisplaySubPicture( p_vout, p_subpic );
vlc_mutex_unlock( &p_vout->change_lock );
vlc_object_release( p_vout );
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment