render.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 Aug 2008 21:30:32 +0300
changeset 41 540737bf6bac
parent 23 31307efd7e78
permissions -rw-r--r--
sending requests, and partial support for receiving -- incomplete, not tested
#include <stdlib.h>
#include <string.h>

#include "render_struct.h"
#include "render.h"

int render_init (struct render *ctx) {
    memset(ctx, 0, sizeof(*ctx));

    return 0;
}

struct render *render_alloc () {
    struct render *ctx;

    if (!(ctx = calloc(1, sizeof(struct render))))
        return NULL;

    return ctx;
}

void render_free(struct render *ctx) {
    free(ctx);
}

int render_set_mode (struct render *ctx, int mode) {
    if (mode != RENDER_RAW && mode != RENDER_PNG)
        return -1;

    ctx->mode = mode;

    return 0;
}

int render_set_size (struct render *ctx, u_int32_t img_w, u_int32_t img_h) {
    if (img_w == 0 || img_h == 0)
        return -1;

    ctx->img_w = img_w;
    ctx->img_h = img_h;

    // default render region...
    ctx->img_left = ctx->img_top = 0;
    ctx->img_right = img_w;
    ctx->img_bottom = img_h;
    ctx->img_x_step = ctx->img_y_step = 1;

    return 0;
}

int render_get_size (struct render *ctx, u_int32_t *img_w, u_int32_t *img_h) {
    *img_w = ctx->img_w;
    *img_h = ctx->img_h;

    return 0;
}

int render_region_full (struct render *ctx) {
    return render_region_raw(ctx, REGION_X1, REGION_Y1, REGION_X2, REGION_Y2);
}

int render_region_raw (struct render *ctx, double x1, double y1, double x2, double y2) {
    if ((x1 >= x2) || (y1 >= y2))
        return -1;

    ctx->x1 = x1;
    ctx->y1 = y1;
    ctx->x2 = x2;
    ctx->y2 = y2;

    return 0;
}

int render_io_custom (struct render *ctx, render_ctx_write_cb write_fn, render_ctx_flush_cb flush_fn, void *arg) {
    if (!write_fn)
        return -1;

    ctx->io_write_fn = write_fn;
    ctx->io_flush_fn = flush_fn;
    ctx->cb_arg = arg;

    return 0;
}

int render_io_stream (struct render *ctx, FILE *fh) {
    if (!fh)
        return -1;

    ctx->io_stream = fh;

    return 0;
}

int render_local_mem (struct render *ctx, unsigned char **rowbuf_addr, render_ctx_row_cb row_fn, void *arg) {
    ctx->local_rowbuf_addr = rowbuf_addr;
    ctx->local_row_fn = row_fn;
    ctx->cb_arg = arg;

    return 0;
}