diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2014-01-25 01:22:04 +0000 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2014-01-26 03:22:03 +0000 |
commit | 33492cb5759413d4229f02fd8998926e9b11f3cb (patch) | |
tree | 8a354f62915a3afa828acdb7db5c4c955c528752 | |
parent | 53c0fb57d40ed49aeaa4607528bf614b8a707e2e (diff) | |
download | libass-33492cb5759413d4229f02fd8998926e9b11f3cb.tar.bz2 libass-33492cb5759413d4229f02fd8998926e9b11f3cb.tar.xz |
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.
-rw-r--r-- | libass/ass_render.c | 15 |
1 files changed, 6 insertions, 9 deletions
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; } /* |