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

📄 win32text.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
    fmt.i_height = fmt.i_visible_height = i_height + (b_outline ? 4 : 0);    fmt.i_x_offset = fmt.i_y_offset = 0;    p_region_tmp = spu_CreateRegion( p_filter, &fmt );    if( !p_region_tmp )    {        msg_Err( p_filter, "cannot allocate SPU region" );        return VLC_EGENERIC;    }    /* Build palette */    fmt.p_palette->i_entries = 16;    for( i = 0; i < fmt.p_palette->i_entries; i++ )    {        fmt.p_palette->palette[i][0] = pi_gamma[i];        fmt.p_palette->palette[i][1] = 128;        fmt.p_palette->palette[i][2] = 128;        fmt.p_palette->palette[i][3] = pi_gamma[i];    }    p_region->fmt = p_region_tmp->fmt;    p_region->picture = p_region_tmp->picture;    free( p_region_tmp );    p_dst = p_region->picture.Y_PIXELS;    i_pitch = p_region->picture.Y_PITCH;    if( b_outline )    {        memset( p_dst, 0, i_pitch * fmt.i_height );        p_dst += p_region->picture.Y_PITCH * 2 + 2;    }    for( i = 0; i < i_height; i++ )    {        memcpy( p_dst, p_bitmap, i_width );        p_bitmap += (i_width+3) & ~3;        p_dst += i_pitch;    }    /* Outlining (find something better than nearest neighbour filtering ?) */    if( b_outline )    {        uint8_t *p_top = p_dst; /* Use 1st line as a cache */        uint8_t left, current;        int x, y;        p_dst = p_region->picture.Y_PIXELS;        for( y = 1; y < (int)fmt.i_height - 1; y++ )        {            memcpy( p_top, p_dst, fmt.i_width );            p_dst += i_pitch;            left = 0;            for( x = 1; x < (int)fmt.i_width - 1; x++ )            {                current = p_dst[x];                p_dst[x] = ( 4 * (int)p_dst[x] + left + p_top[x] + p_dst[x+1] +                             p_dst[x + i_pitch]) / 8;                left = current;            }        }        memset( p_top, 0, fmt.i_width );    }    return VLC_SUCCESS;}static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,                       subpicture_region_t *p_region_in ){    filter_sys_t *p_sys = p_filter->p_sys;    int i_font_color, i_font_alpha, i_font_size;    uint8_t *p_bitmap;    TCHAR *psz_string;    int i, i_width, i_height;    HBITMAP bitmap, bitmap_bak;    BITMAPINFO *p_bmi;    RECT rect = {0};    SIZE size;    /* Sanity check */    if( !p_region_in || !p_region_out ) return VLC_EGENERIC;#ifdef UNICODE    psz_string = malloc( (strlen( p_region_in->psz_text )+1) * sizeof(TCHAR) );    if( mbstowcs( psz_string, p_region_in->psz_text,                  strlen( p_region_in->psz_text ) * sizeof(TCHAR) ) < 0 )    {        free( psz_string );        return VLC_EGENERIC;    }#else    psz_string = strdup( p_region_in->psz_text );#endif    if( !psz_string || !*psz_string ) return VLC_EGENERIC;    if( p_region_in->p_style )    {        i_font_color = __MAX( __MIN( p_region_in->p_style->i_font_color, 0xFFFFFF ), 0 );        i_font_alpha = __MAX( __MIN( p_region_in->p_style->i_font_alpha, 255 ), 0 );        i_font_size  = __MAX( __MIN( p_region_in->p_style->i_font_size, 255 ), 0 );    }    else    {        i_font_color = p_sys->i_font_color;        i_font_alpha = 255 - p_sys->i_font_opacity;        i_font_size = p_sys->i_default_font_size;    }    SetFont( p_filter, i_font_size );    SetTextColor( p_sys->hcdc, RGB( (i_font_color >> 16) & 0xff,                  (i_font_color >> 8) & 0xff, i_font_color & 0xff) );    GetTextExtentExPoint( p_sys->hcdc, psz_string, _tcslen(psz_string),                          0, 0, 0, &size );    i_width = rect.right = size.cx; i_height = rect.bottom = size.cy;    p_bmi = malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*16);    memset( p_bmi, 0, sizeof(BITMAPINFOHEADER) );    p_bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);    p_bmi->bmiHeader.biWidth = (i_width+3) & ~3;    p_bmi->bmiHeader.biHeight = - i_height;    p_bmi->bmiHeader.biPlanes = 1;    p_bmi->bmiHeader.biBitCount = 8;    p_bmi->bmiHeader.biCompression = BI_RGB;    p_bmi->bmiHeader.biClrUsed = 16;    for( i = 0; i < 16; i++ )    {        p_bmi->bmiColors[i].rgbBlue =            p_bmi->bmiColors[i].rgbGreen =                p_bmi->bmiColors[i].rgbRed = pi_gamma[i];    }    bitmap = CreateDIBSection( p_sys->hcdc, p_bmi, DIB_RGB_COLORS,                               (void **)&p_bitmap, NULL, 0 );    if( !bitmap )    {        msg_Err( p_filter, "could not create bitmap" );        return VLC_EGENERIC;    }    bitmap_bak = SelectObject( p_sys->hcdc, bitmap );    FillRect( p_sys->hcdc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH) );    //TextOut( p_sys->hcdc, 0, 0, psz_string, strlen(psz_string) );    if( !DrawText( p_sys->hcdc, psz_string, -1, &rect, 0 ) )    {        msg_Err( p_filter, "could not draw text" );    }    p_region_out->i_x = p_region_in->i_x;    p_region_out->i_y = p_region_in->i_y;    Render( p_filter, p_region_out, p_bitmap, i_width, i_height );    SelectObject( p_sys->hcdc, bitmap_bak );    DeleteObject( bitmap );    return VLC_SUCCESS;}static int SetFont( filter_t *p_filter, int i_size ){    filter_sys_t *p_sys = p_filter->p_sys;    LOGFONT logfont;    if( i_size && i_size == p_sys->i_font_size ) return VLC_SUCCESS;    if( !i_size )    {        vlc_value_t val;        if( !p_sys->i_default_font_size &&            p_sys->i_display_height == (int)p_filter->fmt_out.video.i_height )            return VLC_SUCCESS;        if( p_sys->i_default_font_size )        {            i_size = p_sys->i_default_font_size;        }        else        {            var_Get( p_filter, "win32text-rel-fontsize", &val );            i_size = (int)p_filter->fmt_out.video.i_height / val.i_int;            p_filter->p_sys->i_display_height =                p_filter->fmt_out.video.i_height;        }        if( i_size <= 0 )        {            msg_Warn( p_filter, "invalid fontsize, using 12" );            i_size = 12;        }        msg_Dbg( p_filter, "using fontsize: %i", i_size );    }    p_sys->i_font_size = i_size;    if( p_sys->hfont_bak ) SelectObject( p_sys->hcdc, p_sys->hfont_bak );    if( p_sys->hfont ) DeleteObject( p_sys->hfont );    i_size = i_size * (int64_t)p_sys->i_logpy / 72;    logfont.lfHeight = i_size;    logfont.lfWidth = 0;    logfont.lfEscapement = 0;    logfont.lfOrientation = 0;    logfont.lfWeight = 0;    logfont.lfItalic = FALSE;    logfont.lfUnderline = FALSE;    logfont.lfStrikeOut = FALSE;    logfont.lfCharSet = ANSI_CHARSET;    logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;    logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;    logfont.lfQuality = ANTIALIASED_QUALITY;    logfont.lfPitchAndFamily = DEFAULT_PITCH;    memcpy( logfont.lfFaceName, _T("Arial"), sizeof(_T("Arial")) );    p_sys->hfont = CreateFontIndirect( &logfont );    p_sys->hfont_bak = SelectObject( p_sys->hcdc, p_sys->hfont );    return VLC_SUCCESS;}

⌨️ 快捷键说明

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