/* gcc -o mandelbrot mandelbrot.c `allegro-config --libs` -DMANDEL_ITER=20 */
#include <allegro.h>

#define ZOOM 140.0

int mandelbrot(double, double);

int main()
{
    int i, j;

    allegro_init();
    install_keyboard();

    set_color_depth(desktop_color_depth());
    if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 600, 600, 0, 0) != 0)
        return 1;

    for (i = 0; i < SCREEN_W; ++i) {
        double re = ((double)i - 300.0) / ZOOM;

        for (j = 0; j < SCREEN_H; ++j) {
            double im = ((double)j - 300.0) / ZOOM;
            int its = mandelbrot(re, im),
                c = 255 - its * 255 / MANDEL_ITER;

            putpixel(screen, i, j, makecol(c, c, c));
        }
    }

    while (!keypressed());

    return 0;

} END_OF_MAIN()

int mandelbrot(double c_r, double c_i)
{
    double z_r = 0.0, z_i = 0.0;
    int i = 0;

    for (i = 0; i < MANDEL_ITER; ++i) {
        double z_r_t = z_r * z_r - z_i * z_i + c_r,
               z_i_t = 2 * z_r *  z_i + c_i;

        z_r = z_r_t;
        z_i = z_i_t;

        if (z_r * z_r + z_i * z_i > 4)
            return i;
    }

    return i;
}