📄 win32text.c
字号:
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 + -