render_local.c
changeset 23 31307efd7e78
parent 17 8e8b56b0e0f5
child 24 8307d28329ae
--- a/render_local.c	Tue Jun 17 19:08:05 2008 +0300
+++ b/render_local.c	Thu Jun 26 01:32:56 2008 +0300
@@ -15,15 +15,12 @@
     unsigned char *rowbuf = NULL;
     struct render_png png_ctx;
     struct render_raw raw_ctx;
+    int must_deinit = 0;
     clock_t t1, t2;
     
     if (duration)
         *duration = -1;
 
-    // ugh
-    memset(&png_ctx, 0, sizeof(png_ctx));
-    memset(&raw_ctx, 0, sizeof(raw_ctx));
-
     // alloc the memory buffer
     if (!(rowbuf = malloc(render->img_w)))
         ERROR("malloc");
@@ -32,9 +29,13 @@
     switch (render->mode) {
         case RENDER_PNG :
             // the render_png stuff
+            memset(&png_ctx, 0, sizeof(png_ctx));
+
             if (render_png_init(&png_ctx, render))
                 ERROR("render_png_init");
-                
+            
+            must_deinit = RENDER_PNG;
+
             //  set render_* to use the render_png
             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_png_row, &png_ctx))
                 ERROR("render_local_mem");
@@ -43,8 +44,12 @@
 
         case RENDER_RAW :
             // the render_raw stuff
+            memset(&raw_ctx, 0, sizeof(raw_ctx));
+
             if (render_raw_init(&raw_ctx, render))
                 ERROR("render_raw_init");
+            
+            must_deinit = RENDER_RAW;
 
             //  set render_* to use the render_raw
             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &raw_ctx))
@@ -73,9 +78,12 @@
 
 error:
     free(rowbuf);
+    
+    if (must_deinit == RENDER_PNG)
+        render_png_deinit(&png_ctx);
 
-    render_png_deinit(&png_ctx);
-    render_raw_deinit(&raw_ctx);
+    else if (must_deinit == RENDER_RAW)
+        render_raw_deinit(&raw_ctx);
 
     return -1;
 }