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); }
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; }