render.h
changeset 11 082bfaf38cf0
parent 2 69f8c0acaac7
child 13 ee426f453cf5
--- 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 */