tools/rlemandl.c

Summary

Maintainability
Test Coverage
/* 
 * rlemandl.c - Compute images of the Mandelbrot set in RLE format
 * 
 * Author:    John W. Peterson
 *         Computer Science Dept.
 *         University of Utah
 * Date:    Mon Nov  9 1987
 * Copyright (c) 1987, University of Utah
 */

#include <stdio.h>
#include <math.h>
#include "rle.h"

void
main( argc, argv )
int argc;
char **argv;
{
    char *out_fname = NULL;
    rle_hdr out_hdr;
    char comment[128];
    float real, imaginary, width, step;
    float ypos, xpos;
    rle_pixel ** rows;
    int xsize = 256, ysize = 256;
    int x_pixel, y_pixel;
    int oflag = 0, offset = 1, junk, verbose = 0;
    double scale = 1;
    register int iter;
    int stop;
    /* May want to use floats...whatever's fastest */
    register double z_r, z_i, z_rs, z_is;
    
    out_hdr = *rle_hdr_init( NULL );

    if (! scanargs(argc, argv,
           "% v%- s%-xsize!dysize!d b%-band-scale!Fband-offset%d \n\
\to%-outfile!s real!f imag!f width!f",
           &verbose, 
           &junk, &xsize, &ysize,
           &junk, &scale, &offset,
           &oflag, &out_fname,
           &real, &imaginary, &width ))
    exit( -2 );

    step = width / (double) xsize;

    sprintf( comment,
    "Mandelbrot=set centered at (%g %g), width %g.  Bands %g wide, offset %d.",
         real, imaginary, width, scale, offset );

    xpos = real - width / 2.0;
    ypos = imaginary - (step / 2.0) * (double) ysize;

    /* Re-use real as left margin */
    real = xpos;

    /* Change the default rle_dflt_hdr struct to match what we need */
    out_hdr.rle_file = rle_open_f(cmd_name( argv ), out_fname, "w");
    rle_names( &out_hdr, cmd_name( argv ), out_fname, 0 );
   
    out_hdr.xmax = xsize - 1;
    out_hdr.ymax = ysize - 1;
    out_hdr.ncolors = 1;    /* One output channel */
    out_hdr.alpha = 0;        /* No coverage (alpha) */

    rle_putcom( comment, &out_hdr );
    rle_addhist( argv, (rle_hdr *)0, &out_hdr );

    /* Allocate storage for the output row */
    if (rle_row_alloc( &out_hdr, &rows ) < 0)
    RLE_CHECK_ALLOC( cmd_name( argv ), 0, 0 );

    /* Create the header in the output file */
    rle_put_setup( &out_hdr );

    for (y_pixel = 0; y_pixel < ysize; y_pixel++)
    {
    xpos = real;
    for (x_pixel = 0; x_pixel < xsize; x_pixel++)
    {
        z_r = 0;
        z_i = 0;
        iter = 0;
        stop = scale * 255 + offset;
        while (iter < stop &&
           ((z_rs = z_r * z_r) + (z_is = z_i * z_i)) < 4)
        {
        z_i = 2 * z_r*z_i + ypos;
        z_r = z_rs - z_is + xpos;
        iter++;
        }
        if ( iter == stop )
        iter = 255;
        else
        iter = (iter - offset) / scale;
        rows[0][x_pixel] = (rle_pixel) (iter <= 0 ? 0 : iter);
        xpos += step;
    }
    rle_putrow( rows, xsize + 1, &out_hdr );
    if (verbose)
        if ((y_pixel % 50) == 0)
        fprintf(stderr, "line %d...\n", y_pixel);
    ypos += step;
    }
    rle_puteof( &out_hdr );
    exit( 0 );
}