#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include "common.h"
#include "render_struct.h"
#include "render_local.h"
#include "render_png_struct.h"
#include "render_png.h"
#include "render_raw_struct.h"
#include "render_raw.h"
#include "render_mandelbrot.h"
int render_local (struct render *render, double *duration) {
unsigned char *rowbuf = NULL;
struct render_png png_ctx;
struct render_raw raw_ctx;
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");
// what mode?
switch (render->mode) {
case RENDER_PNG :
// the render_png stuff
if (render_png_init(&png_ctx, render))
ERROR("render_png_init");
// 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");
break;
case RENDER_RAW :
// the render_raw stuff
if (render_raw_init(&raw_ctx, render))
ERROR("render_raw_init");
// set render_* to use the render_raw
if (render_local_mem(render, &rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &raw_ctx))
ERROR("render_local_mem");
break;
default :
assert(0);
}
// then we can actually render
t1 = clock();
if (render_mandelbrot(render))
ERROR("render_mandelbrot");
t2 = clock();
// calculate the time taken
if (duration)
*duration = ((double)(t2 - t1))/CLOCKS_PER_SEC;
// success
return 0;
error:
free(rowbuf);
render_png_deinit(&png_ctx);
render_raw_deinit(&raw_ctx);
return -1;
}