terom@11: #include terom@12: #include terom@11: #include terom@11: terom@11: #include "common.h" terom@17: #include "render_struct.h" terom@11: #include "render_local.h" terom@11: #include "render_png.h" terom@13: #include "render_raw.h" terom@12: #include "render_mandelbrot.h" terom@11: terom@11: int render_local (struct render *render, double *duration) { terom@24: struct render_local ctx; terom@12: terom@24: if (render_local_init(&ctx, render)) terom@24: return -1; terom@24: terom@24: int err = render_local_run(&ctx, duration); terom@24: terom@24: render_local_deinit(&ctx); terom@24: terom@24: return err; terom@24: } terom@24: terom@24: int render_local_init (struct render_local *ctx, struct render *render) { terom@24: // zero terom@24: memset(ctx, 0, sizeof(*ctx)); terom@24: terom@24: ctx->render_info = render; terom@11: terom@11: // alloc the memory buffer terom@24: if (!(ctx->rowbuf = malloc(render->img_w))) terom@11: ERROR("malloc"); terom@11: terom@13: // what mode? terom@13: switch (render->mode) { terom@13: case RENDER_PNG : terom@13: // the render_png stuff terom@24: memset(&ctx->png_ctx, 0, sizeof(ctx->png_ctx)); terom@23: terom@24: if (render_png_init(&ctx->png_ctx, render)) terom@13: ERROR("render_png_init"); terom@23: terom@24: ctx->must_deinit = RENDER_PNG; terom@23: terom@13: // set render_* to use the render_png terom@24: if (render_local_mem(render, &ctx->rowbuf, (int(*)(void *arg, unsigned char *)) &render_png_row, &ctx->png_ctx)) terom@13: ERROR("render_local_mem"); terom@13: terom@13: break; terom@13: terom@13: case RENDER_RAW : terom@13: // the render_raw stuff terom@24: memset(&ctx->raw_ctx, 0, sizeof(ctx->raw_ctx)); terom@23: terom@24: if (render_raw_init(&ctx->raw_ctx, render)) terom@13: ERROR("render_raw_init"); terom@23: terom@24: ctx->must_deinit = RENDER_RAW; terom@13: terom@13: // set render_* to use the render_raw terom@24: if (render_local_mem(render, &ctx->rowbuf, (int(*)(void *arg, unsigned char *)) &render_raw_row, &ctx->raw_ctx)) terom@13: ERROR("render_local_mem"); terom@13: terom@13: break; terom@13: terom@13: default : terom@13: assert(0); terom@13: } terom@24: terom@24: // success terom@24: return 0; terom@24: terom@24: error: terom@24: render_local_deinit(ctx); terom@24: terom@24: return -1; terom@24: } terom@24: terom@24: int render_local_run (struct render_local *ctx, double *duration) { terom@24: clock_t t1, t2; terom@24: terom@24: if (duration) terom@24: *duration = -1; terom@24: terom@11: // then we can actually render terom@12: t1 = clock(); terom@12: terom@24: if (render_mandelbrot(ctx->render_info)) terom@24: goto error; terom@11: terom@12: t2 = clock(); terom@24: terom@24: // flush the PNG terom@24: if (render_png_done(&ctx->png_ctx)) terom@24: goto error; terom@12: terom@12: // calculate the time taken terom@12: if (duration) terom@12: *duration = ((double)(t2 - t1))/CLOCKS_PER_SEC; terom@12: terom@11: // success terom@11: return 0; terom@11: terom@11: error: terom@24: // caller must deinit terom@24: // terom@11: return -1; terom@11: } terom@11: terom@24: void render_local_deinit (struct render_local *ctx) { terom@24: free(ctx->rowbuf); terom@24: terom@24: if (ctx->must_deinit == RENDER_PNG) terom@24: render_png_deinit(&ctx->png_ctx); terom@24: terom@24: else if (ctx->must_deinit == RENDER_RAW) terom@24: render_raw_deinit(&ctx->raw_ctx); terom@24: } terom@24: