📄 magnify.c
字号:
magnify( Y_PLANE ); magnify( U_PLANE ); magnify( V_PLANE );#undef magnify } else {#define copy( plane ) \ memcpy( p_outpic->p[plane].p_pixels, p_pic->p[plane].p_pixels, \ p_outpic->p[plane].i_lines * p_outpic->p[plane].i_pitch ); copy( Y_PLANE ); copy( U_PLANE ); copy( V_PLANE );#undef copy } if( p_vout->p_sys->b_visible ) { /* image visualization */ fmt_out = p_vout->fmt_out; fmt_out.i_width = p_vout->render.i_width/VIS_ZOOM; fmt_out.i_height = p_vout->render.i_height/VIS_ZOOM; p_converted = image_Convert( p_vout->p_sys->p_image, p_pic, &(p_pic->format), &fmt_out ); #define copyimage( plane ) \ for( y=0; y<p_converted->p[plane].i_visible_lines; y++) \ { \ memcpy( p_outpic->p[plane].p_pixels+y*p_outpic->p[plane].i_pitch, \ p_converted->p[plane].p_pixels+y*p_converted->p[plane].i_pitch, \ p_converted->p[plane].i_visible_pitch ); \ } copyimage( Y_PLANE ); copyimage( U_PLANE ); copyimage( V_PLANE ); #undef copyimage p_converted->pf_release( p_converted ); /* white rectangle on visualization */ v_w = p_oyp->i_pitch*ZOOM_FACTOR/(VIS_ZOOM*o_zoom); v_h = (o_y+p_oyp->i_lines*ZOOM_FACTOR/o_zoom)/VIS_ZOOM; /* top line */ memset( p_oyp->p_pixels + o_y/VIS_ZOOM*p_oyp->i_pitch + o_x/VIS_ZOOM, 0xff, v_w+1 ); for( y = o_y/VIS_ZOOM+1; y < v_h; y++ ) { /* left line */ p_oyp->p_pixels[ y*p_oyp->i_pitch+o_x/VIS_ZOOM ] = 0xff; /* right line */ p_oyp->p_pixels[ y*p_oyp->i_pitch+o_x/VIS_ZOOM + v_w ] = 0xff; } /* bottom line */ memset( p_oyp->p_pixels + v_h*p_oyp->i_pitch + o_x/VIS_ZOOM, 0xff, v_w+1 ); /* */ v_h = p_oyp->i_lines/VIS_ZOOM; } else { v_h = 1; } /* print a small "VLC ZOOM" ... gruikkkkkkkkk */#define DRAW(a) {int c,l=1;L a;}#define L ;l++,c=1#define X ;draw(l,c);c+=1#define o +1#define draw(y,x) p_oyp->p_pixels[(v_h+y)*p_oyp->i_pitch+x] = 0xff;if( p_vout->p_sys->b_visible )DRAW(X o o o X o X o o o o o o X X X X o o o X X X X X o o X X X o o o X X X o o X X o X X o o o X o o o X o X X X X X o X X X X o o X X X X X LX o o o X o X o o o o o X o o o o o o o o o o X o o X o o o X o X o o o X o X o X o X o o o X o o o X o o o X o o o X o o o X o X o o o o Lo X o X o o X o o o o o X o o o o o o o o o X o o o X o o o X o X o o o X o X o o o X o o o X X X X X o o o X o o o X o o o X o X X X X o Lo X o X o o X o o o o o X o o o o o o o o X o o o o X o o o X o X o o o X o X o o o X o o o X o o o X o o o X o o o X o o o X o X o o o o Lo o X o o o X X X X X o o X X X X o o o X X X X X o o X X X o o o X X X o o X o o o X o o o X o o o X o X X X X X o X X X X o o X X X X X L)elseDRAW(X o o o X o X o o o o o o X X X X o o o X X X X X o o X X X o o o X X X o o X X o X X o o o o X X X X o X o o o X o o X X X o o X o o o X LX o o o X o X o o o o o X o o o o o o o o o o X o o X o o o X o X o o o X o X o X o X o o o X o o o o o X o o o X o X o o o X o X o o o X Lo X o X o o X o o o o o X o o o o o o o o o X o o o X o o o X o X o o o X o X o o o X o o o o X X X o o X X X X X o X o o o X o X o X o X Lo X o X o o X o o o o o X o o o o o o o o X o o o o X o o o X o X o o o X o X o o o X o o o o o o o X o X o o o X o X o o o X o X o X o X Lo o X o o o X X X X X o o X X X X o o o X X X X X o o X X X o o o X X X o o X o o o X o o o X X X X o o X o o o X o o X X X o o o X o X o L)#undef DRAW#undef L#undef X#undef O#undef draw if( p_vout->p_sys->b_visible ) { /* zoom gauge */ memset( p_oyp->p_pixels + (v_h+9)*p_oyp->i_pitch, 0xff, 41 ); for( y = v_h + 10; y < v_h + 90; y++ ) { int width = v_h + 90 - y; width = (width*width)/160; if( (80 - y + v_h)*10 < o_zoom ) { memset( p_oyp->p_pixels + y*p_oyp->i_pitch, 0xff, width ); } else { p_oyp->p_pixels[y*p_oyp->i_pitch] = 0xff; p_oyp->p_pixels[y*p_oyp->i_pitch + width - 1] = 0xff; } } } vout_DisplayPicture( p_vout->p_sys->p_vout, p_outpic );}/***************************************************************************** * SendEvents: forward mouse and keyboard events to the parent p_vout *****************************************************************************/static int SendEvents( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ var_Set( (vlc_object_t *)p_data, psz_var, newval ); return VLC_SUCCESS;}/***************************************************************************** * SendEventsToChild: forward events to the child/children vout *****************************************************************************/static int SendEventsToChild( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t *)p_this; var_Set( p_vout->p_sys->p_vout, psz_var, newval ); return VLC_SUCCESS;}/***************************************************************************** * MouseEvent: callback for mouse events *****************************************************************************/static int MouseEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vout_thread_t *p_vout = (vout_thread_t*)p_data; vlc_value_t vald,valx,valy;#define MOUSE_DOWN 1#define MOUSE_CLICKED 2#define MOUSE_MOVE_X 4#define MOUSE_MOVE_Y 8#define MOUSE_MOVE 12 uint8_t mouse= 0; int v_h = p_vout->output.i_height*ZOOM_FACTOR/p_vout->p_sys->i_zoom; int v_w = p_vout->output.i_width*ZOOM_FACTOR/p_vout->p_sys->i_zoom; if( psz_var[6] == 'x' ) mouse |= MOUSE_MOVE_X; if( psz_var[6] == 'y' ) mouse |= MOUSE_MOVE_Y; if( psz_var[6] == 'c' ) mouse |= MOUSE_CLICKED; var_Get( p_vout->p_sys->p_vout, "mouse-button-down", &vald ); if( vald.i_int & 0x1 ) mouse |= MOUSE_DOWN; var_Get( p_vout->p_sys->p_vout, "mouse-y", &valy ); var_Get( p_vout->p_sys->p_vout, "mouse-x", &valx ); if( ( mouse&MOUSE_MOVE && mouse&MOUSE_DOWN) || mouse&MOUSE_CLICKED ) { /* (mouse moved and mouse button is down) or (mouse clicked) */ if( p_vout->p_sys->b_visible ) { if( 0 <= valy.i_int && valy.i_int < (int)p_vout->output.i_height/VIS_ZOOM && 0 <= valx.i_int && valx.i_int < (int)p_vout->output.i_width/VIS_ZOOM ) { /* mouse is over visualisation */ p_vout->p_sys->i_x = __MIN( __MAX( valx.i_int*VIS_ZOOM - v_w/2, 0 ), p_vout->output.i_width - v_w - 1); p_vout->p_sys->i_y = __MIN( __MAX( valy.i_int * VIS_ZOOM - v_h/2, 0 ), p_vout->output.i_height - v_h - 1); } else if( valx.i_int >= 0 && valx.i_int < 80 && valy.i_int >= (int)p_vout->output.i_height/VIS_ZOOM && valy.i_int < (int)p_vout->output.i_height/VIS_ZOOM + 9 && mouse&MOUSE_CLICKED ) { /* mouse is over the "VLC ZOOM HIDE" text */ p_vout->p_sys->b_visible = VLC_FALSE; } else if( (int)p_vout->output.i_height/VIS_ZOOM + 9 <= valy.i_int && valy.i_int <= (int)p_vout->output.i_height/VIS_ZOOM + 90 && 0 <= valx.i_int && valx.i_int <= (( (int)p_vout->output.i_height/VIS_ZOOM + 90 - valy.i_int) *( (int)p_vout->output.i_height/VIS_ZOOM + 90 - valy.i_int))/160 ) { /* mouse is over zoom gauge */ p_vout->p_sys->i_zoom = __MAX( ZOOM_FACTOR, ( 80 + (int)p_vout->output.i_height/VIS_ZOOM - valy.i_int + 2) * ZOOM_FACTOR/10 ); } else if( mouse&MOUSE_MOVE_X && !(mouse&MOUSE_CLICKED) ) { p_vout->p_sys->i_x -= (newval.i_int - oldval.i_int) *ZOOM_FACTOR/p_vout->p_sys->i_zoom; } else if( mouse&MOUSE_MOVE_Y && !(mouse&MOUSE_CLICKED) ) { p_vout->p_sys->i_y -= (newval.i_int - oldval.i_int) *ZOOM_FACTOR/p_vout->p_sys->i_zoom; } } else { if( valx.i_int >= 0 && valx.i_int < 80 && valy.i_int >= 0 && valy.i_int <= 10 && mouse&MOUSE_CLICKED ) { /* mouse is over the "VLC ZOOM SHOW" text */ p_vout->p_sys->b_visible = VLC_TRUE; } else if( mouse&MOUSE_MOVE_X && !(mouse&MOUSE_CLICKED) ) { p_vout->p_sys->i_x -= (newval.i_int - oldval.i_int) *ZOOM_FACTOR/p_vout->p_sys->i_zoom; } else if( mouse&MOUSE_MOVE_Y && !(mouse&MOUSE_CLICKED) ) { p_vout->p_sys->i_y -= (newval.i_int - oldval.i_int) *ZOOM_FACTOR/p_vout->p_sys->i_zoom; } } } p_vout->p_sys->i_x = __MAX( 0, __MIN( p_vout->p_sys->i_x, (int)p_vout->output.i_width - (int)p_vout->output.i_width*ZOOM_FACTOR/p_vout->p_sys->i_zoom - 1 )); p_vout->p_sys->i_y = __MAX( 0, __MIN( p_vout->p_sys->i_y, (int)p_vout->output.i_height - (int)p_vout->output.i_height*ZOOM_FACTOR/p_vout->p_sys->i_zoom - 1 )); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -