render_local.c
changeset 23 31307efd7e78
parent 17 8e8b56b0e0f5
child 24 8307d28329ae
equal deleted inserted replaced
22:4627760fc0d1 23:31307efd7e78
    13 
    13 
    14 int render_local (struct render *render, double *duration) {
    14 int render_local (struct render *render, double *duration) {
    15     unsigned char *rowbuf = NULL;
    15     unsigned char *rowbuf = NULL;
    16     struct render_png png_ctx;
    16     struct render_png png_ctx;
    17     struct render_raw raw_ctx;
    17     struct render_raw raw_ctx;
       
    18     int must_deinit = 0;
    18     clock_t t1, t2;
    19     clock_t t1, t2;
    19     
    20     
    20     if (duration)
    21     if (duration)
    21         *duration = -1;
    22         *duration = -1;
    22 
       
    23     // ugh
       
    24     memset(&png_ctx, 0, sizeof(png_ctx));
       
    25     memset(&raw_ctx, 0, sizeof(raw_ctx));
       
    26 
    23 
    27     // alloc the memory buffer
    24     // alloc the memory buffer
    28     if (!(rowbuf = malloc(render->img_w)))
    25     if (!(rowbuf = malloc(render->img_w)))
    29         ERROR("malloc");
    26         ERROR("malloc");
    30  
    27  
    31     // what mode?
    28     // what mode?
    32     switch (render->mode) {
    29     switch (render->mode) {
    33         case RENDER_PNG :
    30         case RENDER_PNG :
    34             // the render_png stuff
    31             // the render_png stuff
       
    32             memset(&png_ctx, 0, sizeof(png_ctx));
       
    33 
    35             if (render_png_init(&png_ctx, render))
    34             if (render_png_init(&png_ctx, render))
    36                 ERROR("render_png_init");
    35                 ERROR("render_png_init");
    37                 
    36             
       
    37             must_deinit = RENDER_PNG;
       
    38 
    38             //  set render_* to use the render_png
    39             //  set render_* to use the render_png
    39             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_png_row, &png_ctx))
    40             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_png_row, &png_ctx))
    40                 ERROR("render_local_mem");
    41                 ERROR("render_local_mem");
    41 
    42 
    42             break;
    43             break;
    43 
    44 
    44         case RENDER_RAW :
    45         case RENDER_RAW :
    45             // the render_raw stuff
    46             // the render_raw stuff
       
    47             memset(&raw_ctx, 0, sizeof(raw_ctx));
       
    48 
    46             if (render_raw_init(&raw_ctx, render))
    49             if (render_raw_init(&raw_ctx, render))
    47                 ERROR("render_raw_init");
    50                 ERROR("render_raw_init");
       
    51             
       
    52             must_deinit = RENDER_RAW;
    48 
    53 
    49             //  set render_* to use the render_raw
    54             //  set render_* to use the render_raw
    50             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &raw_ctx))
    55             if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &raw_ctx))
    51                 ERROR("render_local_mem");
    56                 ERROR("render_local_mem");
    52 
    57 
    71     // success
    76     // success
    72     return 0;
    77     return 0;
    73 
    78 
    74 error:
    79 error:
    75     free(rowbuf);
    80     free(rowbuf);
       
    81     
       
    82     if (must_deinit == RENDER_PNG)
       
    83         render_png_deinit(&png_ctx);
    76 
    84 
    77     render_png_deinit(&png_ctx);
    85     else if (must_deinit == RENDER_RAW)
    78     render_raw_deinit(&raw_ctx);
    86         render_raw_deinit(&raw_ctx);
    79 
    87 
    80     return -1;
    88     return -1;
    81 }
    89 }
    82 
    90