]> granicus.if.org Git - libass/commitdiff
Make sure to release each event's vector clip mask
authorOleg Oshmyan <chortos@inbox.lv>
Sat, 25 Jan 2014 01:22:04 +0000 (01:22 +0000)
committerOleg Oshmyan <chortos@inbox.lv>
Sun, 26 Jan 2014 03:22:03 +0000 (03:22 +0000)
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

index 409b8bc4f19889f6eacd2ff89648b72a396bed84..3954c5b6fa6184bf50d67baa0a7a4bcee460f4fd 100644 (file)
@@ -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;
 }
 
 /*