#include "common.h"
#include "render_struct.h"
#include "render_mandelbrot.h"
#define DETAIL 255
#define absdelta(a, b) (a>b ? a-b : b-a)
int render_mandelbrot (struct render *ctx) {
// render algorithm vars
u_int32_t img_x, img_y;
double x0, y0, x, y, _x, _y, w_scale, h_scale;
u_int8_t iter;
// calcluate the scale factors
w_scale = ctx->img_w/absdelta(ctx->x1, ctx->x2);
h_scale = ctx->img_h/absdelta(ctx->y1, ctx->y2);
// start rendering!
for (img_y=ctx->img_top; img_y < ctx->img_bottom; img_y += ctx->img_y_step) {
// render the current row
for (img_x=ctx->img_left; img_x < ctx->img_right; img_x += ctx->img_x_step) {
x = 0;
y = 0;
x0 = img_x/w_scale + ctx->x1;
y0 = img_y/h_scale + ctx->y1;
iter = DETAIL;
while (x*x + y*y < (2*2) && iter > 0) {
_x = x*x - y*y + x0;
_y = 2*x*y + y0;
x = _x;
y = _y;
iter--;
}
(*ctx->local_rowbuf_addr)[img_x - ctx->img_left] = iter;
}
// row cb
if (ctx->local_row_fn(ctx->cb_arg, (*ctx->local_rowbuf_addr)))
ERROR("local_row_fn");
}
// return succesfully
return 0;
error:
return -1;
}