terom@1: #ifndef RENDER_H terom@1: #define RENDER_H terom@1: terom@1: #include terom@1: #include terom@1: terom@1: /* terom@1: * This module provides various ways to render mandelbrot images in various formats terom@1: */ terom@1: terom@11: /* terom@11: * Custom callbacks terom@11: * terom@11: * These should return non-zero on error, whereupon the rendering will be aborted, or zero on success terom@11: */ terom@1: typedef int (*render_ctx_write_cb)(const unsigned char *data, size_t length, void *arg); terom@1: typedef int (*render_ctx_flush_cb)(void *arg); terom@11: typedef int (*render_ctx_row_cb)(void *arg, unsigned char *rowbuf); terom@11: typedef int (*render_ctx_done_cb)(void *arg); terom@1: terom@11: // include render_internal.h first if you need it terom@11: struct render; terom@1: terom@1: // output types terom@1: enum { terom@1: RENDER_RAW, // raw pixel data terom@1: RENDER_PNG, // a png image terom@1: }; terom@1: terom@1: /* terom@11: * Alloc a new render context terom@1: */ terom@11: struct render *render_alloc (); terom@21: void render_free(struct render *ctx); terom@1: terom@1: /* terom@13: * Clear out the value of the given render context terom@13: */ terom@23: int render_init (struct render *ctx); terom@13: terom@13: /* terom@1: * What kind of image to render, PNG or RAW? terom@1: */ terom@11: int render_set_mode (struct render *ctx, int mode); terom@1: terom@1: /* terom@1: * What size of image to render terom@1: */ terom@11: int render_set_size (struct render *ctx, u_int32_t img_w, u_int32_t img_h); terom@11: int render_get_size (struct render *ctx, u_int32_t *img_w, u_int32_t *img_h); terom@1: terom@1: /* terom@1: * Select what region to render terom@1: */ terom@1: terom@1: // the "full" mandelbrot region terom@1: #define REGION_X1 -2.0 terom@1: #define REGION_Y1 -1.5 terom@1: #define REGION_X2 1.0 terom@1: #define REGION_Y2 1.5 terom@1: terom@27: #define REGION_W (REGION_X2 - REGION_X1) terom@27: #define REGION_H (REGION_Y2 - REGION_Y1) terom@27: terom@11: int render_region_full (struct render *ctx); terom@11: int render_region_raw (struct render *ctx, double x1, double y1, double x2, double y2); terom@11: terom@11: /* terom@11: * Render raw pixel data directly to local memory. terom@11: * terom@11: * rowbuf_addr should point to a memory address that the mandelbrot will be terom@11: * rendered into. This memory address should have room for bytes. terom@11: * terom@11: * row_fn will be called after each row has been written, passing in arg and terom@11: * *rowbuf_addr as arguments. terom@11: * terom@11: */ terom@11: int render_local_mem (struct render *ctx, unsigned char **rowbuf_addr, render_ctx_row_cb row_fn, void *arg); terom@1: terom@1: /* terom@1: * How to handle the I/O terom@1: */ terom@11: int render_io_custom (struct render *ctx, render_ctx_write_cb write_fn, render_ctx_flush_cb flush_fn, void *arg); terom@11: int render_io_stream (struct render *ctx, FILE *fh); terom@1: terom@1: #endif /* RENDER_H */