⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magnify.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
        fmt_in.i_width  = (fmt_in.i_width  * ZOOM_FACTOR / o_zoom) & ~1;        fmt_in.i_height = (fmt_in.i_height * ZOOM_FACTOR / o_zoom) & ~1;        /* */        fmt_out = p_vout->fmt_out;        p_converted = image_Convert( p_sys->p_image, &crop, &fmt_in, &fmt_out );        picture_CopyPixels( p_outpic, p_converted );        picture_Release( p_converted );    }    else    {        picture_CopyPixels( p_outpic, p_pic );    }    /* */    p_oyp = &p_outpic->p[Y_PLANE];    if( b_visible )    {        video_format_t fmt_out;        /* image visualization */        fmt_out = p_vout->fmt_out;        fmt_out.i_width  = (p_vout->render.i_width/VIS_ZOOM ) & ~1;        fmt_out.i_height = (p_vout->render.i_height/VIS_ZOOM) & ~1;        p_converted = image_Convert( p_sys->p_image, p_pic,                                     &p_pic->format, &fmt_out );        for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )        {            int y;            for( y = 0; y < p_converted->p[i_plane].i_visible_lines; y++)            {                vlc_memcpy(                    &p_outpic->p[i_plane].p_pixels[y*p_outpic->p[i_plane].i_pitch],                    p_converted->p[i_plane].p_pixels+y*p_converted->p[i_plane].i_pitch,                    p_converted->p[i_plane].i_visible_pitch );            }        }        picture_Release( p_converted );        /* white rectangle on visualization */        v_w = __MIN( fmt_out.i_width  * ZOOM_FACTOR / o_zoom, fmt_out.i_width - 1 );        v_h = __MIN( fmt_out.i_height * ZOOM_FACTOR / o_zoom, fmt_out.i_height - 1 );        DrawRectangle( p_oyp->p_pixels, p_oyp->i_pitch,                       p_oyp->i_pitch, p_oyp->i_lines,                       o_x/VIS_ZOOM, o_y/VIS_ZOOM,                       v_w, v_h );        /* */        v_h = fmt_out.i_height + 1;    }    else    {        v_h = 1;    }    /* print a small "VLC ZOOM" */    if( b_visible || i_last_activity + p_sys->i_hide_timeout > mdate() )        DrawZoomStatus( p_oyp->p_pixels, p_oyp->i_pitch, p_oyp->i_pitch, p_oyp->i_lines,                        1, v_h, b_visible );    if( b_visible )    {        int y;        /* zoom gauge */        vlc_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)*ZOOM_FACTOR/10 < o_zoom )            {                vlc_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_sys->p_vout, p_outpic );}static void DrawZoomStatus( uint8_t *pb_dst, int i_pitch, int i_width, int i_height,                            int i_offset_x, int i_offset_y, bool b_visible ){    static const char *p_hide =        "X   X X      XXXX   XXXXX  XXX   XXX  XX XX   X   X XXXXX XXXX  XXXXXL"        "X   X X     X          X  X   X X   X X X X   X   X   X   X   X X    L"        " X X  X     X         X   X   X X   X X   X   XXXXX   X   X   X XXXX L"        " X X  X     X        X    X   X X   X X   X   X   X   X   X   X X    L"        "  X   XXXXX  XXXX   XXXXX  XXX   XXX  X   X   X   X XXXXX XXXX  XXXXXL";    static const char *p_show =         "X   X X      XXXX   XXXXX  XXX   XXX  XX XX    XXXX X   X  XXX  X   XL"        "X   X X     X          X  X   X X   X X X X   X     X   X X   X X   XL"        " X X  X     X         X   X   X X   X X   X    XXX  XXXXX X   X X X XL"        " X X  X     X        X    X   X X   X X   X       X X   X X   X X X XL"        "  X   XXXXX  XXXX   XXXXX  XXX   XXX  X   X   XXXX  X   X  XXX   X X L";    const char *p_draw = b_visible ? p_hide : p_show;    int i, y, x;    for( i = 0, x = i_offset_x, y = i_offset_y; p_draw[i] != '\0'; i++ )    {        if( p_draw[i] == 'X' )        {            if( x < i_width && y < i_height )                pb_dst[y*i_pitch + x] = 0xff;            x++;        }        else if( p_draw[i] == ' ' )        {            x++;        }        else if( p_draw[i] == 'L' )        {            x = i_offset_x;            y++;        }    }}static void DrawRectangle( uint8_t *pb_dst, int i_pitch, int i_width, int i_height,                           int x, int y, int i_w, int i_h ){    int dy;    if( x + i_w > i_width || y + i_h > i_height )        return;    /* top line */    vlc_memset( &pb_dst[y * i_pitch + x], 0xff, i_w );    /* left and right */    for( dy = 1; dy < i_h-1; dy++ )    {        pb_dst[(y+dy) * i_pitch + x +     0] = 0xff;        pb_dst[(y+dy) * i_pitch + x + i_w-1] = 0xff;    }    /* bottom line */    vlc_memset( &pb_dst[(y+i_h-1) * i_pitch + x], 0xff, i_w );}/***************************************************************************** * 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 ){    VLC_UNUSED(p_this); VLC_UNUSED(oldval);    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 ){    VLC_UNUSED(p_data); VLC_UNUSED(oldval);    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;    VLC_UNUSED(p_this);#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;    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 );    vlc_mutex_lock( &p_vout->p_sys->lock );    const int v_h = p_vout->output.i_height*ZOOM_FACTOR/p_vout->p_sys->i_zoom;    const int v_w = p_vout->output.i_width*ZOOM_FACTOR/p_vout->p_sys->i_zoom;    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 = 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 = 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 ));    p_vout->p_sys->i_last_activity = mdate();    vlc_mutex_unlock( &p_vout->p_sys->lock );    return VLC_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -