render_raw.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 Aug 2008 21:30:32 +0300
changeset 41 540737bf6bac
parent 17 8e8b56b0e0f5
permissions -rw-r--r--
sending requests, and partial support for receiving -- incomplete, not tested
#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;
}