コード例 #1
0
ファイル: sd_ass.c プロジェクト: miaomi/mpv
static void configure_ass(struct sd *sd, struct mp_osd_res *dim,
                          bool converted, ASS_Track *track)
{
    struct MPOpts *opts = sd->opts;
    struct sd_ass_priv *ctx = sd->priv;
    ASS_Renderer *priv = ctx->ass_renderer;

    ass_set_frame_size(priv, dim->w, dim->h);
    ass_set_margins(priv, dim->mt, dim->mb, dim->ml, dim->mr);

    bool set_use_margins = false;
    int set_sub_pos = 0;
    float set_line_spacing = 0;
    float set_font_scale = 1;
    int set_hinting = 0;
    bool set_scale_with_window = false;
    bool set_scale_by_window = true;
    bool total_override = false;
    // With forced overrides, apply the --sub-* specific options
    if (converted || opts->ass_style_override == 3) {
        set_scale_with_window = opts->sub_scale_with_window;
        set_use_margins = opts->sub_use_margins;
        set_scale_by_window = opts->sub_scale_by_window;
        total_override = true;
    } else {
        set_scale_with_window = opts->ass_scale_with_window;
        set_use_margins = opts->ass_use_margins;
    }
    if (converted || opts->ass_style_override) {
        set_sub_pos = 100 - opts->sub_pos;
        set_line_spacing = opts->ass_line_spacing;
        set_hinting = opts->ass_hinting;
        set_font_scale = opts->sub_scale;
    }
    if (set_scale_with_window) {
        int vidh = dim->h - (dim->mt + dim->mb);
        set_font_scale *= dim->h / (float)MPMAX(vidh, 1);
    }
    if (!set_scale_by_window) {
        double factor = dim->h / 720.0;
        if (factor != 0.0)
            set_font_scale /= factor;
    }
    ass_set_use_margins(priv, set_use_margins);
    ass_set_line_position(priv, set_sub_pos);
    ass_set_shaper(priv, opts->ass_shaper);
    int set_force_flags = 0;
    if (total_override)
        set_force_flags |= ASS_OVERRIDE_BIT_STYLE | ASS_OVERRIDE_BIT_FONT_SIZE;
    if (opts->ass_style_override == 4)
        set_force_flags |= ASS_OVERRIDE_BIT_FONT_SIZE;
    ass_set_selective_style_override_enabled(priv, set_force_flags);
    ASS_Style style = {0};
    mp_ass_set_style(&style, 288, opts->sub_text_style);
    ass_set_selective_style_override(priv, &style);
    free(style.FontName);
    if (converted && track->default_style < track->n_styles) {
        mp_ass_set_style(track->styles + track->default_style,
                         track->PlayResY, opts->sub_text_style);
    }
    ass_set_font_scale(priv, set_font_scale);
    ass_set_hinting(priv, set_hinting);
    ass_set_line_spacing(priv, set_line_spacing);
}
コード例 #2
0
ファイル: libASS.cpp プロジェクト: JandunCN/QMPlay2
bool libASS::getASS( QMPlay2_OSD *&osd, double pos )
{
	if ( !ass_sub_track || !ass_sub_renderer || !W || !H )
		return false;

	int playResX = ass_sub_track->PlayResX;
	int playResY = ass_sub_track->PlayResY;
	if ( overridePlayRes )
	{
		ass_sub_track->PlayResX = 384;
		ass_sub_track->PlayResY = 288;
	}

	double _fontScale = fontScale;

	if ( _fontScale != 1.0 )
	{
		for ( int i = 0 ; i < ass_sub_track->n_styles ; i++ )
		{
			ass_sub_track->styles[ i ].ScaleX  *= _fontScale;
			ass_sub_track->styles[ i ].ScaleY  *= _fontScale;
			ass_sub_track->styles[ i ].Shadow  *= _fontScale;
			ass_sub_track->styles[ i ].Outline *= _fontScale;
		}
	}

	ass_set_frame_size( ass_sub_renderer, W, H );
	int ch;
	ASS_Image *img = ass_render_frame( ass_sub_renderer, ass_sub_track, pos * 1000, &ch );

	if ( _fontScale != 1.0 )
	{
		for ( int i = 0 ; i < ass_sub_track->n_styles ; i++ )
		{
			ass_sub_track->styles[ i ].ScaleX  /= _fontScale;
			ass_sub_track->styles[ i ].ScaleY  /= _fontScale;
			ass_sub_track->styles[ i ].Shadow  /= _fontScale;
			ass_sub_track->styles[ i ].Outline /= _fontScale;
		}
	}

	if ( overridePlayRes )
	{
		ass_sub_track->PlayResX = playResX;
		ass_sub_track->PlayResY = playResY;
	}

	if ( !img )
		return false;
	bool old_osd = osd;
	if ( !old_osd )
		osd = new QMPlay2_OSD;
	else
	{
		osd->lock();
		if ( ch )
			osd->clear( false );
	}
	osd->setPTS( pos );
	if ( ch || !old_osd )
	{
		addImgs( img, osd );
		osd->genChecksum();
	}
	if ( old_osd )
		osd->unlock();
	return true;
}