summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2014-01-25 01:22:04 +0000
committerOleg Oshmyan <chortos@inbox.lv>2014-01-26 03:22:03 +0000
commit33492cb5759413d4229f02fd8998926e9b11f3cb (patch)
tree8a354f62915a3afa828acdb7db5c4c955c528752
parent53c0fb57d40ed49aeaa4607528bf614b8a707e2e (diff)
downloadlibass-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.c15
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;
}
/*