#include <stdlib.h>
#include "common.h"
#include "render_struct.h"
#include "render.h"
#include "render_raw_struct.h"
#include "render_raw.h"
int render_raw_deinit (struct render_raw *ctx) {
return 0;
}
void render_raw_free (struct render_raw *ctx) {
render_raw_deinit(ctx);
if (ctx->owned_by_me)
free(ctx);
}
int render_raw_init (struct render_raw *ctx, struct render *render) {
// store some info from the struct render
ctx->img_w = render->img_w;
ctx->io_stream = render->io_stream;
ctx->io_write_fn = render->io_write_fn;
ctx->io_flush_fn = render->io_flush_fn;
ctx->cb_arg = render->cb_arg;
// success
return 0;
/*
error:
_render_raw_deinit(ctx);
return -1;
*/
}
struct render_raw *render_raw_alloc (struct render *render) {
struct render_raw *ctx = NULL;
// calloc the render_png
if (!(ctx = calloc(1, sizeof(struct render_raw))))
ERROR("calloc");
// mark it to be freed
ctx->owned_by_me = 1;
// initialize
if (render_raw_init(ctx, render))
goto error;
return ctx;
error:
render_raw_free(ctx);
return NULL;
}
int render_raw_row (struct render_raw *ctx, unsigned char *rowbuf) {
// write it out
if (ctx->io_stream) {
if (fwrite(rowbuf, ctx->img_w, 1, ctx->io_stream) != 1)
PERROR("fwrite");
} else if (ctx->io_write_fn) {
if (ctx->io_write_fn(rowbuf, ctx->img_w, ctx->cb_arg))
ERROR("io_write_fn");
} else {
// ignore
}
// success
return 0;
error:
// don't free it yet, raw_{done,abort} does that!
return -1;
}
int render_raw_done (struct render_raw *ctx) {
// flush
if (ctx->io_stream) {
if (fflush(ctx->io_stream))
PERROR("fflush");
} else if (ctx->io_flush_fn) {
if (ctx->io_flush_fn(ctx->cb_arg))
ERROR("io_flush_fn");
} else {
// ignore
}
// free everything
render_raw_free(ctx);
// success
return 0;
error:
render_raw_free(ctx);
return -1;
}
int render_raw_abort (struct render_raw *ctx) {
// just free it
render_raw_free(ctx);
// success
return 0;
}