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