render_mandelbrot.c
author Tero Marttila <terom@fixme.fi>
Fri, 06 Jun 2008 23:37:45 +0300
changeset 12 43297144f196
child 18 86f2e5b7191b
permissions -rw-r--r--
* rename files, render_file -> file_main, render_node -> node_main, mandelbrot -> render_mandelbrot
* make the error message stuff in common a /lot/ neater (a single function and a set of macros)
* clean up rest of code to use those new macros

committer: Tero Marttila <terom@fixme.fi>

#include "common.h"
#include "render_internal.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=0; img_y < ctx->img_h; img_y++) {
        // render the current row
        for (img_x=0; img_x < ctx->img_w; img_x++) {
            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] = 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;
}