diff options
-rw-r--r-- | libass/ass_render.c | 98 |
1 files changed, 50 insertions, 48 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index 8895a884..71f1300e 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -208,9 +208,11 @@ struct render_priv_s { int render_id; }; -static void ass_lazy_track_init(ass_renderer_t* render_priv, ass_settings_t* settings_priv) +static void ass_lazy_track_init(ass_renderer_t* render_priv) { ass_track_t* track = render_priv->track; + ass_settings_t* settings_priv = &render_priv->settings; + if (track->PlayResX && track->PlayResY) return; if (!track->PlayResX && !track->PlayResY) { @@ -573,43 +575,43 @@ static ass_image_t* render_text(ass_renderer_t* render_priv, text_info_t* text_i /** * \brief Mapping between script and screen coordinates */ -static int x2scr(ass_renderer_t* render_priv, ass_settings_t* priv, double x) { +static int x2scr(ass_renderer_t* render_priv, double x) { return x*render_priv->orig_width_nocrop / render_priv->track->PlayResX + - FFMAX(priv->left_margin, 0); + FFMAX(render_priv->settings.left_margin, 0); } -static double x2scr_pos(ass_renderer_t* render_priv, ass_settings_t* priv, double x) { +static double x2scr_pos(ass_renderer_t* render_priv, double x) { return x*render_priv->orig_width / render_priv->track->PlayResX + - priv->left_margin; + render_priv->settings.left_margin; } /** * \brief Mapping between script and screen coordinates */ -static double y2scr(ass_renderer_t* render_priv, ass_settings_t* priv, double y) { +static double y2scr(ass_renderer_t* render_priv, double y) { return y * render_priv->orig_height_nocrop / render_priv->track->PlayResY + - FFMAX(priv->top_margin, 0); + FFMAX(render_priv->settings.top_margin, 0); } -static double y2scr_pos(ass_renderer_t* render_priv, ass_settings_t* priv, double y) { +static double y2scr_pos(ass_renderer_t* render_priv, double y) { return y * render_priv->orig_height / render_priv->track->PlayResY + - priv->top_margin; + render_priv->settings.top_margin; } // the same for toptitles -static int y2scr_top(ass_renderer_t* render_priv, ass_settings_t* priv, double y) { - if (priv->use_margins) +static int y2scr_top(ass_renderer_t* render_priv, double y) { + if (render_priv->settings.use_margins) return y * render_priv->orig_height_nocrop / render_priv->track->PlayResY; else return y * render_priv->orig_height_nocrop / render_priv->track->PlayResY + - FFMAX(priv->top_margin, 0); + FFMAX(render_priv->settings.top_margin, 0); } // the same for subtitles -static int y2scr_sub(ass_renderer_t* render_priv, ass_settings_t* priv, double y) { - if (priv->use_margins) +static int y2scr_sub(ass_renderer_t* render_priv, double y) { + if (render_priv->settings.use_margins) return y * render_priv->orig_height_nocrop / render_priv->track->PlayResY + - FFMAX(priv->top_margin, 0) + - FFMAX(priv->bottom_margin, 0); + FFMAX(render_priv->settings.top_margin, 0) + + FFMAX(render_priv->settings.bottom_margin, 0); else return y * render_priv->orig_height_nocrop / render_priv->track->PlayResY + - FFMAX(priv->top_margin, 0); + FFMAX(render_priv->settings.top_margin, 0); } static void compute_string_bbox( text_info_t* info, FT_BBox *abbox ) { @@ -1420,7 +1422,7 @@ static void free_render_context(void) * and add them to cache. * The glyphs are returned in info->glyph and info->outline_glyph */ -static void get_outline_glyph(ass_renderer_t* render_priv, ass_settings_t* priv, int symbol, glyph_info_t* info, FT_Vector* advance) +static void get_outline_glyph(ass_renderer_t* render_priv, int symbol, glyph_info_t* info, FT_Vector* advance) { int error; glyph_hash_val_t* val; @@ -1448,7 +1450,7 @@ static void get_outline_glyph(ass_renderer_t* render_priv, ass_settings_t* priv, info->advance.y = val->advance.y; } else { glyph_hash_val_t v; - info->glyph = ass_font_get_glyph(render_priv->fontconfig_priv, render_context.font, symbol, priv->hinting); + info->glyph = ass_font_get_glyph(render_priv->fontconfig_priv, render_context.font, symbol, render_priv->settings.hinting); if (!info->glyph) return; info->advance.x = d16_to_d6(info->glyph->advance.x); @@ -1940,8 +1942,8 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve shift.y = pen.y & SUBPIXEL_MASK; if (render_context.evt_type == EVENT_POSITIONED) { - shift.x += double_to_d6(x2scr_pos(render_priv, settings_priv, render_context.pos_x)) & SUBPIXEL_MASK; - shift.y -= double_to_d6(y2scr_pos(render_priv, settings_priv, render_context.pos_y)) & SUBPIXEL_MASK; + shift.x += double_to_d6(x2scr_pos(render_priv, render_context.pos_x)) & SUBPIXEL_MASK; + shift.y -= double_to_d6(y2scr_pos(render_priv, render_context.pos_y)) & SUBPIXEL_MASK; } ass_font_set_transform(render_context.font, @@ -1949,7 +1951,7 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve render_context.scale_y, &shift ); - get_outline_glyph(render_priv, settings_priv, code, text_info.glyphs + text_info.length, &shift); + get_outline_glyph(render_priv, code, text_info.glyphs + text_info.length, &shift); text_info.glyphs[text_info.length].pos.x = pen.x >> 6; text_info.glyphs[text_info.length].pos.y = pen.y >> 6; @@ -2027,7 +2029,7 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve int max_text_width; // calculate max length of a line - max_text_width = x2scr(render_priv, settings_priv, render_priv->track->PlayResX - MarginR) - x2scr(render_priv, settings_priv, MarginL); + max_text_width = x2scr(render_priv, render_priv->track->PlayResX - MarginR) - x2scr(render_priv, MarginL); // rearrange text in several lines wrap_lines_smart(settings_priv, max_text_width); @@ -2069,36 +2071,36 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve // x coordinate for everything except positioned events if (render_context.evt_type == EVENT_NORMAL || render_context.evt_type == EVENT_VSCROLL) { - device_x = x2scr(render_priv, settings_priv, MarginL); + device_x = x2scr(render_priv, MarginL); } else if (render_context.evt_type == EVENT_HSCROLL) { if (render_context.scroll_direction == SCROLL_RL) - device_x = x2scr(render_priv, settings_priv, render_priv->track->PlayResX - render_context.scroll_shift); + device_x = x2scr(render_priv, render_priv->track->PlayResX - render_context.scroll_shift); else if (render_context.scroll_direction == SCROLL_LR) - device_x = x2scr(render_priv, settings_priv, render_context.scroll_shift) - (bbox.xMax - bbox.xMin); + device_x = x2scr(render_priv, render_context.scroll_shift) - (bbox.xMax - bbox.xMin); } // y coordinate for everything except positioned events if (render_context.evt_type == EVENT_NORMAL || render_context.evt_type == EVENT_HSCROLL) { if (valign == VALIGN_TOP) { // toptitle - device_y = y2scr_top(render_priv, settings_priv, MarginV) + d6_to_int(text_info.lines[0].asc); + device_y = y2scr_top(render_priv, MarginV) + d6_to_int(text_info.lines[0].asc); } else if (valign == VALIGN_CENTER) { // midtitle - int scr_y = y2scr(render_priv, settings_priv, render_priv->track->PlayResY / 2); + int scr_y = y2scr(render_priv, render_priv->track->PlayResY / 2); device_y = scr_y - (bbox.yMax - bbox.yMin) / 2; } else { // subtitle int scr_y; if (valign != VALIGN_SUB) mp_msg(MSGT_ASS, MSGL_V, "Invalid valign, supposing 0 (subtitle)\n"); - scr_y = y2scr_sub(render_priv, settings_priv, render_priv->track->PlayResY - MarginV); + scr_y = y2scr_sub(render_priv, render_priv->track->PlayResY - MarginV); device_y = scr_y; device_y -= d6_to_int(text_info.height); device_y += d6_to_int(text_info.lines[0].asc); } } else if (render_context.evt_type == EVENT_VSCROLL) { if (render_context.scroll_direction == SCROLL_TB) - device_y = y2scr(render_priv, settings_priv, render_context.clip_y0 + render_context.scroll_shift) - (bbox.yMax - bbox.yMin); + device_y = y2scr(render_priv, render_context.clip_y0 + render_context.scroll_shift) - (bbox.yMax - bbox.yMin); else if (render_context.scroll_direction == SCROLL_BT) - device_y = y2scr(render_priv, settings_priv, render_context.clip_y1 - render_context.scroll_shift); + device_y = y2scr(render_priv, render_context.clip_y1 - render_context.scroll_shift); } // positioned events are totally different @@ -2107,31 +2109,31 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve int base_y = 0; mp_msg(MSGT_ASS, MSGL_DBG2, "positioned event at %f, %f\n", render_context.pos_x, render_context.pos_y); get_base_point(bbox, alignment, &base_x, &base_y); - device_x = x2scr_pos(render_priv, settings_priv, render_context.pos_x) - base_x; - device_y = y2scr_pos(render_priv, settings_priv, render_context.pos_y) - base_y; + device_x = x2scr_pos(render_priv, render_context.pos_x) - base_x; + device_y = y2scr_pos(render_priv, render_context.pos_y) - base_y; } // fix clip coordinates (they depend on alignment) if (render_context.evt_type == EVENT_NORMAL || render_context.evt_type == EVENT_HSCROLL || render_context.evt_type == EVENT_VSCROLL) { - render_context.clip_x0 = x2scr(render_priv, settings_priv, render_context.clip_x0); - render_context.clip_x1 = x2scr(render_priv, settings_priv, render_context.clip_x1); + render_context.clip_x0 = x2scr(render_priv, render_context.clip_x0); + render_context.clip_x1 = x2scr(render_priv, render_context.clip_x1); if (valign == VALIGN_TOP) { - render_context.clip_y0 = y2scr_top(render_priv, settings_priv, render_context.clip_y0); - render_context.clip_y1 = y2scr_top(render_priv, settings_priv, render_context.clip_y1); + render_context.clip_y0 = y2scr_top(render_priv, render_context.clip_y0); + render_context.clip_y1 = y2scr_top(render_priv, render_context.clip_y1); } else if (valign == VALIGN_CENTER) { - render_context.clip_y0 = y2scr(render_priv, settings_priv, render_context.clip_y0); - render_context.clip_y1 = y2scr(render_priv, settings_priv, render_context.clip_y1); + render_context.clip_y0 = y2scr(render_priv, render_context.clip_y0); + render_context.clip_y1 = y2scr(render_priv, render_context.clip_y1); } else if (valign == VALIGN_SUB) { - render_context.clip_y0 = y2scr_sub(render_priv, settings_priv, render_context.clip_y0); - render_context.clip_y1 = y2scr_sub(render_priv, settings_priv, render_context.clip_y1); + render_context.clip_y0 = y2scr_sub(render_priv, render_context.clip_y0); + render_context.clip_y1 = y2scr_sub(render_priv, render_context.clip_y1); } } else if (render_context.evt_type == EVENT_POSITIONED) { - render_context.clip_x0 = x2scr_pos(render_priv, settings_priv, render_context.clip_x0); - render_context.clip_x1 = x2scr_pos(render_priv, settings_priv, render_context.clip_x1); - render_context.clip_y0 = y2scr_pos(render_priv, settings_priv, render_context.clip_y0); - render_context.clip_y1 = y2scr_pos(render_priv, settings_priv, render_context.clip_y1); + render_context.clip_x0 = x2scr_pos(render_priv, render_context.clip_x0); + render_context.clip_x1 = x2scr_pos(render_priv, render_context.clip_x1); + render_context.clip_y0 = y2scr_pos(render_priv, render_context.clip_y0); + render_context.clip_y1 = y2scr_pos(render_priv, render_context.clip_y1); } // calculate rotation parameters @@ -2139,8 +2141,8 @@ static int ass_render_event(ass_renderer_t* render_priv, ass_event_t* event, eve FT_Vector center; if (render_context.have_origin) { - center.x = x2scr(render_priv, settings_priv, render_context.org_x); - center.y = y2scr(render_priv, settings_priv, render_context.org_y); + center.x = x2scr(render_priv, render_context.org_x); + center.y = y2scr(render_priv, render_context.org_y); } else { int bx = 0, by = 0; get_base_point(bbox, alignment, &bx, &by); @@ -2313,7 +2315,7 @@ static int ass_start_frame(ass_renderer_t *render_priv, ass_track_t* track, long render_priv->track = track; render_priv->time = now; - ass_lazy_track_init(render_priv, settings_priv); + ass_lazy_track_init(render_priv); render_priv->font_scale = settings_priv->font_size_coeff * render_priv->orig_height / render_priv->track->PlayResY; |