--- 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 <img_w> 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 */