diff options
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r-- | libass/ass_render.c | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index f95479c..afcbf42 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -76,6 +76,29 @@ static void text_info_done(TextInfo* text_info) free(text_info->combined_bitmaps); } +static bool render_context_init(RenderContext *state, ASS_Renderer *priv) +{ + state->renderer = priv; + + if (!text_info_init(&state->text_info)) + return false; + + if (!(state->shaper = ass_shaper_new(priv->cache.metrics_cache))) + return false; + + return ass_rasterizer_init(&priv->engine, &state->rasterizer, RASTERIZER_PRECISION); +} + +static void render_context_done(RenderContext *state) +{ + ass_rasterizer_done(&state->rasterizer); + + if (state->shaper) + ass_shaper_free(state->shaper); + + text_info_done(&state->text_info); +} + ASS_Renderer *ass_renderer_init(ASS_Library *library) { int error; @@ -112,9 +135,6 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library) #endif priv->engine = ass_bitmap_engine_init(flags); - if (!ass_rasterizer_init(&priv->engine, &priv->state.rasterizer, RASTERIZER_PRECISION)) - goto fail; - priv->cache.font_cache = ass_font_cache_create(); priv->cache.bitmap_cache = ass_bitmap_cache_create(); priv->cache.composite_cache = ass_composite_cache_create(); @@ -127,20 +147,14 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library) priv->cache.bitmap_max_size = BITMAP_CACHE_MAX_SIZE; priv->cache.composite_max_size = COMPOSITE_CACHE_MAX_SIZE; - if (!text_info_init(&priv->text_info)) + if (!render_context_init(&priv->state, priv)) goto fail; priv->user_override_style.Name = "OverrideStyle"; // name insignificant - priv->state.renderer = priv; - priv->state.text_info = &priv->text_info; - priv->settings.font_size_coeff = 1.; priv->settings.selective_style_overrides = ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE; - if (!(priv->state.shaper = ass_shaper_new(priv->cache.metrics_cache))) - goto fail; - ass_shaper_info(library); priv->settings.shaper = ASS_SHAPING_COMPLEX; @@ -167,18 +181,15 @@ void ass_renderer_done(ASS_Renderer *render_priv) ass_cache_done(render_priv->cache.bitmap_cache); ass_cache_done(render_priv->cache.outline_cache); ass_cache_done(render_priv->cache.metrics_cache); - ass_shaper_free(render_priv->state.shaper); ass_cache_done(render_priv->cache.font_cache); - ass_rasterizer_done(&render_priv->state.rasterizer); - if (render_priv->fontselect) ass_fontselect_free(render_priv->fontselect); if (render_priv->ftlibrary) FT_Done_FreeType(render_priv->ftlibrary); free(render_priv->eimg); - text_info_done(&render_priv->text_info); + render_context_done(&render_priv->state); free(render_priv->settings.default_font); free(render_priv->settings.default_family); @@ -809,8 +820,8 @@ static ASS_Image *render_text(RenderContext *state) { ASS_Image *head; ASS_Image **tail = &head; - unsigned n_bitmaps = state->text_info->n_bitmaps; - CombinedBitmapInfo *bitmaps = state->text_info->combined_bitmaps; + unsigned n_bitmaps = state->text_info.n_bitmaps; + CombinedBitmapInfo *bitmaps = state->text_info.combined_bitmaps; for (unsigned i = 0; i < n_bitmaps; i++) { CombinedBitmapInfo *info = &bitmaps[i]; @@ -1149,9 +1160,7 @@ static void free_render_context(RenderContext *state) state->family.len = 0; state->clip_drawing_text.str = NULL; state->clip_drawing_text.len = 0; - - if (state->text_info) - state->text_info->length = 0; + state->text_info.length = 0; } /** @@ -1580,7 +1589,7 @@ static void measure_text_on_eol(RenderContext *state, double scale, int cur_line int max_asc, int max_desc, double max_border_x, double max_border_y) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; text_info->lines[cur_line].asc = scale * max_asc; text_info->lines[cur_line].desc = scale * max_desc; text_info->height += scale * max_asc + scale * max_desc; @@ -1608,7 +1617,7 @@ static void measure_text_on_eol(RenderContext *state, double scale, int cur_line static void measure_text(RenderContext *state) { ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; text_info->height = 0; text_info->border_x = 0; @@ -1661,7 +1670,7 @@ static void trim_whitespace(RenderContext *state) { int i, j; GlyphInfo *cur; - TextInfo *ti = state->text_info; + TextInfo *ti = &state->text_info; // Mark trailing spaces i = ti->length - 1; @@ -1732,7 +1741,7 @@ static void wrap_lines_naive(RenderContext *state, double max_text_width, char *unibrks) { ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; GlyphInfo *s1 = text_info->glyphs; // current line start int last_breakable = -1; int break_type = 0; @@ -1812,7 +1821,7 @@ static inline GlyphInfo *rewind_trailing_spaces(GlyphInfo *start1, GlyphInfo* st static void wrap_lines_rebalance(RenderContext *state, double max_text_width, char *unibrks) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; int exit = 0; #define DIFF(x,y) (((x) < (y)) ? (y - x) : (x - y)) @@ -1881,7 +1890,7 @@ wrap_lines_rebalance(RenderContext *state, double max_text_width, char *unibrks) static void wrap_lines_measure(RenderContext *state, char *unibrks) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; int cur_line = 1; int i = 0; @@ -1933,7 +1942,7 @@ wrap_lines_smart(RenderContext *state, double max_text_width) #ifdef CONFIG_UNIBREAK ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; if (render_priv->track->parser_priv->feature_flags & FEATURE_MASK(ASS_FEATURE_WRAP_UNICODE)) { unibrks = text_info->breaks; set_linebreaks_utf32( @@ -2033,7 +2042,7 @@ fix_glyph_scaling(ASS_Renderer *priv, GlyphInfo *glyph) // Initial run splitting based purely on the characters' styles static void split_style_runs(RenderContext *state) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; Effect last_effect_type = text_info->glyphs[0].effect_type; text_info->glyphs[0].starts_new_run = true; for (int i = 1; i < text_info->length; i++) { @@ -2079,7 +2088,7 @@ static void split_style_runs(RenderContext *state) // Fill render_priv->text_info. static bool parse_events(RenderContext *state, ASS_Event *event) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; ASS_Renderer *render_priv = state->renderer; char *p = event->Text, *q; @@ -2214,10 +2223,10 @@ fail: // Process render_priv->text_info and load glyph outlines. static void retrieve_glyphs(RenderContext *state) { - GlyphInfo *glyphs = state->text_info->glyphs; + GlyphInfo *glyphs = state->text_info.glyphs; int i; - for (i = 0; i < state->text_info->length; i++) { + for (i = 0; i < state->text_info.length; i++) { GlyphInfo *info = glyphs + i; do { get_outline_glyph(state, info); @@ -2245,8 +2254,8 @@ static void retrieve_glyphs(RenderContext *state) static void preliminary_layout(RenderContext *state) { ASS_Vector pen = { 0, 0 }; - for (int i = 0; i < state->text_info->length; i++) { - GlyphInfo *info = state->text_info->glyphs + i; + for (int i = 0; i < state->text_info.length; i++) { + GlyphInfo *info = state->text_info.glyphs + i; ASS_Vector cluster_pen = pen; do { info->pos.x = cluster_pen.x; @@ -2257,7 +2266,7 @@ static void preliminary_layout(RenderContext *state) info = info->next; } while (info); - info = state->text_info->glyphs + i; + info = state->text_info.glyphs + i; pen.x += info->cluster_advance.x; pen.y += info->cluster_advance.y; } @@ -2267,7 +2276,7 @@ static void preliminary_layout(RenderContext *state) static void reorder_text(RenderContext *state) { ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; FriBidiStrIndex *cmap = ass_shaper_reorder(state->shaper, text_info); if (!cmap) { ass_msg(render_priv->library, MSGL_ERR, "Failed to reorder text"); @@ -2306,7 +2315,7 @@ static void reorder_text(RenderContext *state) static void apply_baseline_shear(RenderContext *state) { ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; FriBidiStrIndex *cmap = ass_shaper_get_reorder_map(state->shaper); int32_t shear = 0; bool whole_text_layout = @@ -2329,7 +2338,7 @@ static void apply_baseline_shear(RenderContext *state) static void align_lines(RenderContext *state, double max_text_width) { - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; GlyphInfo *glyphs = text_info->glyphs; int i, j; double width = 0; @@ -2413,7 +2422,7 @@ static void calculate_rotation_params(RenderContext *state, ASS_DRect *bbox, center.y = device_y + by; } - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; for (int i = 0; i < text_info->length; i++) { GlyphInfo *info = text_info->glyphs + i; while (info) { @@ -2481,7 +2490,7 @@ static void render_and_combine_glyphs(RenderContext *state, double device_x, double device_y) { ASS_Renderer *render_priv = state->renderer; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; int left = render_priv->settings.left_margin; device_x = (device_x - left) * render_priv->par_scale_x + left; unsigned nb_bitmaps = 0; @@ -2852,7 +2861,7 @@ ass_render_event(RenderContext *state, ASS_Event *event, if (!parse_events(state, event)) return false; - TextInfo *text_info = state->text_info; + TextInfo *text_info = &state->text_info; if (text_info->length == 0) { // no valid symbols in the event; this can be smth like {comment} free_render_context(state); |