diff -r 9daa832ab9c4 -r 082bfaf38cf0 render.h --- a/render.h Fri Jun 06 16:05:26 2008 +0300 +++ b/render.h Fri Jun 06 18:35:46 2008 +0300 @@ -8,16 +8,18 @@ * This module provides various ways to render mandelbrot images in various formats */ -// custom I/O callbacks function signatures +/* + * Custom callbacks + * + * These should return non-zero on error, whereupon the rendering will be aborted, or zero on success + */ typedef int (*render_ctx_write_cb)(const unsigned char *data, size_t length, void *arg); typedef int (*render_ctx_flush_cb)(void *arg); +typedef int (*render_ctx_row_cb)(void *arg, unsigned char *rowbuf); +typedef int (*render_ctx_done_cb)(void *arg); -// callback return codes -#define RENDER_CB_OK 0 -#define RENDER_CB_ERR 1 - -#define RENDER_OK 0 -#define RENDER_ERR 1 +// include render_internal.h first if you need it +struct render; // output types enum { @@ -25,51 +27,21 @@ RENDER_PNG, // a png image }; -typedef struct render_ctx { -/* render mode */ - int mode; - -/* image size */ - u_int32_t img_w; - u_int32_t img_h; - -/* mandelbrot region */ - double x1; - double y1; - double x2; - double y2; - -/* I/O parameters */ - // if this is non-NULL, use libpng's normal IO on this stream - FILE *io_stream; - - // called to handle the output data - render_ctx_write_cb io_write_fn; - - // called when the output data should be flushed - can be safely ignored if not needed - render_ctx_flush_cb io_flush_fn; - - // the callback argument - void *io_cb_arg; - - // error status - int io_error; -} render_t; - /* - * Clear out the render context and set the mode + * Alloc a new render context */ -int render_init (render_t *ctx, int mode); +struct render *render_alloc (); /* * What kind of image to render, PNG or RAW? */ -int render_set_mode (render_t *ctx, int mode); +int render_set_mode (struct render *ctx, int mode); /* * What size of image to render */ -int render_set_size (render_t *ctx, u_int32_t img_w, u_int32_t img_h); +int render_set_size (struct render *ctx, u_int32_t img_w, u_int32_t img_h); +int render_get_size (struct render *ctx, u_int32_t *img_w, u_int32_t *img_h); /* * Select what region to render @@ -81,13 +53,25 @@ #define REGION_X2 1.0 #define REGION_Y2 1.5 -int render_region_full (render_t *ctx); -int render_region_raw (render_t *ctx, double x1, double y1, double x2, double y2); +int render_region_full (struct render *ctx); +int render_region_raw (struct render *ctx, double x1, double y1, double x2, double y2); + +/* + * Render raw pixel data directly to local memory. + * + * rowbuf_addr should point to a memory address that the mandelbrot will be + * rendered into. This memory address should have room for bytes. + * + * row_fn will be called after each row has been written, passing in arg and + * *rowbuf_addr as arguments. + * + */ +int render_local_mem (struct render *ctx, unsigned char **rowbuf_addr, render_ctx_row_cb row_fn, void *arg); /* * How to handle the I/O */ -int render_io_custom (render_t *ctx, render_ctx_write_cb write_fn, render_ctx_flush_cb flush_fn, void *arg); -int render_io_stream (render_t *ctx, FILE *fh); +int render_io_custom (struct render *ctx, render_ctx_write_cb write_fn, render_ctx_flush_cb flush_fn, void *arg); +int render_io_stream (struct render *ctx, FILE *fh); #endif /* RENDER_H */