From 33492cb5759413d4229f02fd8998926e9b11f3cb Mon Sep 17 00:00:00 2001 From: Oleg Oshmyan Date: Sat, 25 Jan 2014 01:22:04 +0000 Subject: Make sure to release each event's vector clip mask Events with a clip mask but no text such as just Dialogue: ...,{\clip(m 47 32 )} had their clip masks carried over to the next event. Fixes GitHub issue #22. --- libass/ass_render.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'libass/ass_render.c') diff --git a/libass/ass_render.c b/libass/ass_render.c index 409b8bc..3954c5b 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -504,7 +504,7 @@ static void blend_vector_clip(ASS_Renderer *render_priv, if (!outline) { ass_msg(render_priv->library, MSGL_WARN, "Clip vector parsing failed. Skipping."); - goto blend_vector_error; + return; } // We need to translate the clip according to screen borders @@ -526,9 +526,8 @@ static void blend_vector_clip(ASS_Renderer *render_priv, v.bm = clip_bm; ass_cache_put(render_priv->cache.bitmap_cache, &key, &v); } -blend_vector_error: - if (!clip_bm) goto blend_vector_exit; + if (!clip_bm) return; // Iterate through bitmaps and blend/clip them for (cur = head; cur; cur = cur->next) { @@ -572,7 +571,7 @@ blend_vector_error: // Allocate new buffer and add to free list nbuffer = malloc(as * ah + 0x1F); - if (!nbuffer) goto blend_vector_exit; + if (!nbuffer) return; free_list_add(render_priv, nbuffer); nbuffer = (unsigned char*)(((uintptr_t)nbuffer + 0x1F) & ~0x1F); @@ -593,7 +592,7 @@ blend_vector_error: uintptr_t alignment_offset = (w > 15) ? 15 : ((w > 7) ? 7 : 0); unsigned ns = (w + alignment_offset) & ~alignment_offset; nbuffer = malloc(ns * h + alignment_offset); - if (!nbuffer) goto blend_vector_exit; + if (!nbuffer) return; free_list_add(render_priv, nbuffer); nbuffer = (unsigned char*) (((uintptr_t)nbuffer + alignment_offset) & ~alignment_offset); @@ -611,10 +610,6 @@ blend_vector_error: } cur->bitmap = nbuffer; } - -blend_vector_exit: - ass_drawing_free(render_priv->state.clip_drawing); - render_priv->state.clip_drawing = 0; } static inline int is_skip_symbol(uint32_t x) @@ -844,9 +839,11 @@ static void free_render_context(ASS_Renderer *render_priv) { free(render_priv->state.family); ass_drawing_free(render_priv->state.drawing); + ass_drawing_free(render_priv->state.clip_drawing); render_priv->state.family = NULL; render_priv->state.drawing = NULL; + render_priv->state.clip_drawing = NULL; } /* -- cgit v1.2.3