summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c87
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);